2011年5月4日 星期三

GCC-4.6.0 little-endian build script for arm-none-linux-gnueabi

For ARM's cortex-a9, build arm-none-linux-gnueabi little-endian toolchain

Source package:
binutils-2.21
gcc-4.6.0
glibc-2.13

With hardware vfp.

[1-build-binutils.sh]
#!/bin/bash
cd ${BUILDPATH}
mkdir -v binutils-build
cd binutils-build
AR=ar AS=as ${BINUTILS_SRC}/configure --build=${HOST} --host=${HOST} --target=${TARGET} --prefix=${PREFIX} --with-sysroot=${PREFIX}/${TARGET} --disable-nls --enable-shared --enable-install-libbfd --enable-interwork --with-v4bx-interworking --enable-multilib
make configure-host
make LDFLAGS="-static"
make install

[2-build-gmp-mpfr.sh]
#!/bin/bash
mkdir -v ${BUILDPATH}/gmp-build
cd ${BUILDPATH}/gmp-build
${GMP_SRC}/configure --prefix=${GMP_PREFIX} --enable-cxx --enable-mpbsd
make
make install

mkdir -v ${BUILDPATH}/mpfr-build
cd ${BUILDPATH}/mpfr-build
LDFLAGS="-Wl,-rpath,${PREFIX}/lib" ${MPFR_SRC}/configure --prefix=${MPFR_PREFIX} --enable-shared --with-gmp=${GMP_PREFIX}
make
make check
make install

[3-build-headers.sh]
#!/bin/bash
echo "Prepare Linux kernel headers"

cd ${LINUX_HEADER_SRC}
make ARCH=arm CROSS_COMPILE=${TARGET}- INSTALL_HDR_PATH=${PREFIX}/${TARGET} headers_install

[4-build-gcc.sh]
#!/bin/bash
if test x"${BOOTSTRAP_PREFIX}" != x"${PREFIX}"; then
    mkdir -p ${BOOTSTRAP_PREFIX}/${TARGET}/bin
    for tool in ar as ld strip ranlib; do
        rm -f ${BOOTSTRAP_PREFIX}/${TARGET}/bin/${tool} || true
        ln -s ${PREFIX}/bin/${TARGET}-${tool} ${BOOTSTRAP_PREFIX}/${TARGET}/bin/${tool}
    done
fi

echo "Build bootstrap gcc"

cd ${BUILDPATH}
mkdir -v gcc-build
cd gcc-build

#mkdir -p mpfr
#cp ${GCC_SRC}/gmp/gmp-impl.h ./mpfr
#cp ${GCC_SRC}/gmp/longlong.h ./mpfr

# http://comments.gmane.org/gmane.linux.lfs.devel/10631
# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47836
# need --disable-shared --disable-lto --disable-libquadmath --without-target-libiberty --without-target-zlib
${GCC_SRC}/configure --build=${HOST} --host=${HOST} --target=${TARGET} --prefix=${BOOTSTRAP_PREFIX} --with-local-prefix=${BOOTSTRAP_PREFIX}/${TARGET} --without-target-libiberty --without-target-zlib --disable-libquadmath --disable-lto --disable-libstdcxx-pch --disable-libffi --disable-multilib --disable-nls --disable-libgomp --disable-libmudflap --disable-libssp --enable-gold --enable-ld --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c --disable-shared --disable-threads --without-headers --disable-decimal-float --enable-mpfr --enable-gmp --without-cloog --without-ppl --with-float=hard --with-v4bx-interworking --with-gnu-as --with-gnu-ld --with-cpu=${DEFAULT_CPU} --with-libelf=${LIBELF_PREFIX} --with-mpc=${MPC_PREFIX}
make
make install

[5-build-glibc.sh]
#!/bin/bash
#if test x"${BOOTSTRAP_PREFIX}" != x"${PREFIX}"; then
#    ln -s ${PREFIX}/${TARGET}/include ${BOOTSTRAP_PREFIX}/${TARGET}/include
#fi

cd ${BUILDPATH}
mkdir -v glibc-build
cd glibc-build
cat > config.cache << EOF
libc_cv_forced_unwind=yes
libc_cv_c_cleanup=yes
libc_cv_arm_tls=yes
libc_cv_gnu89_inline=yes
EOF

# http://newsgroups.derkeiler.com/Archive/Comp/comp.lang.awk/2009-03/msg00088.html
# glibc-2.13 may have [^/], replace it with [^\/] in gen-sorted.awk
# need to install gawk
BUILD_CC="gcc" CC="${TARGET}-gcc" AR="${TARGET}-ar" RANLIB="${TARGET}-ranlib" ${GLIBC_SRC}/configure --prefix=/usr --build=${HOST} --host=${TARGET} --target=${TARGET} --without-cvs --disable-profile --disable-debug --without-gd --with-fp --disable-libunwind-exceptions --cache-file=config.cache --enable-kernel=2.6.38 --with-binutils=${PREFIX}/bin --enable-add-ons=ports,nptl --with-tls --with-__thread --with-arch=${DEFAULT_ARCH} --enable-multilib --enable-sim --enable-shared --enable-multi-arch --with-v4bx-interworking --with-headers=${PREFIX}/${TARGET}/include
make V=1 LD=${TARGET}-ld RANLIB=${TARGET}-ranlib all
make install_root=${PREFIX}/${TARGET} prefix= install

# modify libc.so  libpthread.so
# GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a  AS_NEEDED ( /lib/ld-linux.so.2 ) ) ---> GROUP ( libc.so.6 libc_nonshared.a  AS_NEEDED ( ld-linux.so.2 ) )

[6-build-gcc-final.sh]
#!/bin/bash
cd ${BUILDPATH}
mkdir -v gcc-build-final
cd gcc-build-final

#mkdir -p mpfr
#cp ${GCC_SRC}/gmp/gmp-impl.h ./mpfr
#cp ${GCC_SRC}/gmp/longlong.h ./mpfr

#add --with-newlib
AR=ar LDFLAGS="-Wl,-rpath,${PREFIX}/${TARGET}/lib" ${GCC_SRC}/configure --prefix=${PREFIX} --build=${HOST} --host=${HOST} --target=${TARGET} --with-cpu=${DEFAULT_CPU} --with-pkgversion='M.F. C/C++ Compiler Release 20110423' --disable-nls --disable-libssp --disable-libgomp --enable-gold --enable-ld --enable-threads=posix --disable-tls --enable-symvers=gnu --enable-c99 --enable-long-long --enable-multilib --enable-languages=c,c++ --enable-__cxa_atexit --with-float=hard --enable-cxx-flags=-mhard-float --enable-shared --enable-gmp --enable-mpfr --enable-cloog --enable-ppl --with-v4bx-interworking --with-headers=${PREFIX}/${TARGET}/include --with-libelf=${LIBELF_PREFIX} --with-mpc=${MPC_PREFIX}
make AS_FOR_TARGET="${TARGET}-as" LD_FOR_TARGET="${TARGET}-ld" LDFLAGS="-static" all
make install

rm -f ${PREFIX}/bin/${TARGET}-gccbug
strip ${PREFIX}/bin/*
strip ${PREFIX}/${TARGET}/bin/ar
strip ${PREFIX}/${TARGET}/bin/as
strip ${PREFIX}/${TARGET}/bin/c++
strip ${PREFIX}/${TARGET}/bin/g++
strip ${PREFIX}/${TARGET}/bin/gcc
strip ${PREFIX}/${TARGET}/bin/ld
strip ${PREFIX}/${TARGET}/bin/nm
strip ${PREFIX}/${TARGET}/bin/objcopy
strip ${PREFIX}/${TARGET}/bin/objdump
strip ${PREFIX}/${TARGET}/bin/ranlib
strip ${PREFIX}/${TARGET}/bin/strip
strip ${PREFIX}/libexec/gcc/${TARGET}/${GCC_VER}/cc1
strip ${PREFIX}/libexec/gcc/${TARGET}/${GCC_VER}/cc1plus
strip ${PREFIX}/libexec/gcc/${TARGET}/${GCC_VER}/collect2

[build-all.sh]
#!/bin/bash
set -ex

#HOST=i686-pc-linux-gnu
HOST=x86_64-linux-gnu
TARGET=arm-none-linux-gnueabi
DEFAULT_ARCH=armv7
DEFAULT_CPU=cortex-a9

# Specify the source path of each package
BINUTILS_SRC=/opt/binutils-2.21
GCC_VER=4.6.0
GCC_SRC=/opt/gcc-${GCC_VER}
GLIBC_SRC=/opt/src/glibc-2.13
LINUX_HEADER_SRC=/opt/linux-2.6.38

LOCAL_DIR=${PWD}
BUILDPATH=${LOCAL_DIR}/build
PREFIX=/opt/build/${TARGET}-${GCC_VER}
BOOTSTRAP_PREFIX=${BUILDPATH}/${TARGET}-${GCC_VER}
MPFR_PREFIX=/usr
GMP_PREFIX=/usr
MPC_PREFIX=/usr
LIBELF_PREFIX=/usr

unset LD_LIBRARY_PATH
unset LIBRARY_PATH
unset LD_RUN_PATH

if [ -e ${GCC_SRC}/newlib ]; then
  mv ${GCC_SRC}/newlib ${GCC_SRC}/newlib.orig
fi

mkdir -v ${BUILDPATH}
source ${LOCAL_DIR}/1-build-binutils.sh
#source ${LOCAL_DIR}/2-build-gmp-mpfr.sh
source ${LOCAL_DIR}/3-build-headers.sh
if test x"${BOOTSTRAP_PREFIX}" != x"${PREFIX}"; then
    export PATH=${BOOTSTRAP_PREFIX}/bin:${PATH}
fi
export PATH=${PREFIX}/bin:${PATH}
export LD_LIBRARY_PATH=${GMP_PREFIX}/lib:${MPFR_PREFIX}/lib
source ${LOCAL_DIR}/4-build-gcc.sh
source ${LOCAL_DIR}/5-build-glibc.sh
source ${LOCAL_DIR}/6-build-gcc-final.sh

if [ -e ${GCC_SRC}/newlib.orig ]; then
  mv ${GCC_SRC}/newlib.orig ${GCC_SRC}/newlib
fi

沒有留言:

張貼留言