This is the mail archive of the crossgcc@sourceware.org mailing list for the crossgcc project.

See the CrossGCC FAQ for lots more information.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: crosstool-0.38, ppc860, NPTL and gcc4.0.1


Hello list,

again replying to myself (*sigh*)... I was able to compile
the toolchain for ppc860, NPTL and gcc4.0.1-libc-2.3.5
with the following patch to crosstool-0.38.

It's basically the NPTL-patch rediffed against 0.38 with an
added patch for libiberty path issues in patches/gcc-4.0.1.

In addition see the if-condition in line 864 of the patch, here
i added configuration & build of libcpp.

Beware: I haven't tested the toolchain yet!

Best regards,

 Peter

diff -urN crosstool-0.38.orig/crosstool.sh crosstool-0.38/crosstool.sh
--- crosstool-0.38.orig/crosstool.sh	2005-07-21 19:58:19.000000000 +0200
+++ crosstool-0.38/crosstool.sh	2005-08-07 11:34:34.551302360 +0200
@@ -70,23 +70,28 @@
 test -z "$BUILD" && abort "bug: BUILD not set?!"
 
 if test -z "${GLIBC_ADDON_OPTIONS}"; then
-   echo "GLIBC_ADDON_OPTIONS not set, so guessing addons from GLIBCTHREADS_FILENAME and GLIBCCRYPT_FILENAME"
-   # this is lame, need to fix this for nptl later?
-   # (nptl is an addon, but it's shipped in the main tarball)
+   echo "GLIBC_ADDON_OPTIONS not set"
    GLIBC_ADDON_OPTIONS="="
-   case "${GLIBCTHREADS_FILENAME}" in
-     *linuxthreads*) GLIBC_ADDON_OPTIONS="${GLIBC_ADDON_OPTIONS}linuxthreads," ;;
-   esac
+   if test '!' -z ${GLIBC_ADDON_LINUXTHREADS}; then
+       GLIBC_ADDON_OPTIONS="${GLIBC_ADDON_OPTIONS}linuxthreads,"
+   elif test '!' -z ${GLIBC_ADDON_NPTL}; then
+       GLIBC_ADDON_OPTIONS="${GLIBC_ADDON_OPTIONS}nptl,"
+   fi
    # crypt is only an addon for glibc-2.1.x
    test -z "${GLIBCCRYPT_FILENAME}"   || GLIBC_ADDON_OPTIONS="${GLIBC_ADDON_OPTIONS}crypt,"
 fi
 
+if test '!' -z "${GLIBC_ADDON_NPTL}"; then
+    GLIBC_EXTRA_CONFIG="--with-tls --with-__thread ${GLIBC_EXTRA_CONFIG}"
+    GLIBC_MIN_KERNEL=2.6.4
+else
+    GLIBC_EXTRA_CONFIG="--without-tls --without-__thread ${GLIBC_EXTRA_CONFIG}"
+    GLIBC_MIN_KERNEL=2.4.3
+fi
+
 # One is forbidden
 test -z "${LD_LIBRARY_PATH}" || abort  "glibc refuses to build if LD_LIBRARY_PATH is set.  Please unset it before running this script."
 
-# And one is derived.
-GLIBCTHREADS_FILENAME=`echo $GLIBC_DIR | sed 's/glibc-/glibc-linuxthreads-/'`
-
 # Check for a few prerequisites that have tripped people up.
 awk '/x/' < /dev/null  || abort "You need awk to build a toolchain."
 test -z "${CFLAGS}"    || abort "Don't set CFLAGS, it screws up the build"
@@ -442,13 +447,47 @@
     # http://sourceware.org/ml/crossgcc/2005-05/msg00168.html
     cp misc/syscall-list.h $HEADERDIR/bits/syscall.h
 
+    if test '!' -z "${GLIBC_ADDON_NPTL}"; then 
+        # To build gcc with thread support requires real pthread headers. These
+        # will have to manually be copied from under the tree of the desired
+        # target pthread implementation.
+        cp ${GLIBC_DIR}/nptl/sysdeps/pthread/pthread.h $HEADERDIR/pthread.h
+        pthreadtypes_h=nptl/sysdeps/unix/sysv/linux/${ARCH}/bits/pthreadtypes.h
+
+        # On s390, powerpc and sparc we also require bits/wordsize.h.
+        case $TARGET in
+        sparc* | s390* | powerpc* )
+            case $TARGET in
+            sparc64* )   wordsize_h=sysdeps/sparc/sparc64/bits/wordsize.h
+			 pthreadtypes_h=nptl/sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h
+			 ;;
+            sparc* )     wordsize_h=sysdeps/sparc/sparc32/bits/wordsize.h 
+			 pthreadtypes_h=nptl/sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h
+			 ;;
+            s390x* )     wordsize_h=sysdeps/s390/s390x/bits/wordsize.h 
+			 ;;
+            s390* )      wordsize_h=sysdeps/s390/s390/bits/wordsize.h 
+			 ;;
+            powerpc64* ) wordsize_h=sysdeps/powerpc/powerpc64/bits/wordsize.h
+			 pthreadtypes_h=nptl/sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h
+			 ;;
+            powerpc* )   wordsize_h=sysdeps/powerpc/powerpc32/bits/wordsize.h
+			 pthreadtypes_h=nptl/sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h
+			 ;;
+            esac
+            test ! -f $HEADERDIR/bits/wordsize.h && cp ${GLIBC_DIR}/${wordsize_h} $HEADERDIR/bits/wordsize.h
+            cp ${GLIBC_DIR}/${pthreadtypes_h} $HEADERDIR/bits/pthreadtypes.h
+	    ;;
+	esac
+    fi # GLIBC_ADDONS_NPTL
+
     cd ..
 fi
 
 #---------------------------------------------------------
-echo "Build gcc-core (just enough to build glibc)"
+echo "Build gcc-core w/o shared libgcc (just enough to build glibc starfiles)"
 
-mkdir -p build-gcc-core; cd build-gcc-core
+mkdir -p build-gcc-core-static; cd build-gcc-core-static
 
 echo Copy headers to install area of bootstrap gcc, so it can build libgcc2
 mkdir -p $CORE_PREFIX/$TARGET/include
@@ -480,8 +519,124 @@
 
 logresult gcc-core $CORE_PREFIX/bin/${TARGET}-gcc${EXEEXT}
 
+# Following extra steps required for building an NPTL enabled glibc.
+if test '!' -z "${GLIBC_ADDON_NPTL}"; then
+    #---------------------------------------------------------
+    echo "Build glibc startfiles (required for shared libgcc)"
+
+    mkdir -p build-glibc-startfiles; cd build-glibc-startfiles
+
+    # sh4 really needs to set configparms as of gcc-3.4/glibc-2.3.2
+    # note: this is awkward, doesn't work well if you need more than one line in configparms
+    echo ${GLIBC_CONFIGPARMS} > configparms
+
+    echo "libc_cv_forced_unwind=yes" > config.cache
+    echo "libc_cv_c_cleanup=yes" >> config.cache
+    # this here is moot, currently you cannot build nptl for sparc64
+    case ${TARGET} in
+        sparc64* ) echo "libc_cv_sparc64_tls=yes" >> config.cache ;;
+    esac
+
+    if test '!' -f Makefile; then
+        # Configure with --prefix the way we want it on the target...
+        # There are a whole lot of settings here.  You'll probably want
+        # to read up on what they all mean, and customize a bit.
+        # e.g. I picked --enable-kernel=2.4.3 here just because it's the kernel Bill 
+        # used in his example gcc2.95.3 script.  That means some backwards compatibility 
+        # stuff is turned on in glibc that you may not need if you're using a newer kernel.
+        # Compare these options with the ones used when installing the glibc headers above - they're different.
+        # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory" 
+        # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html. 
+        # Set BUILD_CC, or you won't be able to build datafiles
+        # Set --build, else glibc-2.3.2 will think you're not cross-compiling, and try to run the test programs
+
+        BUILD_CC=gcc CFLAGS="$TARGET_CFLAGS" CC="${TARGET}-gcc $GLIBC_EXTRA_CC_ARGS" \
+        AR=${TARGET}-ar RANLIB=${TARGET}-ranlib \
+            ${GLIBC_DIR}/configure --prefix=/usr \
+	    --build=$BUILD --host=$TARGET \
+            ${GLIBC_EXTRA_CONFIG} \
+            --enable-kernel=${GLIBC_MIN_KERNEL} \
+            --without-cvs --disable-profile --disable-debug --without-gd \
+            $SHARED_MODE \
+            --enable-add-ons${GLIBC_ADDON_OPTIONS} --with-headers=$HEADERDIR \
+            --cache-file=config.cache
+    fi
+
+    #TODO: should check whether slibdir has been set in configparms to */lib64
+    #      and copy the startfiles into the appropriate libdir.
+    make csu/subdir_lib
+    
+    test -z "${USE_SYSROOT}" &&
+    cp -fp csu/crt[1in].o ${SYSROOT}/lib/ ||
+    cp -fp csu/crt[1in].o ${SYSROOT}/usr/lib/ 
+
+    cd ..
+
+    #---------------------------------------------------------
+    echo "Build gcc-core w shared libgcc"
+
+    mkdir -p build-gcc-core-shared; cd build-gcc-core-shared
+
+    # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
+
+    if test '!' -f Makefile; then
+        ${GCC_DIR}/configure $CANADIAN_BUILD --target=$TARGET --host=$GCC_HOST --prefix=$PREFIX \
+	    --with-local-prefix=${SYSROOT} \
+	    --disable-multilib \
+            ${GCC_EXTRA_CONFIG} \
+	    ${GCC_SYSROOT_ARG_CORE} \
+	    --disable-nls \
+	    --enable-symvers=gnu \
+	    --enable-__cxa_atexit \
+            --enable-languages=c \
+            --enable-shared
+    fi
+
+    # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
+    #       gcc/config/t-libunwind so -lc is removed from the link for 
+    #       libgcc_s.so, as we do not have a target -lc yet.
+    #       This is not as ugly as it appears to be ;-) All symbols get resolved
+    #       during the glibc build, and we provide a proper libgcc_s.so for the
+    #       cross toolchain during the final gcc build.
+    #
+    #       As we cannot modify the source tree, nor override SHLIB_LC itself
+    #       during configure or make, we have to edit the resultant 
+    #       gcc/libgcc.mk itself to remove -lc from the link.
+    #       This causes us to have to jump through some hoops...
+    #
+    #       To produce libgcc.mk to edit we firstly require libiberty.a,
+    #       so we configure then build it.
+    #       Next we have to configure gcc, create libgcc.mk then edit it...
+    #       So much easier if we just edit the source tree, but hey...
+    if test '!' -f ${GCC_DIR}/gcc/BASE-VER; then
+	make configure-libiberty
+	make -C libiberty libiberty.a
+	make configure-gcc
+	make configure-libcpp
+	make all-libcpp
+    else
+	make configure-gcc
+	make configure-libcpp
+	make configure-build-libiberty
+	make all-libcpp
+	make all-build-libiberty
+    fi
+    make -C gcc libgcc.mk
+
+    if test '!' -f gcc/libgcc.mk-ORIG ; then cp -p gcc/libgcc.mk gcc/libgcc.mk-ORIG; fi
+    sed 's@-lc@@g' < gcc/libgcc.mk-ORIG > gcc/libgcc.mk
+
+    test "$CANADIAN_BUILD" = "" || make $PARALLELMFLAGS all-build-libiberty || true
+    make $PARALLELMFLAGS all-gcc 
+    make install-gcc
+
+    cd ..
+
+    test -x ${PREFIX}/bin/${TARGET}-gcc || abort Build failed during gcc-core 
+
+fi # GLIBC_ADDON_NPTL
 #---------------------------------------------------------
-echo Build glibc and linuxthreads
+echo Build glibc
 
 mkdir -p build-glibc; cd build-glibc
 
@@ -489,6 +644,16 @@
 # note: this is awkward, doesn't work well if you need more than one line in configparms
 echo ${GLIBC_CONFIGPARMS} > configparms
 
+if test '!' -z "${GLIBC_ADDON_NPTL}"; then
+    # Following configure tests fail while cross-compiling
+    echo "libc_cv_forced_unwind=yes" > config.cache
+    echo "libc_cv_c_cleanup=yes" >> config.cache
+    # The following is moot, currently you cannot build nptl for sparc64
+    case ${TARGET} in
+        sparc64* ) echo "libc_cv_sparc64_tls=yes" >> config.cache ;;
+    esac
+fi # GLIBC_ADDON_NPTL
+
 if test '!' -f Makefile; then
     # Configure with --prefix the way we want it on the target...
     # There are a whole lot of settings here.  You'll probably want
@@ -507,11 +672,11 @@
         ${GLIBC_DIR}/configure --prefix=/usr \
         --build=$BUILD --host=$TARGET \
         ${GLIBC_EXTRA_CONFIG} \
-        --enable-kernel=2.4.3 \
+        --enable-kernel=${GLIBC_MIN_KERNEL} \
         --without-cvs --disable-profile --disable-debug --without-gd \
-        --without-tls --without-__thread \
         $SHARED_MODE \
-        --enable-add-ons${GLIBC_ADDON_OPTIONS} --with-headers=$HEADERDIR
+        --enable-add-ons${GLIBC_ADDON_OPTIONS} --with-headers=$HEADERDIR \
+	--cache-file=config.cache
 fi
 
 if grep -l '^install-lib-all:' ${GLIBC_DIR}/Makerules > /dev/null; then
diff -urN crosstool-0.38.orig/crosstool.sh~ crosstool-0.38/crosstool.sh~
--- crosstool-0.38.orig/crosstool.sh~	1970-01-01 01:00:00.000000000 +0100
+++ crosstool-0.38/crosstool.sh~	2005-08-07 11:33:16.575156536 +0200
@@ -0,0 +1,842 @@
+#!/bin/sh
+
+abort() {
+    echo crosstool: $@
+    exec false
+}
+
+# Used to log success or failure of each stage
+logresult() {
+    if test -x $2; then
+        echo crosstool: $1 built ok
+    else
+        abort Build failed during $1
+    fi
+}
+
+#
+# crosstool.sh
+# Build a GNU/Linux toolchain
+#
+# Copyright (c) 2001 by Bill Gatliff, bgat@billgatliff.com 
+# Copyright (c) 2003 by Dan Kegel, Ixia Communications, 
+# Copyright (c) 2004,2005 by Dan Kegel, Google, Inc.
+# All rights reserved.  This script is provided under the terms of the GPL.
+# For questions, comments or improvements see the crossgcc mailing
+# list at http://sources.redhat.com/ml/crossgcc, or contact the
+# authors, but do your homework first.  As Bill says, "THINK!"
+#
+# Meant to be invoked from another shell script.
+# Usage: nine environment variables must be set, namely:
+test -z "${PREFIX}"           && abort "Please set PREFIX to where you want the toolchain installed."
+test -z "${BUILD_DIR}"        && abort "Please set BUILD_DIR to the directory where the tools are to be built"
+test -z "${SRC_DIR}"          && abort "Please set SRC_DIR to the directory where the source tarballs are to be unpacked"
+test -z "${BINUTILS_DIR}"     && abort "Please set BINUTILS_DIR to the bare filename of the binutils tarball or directory"
+test -z "${GCC_DIR}"          && abort "Please set GCC_DIR to the bare filename of the gcc tarball or directory"
+test -z "${GLIBC_DIR}"        && abort "Please set GLIBC_DIR to the bare filename of the glibc tarball or directory"
+test -z "${TARGET}"           && abort "Please set TARGET to the Gnu target identifier (e.g. pentium-linux)"
+test -z "${TARGET_CFLAGS}"    && abort "Please set TARGET_CFLAGS to any compiler flags needed when building glibc (-O recommended)"
+if test -z "${LINUX_SANITIZED_HEADER_DIR}" ; then
+    test -z "${LINUX_DIR}"        && abort "Please set either LINUX_DIR or LINUX_SANITIZED_HEADER_DIR to the bare filename of the tarball or directory containing the kernel headers"
+    LINUX_HEADER_DIR="${LINUX_DIR}"
+else
+    test -n "${LINUX_DIR}"        && echo "You set both LINUX_DIR and LINUX_SANITIZED_HEADER_DIR - ignoring LINUX_DIR"
+    LINUX_HEADER_DIR="${LINUX_SANITIZED_HEADER_DIR}"
+fi
+
+
+# Seventeen or so are optional
+if test -z "${GCC_CORE_DIR}"; then
+    echo "GCC_CORE_DIR not set, so using $GCC_DIR for bootstrap compiler"
+    GCC_CORE_DIR="${GCC_DIR}"
+fi
+test -z "${BINUTILS_EXTRA_CONFIG}" && echo "BINUTILS_EXTRA_CONFIG not set, so not passing any extra options to binutils' configure script"
+test -z "${GCC_EXTRA_CONFIG}"      && echo "GCC_EXTRA_CONFIG not set, so not passing any extra options to gcc's configure script"
+test -z "${GLIBC_EXTRA_CONFIG}"    && echo "GLIBC_EXTRA_CONFIG not set, so not passing any extra options to glibc's configure script"
+test -z "${GLIBC_EXTRA_ENV}"       && echo "GLIBC_EXTRA_ENV not set, so not passing any extra environment variables to glibc's configure script"
+test -z "${GLIBC_EXTRA_CC_ARGS}"   && echo "GLIBC_EXTRA_CC_ARGS not set, so not passing any extra options to gcc when building glibc"
+test -z "${EXTRA_TARGET_CFLAGS}"   && echo "EXTRA_TARGET_CFLAGS not set, so not passing any extra cflags to gcc when building glibc"
+test -z "${USE_SYSROOT}"           && echo "USE_SYSROOT not set, so not configuring with --with-sysroot"
+test -z "${GCC_BUILD}"             && echo "GCC_BUILD not set, assuming BUILD=output of config.guess"
+test -z "${GCC_HOST}"              && echo "GCC_HOST not set, assuming HOST=BUILD"
+test -z "${KERNELCONFIG}" && test ! -f ${LINUX_DIR}/.config  && echo  "KERNELCONFIG not set, and no .config file found, so not configuring linux kernel"
+test -z "${KERNELCONFIG}" || test -r "${KERNELCONFIG}"  || abort  "Can't read file KERNELCONFIG = $KERNELCONFIG, please fix."
+test -z "${SHARED_MODE}" && SHARED_MODE="--enable-shared" && echo "SHARED_MODE not set, so defaulting to --enable-shared"
+test -z "${GCC_LANGUAGES}"         && echo "GCC_LANGUAGES not set, assuming c,c++"
+GCC_LANGUAGES=${GCC_LANGUAGES-"c,c++"}
+TOP_DIR=${TOP_DIR-`pwd`}
+chmod 755 $TOP_DIR/config.guess
+BUILD=${GCC_BUILD-`$TOP_DIR/config.guess`}
+test -z "$BUILD" && abort "bug: BUILD not set?!"
+
+if test -z "${GLIBC_ADDON_OPTIONS}"; then
+   echo "GLIBC_ADDON_OPTIONS not set"
+   GLIBC_ADDON_OPTIONS="="
+   if test '!' -z ${GLIBC_ADDON_LINUXTHREADS}; then
+       GLIBC_ADDON_OPTIONS="${GLIBC_ADDON_OPTIONS}linuxthreads,"
+   elif test '!' -z ${GLIBC_ADDON_NPTL}; then
+       GLIBC_ADDON_OPTIONS="${GLIBC_ADDON_OPTIONS}nptl,"
+   fi
+   # crypt is only an addon for glibc-2.1.x
+   test -z "${GLIBCCRYPT_FILENAME}"   || GLIBC_ADDON_OPTIONS="${GLIBC_ADDON_OPTIONS}crypt,"
+fi
+
+if test '!' -z "${GLIBC_ADDON_NPTL}"; then
+    GLIBC_EXTRA_CONFIG="--with-tls --with-__thread ${GLIBC_EXTRA_CONFIG}"
+    GLIBC_MIN_KERNEL=2.6.4
+else
+    GLIBC_EXTRA_CONFIG="--without-tls --without-__thread ${GLIBC_EXTRA_CONFIG}"
+    GLIBC_MIN_KERNEL=2.4.3
+fi
+
+# One is forbidden
+test -z "${LD_LIBRARY_PATH}" || abort  "glibc refuses to build if LD_LIBRARY_PATH is set.  Please unset it before running this script."
+
+# Check for a few prerequisites that have tripped people up.
+awk '/x/' < /dev/null  || abort "You need awk to build a toolchain."
+test -z "${CFLAGS}"    || abort "Don't set CFLAGS, it screws up the build"
+test -z "${CXXFLAGS}"  || abort "Don't set CXXFLAGS, it screws up the build"
+
+#---------------------------------------------------------
+
+# Save configuration; output every envrionment variable these
+# scripts reference to a text file for future reference.  Name the
+# text file after the target so in a future version of crosstool,
+# when we start installing toolchains for several targets into
+# the same PREFIX, we don't overwrite.
+# FIXME: this is a bit fragile; when adding variables elsewhere,
+# it's easy to forget to add them here.
+# FIXME: this documents some variables obeyed only by e.g.
+# getandpatch.sh and all.sh, so if you invoked crosstool.sh
+# by hand, some of these might be misleading.
+# NOTE: surround with "Begin/end" and echo to stdout so we can grep out of the log later.
+
+echo "Begin saving environment"
+> $PREFIX/$TARGET.crosstoolconfig.txt
+
+set -x
+for var in \
+AR \
+BINUTILS_DIR \
+BINUTILS_EXTRA_CONFIG \
+BUILD \
+BUILD_DIR \
+CC \
+DEJAGNU \
+EXTRA_TARGET_CFLAGS \
+GCC_BUILD \
+GCC_CORE_DIR \
+GCC_DIR \
+GCC_EXTRA_CONFIG \
+GCC_HOST \
+GCC_LANGUAGES \
+GDB_DIR \
+GLIBC_ADDON_OPTIONS \
+GLIBC_DIR \
+GLIBC_EXTRA_CC_ARGS \
+GLIBC_EXTRA_CONFIG \
+GLIBC_EXTRA_ENV \
+JUST_DOWNLOAD \
+KERNELCONFIG \
+LINUX_DIR \
+LINUX_SANITIZED_HEADER_DIR \
+NO_DOWNLOAD  \
+PREFIX \
+PTXDIST_DIR \
+SHARED_MODE \
+SRC_DIR \
+TARBALLS_DIR \
+TARGET \
+TARGET_CFLAGS \
+TOP_DIR \
+USE_SYSROOT \
+; do 
+  eval echo $var=\$$var
+  eval echo $var=\$$var >> $PREFIX/$TARGET.crosstoolconfig.txt
+done
+set +x
+echo "End saving environment"
+
+#---------------------------------------------------------
+
+if test "$GCC_HOST" != ""; then
+        # Modify $BUILD so gcc never, ever thinks $build = $host
+        UNIQUE_BUILD=`echo $BUILD | sed s/-/-build_/`
+        CANADIAN_BUILD="--build=$UNIQUE_BUILD"
+        echo "canadian cross, configuring gcc & binutils with $CANADIAN_BUILD"
+        # make sure we have a host compiler (since $GCC_HOST-gcc won't work)
+        "$CC" --version || abort "Must set CC to a compiler targeting $GCC_HOST.  PATH is $PATH"
+        "$AR" --version || abort "Must set AR to a version of 'ar' targeting $GCC_HOST.  PATH is $PATH"
+        # make sure we have a target compiler (otherwise glibc configure will fail)
+        "$TARGET-gcc" --version || abort "Could not execute $TARGET-gcc.  PATH is $PATH"
+else
+        GCC_HOST=$BUILD
+        CANADIAN_BUILD=""
+fi
+
+
+# Modify GCC_HOST to never be equal to $BUILD or $TARGET
+# This strange operation causes gcc to always generate a cross-compiler
+# even if the build machine is the same kind as the host.
+# This is why CC has to be set when doing a canadian cross;
+# you can't find a host compiler by appending -gcc to our whacky $GCC_HOST
+# Kludge: it is reported that the above causes canadian crosses with
+# cygwin hosts to fail, so avoid it just in that one case.  It would be
+# cleaner to just move this into the non-canadian case
+# above, but I'm afraid that might cause some configure script somewhere
+# to decide that since build==host, they could run host binaries.
+#
+# if host is cygwin and this is not a canadian build, modify GCC_HOST
+case "$GCC_HOST,$CANADIAN_BUILD," in
+*cygwin*,?*,) ;;
+*)            GCC_HOST=`echo $GCC_HOST | sed s/-/-host_/` ;;
+esac
+
+
+# If we're building compilers that run on Windows, remember that their
+# filenames end in .exe
+case "$GCC_HOST" in
+*cygwin*) EXEEXT=".exe" ;;
+*)        EXEEXT="" ;;
+esac
+
+set -ex
+
+# map TARGET to Linux equivalent
+case $TARGET in
+    alpha*)   ARCH=alpha ;;
+    arm*)     ARCH=arm ;;
+    cris*)    ARCH=cris ;;
+    hppa*)    ARCH=parisc ;;
+    i*86*)    ARCH=i386 ;;
+    i4004)    abort "ENOMEM" ;;
+    ia64*)    ARCH=ia64 ;;
+    mips*)    ARCH=mips ;;
+    m68k*)    ARCH=m68k ;;
+    powerpc64*) ARCH=ppc64 ;;
+    powerpc*) ARCH=ppc ;;
+    ppc*)     abort "Target $TARGET incompatible with binutils and gcc regression tests; use target powerpc-* or powerpc64-* instead";;
+    s390*)    ARCH=s390 ;;
+    sh*)      ARCH=sh ;;
+    sparc64*) ARCH=sparc64 ;;
+    sparc*)   ARCH=sparc ;;
+    vax*)     ARCH=vax ;;
+    x86_64*)  ARCH=x86_64 ;;
+    *) abort "Bad target $TARGET"
+esac
+
+# Make all paths absolute (it's so confusing otherwise)
+# FIXME: this doesn't work well with some automounters
+PREFIX=`cd $PREFIX; pwd`
+BUILD_DIR=`cd $BUILD_DIR; pwd`
+SRC_DIR=`cd $SRC_DIR; pwd`
+BINUTILS_DIR=`cd ${SRC_DIR}/${BINUTILS_DIR}; pwd`
+GCC_DIR=`cd ${SRC_DIR}/${GCC_DIR}; pwd`
+GCC_CORE_DIR=`cd ${SRC_DIR}/${GCC_CORE_DIR}; pwd`
+LINUX_HEADER_DIR=`cd ${SRC_DIR}/${LINUX_HEADER_DIR}; pwd`
+GLIBC_DIR=`cd ${SRC_DIR}/${GLIBC_DIR}; pwd`
+
+# Always install the bootstrap gcc (used to build glibc)
+# somewhere it can't interfere with the final gcc.
+CORE_PREFIX=$BUILD_DIR/gcc-core-prefix
+
+# If user isn't doing a canadian cross, add the target compiler's bin to
+# the path, so we can use the compiler we build to build glibc etc.
+if test "$CANADIAN_BUILD" = ""; then
+        PATH="${PREFIX}/bin:$CORE_PREFIX/bin:${PATH}"
+        export PATH
+fi
+
+# test that we have write permissions to the install dir
+mkdir -p ${PREFIX}/${TARGET}
+touch ${PREFIX}/${TARGET}/test-if-write
+test -w ${PREFIX}/${TARGET}/test-if-write || abort "You don't appear to have write permissions to ${PREFIX}/${TARGET}."
+rm -f ${PREFIX}/${TARGET}/test-if-write
+
+if test -z "$USE_SYSROOT"; then
+    # plain old way.  all libraries in prefix/target/lib
+    SYSROOT=${PREFIX}/${TARGET}
+    HEADERDIR=$SYSROOT/include
+    # hack!  Always use --with-sysroot for binutils.
+    # binutils 2.14 and later obey it, older binutils ignore it.
+    # Lets you build a working 32->64 bit cross gcc
+    BINUTILS_SYSROOT_ARG="--with-sysroot=${SYSROOT}"
+    # Use --with-headers, else final gcc will define disable_glibc while building libgcc, and you'll have no profiling
+    GCC_SYSROOT_ARG_CORE="--without-headers"
+    GCC_SYSROOT_ARG="--with-headers=${HEADERDIR}"
+    GLIBC_SYSROOT_ARG=prefix=
+else
+    # spiffy new sysroot way.  libraries split between
+    # prefix/target/sys-root/lib and prefix/target/sys-root/usr/lib
+    SYSROOT=${PREFIX}/${TARGET}/sys-root
+    HEADERDIR=$SYSROOT/usr/include
+    BINUTILS_SYSROOT_ARG="--with-sysroot=${SYSROOT}"
+    GCC_SYSROOT_ARG="--with-sysroot=${SYSROOT}"
+    GCC_SYSROOT_ARG_CORE=$GCC_SYSROOT_ARG
+    GLIBC_SYSROOT_ARG=""
+    # glibc's prefix must be exactly /usr, else --with-sysroot'd
+    # gcc will get confused when $sysroot/usr/include is not present
+    # Note: --prefix=/usr is magic!  See http://www.gnu.org/software/libc/FAQ.html#s-2.2
+fi
+
+# Make lib directory in sysroot, else the ../lib64 hack used by 32 -> 64 bit
+# crosscompilers won't work, and build of final gcc will fail with 
+#  "ld: cannot open crti.o: No such file or directory"
+mkdir -p $SYSROOT/lib
+mkdir -p $SYSROOT/usr/lib
+
+echo
+echo "Building for --target=$TARGET, --prefix=$PREFIX"
+
+#---------------------------------------------------------
+# Use sanitized headers, if available
+if test -z "$LINUX_SANITIZED_HEADER_DIR" ; then
+    echo Prepare kernel headers
+else
+    echo Copy sanitized headers
+fi
+
+cd $LINUX_HEADER_DIR
+mkdir -p $HEADERDIR
+
+# no indentation for now because indentation levels are rising too high
+if test -z "$LINUX_SANITIZED_HEADER_DIR" ; then
+
+if test -f "$KERNELCONFIG" ; then
+    cp $KERNELCONFIG .config
+fi
+if test -f .config; then
+    yes "" | make ARCH=$ARCH oldconfig
+fi
+
+# autodetect kernel version from contents of Makefile
+KERNEL_VERSION=`awk '/^VERSION =/ { print $3 }' $LINUX_HEADER_DIR/Makefile`
+KERNEL_PATCHLEVEL=`awk '/^PATCHLEVEL =/ { print $3 }' $LINUX_HEADER_DIR/Makefile`
+
+case "$KERNEL_VERSION.$KERNEL_PATCHLEVEL.x" in
+2.2.x|2.4.x) make ARCH=$ARCH symlinks    include/linux/version.h
+             ;;
+2.6.x)       case $ARCH in
+             sh*)        # sh does secret stuff in 'make prepare' that can't be triggered separately,
+                         # but happily, it doesn't use target gcc, so we can use it.
+                         # Update: this fails on 2.6.11, as it installs elfconfig.h, which requires target compiler :-(
+                         make ARCH=$ARCH prepare include/linux/version.h
+                         ;;
+             arm*|cris*) make ARCH=$ARCH include/asm include/linux/version.h include/asm-$ARCH/.arch
+                         ;;
+             mips*)      # for linux-2.6, 'make prepare' for mips doesn't 
+                         # actually create any symlinks.  Hope generic is ok.
+                         # Note that glibc ignores all -I flags passed in CFLAGS,
+                         # so you have to use -isystem.
+                         make ARCH=$ARCH include/asm include/linux/version.h
+                         TARGET_CFLAGS="$TARGET_CFLAGS -isystem $LINUX_HEADER_DIR/include/asm-mips/mach-generic"
+                         ;;
+             *)          make ARCH=$ARCH include/asm include/linux/version.h
+                         ;;
+             esac
+             ;;
+*)           abort "Unsupported kernel version $KERNEL_VERSION.$KERNEL_PATCHLEVEL"
+esac
+cp -r include/asm-generic $HEADERDIR/asm-generic
+
+fi # test -z "$LINUX_SANITIZED_HEADER_DIR"
+
+cp -r include/linux $HEADERDIR
+cp -r include/asm-${ARCH} $HEADERDIR/asm
+
+cd $BUILD_DIR
+
+#---------------------------------------------------------
+echo Build binutils
+
+mkdir -p build-binutils; cd build-binutils
+
+if test '!' -f Makefile; then
+    ${BINUTILS_DIR}/configure $CANADIAN_BUILD --target=$TARGET --host=$GCC_HOST --prefix=$PREFIX --disable-nls ${BINUTILS_EXTRA_CONFIG} $BINUTILS_SYSROOT_ARG
+fi
+
+make $PARALLELMFLAGS all 
+make install 
+
+if test x"$CORE_PREFIX" != x"$PREFIX"; then
+    # if we're using a different core compiler, make binutils available to it
+    # gcc searches in $CORE_PREFIX/$TARGET/bin for tools like 'ar', 'as', and 'ld'
+    # instead of the location its configure script claims it searches (gcc_cv_as), grr
+    mkdir -p $CORE_PREFIX/$TARGET/bin
+    for tool in ar as ld strip; do
+       # Remove old symlink to avoid clash on rerun
+       # ln -snf is safe, but not portable.  
+       # Can't test for existence of symlinks reliably
+       # rm -f returns nonzero status on Solaris if it fails, so || true to keep script from aborting
+       rm -f $CORE_PREFIX/$TARGET/bin/$tool || true
+       ln -s $PREFIX/bin/$TARGET-$tool $CORE_PREFIX/$TARGET/bin/$tool
+    done
+fi
+
+cd ..
+
+# test to see if this step passed
+logresult binutils ${PREFIX}/bin/${TARGET}-ld${EXEEXT}
+
+#---------------------------------------------------------
+echo "Install glibc headers needed to build bootstrap compiler -- but only if gcc-3.x"
+
+# Only need to install bootstrap glibc headers for gcc-3.0 and above?  Or maybe just gcc-3.3 and above?
+# See also http://gcc.gnu.org/PR8180, which complains about the need for this step.
+# Don't install them if they're already there (it's really slow)
+if grep -q 'gcc-[34]' ${GCC_CORE_DIR}/ChangeLog && test '!' -f $HEADERDIR/features.h; then
+    mkdir -p build-glibc-headers; cd build-glibc-headers
+
+    if test '!' -f Makefile; then
+        # The following three things have to be done to build glibc-2.3.x, but they don't hurt older versions.
+        # 1. override CC to keep glibc's configure from using $TARGET-gcc. 
+        # 2. disable linuxthreads, which needs a real cross-compiler to generate tcb-offsets.h properly
+        # 3. build with gcc 3.2 or later
+        # Compare these options with the ones used when building glibc for real below - they're different.
+        # As of glibc-2.3.2, to get this step to work for hppa-linux, you need --enable-hacker-mode
+        # so when configure checks to make sure gcc has access to the assembler you just built...
+        # Alternately, we could put ${PREFIX}/${TARGET}/bin on the path.
+        # Set --build so maybe we don't have to specify "cross-compiling=yes" below (haven't tried yet)
+        # Note: the warning
+        # "*** WARNING: Are you sure you do not want to use the `linuxthreads'"
+        # *** add-on?"
+        # is ok here, since all we want are the basic headers at this point.
+        # Override libc_cv_ppc_machine so glibc-cvs doesn't complain
+        # 'a version of binutils that supports .machine "altivec" is needed'.
+        libc_cv_ppc_machine=yes \
+        CC=gcc \
+            ${GLIBC_DIR}/configure --prefix=/usr \
+            --build=$BUILD --host=$TARGET \
+            --without-cvs --disable-sanity-checks --with-headers=$HEADERDIR \
+            --enable-hacker-mode
+    fi
+
+    if grep -q GLIBC_2.3 ${GLIBC_DIR}/ChangeLog; then
+        # glibc-2.3.x passes cross options to $(CC) when generating errlist-compat.c, which fails without a real cross-compiler.
+        # Fortunately, we don't need errlist-compat.c, since we just need .h files, 
+        # so work around this by creating a fake errlist-compat.c and satisfying its dependencies.
+        # Another workaround might be to tell configure to not use any cross options to $(CC).
+        # The real fix would be to get install-headers to not generate errlist-compat.c.
+        # Note: BOOTSTRAP_GCC is used by patches/glibc-2.3.5/glibc-mips-bootstrap-gcc-header-install.patch
+        libc_cv_ppc_machine=yes \
+                make CFLAGS=-DBOOTSTRAP_GCC sysdeps/gnu/errlist.c
+        mkdir -p stdio-common
+        # sleep for 2 seconds for benefit of filesystems with lousy time resolution, like FAT,
+        # so make knows for sure errlist-compat.c doesn't need generating
+        sleep 2
+        touch stdio-common/errlist-compat.c
+    fi
+    # Note: BOOTSTRAP_GCC is used by patches/glibc-2.3.5/glibc-mips-bootstrap-gcc-header-install.patch
+    libc_cv_ppc_machine=yes \
+    make cross-compiling=yes install_root=${SYSROOT} CFLAGS=-DBOOTSTRAP_GCC $GLIBC_SYSROOT_ARG install-headers
+
+    # Two headers -- stubs.h and features.h -- aren't installed by install-headers,
+    # so do them by hand.  We can tolerate an empty stubs.h for the moment.
+    # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html
+
+    mkdir -p $HEADERDIR/gnu
+    touch $HEADERDIR/gnu/stubs.h
+    cp ${GLIBC_DIR}/include/features.h $HEADERDIR/features.h
+    # Building the bootstrap gcc requires either setting inhibit_libc, or
+    # having a copy of stdio_lim.h... see
+    # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html
+    cp bits/stdio_lim.h $HEADERDIR/bits/stdio_lim.h
+    # Following error building gcc-4.0.0's gcj:
+    #  error: bits/syscall.h: No such file or directory
+    # solved by following copy; see
+    # http://sourceware.org/ml/crossgcc/2005-05/msg00168.html
+    cp misc/syscall-list.h $HEADERDIR/bits/syscall.h
+
+    if test '!' -z "${GLIBC_ADDON_NPTL}"; then 
+        # To build gcc with thread support requires real pthread headers. These
+        # will have to manually be copied from under the tree of the desired
+        # target pthread implementation.
+        cp ${GLIBC_DIR}/nptl/sysdeps/pthread/pthread.h $HEADERDIR/pthread.h
+        pthreadtypes_h=nptl/sysdeps/unix/sysv/linux/${ARCH}/bits/pthreadtypes.h
+
+        # On s390, powerpc and sparc we also require bits/wordsize.h.
+        case $TARGET in
+        sparc* | s390* | powerpc* )
+            case $TARGET in
+            sparc64* )   wordsize_h=sysdeps/sparc/sparc64/bits/wordsize.h
+			 pthreadtypes_h=nptl/sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h
+			 ;;
+            sparc* )     wordsize_h=sysdeps/sparc/sparc32/bits/wordsize.h 
+			 pthreadtypes_h=nptl/sysdeps/unix/sysv/linux/sparc/bits/pthreadtypes.h
+			 ;;
+            s390x* )     wordsize_h=sysdeps/s390/s390x/bits/wordsize.h 
+			 ;;
+            s390* )      wordsize_h=sysdeps/s390/s390/bits/wordsize.h 
+			 ;;
+            powerpc64* ) wordsize_h=sysdeps/powerpc/powerpc64/bits/wordsize.h
+			 pthreadtypes_h=nptl/sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h
+			 ;;
+            powerpc* )   wordsize_h=sysdeps/powerpc/powerpc32/bits/wordsize.h
+			 pthreadtypes_h=nptl/sysdeps/unix/sysv/linux/powerpc/bits/pthreadtypes.h
+			 ;;
+            esac
+            test ! -f $HEADERDIR/bits/wordsize.h && cp ${GLIBC_DIR}/${wordsize_h} $HEADERDIR/bits/wordsize.h
+            cp ${GLIBC_DIR}/${pthreadtypes_h} $HEADERDIR/bits/pthreadtypes.h
+	    ;;
+	esac
+    fi # GLIBC_ADDONS_NPTL
+
+    cd ..
+fi
+
+#---------------------------------------------------------
+echo "Build gcc-core w/o shared libgcc (just enough to build glibc starfiles)"
+
+mkdir -p build-gcc-core-static; cd build-gcc-core-static
+
+echo Copy headers to install area of bootstrap gcc, so it can build libgcc2
+mkdir -p $CORE_PREFIX/$TARGET/include
+cp -r $HEADERDIR/* $CORE_PREFIX/$TARGET/include
+
+# Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
+# Use funky prefix so it doesn't contaminate real prefix, in case GCC_DIR != GCC_CORE_DIR
+
+if test '!' -f Makefile; then
+    ${GCC_CORE_DIR}/configure $CANADIAN_BUILD --target=$TARGET --host=$GCC_HOST --prefix=$CORE_PREFIX \
+        --with-local-prefix=${SYSROOT} \
+        --disable-multilib \
+        --with-newlib \
+        ${GCC_EXTRA_CONFIG} \
+        ${GCC_SYSROOT_ARG_CORE} \
+        --disable-nls \
+        --enable-threads=no \
+        --enable-symvers=gnu \
+        --enable-__cxa_atexit \
+        --enable-languages=c \
+        --disable-shared
+fi
+
+test "$CANADIAN_BUILD" = "" || make $PARALLELMFLAGS all-build-libiberty || true
+make $PARALLELMFLAGS all-gcc 
+make install-gcc
+
+cd ..
+
+logresult gcc-core $CORE_PREFIX/bin/${TARGET}-gcc${EXEEXT}
+
+# Following extra steps required for building an NPTL enabled glibc.
+if test '!' -z "${GLIBC_ADDON_NPTL}"; then
+    #---------------------------------------------------------
+    echo "Build glibc startfiles (required for shared libgcc)"
+
+    mkdir -p build-glibc-startfiles; cd build-glibc-startfiles
+
+    # sh4 really needs to set configparms as of gcc-3.4/glibc-2.3.2
+    # note: this is awkward, doesn't work well if you need more than one line in configparms
+    echo ${GLIBC_CONFIGPARMS} > configparms
+
+    echo "libc_cv_forced_unwind=yes" > config.cache
+    echo "libc_cv_c_cleanup=yes" >> config.cache
+    # this here is moot, currently you cannot build nptl for sparc64
+    case ${TARGET} in
+        sparc64* ) echo "libc_cv_sparc64_tls=yes" >> config.cache ;;
+    esac
+
+    if test '!' -f Makefile; then
+        # Configure with --prefix the way we want it on the target...
+        # There are a whole lot of settings here.  You'll probably want
+        # to read up on what they all mean, and customize a bit.
+        # e.g. I picked --enable-kernel=2.4.3 here just because it's the kernel Bill 
+        # used in his example gcc2.95.3 script.  That means some backwards compatibility 
+        # stuff is turned on in glibc that you may not need if you're using a newer kernel.
+        # Compare these options with the ones used when installing the glibc headers above - they're different.
+        # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory" 
+        # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html. 
+        # Set BUILD_CC, or you won't be able to build datafiles
+        # Set --build, else glibc-2.3.2 will think you're not cross-compiling, and try to run the test programs
+
+        BUILD_CC=gcc CFLAGS="$TARGET_CFLAGS" CC="${TARGET}-gcc $GLIBC_EXTRA_CC_ARGS" \
+        AR=${TARGET}-ar RANLIB=${TARGET}-ranlib \
+            ${GLIBC_DIR}/configure --prefix=/usr \
+	    --build=$BUILD --host=$TARGET \
+            ${GLIBC_EXTRA_CONFIG} \
+            --enable-kernel=${GLIBC_MIN_KERNEL} \
+            --without-cvs --disable-profile --disable-debug --without-gd \
+            $SHARED_MODE \
+            --enable-add-ons${GLIBC_ADDON_OPTIONS} --with-headers=$HEADERDIR \
+            --cache-file=config.cache
+    fi
+
+    #TODO: should check whether slibdir has been set in configparms to */lib64
+    #      and copy the startfiles into the appropriate libdir.
+    make csu/subdir_lib
+    
+    test -z "${USE_SYSROOT}" &&
+    cp -fp csu/crt[1in].o ${SYSROOT}/lib/ ||
+    cp -fp csu/crt[1in].o ${SYSROOT}/usr/lib/ 
+
+    cd ..
+
+    #---------------------------------------------------------
+    echo "Build gcc-core w shared libgcc"
+
+    mkdir -p build-gcc-core-shared; cd build-gcc-core-shared
+
+    # Use --with-local-prefix so older gccs don't look in /usr/local (http://gcc.gnu.org/PR10532)
+
+    if test '!' -f Makefile; then
+        ${GCC_DIR}/configure $CANADIAN_BUILD --target=$TARGET --host=$GCC_HOST --prefix=$PREFIX \
+	    --with-local-prefix=${SYSROOT} \
+	    --disable-multilib \
+            ${GCC_EXTRA_CONFIG} \
+	    ${GCC_SYSROOT_ARG_CORE} \
+	    --disable-nls \
+	    --enable-symvers=gnu \
+	    --enable-__cxa_atexit \
+            --enable-languages=c \
+            --enable-shared
+    fi
+
+    # HACK: we need to override SHLIB_LC from gcc/config/t-slibgcc-elf-ver or
+    #       gcc/config/t-libunwind so -lc is removed from the link for 
+    #       libgcc_s.so, as we do not have a target -lc yet.
+    #       This is not as ugly as it appears to be ;-) All symbols get resolved
+    #       during the glibc build, and we provide a proper libgcc_s.so for the
+    #       cross toolchain during the final gcc build.
+    #
+    #       As we cannot modify the source tree, nor override SHLIB_LC itself
+    #       during configure or make, we have to edit the resultant 
+    #       gcc/libgcc.mk itself to remove -lc from the link.
+    #       This causes us to have to jump through some hoops...
+    #
+    #       To produce libgcc.mk to edit we firstly require libiberty.a,
+    #       so we configure then build it.
+    #       Next we have to configure gcc, create libgcc.mk then edit it...
+    #       So much easier if we just edit the source tree, but hey...
+    if test '!' -f ${GCC_DIR}/gcc/BASE-VER; then
+	make configure-libiberty
+	make -C libiberty libiberty.a
+	make configure-gcc
+	make configure-libcpp
+	make all-libcpp
+    else
+        make configure-gcc
+	make configure-libcpp
+	make configure-build-libiberty
+	make all-libcpp
+	make all-build-libiberty
+    fi
+    make -C gcc libgcc.mk
+
+    if test '!' -f gcc/libgcc.mk-ORIG ; then cp -p gcc/libgcc.mk gcc/libgcc.mk-ORIG; fi
+    sed 's@-lc@@g' < gcc/libgcc.mk-ORIG > gcc/libgcc.mk
+
+    test "$CANADIAN_BUILD" = "" || make $PARALLELMFLAGS all-build-libiberty || true
+    make $PARALLELMFLAGS all-gcc 
+    make install-gcc
+
+    cd ..
+
+    test -x ${PREFIX}/bin/${TARGET}-gcc || abort Build failed during gcc-core 
+
+fi # GLIBC_ADDON_NPTL
+#---------------------------------------------------------
+echo Build glibc
+
+mkdir -p build-glibc; cd build-glibc
+
+# sh4 really needs to set configparms as of gcc-3.4/glibc-2.3.2
+# note: this is awkward, doesn't work well if you need more than one line in configparms
+echo ${GLIBC_CONFIGPARMS} > configparms
+
+if test '!' -z "${GLIBC_ADDON_NPTL}"; then
+    # Following configure tests fail while cross-compiling
+    echo "libc_cv_forced_unwind=yes" > config.cache
+    echo "libc_cv_c_cleanup=yes" >> config.cache
+    # The following is moot, currently you cannot build nptl for sparc64
+    case ${TARGET} in
+        sparc64* ) echo "libc_cv_sparc64_tls=yes" >> config.cache ;;
+    esac
+fi # GLIBC_ADDON_NPTL
+
+if test '!' -f Makefile; then
+    # Configure with --prefix the way we want it on the target...
+    # There are a whole lot of settings here.  You'll probably want
+    # to read up on what they all mean, and customize a bit.
+    # e.g. I picked --enable-kernel=2.4.3 here just because it's the kernel Bill 
+    # used in his example gcc2.95.3 script.  That means some backwards compatibility 
+    # stuff is turned on in glibc that you may not need if you're using a newer kernel.
+    # Compare these options with the ones used when installing the glibc headers above - they're different.
+    # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory" 
+    # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html. 
+    # Set BUILD_CC, or you won't be able to build datafiles
+    # Set --build, else glibc-2.3.2 will think you're not cross-compiling, and try to run the test programs
+
+    BUILD_CC=gcc CFLAGS="$TARGET_CFLAGS $EXTRA_TARGET_CFLAGS" CC="${TARGET}-gcc $GLIBC_EXTRA_CC_ARGS" \
+    AR=${TARGET}-ar RANLIB=${TARGET}-ranlib \
+        ${GLIBC_DIR}/configure --prefix=/usr \
+        --build=$BUILD --host=$TARGET \
+        ${GLIBC_EXTRA_CONFIG} \
+        --enable-kernel=${GLIBC_MIN_KERNEL} \
+        --without-cvs --disable-profile --disable-debug --without-gd \
+        $SHARED_MODE \
+        --enable-add-ons${GLIBC_ADDON_OPTIONS} --with-headers=$HEADERDIR \
+	--cache-file=config.cache
+fi
+
+if grep -l '^install-lib-all:' ${GLIBC_DIR}/Makerules > /dev/null; then
+    # nptl-era glibc.
+    # If the install-lib-all target (which is added by our make-install-lib-all.patch) is present,
+    # it means we're building glibc-2.3.3 or later, and we can't build programs yet,
+    # as they require libeh, which won't be installed until full build of gcc
+    GLIBC_INITIAL_BUILD_RULE=lib
+    GLIBC_INITIAL_INSTALL_RULE="install-lib-all install-headers"
+    GLIBC_INSTALL_APPS_LATER=yes
+else
+    # classic glibc.  
+    # We can build and install everything with the bootstrap compiler.
+    GLIBC_INITIAL_BUILD_RULE=all
+    GLIBC_INITIAL_INSTALL_RULE=install
+    GLIBC_INSTALL_APPS_LATER=no
+fi
+# If this fails with an error like this:
+# ...  linux/autoconf.h: No such file or directory 
+# then you need to set the KERNELCONFIG variable to point to a .config file for this arch.
+# The following architectures are known to need kernel .config: alpha, arm, ia64, s390, sh, sparc
+# Note: LD and RANLIB needed by glibc-2.1.3's c_stub directory, at least on macosx
+# No need for PARALLELMFLAGS here, Makefile already reads this environment variable
+make LD=${TARGET}-ld RANLIB=${TARGET}-ranlib $GLIBC_INITIAL_BUILD_RULE
+make install_root=${SYSROOT} $GLIBC_SYSROOT_ARG $GLIBC_INITIAL_INSTALL_RULE
+
+# This doesn't seem to work when building a crosscompiler,
+# as it tries to execute localedef using the just-built ld.so!?
+#make localedata/install-locales install_root=${SYSROOT}
+
+# Fix problems in linker scripts.
+# 
+# 1. Remove absolute paths
+# Any file in a list of known suspects that isn't a symlink is assumed to be a linker script.
+# FIXME: test -h is not portable
+# FIXME: probably need to check more files than just these three...
+# Need to use sed instead of just assuming we know what's in libc.so because otherwise alpha breaks
+# But won't need to do this at all once we use --with-sysroot (available in gcc-3.3.3 and up)
+#
+# 2. Remove lines containing BUG per http://sources.redhat.com/ml/bug-glibc/2003-05/msg00055.html,
+# needed to fix gcc-3.2.3/glibc-2.3.2 targeting arm
+#
+# To make "strip *.so.*" not fail (ptxdist does this), rename to .so_orig rather than .so.orig
+for file in libc.so libpthread.so libgcc_s.so; do
+  for lib in lib lib64 usr/lib usr/lib64; do
+        if test -f ${SYSROOT}/$lib/$file && test ! -h ${SYSROOT}/$lib/$file; then
+                mv ${SYSROOT}/$lib/$file ${SYSROOT}/$lib/${file}_orig
+                if test -z "$USE_SYSROOT"; then
+                  sed 's,/usr/lib/,,g;s,/usr/lib64/,,g;s,/lib/,,g;s,/lib64/,,g;/BUG in libc.scripts.output-format.sed/d' < ${SYSROOT}/$lib/${file}_orig > ${SYSROOT}/$lib/$file
+                else
+                  sed '/BUG in libc.scripts.output-format.sed/d' < ${SYSROOT}/$lib/${file}_orig > ${SYSROOT}/$lib/$file
+                fi
+        fi
+    done
+done
+cd ..
+
+test -f ${SYSROOT}/lib/libc.a || test -f ${SYSROOT}/lib64/libc.a || test -f ${SYSROOT}/usr/lib/libc.a || test -f ${SYSROOT}/usr/lib64/libc.a || abort Building libc failed
+
+#---------------------------------------------------------
+echo Build final gcc
+
+mkdir -p build-gcc; cd build-gcc
+
+if test '!' -f Makefile; then
+    # --enable-symvers=gnu really only needed for sh4 to work around a detection problem
+    # only matters for gcc-3.2.x and later, I think
+    # --disable-nls to work around crash bug on ppc405, but also because embedded
+    # systems don't really need message catalogs...
+    ${GCC_DIR}/configure $CANADIAN_BUILD --target=$TARGET --host=$GCC_HOST --prefix=$PREFIX \
+        ${GCC_EXTRA_CONFIG} \
+        $GCC_SYSROOT_ARG \
+        --with-local-prefix=${SYSROOT} \
+        --disable-nls \
+        --enable-threads=posix \
+        --enable-symvers=gnu \
+        --enable-__cxa_atexit \
+        --enable-languages="$GCC_LANGUAGES" \
+         $SHARED_MODE \
+        --enable-c99 \
+        --enable-long-long
+fi
+
+test "$CANADIAN_BUILD" = "" || make $PARALLELMFLAGS all-build-libiberty || true
+
+# Idea from <cort.dougan at gmail.com>:
+# Fix lib/lib64 confusion for GCC 3.3.3 on PowerPC64 and x86_64.
+# GCC 3.4.0 and up don't suffer from this confusion, and don't need this kludge.
+# FIXME: we should patch gcc's source rather than uglify crosstool.sh.
+# FIXME: is this needed for gcc-3.3.[56]?
+
+case `basename ${GCC_DIR}` in
+  gcc-3.3.[34])
+    case ${TARGET} in
+        powerpc64-unknown-linux-gnu|x86_64-unknown-linux-gnu)
+            for x in `find ${SYSROOT} -name lib -type d -empty`; do
+                echo $x
+                if [ -d `dirname $x`/lib64 ] ; then
+                    rm -rf $x
+                    ln -s `dirname $x`/lib64 $x
+                fi
+            done
+            ;;
+        *)
+          ;;
+    esac
+    ;;
+  *)
+    ;;
+esac
+
+make $PARALLELMFLAGS all 
+make install 
+
+# FIXME: shouldn't people who want this just --disable-multilib in final gcc and be done with it?
+# This code should probably be deleted, it was written long ago and hasn't been tested in ages.
+echo "kludge: If the chip does not have a floating point unit "
+echo "(i.e. if GLIBC_EXTRA_CONFIG contains --without-fp),"
+echo "and there are shared libraries in /lib/nof, copy them to /lib"
+echo "so they get used by default."
+echo "FIXME: only rs6000/powerpc seem to use nof.  See MULTILIB_DIRNAMES"
+echo "in $GCC_DIR/gcc/config/$TARGET/* to see what your arch calls it."
+case "$GLIBC_EXTRA_CONFIG" in
+   *--without-fp*)
+      if test -d ${SYSROOT}/lib/nof; then
+          cp -af ${SYSROOT}/lib/nof/*.so* ${SYSROOT}/lib || echo "Warning: lib/nof not found.  Ignoring."
+      fi
+      ;;
+esac
+
+cd ..
+
+logresult "final gcc" ${PREFIX}/bin/${TARGET}-gcc${EXEEXT}
+
+# Finally, build and install glibc programs, now that libeh (if any) is installed
+# Don't do this unless needed, 'cause it causes glibc-2.{1.3,2.2} to fail here with
+# .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__deregister_frame_info'
+# .../gcc-3.4.1-glibc-2.1.3/build-glibc/libc.so.6: undefined reference to `__register_frame_info'
+if test x$GLIBC_INSTALL_APPS_LATER = xyes;
+then
+  cd build-glibc
+  make LD=${TARGET}-ld RANLIB=${TARGET}-ranlib
+  # note: should do full install and then fix linker scripts, but this is faster
+  make install_root=${SYSROOT} $GLIBC_SYSROOT_ARG install-bin install-rootsbin install-sbin install-data install-others
+fi
+
+#---------------------------------------------------------
+
+# Create masquerade directory $PREFIX/distributed/bin for distcc
+# Relies on $EXEEXT being set to .exe if the compilers run on cygwin
+export EXEEXT
+cd $PREFIX
+sh $TOP_DIR/masq.sh
+
+# Build little program that lets user move resulting toolchain to different prefix
+cd $TOP_DIR
+gcc fix-embedded-paths.c -o $PREFIX/bin/fix-embedded-paths
+
+
+#---------------------------------------------------------
+echo Cross-toolchain build complete.  Result in ${PREFIX}.
+exit 0
+
diff -urN crosstool-0.38.orig/patches/gcc-4.0.1/libiberty.patch crosstool-0.38/patches/gcc-4.0.1/libiberty.patch
--- crosstool-0.38.orig/patches/gcc-4.0.1/libiberty.patch	1970-01-01 01:00:00.000000000 +0100
+++ crosstool-0.38/patches/gcc-4.0.1/libiberty.patch	2005-08-05 22:16:02.000000000 +0200
@@ -0,0 +1,11 @@
+--- gcc-4.0.1.orig/gcc/Makefile.in	2005-04-04 21:45:13.000000000 +0200
++++ gcc-4.0.1/gcc/Makefile.in	2005-08-05 22:12:56.544994408 +0200
+@@ -757,7 +757,7 @@
+ 
+ # Build and host support libraries.
+ LIBIBERTY = ../libiberty/libiberty.a
+-BUILD_LIBIBERTY = ../$(build_subdir)/libiberty/libiberty.a
++BUILD_LIBIBERTY = ../libiberty/libiberty.a
+ 
+ # Dependencies on the intl and portability libraries.
+ LIBDEPS= $(CPPLIB) $(LIBIBERTY) $(LIBINTL_DEP) $(LIBICONV_DEP)

------
Want more information?  See the CrossGCC FAQ, http://www.objsw.com/CrossGCC/
Want to unsubscribe? Send a note to crossgcc-unsubscribe@sources.redhat.com

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]