Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
A shell script to download packages for, configure, build and install a GCC cross-compiler.
#! /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_VERSION/$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_VERSION
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_VERSION/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_KERNEL_VERSION
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_VERSION/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_VERSION/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!'

Love U !!

Good.

zeroows commented Mar 30, 2015

thanks

thanks!

Thank you!!!

How to build the cross compiler for x86_64?

I changed TARGET to "x86_64-linux-gnu", and LINUX_ARCH to "x86_64" in the script, but I got the follow error at the stage building glibc:

x86_64-linux-gnu-gcc -D_RPC_THREAD_SAFE_ -D_GNU_SOURCE -DIS_IN_build -include /net/ala-rsubbian-lx1/ala-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/build-glibc/c
onfig.h rpc_main.c
-o /net/ala-rsubbian-lx1/ala-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/build-glibc/sunrpc/cross-rpc_main.o -MMD -MP -MF /net/ala-rsubbian-lx1/ala
-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/build-glibc/sunrpc/cross-rpc_main.o.dt -MT /net/ala-rsubbian-lx1/ala-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/build
-glibc/sunrpc/cross-rpc_main.o -c
In file included from /net/ala-rsubbian-lx1/ala-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/opt/cross/x86_64-linux-gnu/include/errno.h:28:0,
from rpc_main.c:37:
/net/ala-rsubbian-lx1/ala-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/opt/cross/x86_64-linux-gnu/include/features.h:389:23: fatal error: gnu/stubs.h: No such file
or directory
#include <gnu/stubs.h>
^
compilation terminated.
make[2]: *** [/net/ala-rsubbian-lx1/ala-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/build-glibc/sunrpc/cross-rpc_main.o] Error 1
make[2]: Leaving directory /net/ala-rsubbian-lx1/ala-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/glibc-2.20/sunrpc' make[1]: *** [sunrpc/install-headers] Error 2 make[1]: Leaving directory/net/ala-rsubbian-lx1/ala-rsubbian-lx11/bpang/SHARE/GCC520/GIT/x86_64/glibc-2.20'
make: *** [install-headers] Error 2

Is there a version to build gcc 5.3.x?

used this guide to compile GCC 6.1 with latest GLibc and 4.6 Kernel , thank you for your efforts

pwaring commented May 18, 2016 edited

@Vladinator You should be able to build 5.3.x with this. If not, I've created a similar script with slightly higher levels of abstraction which definitely builds GCC 4.9.x, 5.3.x and 6.1: https://github.com/pwaring/gcc-cross-compiler

Thanks @pwaring, maybe you can add a note at the top of your blog post for the github repository?

mdeguzis commented Jul 23, 2016 edited

Anyone get this to build fine on amd64? @pwaring, I don't see support for amd64 in that, is it possible?

My current version of this script with some improvements:
https://github.com/ProfessorKaos64/LibreGeek-Packaging/blob/brewmaster/gcc/build-cross-gcc.sh

@BaoshanPang - my version of this script above seems to work until a point:

a - /home/desktop/build-cross-gcc/build-glibc/string/rtld-cacheinfo.os
a - /home/desktop/build-cross-gcc/build-glibc/time/rtld-setitimer.os
mv -f /home/desktop/build-cross-gcc/build-glibc/elf/rtld-libc.aT /home/desktop/build-cross-gcc/build-glibc/elf/rtld-libc.a
make[3]: Leaving directory '/home/desktop/build-cross-gcc/glibc-2.23/elf'
make[2]: Leaving directory '/home/desktop/build-cross-gcc/glibc-2.23/elf'
Makefile:214: recipe for target 'elf/subdir_lib' failed
make[1]: *** [elf/subdir_lib] Error 2
make[1]: Leaving directory '/home/desktop/build-cross-gcc/glibc-2.23'
Makefile:9: recipe for target 'all' failed
make: *** [all] Error 2
FAILED COMMAND: sudo make $PARALLEL_MAKE
pwaring commented Jul 29, 2016

@thijstriemstra The blog post you link to isn't mine so I can't edit it.

Thanks

I am also facing same issue like...

make[4]: *** [subsegs.o] Error 1
make[4]: *** Waiting for unfinished jobs....
mv -f .deps/stabs.Tpo .deps/stabs.Po
mv -f .deps/symbols.Tpo .deps/symbols.Po
mv -f .deps/read.Tpo .deps/read.Po
make[4]: Leaving directory '/home/esmadmin/Final_code/port_code/Updates/build_cross_gcc/cross_compilation/build-binutils/gas'
Makefile:2165: recipe for target 'all-recursive' failed
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory '/home/esmadmin/Final_code/port_code/Updates/build_cross_gcc/cross_compilation/build-binutils/gas'
Makefile:682: recipe for target 'all' failed
make[2]: *** [all] Error 2
make[2]: Leaving directory '/home/esmadmin/Final_code/port_code/Updates/build_cross_gcc/cross_compilation/build-binutils/gas'
Makefile:4710: recipe for target 'all-gas' failed
make[1]: *** [all-gas] Error 2
make[1]: Leaving directory '/home/esmadmin/Final_code/port_code/Updates/build_cross_gcc/cross_compilation/build-binutils'
Makefile:830: recipe for target 'all' failed
make: *** [all] Error 2
FAILED COMMAND: make $PARALLEL_MAKE

I have issue with PATH_MAX undefined while compiling last part of gcc (part6)

...
libtool: compile:  /rtos/test/build-gcc/./gcc/xgcc -B/rtos/test/build-gcc/./gcc/ -B/rtos/cross/x86_64-artos-linux/bin/ -B/rtos/cross/x86_64-artos-linux/lib/ -isystem /rtos/cross/x86_64-artos-linux/include -isystem /rtos/cross/x86_64-artos-linux/sys-include -DHAVE_CONFIG_H -I. -I../../../../gcc-6.2.0/libmpx/mpxrt -I.. -I../../../../gcc-6.2.0/libmpx/.. -fPIC -g -O2 -c ../../../../gcc-6.2.0/libmpx/mpxrt/mpxrt-utils.c  -fPIC -DPIC -o .libs/libmpx_la-mpxrt-utils.o
../../../../gcc-6.2.0/libmpx/mpxrt/mpxrt-utils.c:69:23: error: 'PATH_MAX' undeclared here (not in a function)
 #define MAX_FILE_NAME PATH_MAX
                       ^
../../../../gcc-6.2.0/libmpx/mpxrt/mpxrt-utils.c:91:22: note: in expansion of macro 'MAX_FILE_NAME'
 static char out_name[MAX_FILE_NAME];
                      ^~~~~~~~~~~~~
Makefile:390: recipe for target 'libmpx_la-mpxrt-utils.lo' failed
make[4]: *** [libmpx_la-mpxrt-utils.lo] Error 1
make[4]: Leaving directory '/rtos/test/build-gcc/x86_64-artos-linux/libmpx/mpxrt'
Makefile:409: recipe for target 'all-recursive' failed
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory '/rtos/test/build-gcc/x86_64-artos-linux/libmpx'
Makefile:300: recipe for target 'all' failed
make[2]: *** [all] Error 2
make[2]: Leaving directory '/rtos/test/build-gcc/x86_64-artos-linux/libmpx'
Makefile:12473: recipe for target 'all-target-libmpx' failed
make[1]: *** [all-target-libmpx] Error 2
...

my configuration are :

LINUX_ARCH=x86_64
CONFIGURATION_OPTIONS="--disable-multilib --disable-nls --disable-doc --without-selinux --disable-debug --disable-valgrind-tests --disable-documentation --disable-gtk-doc-pdf --disable-gtk-doc --disable-manpages --disable-gtk-doc-html --disable-tests" #
PARALLEL_MAKE=-j4
BINUTILS_VERSION=binutils-2.27
GCC_VERSION=gcc-6.2.0
LINUX_KERNEL_VERSION=linux-4.8.1
GLIBC_VERSION=glibc-2.24
MPFR_VERSION=mpfr-3.1.5
GMP_VERSION=gmp-6.1.1
MPC_VERSION=mpc-1.0.3
ISL_VERSION=isl-0.17.1
CLOOG_VERSION=cloog-0.18.4

any hints to fix?

How to make it works with "arm android"?

lcbcFoo commented Mar 27, 2017

Nice script! Just had to change a few things to build a gcc cross compiler for mips.

bembam commented Apr 9, 2017 edited

I am facing the following error after make -j4:

cc1: all warnings being treated as errors
Makefile:891: recipe for target 'subsegs.o' failed
make[4]: *** [subsegs.o] Error 1
make[4]: *** Waiting for unfinished jobs....
mv -f .deps/stabs.Tpo .deps/stabs.Po
mv -f .deps/read.Tpo .deps/read.Po
mv -f .deps/symbols.Tpo .deps/symbols.Po
make[4]: Leaving directory '/home/bem/Desktop/crosscompiler/build-binutils/gas'
Makefile:2165: recipe for target 'all-recursive' failed
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory '/home/bem/Desktop/crosscompiler/build-binutils/gas'
Makefile:682: recipe for target 'all' failed
make[2]: *** [all] Error 2
make[2]: Leaving directory '/home/bem/Desktop/crosscompiler/build-binutils/gas'
Makefile:4710: recipe for target 'all-gas' failed
make[1]: *** [all-gas] Error 2
make[1]: Leaving directory '/home/bem/Desktop/crosscompiler/build-binutils'
Makefile:830: recipe for target 'all' failed
make: *** [all] Error 2

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment