#!/usr/bin/env bash set -ex ARCH=x86_64 PATCH_TOOLCHAIN=$1 BINUTILS=2.25.1 GCC=6.4.0 hide_output() { set +x on_err=" echo ERROR: An error was encountered with the build. cat /tmp/build.log exit 1 " trap "$on_err" ERR bash -c "while true; do sleep 30; echo \$(date) - building ...; done" & PING_LOOP_PID=$! $@ &> /tmp/build.log trap - ERR kill $PING_LOOP_PID set -x } mkdir binutils cd binutils # First up, build binutils curl https://ftp.gnu.org/gnu/binutils/binutils-$BINUTILS.tar.bz2 | tar xjf - mkdir binutils-build cd binutils-build hide_output ../binutils-$BINUTILS/configure \ --target=$ARCH-unknown-dragonfly hide_output make -j10 hide_output make install cd ../.. rm -rf binutils # Next, download the DragonFly libc and relevant header files URL=http://mirror-master.dragonflybsd.org/iso-images/dfly-x86_64-5.0.0_REL.iso.bz2 mkdir dragonfly curl $URL | bzcat | bsdtar xf - -C dragonfly ./usr/include ./usr/lib ./lib dst=/usr/local/$ARCH-unknown-dragonfly mkdir -p $dst/lib cp -r dragonfly/usr/include $dst/ cp dragonfly/usr/lib/crt1.o $dst/lib cp dragonfly/usr/lib/Scrt1.o $dst/lib cp dragonfly/usr/lib/crti.o $dst/lib cp dragonfly/usr/lib/crtn.o $dst/lib cp dragonfly/usr/lib/libc.a $dst/lib cp dragonfly/usr/lib/libutil.a $dst/lib cp dragonfly/usr/lib/libm.a $dst/lib cp dragonfly/usr/lib/librt.so.0 $dst/lib cp dragonfly/usr/lib/libexecinfo.so.1 $dst/lib cp dragonfly/lib/libc.so.8 $dst/lib cp dragonfly/lib/libm.so.4 $dst/lib cp dragonfly/lib/libutil.so.4 $dst/lib cp dragonfly/usr/lib/libpthread.so $dst/lib/libpthread.so cp dragonfly/usr/lib/thread/libthread_xu.so.2 $dst/lib/libpthread.so.0 ln -s libc.so.8 $dst/lib/libc.so ln -s libm.so.4 $dst/lib/libm.so ln -s librt.so.0 $dst/lib/librt.so ln -s libutil.so.4 $dst/lib/libutil.so ln -s libexecinfo.so.1 $dst/lib/libexecinfo.so rm -rf dragonfly # Finally, download and build gcc to target DragonFly mkdir gcc cd gcc curl https://ftp.gnu.org/gnu/gcc/gcc-$GCC/gcc-$GCC.tar.gz | tar xzf - cd gcc-$GCC # The following three patches are taken from DragonFly's dports collection: # https://github.com/DragonFlyBSD/DPorts/tree/master/lang/gcc5 # The dports specification for gcc5 contains a few more patches, but they are # not relevant in this situation, as they are for a language we don't need # (e.g. java), or a platform which is not supported by DragonFly (e.g. i386, # powerpc64, ia64, arm). # # These patches probably only need to be updated in case the gcc version is # updated. patch -p0 < $PATCH_TOOLCHAIN ./contrib/download_prerequisites mkdir ../gcc-build cd ../gcc-build hide_output ../gcc-$GCC/configure \ --enable-languages=c,c++ \ --target=$ARCH-unknown-dragonfly \ --disable-multilib \ --disable-nls \ --disable-libgomp \ --disable-libquadmath \ --disable-libssp \ --disable-libvtv \ --disable-libcilkrts \ --disable-libada \ --disable-libsanitizer \ --disable-libquadmath-support \ --disable-lto hide_output make -j10 hide_output make install cd ../.. rm -rf gcc