#! /bin/bash set -e trap 'previous_command=$this_command; this_command=$BASH_COMMAND' DEBUG trap 'echo FAILED COMMAND: $previous_command' EXIT #------------------------------------------------------------------------------------------- # This script will download packages for, configure, build and install a GCC cross-compiler. # Customize the variables (INSTALL_PATH, TARGET, etc.) to your liking before running. # If you get an error and need to resume the script from some point in the middle, # just delete/comment the preceding lines before running it again. # # See: http://preshing.com/20141119/how-to-build-a-gcc-cross-compiler #------------------------------------------------------------------------------------------- INSTALL_PATH=/opt/cross TARGET=aarch64-linux USE_NEWLIB=0 LINUX_ARCH=arm64 CONFIGURATION_OPTIONS="--disable-multilib" # --disable-threads --disable-shared PARALLEL_MAKE=-j4 BINUTILS_VERSION=binutils-2.24 GCC_VERSION=gcc-4.9.2 LINUX_KERNEL_VERSION=linux-3.17.2 GLIBC_VERSION=glibc-2.20 MPFR_VERSION=mpfr-3.1.2 GMP_VERSION=gmp-6.0.0a MPC_VERSION=mpc-1.0.2 ISL_VERSION=isl-0.12.2 CLOOG_VERSION=cloog-0.18.1 export PATH=$INSTALL_PATH/bin:$PATH # Download packages export http_proxy=$HTTP_PROXY https_proxy=$HTTP_PROXY ftp_proxy=$HTTP_PROXY wget -nc https://ftp.gnu.org/gnu/binutils/$BINUTILS_VERSION.tar.gz wget -nc https://ftp.gnu.org/gnu/gcc/gcc-4.9.2/$GCC_VERSION.tar.gz if [ $USE_NEWLIB -ne 0 ]; then wget -nc -O newlib-master.zip https://github.com/bminor/newlib/archive/master.zip || true unzip -qo newlib-master.zip else wget -nc https://www.kernel.org/pub/linux/kernel/v3.x/$LINUX_KERNEL_VERSION.tar.xz wget -nc https://ftp.gnu.org/gnu/glibc/$GLIBC_VERSION.tar.xz fi wget -nc https://ftp.gnu.org/gnu/mpfr/$MPFR_VERSION.tar.xz wget -nc https://ftp.gnu.org/gnu/gmp/$GMP_VERSION.tar.xz wget -nc https://ftp.gnu.org/gnu/mpc/$MPC_VERSION.tar.gz wget -nc ftp://gcc.gnu.org/pub/gcc/infrastructure/$ISL_VERSION.tar.bz2 wget -nc ftp://gcc.gnu.org/pub/gcc/infrastructure/$CLOOG_VERSION.tar.gz # Extract everything for f in *.tar*; do tar xfk $f; done # Make symbolic links cd gcc-4.9.2 ln -sf `ls -1d ../mpfr-*/` mpfr ln -sf `ls -1d ../gmp-*/` gmp ln -sf `ls -1d ../mpc-*/` mpc ln -sf `ls -1d ../isl-*/` isl ln -sf `ls -1d ../cloog-*/` cloog cd .. # Step 1. Binutils mkdir -p build-binutils cd build-binutils ../binutils-2.24/configure --prefix=$INSTALL_PATH --target=$TARGET $CONFIGURATION_OPTIONS make $PARALLEL_MAKE make install cd .. # Step 2. Linux Kernel Headers if [ $USE_NEWLIB -eq 0 ]; then cd linux-3.17.2 make ARCH=$LINUX_ARCH INSTALL_HDR_PATH=$INSTALL_PATH/$TARGET headers_install cd .. fi # Step 3. C/C++ Compilers mkdir -p build-gcc cd build-gcc if [ $USE_NEWLIB -ne 0 ]; then NEWLIB_OPTION=--with-newlib fi ../gcc-4.9.2/configure --prefix=$INSTALL_PATH --target=$TARGET --enable-languages=c,c++ $CONFIGURATION_OPTIONS $NEWLIB_OPTION make $PARALLEL_MAKE all-gcc make install-gcc cd .. if [ $USE_NEWLIB -ne 0 ]; then # Steps 4-6: Newlib mkdir -p build-newlib cd build-newlib ../newlib-master/configure --prefix=$INSTALL_PATH --target=$TARGET $CONFIGURATION_OPTIONS make $PARALLEL_MAKE make install cd .. else # Step 4. Standard C Library Headers and Startup Files mkdir -p build-glibc cd build-glibc ../glibc-2.20/configure --prefix=$INSTALL_PATH/$TARGET --build=$MACHTYPE --host=$TARGET --target=$TARGET --with-headers=$INSTALL_PATH/$TARGET/include $CONFIGURATION_OPTIONS libc_cv_forced_unwind=yes make install-bootstrap-headers=yes install-headers make $PARALLEL_MAKE csu/subdir_lib install csu/crt1.o csu/crti.o csu/crtn.o $INSTALL_PATH/$TARGET/lib $TARGET-gcc -nostdlib -nostartfiles -shared -x c /dev/null -o $INSTALL_PATH/$TARGET/lib/libc.so touch $INSTALL_PATH/$TARGET/include/gnu/stubs.h cd .. # Step 5. Compiler Support Library cd build-gcc make $PARALLEL_MAKE all-target-libgcc make install-target-libgcc cd .. # Step 6. Standard C Library & the rest of Glibc cd build-glibc make $PARALLEL_MAKE make install cd .. fi # Step 7. Standard C++ Library & the rest of GCC cd build-gcc make $PARALLEL_MAKE all make install cd .. trap - EXIT echo 'Success!'