Mercurial > hg > aboriginal
changeset 823:3c6565240019
Oops. Commit the new file from 820.
author | Rob Landley <rob@landley.net> |
---|---|
date | Thu, 17 Sep 2009 14:11:56 -0500 |
parents | e9f15e7a1896 |
children | 3c81b6825017 |
files | sources/sections/binutils-gcc.sh |
diffstat | 1 files changed, 181 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sources/sections/binutils-gcc.sh Thu Sep 17 14:11:56 2009 -0500 @@ -0,0 +1,181 @@ +Build binutils, c wrapper, and uClibc++ + +# Build binutils, which provides the linker and assembler and such. + +# PROGRAM_PREFIX affects the name of the generated tools, ala "${ARCH}-". + +setupfor binutils + +# The binutils ./configure stage is _really_stupid_, and we need to define +# lots of environment variables to make it behave. + +function configure_binutils() +{ + "$CURSRC/configure" --prefix="$STAGE_DIR" \ + --build="$CROSS_HOST" --host="$FROM_HOST" --target="$CROSS_TARGET" \ + --disable-nls --disable-shared --disable-multilib --disable-werror \ + --with-lib-path=lib --program-prefix="$PROGRAM_PREFIX" $BINUTILS_FLAGS + + [ $? -ne 0 ] && dienow +} + +if [ -z "$FROM_ARCH" ] +then + # Create a simple cross compiler, from this host to target $ARCH. + # This has no prerequisites. + + # The binutils ./configure stage is _really_stupid_. Define lots of + # environment variables to make it behave. + + AR=ar AS=as LD=ld NM=nm OBJDUMP=objdump OBJCOPY=objcopy configure_binutils +else + # Canadian cross for an arbitrary host/target. The new compiler will run + # on $FROM_ARCH as its host, and build executables for $ARCH as its target. + # (Use host==target to produce a native compiler.) Doing this requires + # existing host ($FROM_ARCH) _and_ target ($ARCH) cross compilers as + # prerequisites. + + AR="${FROM_ARCH}-ar" CC="${FROM_ARCH}-cc" configure_binutils +fi + +# Now that it's configured, build and install binutils + +make -j $CPUS configure-host && +make -j $CPUS CFLAGS="-O2 $STATIC_FLAGS" && +make -j $CPUS install && +mkdir -p "$STAGE_DIR/include" && +cp "$CURSRC/include/libiberty.h" "$STAGE_DIR/include" + +cleanup build-binutils + +# Force gcc to build, largely against its will. + +setupfor gcc-core build-gcc +setupfor gcc-g++ build-gcc gcc-core + +# GCC tries to "help out in the kitchen" by screwing up the kernel include +# files. Surgery with sed to cut out that horrible idea throw it away. + +sed -i 's@^STMP_FIX.*@@' "${CURSRC}/gcc/Makefile.in" || dienow + +# The gcc ./configure manages to make the binutils one look sane. Again, +# wrap it so we can call it with different variables to beat sense out of it. + +function configure_gcc() +{ + "$CURSRC/configure" --target="$CROSS_TARGET" --prefix="$STAGE_DIR" \ + --disable-multilib --disable-nls --enable-c99 --enable-long-long \ + --enable-__cxa_atexit --enable-languages=c,c++ --disable-libstdcxx-pch \ + --program-prefix="$PROGRAM_PREFIX" "$@" $GCC_FLAGS && + mkdir -p gcc && + ln -s `which ${CC_FOR_TARGET:-cc}` gcc/xgcc || dienow +} + +if [ -z "$FROM_ARCH" ] +then + # Produce a standard host->target cross compiler, which does not include + # thread support or libgcc_s.so to make it depend on the host less. + + # The only prerequisite for this is binutils, above. (It doesn't even + # require a C library for the target to exist yet, which is good because you + # have a chicken and egg problem otherwise. What would you have compiled + # that C library _with_?) + + AR_FOR_TARGET="${ARCH}-ar" configure_gcc \ + --disable-threads --disable-shared --host="$CROSS_HOST" +else + # Canadian cross a compiler to run on $FROM_ARCH as its host and output + # binaries for $ARCH as its target. + + # GCC has some deep assumptions here, which are wrong. Lots of redundant + # corrections are required to make it stop. + + CC="${FROM_ARCH}-cc" AR="${FROM_ARCH}-ar" AS="${FROM_ARCH}-as" \ + LD="${FROM_ARCH}-ld" NM="${FROM_ARCH}-nm" \ + CC_FOR_TARGET="${ARCH}-cc" AR_FOR_TARGET="${ARCH}-ar" \ + NM_FOR_TARGET="${ARCH}-nm" GCC_FOR_TARGET="${ARCH}-cc" \ + AS_FOR_TARGET="${ARCH}-as" LD_FOR_TARGET="${ARCH}-ld" \ + CXX_FOR_TARGET="${ARCH}-c++" \ + ac_cv_path_AR_FOR_TARGET="${ARCH}-ar" \ + ac_cv_path_RANLIB_FOR_TARGET="${ARCH}-ranlib" \ + ac_cv_path_NM_FOR_TARGET="${ARCH}-nm" \ + ac_cv_path_AS_FOR_TARGET="${ARCH}-as" \ + ac_cv_path_LD_FOR_TARGET="${ARCH}-ld" \ + configure_gcc --enable-threads=posix --enable-shared \ + --build="$CROSS_HOST" --host="$CROSS_TARGET" +fi + +# Now that it's configured, build and install gcc + +make -j $CPUS configure-host && +make -j $CPUS all-gcc LDFLAGS="$STATIC_FLAGS" && + +# Work around gcc bug; we disabled multilib but it doesn't always notice. + +ln -s lib "$STAGE_DIR/lib64" && +make -j $CPUS install-gcc && +rm "$STAGE_DIR/lib64" && +ln -s "${PROGRAM_PREFIX}gcc" "$STAGE_DIR/bin/${PROGRAM_PREFIX}cc" || dienow + +# Now we need to beat libsupc++ out of gcc (which uClibc++ needs to build). +# But don't want to build the whole of libstdc++-v3 because +# A) we're using uClibc++ instead, B) the build breaks. + +if [ ! -z "$FROM_ARCH" ] +then + # The libsupc++ ./configure dies if run after the simple cross compiling + # ./configure, because gcc's build system is overcomplicated crap. So + # skip the uClibc++ build first time around. We still build C++ support + # in gcc because we need it to canadian cross build uClibc++ later. + + make -j $CPUS configure-target-libstdc++-v3 && + cd "$CROSS_TARGET"/libstdc++-v3/libsupc++ && + make -j $CPUS && + mv .libs/libsupc++.a "$STAGE_DIR"/lib || dienow +fi + +# We're done with that source and could theoretically cleanup gcc-core and +# build-gcc here, but we still need the timestamps if we do binary package +# tarballs. + +function build_ccwrap() +{ + # build and install gcc wrapper script. + + TEMP="${FROM_ARCH}-cc" + [ -z "$FROM_ARCH" ] && TEMP="$CC" + + mv "$STAGE_DIR/bin/${PROGRAM_PREFIX}"{gcc,rawgcc} && + "$TEMP" "$SOURCES/toys/ccwrap.c" -Os -s \ + -o "$STAGE_DIR/bin/${PROGRAM_PREFIX}gcc" "$@" $STATIC_FLAGS \ + -DGCC_UNWRAPPED_NAME='"'"${PROGRAM_PREFIX}rawgcc"'"' && + + # Move the gcc internal libraries and headers somewhere sane + + mkdir -p "$STAGE_DIR"/gcc && + mv "$STAGE_DIR"/lib/gcc/*/*/include "$STAGE_DIR"/gcc/include && + mv "$STAGE_DIR"/lib/gcc/*/* "$STAGE_DIR"/gcc/lib && + + # Rub gcc's nose in the binutils output. (It's RIGHT THERE! Find it!) + + cd "$STAGE_DIR"/libexec/gcc/*/*/ && + cp -s "../../../../$CROSS_TARGET/bin/"* . && + + # Wrap C++ too. + + mv "$STAGE_DIR/bin/${PROGRAM_PREFIX}"{g++,rawg++} && + rm "$STAGE_DIR/bin/${PROGRAM_PREFIX}c++" && + ln -s "$STAGE_DIR/bin/${PROGRAM_PREFIX}"{rawg++,rawc++} && + ln -s "$STAGE_DIR/bin/${PROGRAM_PREFIX}"{gcc,g++} && + ln -s "$STAGE_DIR/bin/${PROGRAM_PREFIX}"{gcc,c++} || dienow +} + +if [ -z "$FROM_ARCH" ] +then + build_ccwrap +else + build_ccwrap -DGIMME_AN_S +fi + +mv "$WORK"/{gcc-core,gcc} +PACKAGE=gcc cleanup build-gcc "${STAGE_DIR}"/{lib/gcc,{libexec/gcc,gcc/lib}/install-tools,bin/${ARCH}-unknown-*}