version="4.2.4" prepare_settings() { if [ "$GCCARCHTUPLE" = "" ]; then echo "At least GCCARCHTUPLE must be set prior to compilation." exit 1 fi if [ "$GCCARCH" = "" ]; then GCCARCH="$(echo "$GCCARCHTUPLE" | sed -e 's/\([^-]*\).*/\1/')" fi if [ "$GCCARCHFAMILY" = "" ]; then case "$GCCARCH" in i*86) GCCARCHFAMILY="i386" ;; arm*) GCCARCHFAMILY="arm" ;; powerpc*) GCCARCHFAMILY="powerpc" ;; mips*) GCCARCHFAMILY="mips" ;; sparc*) GCCARCHFAMILY="sparc" ;; *) GCCARCHFAMILY="$GCCARCH" ;; esac fi ### is this an uclibc build? if echo "$GCCARCHTUPLE" | grep -i uclibc >& /dev/null then GCCLIBC="uclibc" else GCCLIBC="glibc" fi ### INITIALIZE TARGETDIR="$MLS_STAGING/usr/gcc4-$GCCARCHTUPLE" SYSROOT="$TARGETDIR/sysroot-$GCCARCHTUPLE" mkdir -p "$SYSROOT" PATH="$TARGETDIR/bin:$TARGETDIR/gcc-core/bin:$PATH" LOCAL="$(gcc -dumpmachine)" if [ "$GCCARCHFAMILY" != "powerpc" ]; then WITHARCH="--with-arch=$GCCARCH" else WITHARCH="" fi if [ "$MLS_SOURCES" = "" ]; then MLS_SOURCES="." fi } showconfig() { prepare_settings echo "To be compiled as follows:" echo echo "GCCARCHTUPLE: $GCCARCHTUPLE" echo "GCCARCH: $GCCARCH" echo "GCCARCHFAMILY: $GCCARCHFAMILY" echo "GCCLIBC: $GCCLIBC" echo echo "TARGETDIR: $TARGETDIR" echo "SYSROOT: $SYSROOT" echo "LOCAL: $LOCAL" echo } prepare() { prepare_settings init_prepare mkdir -p "$MLS_WORKDIR" cd "$MLS_WORKDIR" mls-extract "http://ftp.gnu.org/gnu/binutils/binutils-2.18.tar.bz2" mls-extract "http://cross-lfs.org/files/packages/embedded-0.0.1/linux-headers-2.6.20.1-02252007.tar.bz2" mls-extract "http://ftp.gnu.org/gnu/gcc/gcc-4.2.4/gcc-core-4.2.4.tar.bz2" mls-extract "http://ftp.gnu.org/gnu/gcc/gcc-4.2.4/gcc-g++-4.2.4.tar.bz2" if [ "$GCCLIBC" = "glibc" ]; then mls-extract "http://ftp.gnu.org/gnu/glibc/glibc-2.7.tar.bz2" mls-extract "http://ftp.gnu.org/gnu/glibc/glibc-ports-2.7.tar.bz2" mv -v glibc-ports-2.7 glibc-2.7/ mls-patch -p0 "$MLS_SPECSRC"/glibc_2.7.all.libgcc_eh.p0.patch fi if [ "$GCCLIBC" = "uclibc" ]; then mls-extract "http://www.uclibc.org/downloads/uClibc-0.9.29.tar.bz2" fi mls-extract "http://www.kegel.com/crosstool/crosstool-0.43/fix-embedded-paths.c" gcc -o fix-embedded-paths "$MLS_SOURCES/fix-embedded-paths.c" } configure() { prepare_settings init_configure } build_linux_headers() { prepare_settings init_build mkdir -p "$SYSROOT/usr/include" cp -Rva "$MLS_WORKDIR"/linux-headers-2.6.20.1/include/* "$SYSROOT/usr/include" rm -f "$SYSROOT/usr/include/asm" ln -s asm-$GCCARCHFAMILY "$SYSROOT/usr/include/asm" ls "$SYSROOT/usr/include/asm/" > /dev/null } build_binutils() { prepare_settings init_build cd "$MLS_WORKDIR" rm -rf binutils-work mkdir -p binutils-work cd binutils-work ../binutils-2.18/configure --prefix="$TARGETDIR" --target="$GCCARCHTUPLE" --disable-nls --enable-shared \ --disable-multilib --with-sysroot="$SYSROOT" make configure make make install cd "$MLS_WORKDIR" rm -rf binutils-work } build_glibc_headers() { prepare_settings init_build cd "$MLS_WORKDIR" rm -rf glibc-work mkdir -p glibc-work cd glibc-work if [ "$GCCARCHFAMILY" = "powerpc" ]; then echo "libc_cv_mlong_double_128ibm=yes" > config.cache echo "libc_cv_mlong_double_128=yes" >> config.cache echo "libc_cv_ppc_machine=yes" >> config.cache fi CC="gcc" ../glibc-2.7/configure --prefix="/usr" --host="$GCCARCHTUPLE" --disable-profile --with-tls \ --enable-kernel=2.6.0 --with-__thread --cache-file=config.cache --disable-debug --disable-gd \ --with-headers="$SYSROOT/usr/include" make install-headers install_root="$SYSROOT" mkdir -p "$SYSROOT/usr/include/bits" cp -v bits/stdio_lim.h "$SYSROOT/usr/include/bits/" mkdir -p "$SYSROOT/usr/include/gnu" touch "$SYSROOT/usr/include/gnu/stubs.h" cd "$MLS_WORKDIR" rm -rf glibc-work } configure_uclibc() { make defconfig ARCH="$GCCARCHFAMILY" if echo "$GCCARCHTUPLE" | grep -i eabi >& /dev/null then sed -i -e 's/CONFIG_ARM_OABI=.*/# CONFIG_ARM_OABI is not set/g' .config sed -i -e 's/# CONFIG_ARM_EABI is not set/CONFIG_ARM_EABI=y/g' .config fi sed -i \ -e "/^KERNEL_HEADERS/s:=.*:=\"${SYSROOT}/usr/include\":" \ -e "/^SHARED_LIB_LOADER_PREFIX/s:=.*:=\"/lib\":" \ -e "/^DEVEL_PREFIX/s:=.*:=\"/usr\":" \ -e "/^RUNTIME_PREFIX/s:=.*:=\"/\":" \ .config make oldconfig } build_uclibc_headers() { prepare_settings init_build cd "$MLS_WORKDIR/uClibc-"* configure_uclibc make headers make PREFIX="$SYSROOT" install_headers } build_core_gcc() { prepare_settings init_build cd "$MLS_WORKDIR" rm -rf core-gcc-work mkdir -p core-gcc-work cd core-gcc-work ../gcc-4.2.4/configure --prefix="$TARGETDIR/gcc-core" --target="$GCCARCHTUPLE" --disable-multilib --disable-nls \ --disable-shared --disable-threads --enable-languages=c --with-sysroot="$SYSROOT" $WITHARCH make all-gcc make install-gcc cd "$MLS_WORKDIR" rm -rf core-gcc-work ### ENABLE THE NEWLY COMPILED BINUTILS HERE rm -fv "$TARGETDIR/gcc-core/$GCCARCHTUPLE/bin" ln -vs "$TARGETDIR/$GCCARCHTUPLE/bin" "$TARGETDIR/gcc-core/$GCCARCHTUPLE/bin" } build_glibc() { prepare_settings init_build cd "$MLS_WORKDIR" rm -rf glibc-work mkdir -p glibc-work cd glibc-work echo "libc_cv_forced_unwind=yes" > config.cache echo "libc_cv_c_cleanup=yes" >> config.cache echo "libc_cv_arm_tls=yes" >> config.cache BUILD_CC="gcc" CC="$GCCARCHTUPLE-gcc" AR="$GCCARCHTUPLE-ar" RANLIB="$GCCARCHTUPLE-ranlib" ../glibc-2.7/configure \ --prefix="/usr" \ --host="$GCCARCHTUPLE" --build="$LOCAL" --disable-profile --enable-add-ons --enable-kernel=2.6.0 --with-__thread \ --cache-file=config.cache --disable-debug --disable-gd --with-headers="$SYSROOT/usr/include" --without-selinux make LANGUAGE=C LC_ALL=C make install_root="$SYSROOT" install cd "$MLS_WORKDIR" rm -rf glibc-work } build_uclibc() { prepare_settings init_build cd "$MLS_WORKDIR/uClibc-"* configure_uclibc make CROSS="$GCCARCHTUPLE-" make PREFIX="$SYSROOT" install } build_gcc() { prepare_settings init_build cd "$MLS_WORKDIR" rm -rf gcc-work mkdir -p gcc-work cd gcc-work ../gcc-4.2.4/configure --prefix="$TARGETDIR" --target="$GCCARCHTUPLE" --disable-multilib --disable-nls --enable-shared \ --enable-threads=posix --enable-languages=c,c++ --enable-__cxa_atexit \ --with-sysroot="$SYSROOT" --with-headers="$SYSROOT/usr/include" $WITHARCH make make install cd "$MLS_WORKDIR" rm -rf gcc-work } build() { prepare_settings init_build ### LINUX HEADERS if [ ! -d "$SYSROOT/usr/include/asm" ]; then build_linux_headers fi ### BINUTILS if [ ! -f "$TARGETDIR/bin/$GCCARCHTUPLE-ld" ]; then build_binutils fi if [ "$GCCLIBC" = "glibc" ]; then ### GLIBC HEADERS if [ ! -f "$SYSROOT/usr/include/bits/stdio_lim.h" ]; then build_glibc_headers fi fi if [ "$GCCLIBC" = "uclibc" ]; then ### UCLIBC HEADERS build_uclibc_headers fi ### CORE GCC if [ ! -d "$TARGETDIR/gcc-core" ]; then build_core_gcc fi if [ "$GCCLIBC" = "glibc" ]; then ### GLIBC if [ ! -d "$SYSROOT/lib" ]; then build_glibc fi fi if [ "$GCCLIBC" = "uclibc" ]; then ### UCLIBC if [ ! -d "$SYSROOT/lib" ]; then build_uclibc fi fi ### FINAL GCC if [ ! -f "$TARGETDIR/bin/$GCCARCHTUPLE-g++" ]; then build_gcc fi } install() { prepare_settings init_install if [ -d "$TARGETDIR/gcc-core" ]; then rm -rfv "$TARGETDIR/gcc-core" fi rm -rfv "$TARGETDIR"/lib/libiberty.a "$TARGETDIR"/man/man7/* "$TARGETDIR"/info rmdir "$TARGETDIR/include" || true echo '*** Fixing embedded paths in GCC files.. ' ./fix-embedded-paths "$TARGETDIR" "/usr/gcc4-$GCCARCHTUPLE" "$TARGETDIR" mkdir -p "$MLS_STAGING/usr/bin" (cd "$MLS_STAGING/usr/gcc4-$GCCARCHTUPLE/bin" for i in * do ln -s "../gcc4-$GCCARCHTUPLE/bin/$i" "$MLS_STAGING/usr/bin/" done) } installer() { prepare_settings init_installer mls-make-deb --mls --package="gcc4-$GCCARCHTUPLE" } deploy_files() { prepare_settings ls "gcc4-$GCCARCHTUPLE"_* 2>/dev/null || true }