# # Building a Cross-Compiler on GNU/Linux or Cygwin # Kenneth Salerno # # # Adapted from the Gentoo guide on cross-compilers with some ideas from the IBM # cross-compiler guide from IBM Developerworks. # # 1. binutils # 2. kernel headers # 3. gcc pre-stage1 (needed for glibc configure) # 4. glibc headers # 5. gcc stage1 (static) # 6. glibc (stupid hack because we do not yet have gcc shared lib) # 7. gcc stage2 (c/c++/fortran) # 8. glibc # 9. gdb # # # Cygwin filesystem case-sensitivity note: # # Change the following Registry Key from 1 to 0: # # HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel: # obcaseinsensitive ==> 0 # # For this to actually work, you must create your directory structure for # PREFIX under your $HOME directory. # Example of a working PREFIX: /home/kens/cross-compile/powerpc64 # Example of a broken PREFIX: /cygdrive/c/cross-compile/powerpc64 # # # package versions # BINUTILS_VER=2.22 KERNEL_VER=3.4.7 GMP_VER=5.0.5 MPFR_VER=3.1.1 MPC_VER=1.0 GCC_VER=4.7.1 GLIBC_VER=2.16.0 GDB_VER=7.4.1 # # Setup a setenv.sh as follows: # TARGET=x86_64-unknown-linux-gnu; # target for cross-compiler ARCH=x86; # used for linux kernel config MAKE_THREADS=6; # logical CPUs x 1.5 PREFIX=/home/kens/cross-compile/intel TARGET_PREFIX=$PREFIX/$TARGET PATH=$PATH:$PREFIX/bin export PATH # # Setup your build environment: # mkdir -p $TARGET_PREFIX/usr/include $PREFIX/src $PREFIX/build ln -fs $TARGET_PREFIX/usr/include $TARGET_PREFIX/ # # Binutils # if [ ! -f "$PREFIX/build/binutils-$BINUTILS_VER/alldone" ]; then echo building binutils...; sleep 3 cd $PREFIX/src mkdir $PREFIX/build/binutils-$BINUTILS_VER 2>/dev/null if [ ! -d "$PREFIX/src/binutils-$BINUTILS_VER" ]; then tar jxf binutils-$BINUTILS_VER.tar.bz2 fi cd $PREFIX/build/binutils-$BINUTILS_VER $PREFIX/src/binutils-$BINUTILS_VER/configure \ --target=$TARGET \ --prefix=$PREFIX \ --with-sysroot=$TARGET_PREFIX \ --disable-werror make -j$MAKE_THREADS && make install || exit 1 touch alldone fi # # Kernel headers # # New way: # if [ ! -f "$PREFIX/build/linux-$KERNEL_VER/alldone" ]; then echo building kernel headers...; sleep 3 cd $PREFIX/build if [ ! -d "$PREFIX/build/linux-$KERNEL_VER" ]; then tar jxf $PREFIX/src/linux-$KERNEL_VER.tar.bz2 fi cd linux-$KERNEL_VER make ARCH=$ARCH headers_install INSTALL_HDR_PATH=$TARGET_PREFIX/usr ||\ exit 1 touch alldone # # Old way: # $ yes "" | make ARCH=$ARCH oldconfig prepare # $ cp -r include/linux include/asm-generic $TARGET_PREFIX/usr/include/ # $ cp -r include/asm-$ARCH $TARGET_PREFIX/usr/include/asm # fi # # GMP, MPFR, MPC (needed to build newer GCC versions) # if [ ! -f "$PREFIX/build/gmp-$GMP_VER/alldone" ]; then echo building gmp...; sleep 3 cd $PREFIX/src mkdir $PREFIX/build/gmp-$GMP_VER 2>/dev/null if [ ! -d "$PREFIX/src/gmp-$GMP_VER" ]; then tar Jxf gmp-$GMP_VER.tar.xz fi cd $PREFIX/build/gmp-$GMP_VER $PREFIX/src/gmp-$GMP_VER/configure \ --prefix=$PREFIX \ --disable-shared make -j$MAKE_THREADS && make install || exit 1 touch alldone fi if [ ! -f "$PREFIX/build/mpfr-$MPFR_VER/alldone" ]; then echo building mpfr...; sleep 3 cd $PREFIX/src mkdir $PREFIX/build/mpfr-$MPFR_VER 2>/dev/null if [ ! -d "$PREFIX/src/mpfr-$MPFR_VER" ]; then tar zxf mpfr-$MPFR_VER.tar.gz fi cd $PREFIX/build/mpfr-$MPFR_VER $PREFIX/src/mpfr-$MPFR_VER/configure \ --prefix=$PREFIX \ --with-gmp=$PREFIX \ --disable-shared make -j$MAKE_THREADS && make install || exit 1 touch alldone fi if [ ! -f "$PREFIX/build/mpc-$MPC_VER/alldone" ]; then echo building mpc...; sleep 3 cd $PREFIX/src mkdir $PREFIX/build/mpc-$MPC_VER 2>/dev/null if [ ! -d "$PREFIX/src/mpc-$MPC_VER" ]; then tar zxf mpc-$MPC_VER.tar.gz fi cd $PREFIX/build/mpc-$MPC_VER $PREFIX/src/mpc-$MPC_VER/configure \ --prefix=$PREFIX \ --with-gmp=$PREFIX \ --with-mpfr=$PREFIX \ --disable-shared make -j$MAKE_THREADS && make install || exit 1 touch alldone fi # # GCC pre-Stage 1 needed to configure glibc # if [ ! -f "$PREFIX/build/gcc-$GCC_VER-prestage1/alldone" ]; then echo building pre-stage1 gcc...; sleep 3 cd $PREFIX/src mkdir $PREFIX/build/gcc-$GCC_VER-prestage1 2>/dev/null if [ ! -d "$PREFIX/src/gcc-$GCC_VER" ]; then tar zxf gcc-$GCC_VER.tar.gz fi cd $PREFIX/build/gcc-$GCC_VER-prestage1 $PREFIX/src/gcc-$GCC_VER/configure \ --target=$TARGET \ --prefix=$PREFIX \ --with-gmp=$PREFIX \ --with-mpfr=$PREFIX \ --with-mpc=$PREFIX \ --enable-languages=c \ --disable-shared \ --disable-checking \ --disable-werror \ --disable-libmudflap \ --disable-libssp \ --disable-libgomp make -j$MAKE_THREADS all-gcc && make install-gcc || exit 1 touch alldone fi # # System glibc headers needed to compile Stage 1 GCC # if [ ! -f "$PREFIX/build/glibc-$GLIBC_VER-headers/alldone" ]; then echo building glibc headers...; sleep 3 cd $PREFIX/src mkdir $PREFIX/build/glibc-$GLIBC_VER-headers 2>/dev/null if [ ! -d "$PREFIX/src/glibc-$GLIBC_VER" ]; then tar zxf glibc-$GLIBC_VER.tar.gz fi cd $PREFIX/build/glibc-$GLIBC_VER-headers $PREFIX/src/glibc-$GLIBC_VER/configure \ --host=$TARGET \ --prefix=$TARGET_PREFIX \ --with-headers=$TARGET_PREFIX/usr/include \ --without-cvs \ --disable-sanity-checks \ libc_cv_forced_unwind=yes \ libc_cv_c_cleanup=yes \ ac_cv_header_cpuid_h=yes make install-headers || exit 1 mkdir -p $TARGET_PREFIX/usr/include/gnu touch $TARGET_PREFIX/usr/include/gnu/stubs.h cp bits/stdio_lim.h $TARGET_PREFIX/usr/include/bits/ touch alldone fi # # GCC Stage 1 (C only) # if [ ! -f "$PREFIX/build/gcc-$GCC_VER-stage1/alldone" ]; then echo building stage1 gcc...; sleep 3 mkdir $PREFIX/build/gcc-$GCC_VER-stage1 2>/dev/null cd $PREFIX/build/gcc-$GCC_VER-stage1 $PREFIX/src/gcc-$GCC_VER/configure \ --target=$TARGET \ --prefix=$PREFIX \ --with-sysroot=$TARGET_PREFIX \ --with-gmp=$PREFIX \ --with-mpfr=$PREFIX \ --with-mpc=$PREFIX \ --enable-languages=c \ --disable-shared \ --disable-checking \ --disable-werror \ --disable-libmudflap \ --disable-libssp \ --disable-libgomp \ --disable-libquadmath make -j$MAKE_THREADS && make install || exit 1 touch alldone fi # # System glibc (stupid hack until we have shared gcc lib) # if [ ! -f "$PREFIX/build/glibc-$GLIBC_VER-bad/alldone" ]; then echo building hacked glibc...; sleep 3 mkdir $PREFIX/build/glibc-$GLIBC_VER-bad 2>/dev/null cd $PREFIX/build/glibc-$GLIBC_VER-bad $PREFIX/src/glibc-$GLIBC_VER/configure \ --host=$TARGET \ --prefix=$TARGET_PREFIX \ --with-headers=$TARGET_PREFIX/usr/include \ --without-cvs \ libc_cv_forced_unwind=yes \ libc_cv_c_cleanup=yes make -j$MAKE_THREADS libgcc_eh="" static-gnulib="-lgcc" && \ make install || exit 1 touch alldone fi # # GCC Stage 2 (All frontends, shared lib) # if [ ! -f "$PREFIX/build/gcc-$GCC_VER/alldone" ]; then echo building gcc...; sleep 3 mkdir $PREFIX/build/gcc-$GCC_VER 2>/dev/null cd $PREFIX/build/gcc-$GCC_VER $PREFIX/src/gcc-$GCC_VER/configure \ --target=$TARGET \ --prefix=$PREFIX \ --with-sysroot=$TARGET_PREFIX \ --with-gmp=$PREFIX \ --with-mpfr=$PREFIX \ --with-mpc=$PREFIX \ --enable-languages=c,c++,fortran \ --disable-multilib \ --enable-shared \ --disable-checking \ --disable-werror make -j$MAKE_THREADS && make install || exit 1 touch alldone fi # # System glibc # if [ ! -f "$PREFIX/build/glibc-$GLIBC_VER/alldone" ]; then echo building glibc...; sleep 3 mkdir $PREFIX/build/glibc-$GLIBC_VER 2>/dev/null cd $PREFIX/build/glibc-$GLIBC_VER $PREFIX/src/glibc-$GLIBC_VER/configure \ --host=$TARGET \ --prefix=/usr \ --with-headers=$TARGET_PREFIX/usr/include \ --without-cvs \ libc_cv_forced_unwind=yes \ libc_cv_c_cleanup=yes make -j$MAKE_THREADS && make install install_root=$TARGET_PREFIX ||\ exit 1 touch alldone fi # # GNU gdb # if [ ! -f "$PREFIX/build/gdb-$GDB_VER/alldone" ]; then echo building gdb...; sleep 3 cd $PREFIX/src mkdir $PREFIX/build/gdb-$GDB_VER 2>/dev/null if [ ! -d "$PREFIX/src/gdb-$GDB_VER" ]; then tar zxf gdb-$GDB_VER.tar.gz fi cd $PREFIX/build/gdb-$GDB_VER $PREFIX/src/gdb-$GDB_VER/configure \ --target=$TARGET \ --prefix=$PREFIX make -j$MAKE_THREADS && make install ||\ exit 1 touch alldone fi echo all done # # Use your new cross-compiler # # Example 1: # $ . /home/kens/cross-compile/powerpc64/setenv.sh # $ powerpc64-unknown-linux-gnu-gcc -o test test.c # # Example 2: # $ CC=powerpc64-unknown-linux-gnu-gcc ./configure # $ make CC=powerpc64-unknown-linux-gnu-gcc #