scripts/crosstool-NG.sh.in
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jul 10 00:02:05 2011 +0200 (2011-07-10)
branch1.11
changeset 2556 1c0580ebdf9d
parent 2381 0ca0f85a4b2a
child 2558 b7317d2fe0e9
permissions -rw-r--r--
scripts: on startup, also remove the buildtools dir

In case there's one lingering around (whether the previous build was
successful, or failed), we have to remove the buildtools directory
as well as the toochain build dir.

This should also fix the case where out makeinfo wrapper calls
itself recursively.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
(transplanted from 0e8ff57073838afea8830fe09d1d01cdf7cb37d8)
     1 #!@@CT_bash@@
     2 # Copyright 2007 Yann E. MORIN
     3 # Licensed under the GPL v2. See COPYING in the root of this package.
     4 
     5 # This is the main entry point to crosstool
     6 # This will:
     7 #   - download, extract and patch the toolchain components
     8 #   - build and install each components in turn
     9 #   - and eventually test the resulting toolchain
    10 
    11 # What this file does is prepare the environment, based upon the user-choosen
    12 # options. It also checks the existing environment for un-friendly variables,
    13 # and builds the tools.
    14 
    15 # Parse the common functions
    16 # Note: some initialisation and sanitizing is done while parsing this file,
    17 # most notably:
    18 #  - set trap handler on errors,
    19 #  - don't hash commands lookups,
    20 #  - initialise logging.
    21 . "${CT_LIB_DIR}/scripts/functions"
    22 
    23 # Parse the configuration file
    24 # It has some info about the logging facility, so include it early
    25 . .config
    26 # Yes! We can do full logging from now on!
    27 
    28 # Overide the locale early, in case we ever translate crosstool-NG messages
    29 if [ -z "${CT_NO_OVERIDE_LC_MESSAGES}" ]; then
    30     export LC_ALL=C
    31     export LANG=C
    32 fi
    33 
    34 # remove . from PATH since it can cause gcc build failures
    35 CT_SanitizePath
    36 
    37 # Some sanity checks in the environment and needed tools
    38 CT_DoLog INFO "Performing some trivial sanity checks"
    39 CT_TestAndAbort "Don't set LD_LIBRARY_PATH. It screws up the build." -n "${LD_LIBRARY_PATH}"
    40 CT_TestAndAbort "Don't set CFLAGS. It screws up the build." -n "${CFLAGS}"
    41 CT_TestAndAbort "Don't set CXXFLAGS. It screws up the build." -n "${CXXFLAGS}"
    42 CT_Test "GREP_OPTIONS screws up the build. Resetting." -n "${GREP_OPTIONS}"
    43 export GREP_OPTIONS=
    44 
    45 # Some sanity checks on paths content
    46 for d in            \
    47     LOCAL_TARBALLS  \
    48     WORK            \
    49     PREFIX          \
    50     INSTALL         \
    51     ; do
    52         eval dir="\${CT_${d}_DIR}"
    53         case "${dir}" in
    54             *" "*)
    55                 CT_Abort "'CT_${d}_DIR'='${dir}' contains a space in it.\nDon't use spaces in paths, it breaks things."
    56                 ;;
    57         esac
    58 done
    59 
    60 # Where will we work?
    61 CT_WORK_DIR="${CT_WORK_DIR:-${CT_TOP_DIR}/targets}"
    62 CT_DoExecLog ALL mkdir -p "${CT_WORK_DIR}"
    63 
    64 # Check build file system case-sensitiveness
    65 CT_DoExecLog DEBUG touch "${CT_WORK_DIR}/foo"
    66 CT_TestAndAbort "Your file system in '${CT_WORK_DIR}' is *not* case-sensitive!" -f "${CT_WORK_DIR}/FOO"
    67 CT_DoExecLog DEBUG rm -f "${CT_WORK_DIR}/foo"
    68 
    69 # What's our shell?
    70 # Will be plain /bin/sh on most systems, except if we have /bin/ash and we
    71 # _explictly_ required using it
    72 case "${CT_CONFIG_SHELL}" in
    73     sh)     CT_SHELL="/bin/sh";;
    74     ash)    CT_SHELL="/bin/ash";;
    75     bash)   CT_SHELL="${BASH}";;
    76     custom) CT_SHELL="${CT_CONFIG_SHELL_CUSTOM_PATH}";;
    77 esac
    78 
    79 # Check the user is using an existing SHELL to be used by ./configure and Makefiles
    80 CT_TestOrAbort "The CONFIG_SHELL '${CT_CONFIG_SHELL}' (${CT_SHELL}) is not valid" -f "${CT_SHELL}" -a -x "${CT_SHELL}"
    81 
    82 # Create the bin-overide early
    83 # Contains symlinks to the tools found by ./configure
    84 # Note: CT_DoLog and CT_DoExecLog do not use any of those tool, so
    85 # they can be safely used
    86 CT_TOOLS_OVERIDE_DIR="${CT_WORK_DIR}/tools"
    87 CT_DoLog DEBUG "Creating bin-overide for tools in '${CT_TOOLS_OVERIDE_DIR}'"
    88 CT_DoExecLog DEBUG mkdir -p "${CT_TOOLS_OVERIDE_DIR}/bin"
    89 cat "${CT_LIB_DIR}/paths.mk" |while read trash line; do
    90     tool="${line%%=*}"
    91     path="${line#*=}"
    92     CT_DoLog DEBUG "Creating script-override for '${tool}' -> '${path}'"
    93     printf "#${BANG}${CT_SHELL}\nexec '${path}' \"\${@}\"\n" >"${CT_TOOLS_OVERIDE_DIR}/bin/${tool}"
    94     CT_DoExecLog ALL chmod 700 "${CT_TOOLS_OVERIDE_DIR}/bin/${tool}"
    95 done
    96 export PATH="${CT_TOOLS_OVERIDE_DIR}/bin:${PATH}"
    97 
    98 # Start date. Can't be done until we know the locale
    99 # Also requires the bin-override tools
   100 CT_STAR_DATE=$(CT_DoDate +%s%N)
   101 CT_STAR_DATE_HUMAN=$(CT_DoDate +%Y%m%d.%H%M%S)
   102 
   103 # Log real begining of build, now
   104 CT_DoLog INFO "Build started ${CT_STAR_DATE_HUMAN}"
   105 
   106 CT_DoStep DEBUG "Dumping user-supplied crosstool-NG configuration"
   107 CT_DoExecLog DEBUG grep -E '^(# |)CT_' .config
   108 CT_EndStep
   109 
   110 CT_DoLog DEBUG "Unsetting and unexporting MAKEFLAGS"
   111 unset MAKEFLAGS
   112 export MAKEFLAGS
   113 
   114 CT_DoLog INFO "Building environment variables"
   115 
   116 # Include sub-scripts instead of calling them: that way, we do not have to
   117 # export any variable, nor re-parse the configuration and functions files.
   118 . "${CT_LIB_DIR}/scripts/build/internals.sh"
   119 . "${CT_LIB_DIR}/scripts/build/arch/${CT_ARCH}.sh"
   120 . "${CT_LIB_DIR}/scripts/build/companion_tools.sh"
   121 . "${CT_LIB_DIR}/scripts/build/kernel/${CT_KERNEL}.sh"
   122 . "${CT_LIB_DIR}/scripts/build/companion_libs/gmp.sh"
   123 . "${CT_LIB_DIR}/scripts/build/companion_libs/mpfr.sh"
   124 . "${CT_LIB_DIR}/scripts/build/companion_libs/ppl.sh"
   125 . "${CT_LIB_DIR}/scripts/build/companion_libs/cloog.sh"
   126 . "${CT_LIB_DIR}/scripts/build/companion_libs/mpc.sh"
   127 . "${CT_LIB_DIR}/scripts/build/companion_libs/libelf.sh"
   128 . "${CT_LIB_DIR}/scripts/build/binutils/binutils.sh"
   129 . "${CT_LIB_DIR}/scripts/build/binutils/elf2flt.sh"
   130 . "${CT_LIB_DIR}/scripts/build/binutils/sstrip.sh"
   131 . "${CT_LIB_DIR}/scripts/build/libc/${CT_LIBC}.sh"
   132 . "${CT_LIB_DIR}/scripts/build/cc/${CT_CC}.sh"
   133 . "${CT_LIB_DIR}/scripts/build/debug.sh"
   134 . "${CT_LIB_DIR}/scripts/build/test_suite.sh"
   135 
   136 # Target tuple: CT_TARGET needs a little love:
   137 CT_DoBuildTargetTuple
   138 
   139 # Kludge: If any of the configured options needs CT_TARGET,
   140 # then rescan the options file now:
   141 . .config
   142 
   143 # Sanity check some directories
   144 CT_TestAndAbort "'CT_PREFIX_DIR' is not set: where should I install?" -z "${CT_PREFIX_DIR}"
   145 
   146 # Second kludge: merge user-supplied target CFLAGS with architecture-provided
   147 # target CFLAGS. Do the same for LDFLAGS in case it happens in the future.
   148 # Put user-supplied flags at the end, so that they take precedence.
   149 CT_TARGET_CFLAGS="${CT_ARCH_TARGET_CFLAGS} ${CT_TARGET_CFLAGS}"
   150 CT_TARGET_LDFLAGS="${CT_ARCH_TARGET_LDFLAGS} ${CT_TARGET_LDFLAGS}"
   151 CT_CC_CORE_EXTRA_CONFIG="${CT_ARCH_CC_CORE_EXTRA_CONFIG} ${CT_CC_CORE_EXTRA_CONFIG}"
   152 CT_CC_EXTRA_CONFIG="${CT_ARCH_CC_EXTRA_CONFIG} ${CT_CC_EXTRA_CONFIG}"
   153 
   154 # Compute the working directories names
   155 CT_TARBALLS_DIR="${CT_WORK_DIR}/tarballs"
   156 CT_SRC_DIR="${CT_WORK_DIR}/src"
   157 CT_BUILD_DIR="${CT_WORK_DIR}/${CT_TARGET}/build"
   158 CT_BUILDTOOLS_PREFIX_DIR="${CT_WORK_DIR}/${CT_TARGET}/buildtools"
   159 CT_STATE_DIR="${CT_WORK_DIR}/${CT_TARGET}/state"
   160 CT_CONFIG_DIR="${CT_BUILD_DIR}/configs"
   161 CT_COMPLIBS_DIR="${CT_BUILD_DIR}/static"
   162 
   163 # Compute test suite install directory
   164 CT_TEST_SUITE_DIR=${CT_INSTALL_DIR}/test-suite
   165 
   166 # Note: we'll always install the core compiler in its own directory, so as to
   167 # not mix the two builds: core and final.
   168 CT_CC_CORE_STATIC_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core-static"
   169 CT_CC_CORE_SHARED_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core-shared"
   170 
   171 # We must ensure that we can restart if asked for!
   172 if [ -n "${CT_RESTART}" -a ! -d "${CT_STATE_DIR}"  ]; then
   173     CT_DoLog ERROR "You asked to restart a non-restartable build"
   174     CT_DoLog ERROR "This happened because you didn't set CT_DEBUG_CT_SAVE_STEPS"
   175     CT_DoLog ERROR "in the config options for the previous build, or the state"
   176     CT_DoLog ERROR "directory for the previous build was deleted."
   177     CT_Abort "I will stop here to avoid any carnage"
   178 fi
   179 
   180 # If the local tarball directory does not exist, say so, and don't try to save there!
   181 if [    "${CT_SAVE_TARBALLS}" = "y"     \
   182      -a ! -d "${CT_LOCAL_TARBALLS_DIR}" ]; then
   183     CT_DoLog WARN "Directory '${CT_LOCAL_TARBALLS_DIR}' does not exist."
   184     CT_DoLog WARN "Will not save downloaded tarballs to local storage."
   185     CT_SAVE_TARBALLS=
   186 fi
   187 
   188 # Check now if we can write to the destination directory:
   189 if [ -d "${CT_INSTALL_DIR}" ]; then
   190     CT_TestAndAbort "Destination directory '${CT_INSTALL_DIR}' is not removable" ! -w $(dirname "${CT_INSTALL_DIR}")
   191 fi
   192 
   193 # Good, now grab a bit of informations on the system we're being run on,
   194 # just in case something goes awok, and it's not our fault:
   195 CT_SYS_USER=$(id -un)
   196 CT_SYS_HOSTNAME=$(hostname -f 2>/dev/null || true)
   197 # Hmmm. Some non-DHCP-enabled machines do not have an FQDN... Fall back to node name.
   198 CT_SYS_HOSTNAME="${CT_SYS_HOSTNAME:-$(uname -n)}"
   199 CT_SYS_KERNEL=$(uname -s)
   200 CT_SYS_REVISION=$(uname -r)
   201 CT_SYS_OS=$(uname -s)
   202 CT_SYS_MACHINE=$(uname -m)
   203 CT_SYS_PROCESSOR=$(uname -p)
   204 CT_SYS_GCC=$(gcc -dumpversion)
   205 CT_SYS_TARGET=$(CT_DoConfigGuess)
   206 CT_TOOLCHAIN_ID="crosstool-${CT_VERSION} build ${CT_STAR_DATE_HUMAN} by ${CT_SYS_USER}@${CT_SYS_HOSTNAME}"
   207 
   208 CT_DoLog EXTRA "Preparing working directories"
   209 
   210 # Ah! The build directory shall be eradicated, even if we restart!
   211 # Ditto for the build tools install dir
   212 CT_DoForceRmdir "${CT_BUILD_DIR}" "${CT_BUILDTOOLS_PREFIX_DIR}"
   213 
   214 # Don't eradicate directories if we need to restart
   215 if [ -z "${CT_RESTART}" ]; then
   216     # Get rid of pre-existing installed toolchain and previous build directories.
   217     if [ "${CT_FORCE_DOWNLOAD}" = "y" -a -d "${CT_TARBALLS_DIR}" ]; then
   218         CT_DoForceRmdir "${CT_TARBALLS_DIR}"
   219     fi
   220     if [ "${CT_FORCE_EXTRACT}" = "y" -a -d "${CT_SRC_DIR}" ]; then
   221         CT_DoForceRmdir "${CT_SRC_DIR}"
   222     fi
   223     if [ -d "${CT_INSTALL_DIR}" -a "${CT_RM_RF_PREFIX_DIR}" = "y" ]; then
   224         CT_DoForceRmdir "${CT_INSTALL_DIR}"
   225     fi
   226     # In case we start anew, get rid of the previously saved state directory
   227     if [ -d "${CT_STATE_DIR}" ]; then
   228         CT_DoForceRmdir "${CT_STATE_DIR}"
   229     fi
   230 fi
   231 
   232 # Create the directories we'll use, even if restarting: it does no harm to
   233 # create already existent directories, and CT_BUILD_DIR needs to be created
   234 # anyway
   235 CT_DoExecLog ALL mkdir -p "${CT_TARBALLS_DIR}"
   236 CT_DoExecLog ALL mkdir -p "${CT_SRC_DIR}"
   237 CT_DoExecLog ALL mkdir -p "${CT_BUILD_DIR}"
   238 CT_DoExecLog ALL mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/bin"
   239 CT_DoExecLog ALL mkdir -p "${CT_CONFIG_DIR}"
   240 CT_DoExecLog ALL mkdir -p "${CT_INSTALL_DIR}"
   241 CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}"
   242 CT_DoExecLog ALL mkdir -p "${CT_COMPLIBS_DIR}"
   243 if [ -z "${CT_CANADIAN}" ]; then
   244     CT_DoExecLog ALL mkdir -p "${CT_CC_CORE_STATIC_PREFIX_DIR}"
   245     CT_DoExecLog ALL mkdir -p "${CT_CC_CORE_SHARED_PREFIX_DIR}"
   246 fi
   247 
   248 # Only create the state dir if asked for a restartable build
   249 [ -n "${CT_DEBUG_CT_SAVE_STEPS}" ] && CT_DoExecLog ALL mkdir -p "${CT_STATE_DIR}"
   250 
   251 # Check install file system case-sensitiveness
   252 CT_DoExecLog DEBUG touch "${CT_PREFIX_DIR}/foo"
   253 CT_TestAndAbort "Your file system in '${CT_PREFIX_DIR}' is *not* case-sensitive!" -f "${CT_PREFIX_DIR}/FOO"
   254 CT_DoExecLog DEBUG rm -f "${CT_PREFIX_DIR}/foo"
   255 
   256 # Kludge: CT_INSTALL_DIR and CT_PREFIX_DIR might have grown read-only if
   257 # the previous build was successful.
   258 CT_DoExecLog ALL chmod -R u+w "${CT_INSTALL_DIR}" "${CT_PREFIX_DIR}"
   259 
   260 # Setting up the rest of the environment only if not restarting
   261 if [ -z "${CT_RESTART}" ]; then
   262     case "${CT_SYSROOT_NAME}" in
   263         "")     CT_SYSROOT_NAME="sysroot";;
   264         .)      CT_Abort "Sysroot name is set to '.' which is forbidden";;
   265         *' '*)  CT_Abort "Sysroot name contains forbidden space(s): '${CT_SYSROOT_NAME}'";;
   266         */*)    CT_Abort "Sysroot name contains forbidden slash(es): '${CT_SYSROOT_NAME}'";;
   267     esac
   268 
   269     # Arrange paths depending on wether we use sysroot or not.
   270     if [ "${CT_USE_SYSROOT}" = "y" ]; then
   271         CT_SYSROOT_REL_DIR="${CT_SYSROOT_DIR_PREFIX}/${CT_SYSROOT_NAME}"
   272         CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/${CT_SYSROOT_REL_DIR}"
   273         CT_DEBUGROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/${CT_SYSROOT_DIR_PREFIX}/debug-root"
   274         CT_HEADERS_DIR="${CT_SYSROOT_DIR}/usr/include"
   275         CT_SanitiseVarDir CT_SYSROOT_REL_DIR CT_SYSROOT_DIR CT_DEBUGROOT_DIR CT_HEADERS_DIR 
   276         BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
   277         CC_CORE_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
   278         CC_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
   279         LIBC_SYSROOT_ARG=""
   280         # glibc's prefix must be exactly /usr, else --with-sysroot'd gcc will get
   281         # confused when $sysroot/usr/include is not present.
   282         # Note: --prefix=/usr is magic!
   283         # See http://www.gnu.org/software/libc/FAQ.html#s-2.2
   284     else
   285         # plain old way. All libraries in prefix/target/lib
   286         CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}"
   287         CT_DEBUGROOT_DIR="${CT_SYSROOT_DIR}"
   288         CT_HEADERS_DIR="${CT_SYSROOT_DIR}/include"
   289         CT_SanitiseVarDir CT_SYSROOT_DIR CT_DEBUGROOT_DIR CT_HEADERS_DIR 
   290         # hack!  Always use --with-sysroot for binutils.
   291         # binutils 2.14 and later obey it, older binutils ignore it.
   292         # Lets you build a working 32->64 bit cross gcc
   293         BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
   294         # Use --with-headers, else final gcc will define disable_glibc while
   295         # building libgcc, and you'll have no profiling
   296         CC_CORE_SYSROOT_ARG="--without-headers"
   297         CC_SYSROOT_ARG="--with-headers=${CT_HEADERS_DIR}"
   298         LIBC_SYSROOT_ARG="prefix="
   299     fi
   300     CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}"
   301     CT_DoExecLog ALL mkdir -p "${CT_DEBUGROOT_DIR}"
   302 
   303     # Prepare the 'lib' directories in sysroot, else the ../lib64 hack used by
   304     # 32 -> 64 bit crosscompilers won't work, and build of final gcc will fail
   305     # with: "ld: cannot open crti.o: No such file or directory"
   306     # Also prepare the lib directory in the install dir, else some 64 bit archs
   307     # won't build
   308     CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/lib"
   309     CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/lib"
   310     CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
   311     CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/include"
   312 
   313     if [ "${CT_USE_SYSROOT}" = "y" ]; then
   314         # Prevent gcc from installing its libraries outside of the sysroot
   315         CT_DoExecLog ALL ln -sf ".${CT_SYSROOT_REL_DIR}/lib" "${CT_PREFIX_DIR}/${CT_TARGET}/lib"
   316     fi
   317 
   318     # Since we're *not* multilib on the target side, we want all the
   319     # libraries to end up in "lib".  We create "lib64" (for 64-bit
   320     # build or host architectures) and "lib32" (for 32-bit emulation
   321     # on 64-bit) as symlinks to "lib".
   322     #
   323     # Not all of these symlinks are necessary, but better safe than
   324     # sorry. They are summarily removed by build/internals.sh:do_finish.
   325     for d in                            \
   326         "${CT_PREFIX_DIR}"              \
   327         "${CT_SYSROOT_DIR}"             \
   328         "${CT_SYSROOT_DIR}/usr"         \
   329         "${CT_PREFIX_DIR}/${CT_TARGET}" \
   330     ; do
   331         CT_DoExecLog ALL ln -sf "lib" "${d}/lib32"
   332         CT_DoExecLog ALL ln -sf "lib" "${d}/lib64"
   333     done
   334 
   335     # Determine build system if not set by the user
   336     if [ -z "${CT_BUILD}" ]; then
   337         CT_BUILD=$(CT_DoConfigGuess)
   338     fi
   339 
   340     # Prepare mangling patterns to later modify BUILD and HOST (see below)
   341     case "${CT_TOOLCHAIN_TYPE}" in
   342         cross)
   343             # A cross-compiler runs on the same machine it is built on
   344             CT_HOST="${CT_BUILD}"
   345             build_mangle="build_"
   346             host_mangle="build_"
   347             target_mangle=""
   348             install_build_tools_for="BUILD HOST"
   349             ;;
   350         canadian)
   351             build_mangle="build_"
   352             host_mangle="host_"
   353             target_mangle=""
   354             install_build_tools_for="BUILD HOST TARGET"
   355             ;;
   356         *)  CT_Abort "No code for '${CT_TOOLCHAIN_TYPE}' toolchain type!"
   357             ;;
   358     esac
   359 
   360     # Save the real tuples to generate shell-wrappers to the real tools
   361     CT_REAL_BUILD="${CT_BUILD}"
   362     CT_REAL_HOST="${CT_HOST}"
   363     CT_REAL_TARGET="${CT_TARGET}"
   364 
   365     # Canonicalise CT_BUILD and CT_HOST
   366     # Not only will it give us full-qualified tuples, but it will also ensure
   367     # that they are valid tuples (in case of typo with user-provided tuples)
   368     # That's way better than trying to rewrite config.sub ourselves...
   369     # CT_TARGET is already made canonical in CT_DoBuildTargetTuple
   370     CT_BUILD=$(CT_DoConfigSub "${CT_BUILD}")
   371     CT_HOST=$(CT_DoConfigSub "${CT_HOST}")
   372 
   373     # Modify BUILD and HOST so that gcc always generate a cross-compiler
   374     # even if any of the build, host or target machines are the same.
   375     # NOTE: we'll have to mangle the (BUILD|HOST)->TARGET x-compiler to
   376     #       support canadain build, later...
   377     CT_BUILD="${CT_BUILD/-/-${build_mangle}}"
   378     CT_HOST="${CT_HOST/-/-${host_mangle}}"
   379     CT_TARGET="${CT_TARGET/-/-${target_mangle}}"
   380 
   381     # Now we have mangled our BUILD and HOST tuples, we must fake the new
   382     # cross-tools for those mangled tuples.
   383     CT_DoLog DEBUG "Making build system tools available"
   384     for m in ${install_build_tools_for}; do
   385         r="CT_REAL_${m}"
   386         v="CT_${m}"
   387         p="CT_${m}_PREFIX"
   388         s="CT_${m}_SUFFIX"
   389         if [ -n "${!p}" ]; then
   390             t="${!p}"
   391         else
   392             t="${!r}-"
   393         fi
   394 
   395         for tool in ar as dlltool gcc g++ gcj gnatbind gnatmake ld nm objcopy objdump ranlib strip windres; do
   396             # First try with prefix + suffix
   397             # Then try with prefix only
   398             # Then try with suffix only, but only for BUILD, and HOST iff REAL_BUILD == REAL_HOST
   399             # Finally try with neither prefix nor suffix, but only for BUILD, and HOST iff REAL_BUILD == REAL_HOST
   400             # This is needed, because some tools have a prefix and
   401             # a suffix (eg. gcc), while others may have only one,
   402             # or even none (eg. binutils)
   403             where=$(CT_Which "${t}${tool}${!s}")
   404             [ -z "${where}" ] && where=$(CT_Which "${t}${tool}")
   405             if [    -z "${where}"                         \
   406                  -a \(    "${m}" = "BUILD"                \
   407                        -o "${CT_REAL_BUILD}" = "${!r}" \) ]; then
   408                 where=$(CT_Which "${tool}${!s}")
   409             fi
   410             if [ -z "${where}"                            \
   411                  -a \(    "${m}" = "BUILD"                \
   412                        -o "${CT_REAL_BUILD}" = "${!r}" \) ]; then
   413                 where=$(CT_Which "${tool}")
   414             fi
   415 
   416             # Not all tools are available for all platforms, but some are really,
   417             # bally needed
   418             if [ -n "${where}" ]; then
   419                 CT_DoLog DEBUG "  '${!v}-${tool}' -> '${where}'"
   420                 printf "#${BANG}${CT_SHELL}\nexec '${where}' \"\${@}\"\n" >"${CT_BUILDTOOLS_PREFIX_DIR}/bin/${!v}-${tool}"
   421                 CT_DoExecLog ALL chmod 700 "${CT_BUILDTOOLS_PREFIX_DIR}/bin/${!v}-${tool}"
   422             else
   423                 case "${tool}" in
   424                     # We'll at least need some of them...
   425                     ar|as|gcc|ld|nm|objcopy|objdump|ranlib)
   426                         CT_Abort "Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : either needed!"
   427                         ;;
   428                     # Some are conditionnally required
   429                     # Add them in alphabetical (C locale) ordering
   430                     g++)
   431                         # g++ (needed for companion lib), only needed for HOST
   432                         CT_TestAndAbort "Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : either needed!" "${m}" = "HOST"
   433                         ;;
   434                     gcj)
   435                         CT_TestAndAbort "Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : either needed!" "${CT_CC_LANG_JAVA}" = "y"
   436                         ;;
   437                     strip)
   438                         CT_TestAndAbort "Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : either needed!" "${CT_STRIP_ALL_TOOLCHAIN_EXECUTABLES}" = "y"
   439                         ;;
   440                     # If any other is missing, only warn at low level
   441                     *)
   442                         # It does not deserve a WARN level.
   443                         CT_DoLog DEBUG "  Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : not required."
   444                         ;;
   445                 esac
   446             fi
   447         done
   448     done
   449 
   450     # Some makeinfo versions are a pain in [put your most sensible body part here].
   451     # Go ahead with those, by creating a wrapper that keeps partial files, and that
   452     # never fails:
   453     CT_DoLog DEBUG "  'makeinfo' -> '$(CT_Which makeinfo)'"
   454     printf "#${BANG}${CT_SHELL}\n$(CT_Which makeinfo) --force \"\${@}\"\ntrue\n" >"${CT_BUILDTOOLS_PREFIX_DIR}/bin/makeinfo"
   455     CT_DoExecLog ALL chmod 700 "${CT_BUILDTOOLS_PREFIX_DIR}/bin/makeinfo"
   456 
   457     # Carefully add paths in the order we want them:
   458     #  - first try in ${CT_PREFIX_DIR}/bin
   459     #  - then try in ${CT_CC_CORE_SHARED_PREFIX_DIR}/bin
   460     #  - then try in ${CT_CC_CORE_STATIC_PREFIX_DIR}/bin
   461     #  - fall back to searching user's PATH
   462     # Of course, neither cross-native nor canadian can run on BUILD,
   463     # so don't add those PATHs in this case...
   464     case "${CT_TOOLCHAIN_TYPE}" in
   465         cross)  export PATH="${CT_BUILDTOOLS_PREFIX_DIR}/bin:${CT_PREFIX_DIR}/bin:${CT_CC_CORE_SHARED_PREFIX_DIR}/bin:${CT_CC_CORE_STATIC_PREFIX_DIR}/bin:${PATH}";;
   466         canadian) export PATH="${CT_BUILDTOOLS_PREFIX_DIR}/bin:${PATH}";;
   467         *)  ;;
   468     esac
   469 
   470     # Help gcc
   471     CT_CFLAGS_FOR_HOST=
   472     [ "${CT_USE_PIPES}" = "y" ] && CT_CFLAGS_FOR_HOST="${CT_CFLAGS_FOR_HOST} -pipe"
   473 
   474     # Override the configured jobs with what's been given on the command line
   475     [ -n "${CT_JOBS}" ] && CT_PARALLEL_JOBS="${CT_JOBS}"
   476 
   477     # Set the shell to be used by ./configure scripts and by Makefiles (those
   478     # that support it!).
   479     export CONFIG_SHELL="${CT_SHELL}"   # for ./configure
   480     export SHELL="${CT_SHELL}"          # for Makefiles
   481 
   482     # And help make go faster
   483     JOBSFLAGS=
   484     [ ${CT_PARALLEL_JOBS} -ne 0 ] && JOBSFLAGS="${JOBSFLAGS} -j${CT_PARALLEL_JOBS}"
   485     [ ${CT_LOAD} -ne 0 ] && JOBSFLAGS="${JOBSFLAGS} -l${CT_LOAD}"
   486 
   487     CT_DoLog EXTRA "Installing user-supplied crosstool-NG configuration"
   488     CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/bin"
   489     CT_DoExecLog DEBUG install -m 0755 "${CT_LIB_DIR}/scripts/toolchain-config.in" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config"
   490     CT_DoExecLog DEBUG sed -i -e 's,@@grep@@,"'"${grep}"'",;' "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config"
   491     bzip2 -c -9 .config >>"${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config"
   492 
   493     CT_DoStep EXTRA "Dumping internal crosstool-NG configuration"
   494     CT_DoLog EXTRA "Building a toolchain for:"
   495     CT_DoLog EXTRA "  build  = ${CT_REAL_BUILD}"
   496     CT_DoLog EXTRA "  host   = ${CT_REAL_HOST}"
   497     CT_DoLog EXTRA "  target = ${CT_TARGET}"
   498     set |grep -E '^CT_.+=' |sort |CT_DoLog DEBUG
   499     CT_DoLog DEBUG "Other environment:"
   500     printenv |grep -v -E '^CT_.+=' |CT_DoLog DEBUG
   501     CT_EndStep
   502 fi
   503 
   504 if [ -z "${CT_RESTART}" ]; then
   505     if [ "${CT_FORBID_DOWNLOAD}" = "y" ]; then
   506         CT_DoLog INFO "Downloading forbidden by configuration, skipping downloads"
   507     else
   508         CT_DoStep INFO "Retrieving needed toolchain components' tarballs"
   509         do_companion_tools_get
   510         do_kernel_get
   511         do_gmp_get
   512         do_mpfr_get
   513         do_ppl_get
   514         do_cloog_get
   515         do_mpc_get
   516         do_libelf_get
   517         do_binutils_get
   518         do_elf2flt_get
   519         do_sstrip_get
   520         do_cc_get
   521         do_libc_get
   522         do_debug_get
   523         do_test_suite_get
   524         CT_EndStep
   525     fi
   526 
   527     if [ "${CT_ONLY_DOWNLOAD}" != "y" ]; then
   528         if [ "${CT_FORCE_EXTRACT}" = "y" ]; then
   529             CT_DoForceRmdir "${CT_SRC_DIR}"
   530             CT_DoExecLog ALL mkdir -p "${CT_SRC_DIR}"
   531         fi
   532 
   533         if [ "${CT_COMP_TOOLS}" = "y" ]; then
   534           CT_DoStep INFO "Extracting, patching and installing companion tools"
   535           do_companion_tools_extract
   536           do_companion_tools
   537           CT_EndStep
   538         fi
   539 
   540         CT_DoStep INFO "Extracting and patching toolchain components"
   541         do_kernel_extract
   542         do_gmp_extract
   543         do_mpfr_extract
   544         do_ppl_extract
   545         do_cloog_extract
   546         do_mpc_extract
   547         do_libelf_extract
   548         do_binutils_extract
   549         do_elf2flt_extract
   550         do_sstrip_extract
   551         do_cc_extract
   552         do_libc_extract
   553         do_debug_extract
   554         do_test_suite_extract
   555         CT_EndStep
   556     fi
   557 fi
   558 
   559 # Now for the job by itself. Go have a coffee!
   560 if [ "${CT_ONLY_DOWNLOAD}" != "y" -a "${CT_ONLY_EXTRACT}" != "y" ]; then
   561     # Because of CT_RESTART, this becomes quite complex
   562     do_stop=0
   563     prev_step=
   564     [ -n "${CT_RESTART}" ] && do_it=0 || do_it=1
   565     # Aha! CT_STEPS comes from steps.mk!
   566     for step in ${CT_STEPS}; do
   567         if [ ${do_it} -eq 0 ]; then
   568             if [ "${CT_RESTART}" = "${step}" ]; then
   569                 CT_DoLoadState "${step}"
   570                 do_it=1
   571                 do_stop=0
   572             fi
   573         else
   574             CT_DoSaveState ${step}
   575             if [ ${do_stop} -eq 1 ]; then
   576                 CT_DoLog ERROR "Stopping just after step '${prev_step}', as requested."
   577                 exit 0
   578             fi
   579         fi
   580         if [ ${do_it} -eq 1 ]; then
   581             do_${step}
   582             if [ "${CT_STOP}" = "${step}" ]; then
   583                 do_stop=1
   584             fi
   585             if [ "${CT_DEBUG_PAUSE_STEPS}" = "y" ]; then
   586                 CT_DoPause "Step '${step}' finished"
   587             fi
   588         fi
   589         prev_step="${step}"
   590     done
   591 fi
   592 
   593 CT_DoEnd INFO
   594 
   595 # From now-on, it can become impossible to log any time, because
   596 # either we're compressing the log file, or it can become RO any
   597 # moment... Consign all ouptut to oblivion...
   598 CT_DoLog INFO "Finishing installation (may take a few seconds)..."
   599 exec >/dev/null 2>&1
   600 
   601 if [ "${CT_LOG_TO_FILE}" = "y" ]; then
   602     cp "${tmp_log_file}" "${CT_PREFIX_DIR}/build.log"
   603     if [ "${CT_LOG_FILE_COMPRESS}" = y ]; then
   604         bzip2 -9 "${CT_PREFIX_DIR}/build.log"
   605     fi
   606 fi
   607 [ "${CT_INSTALL_DIR_RO}" = "y"  ] && chmod -R a-w "${CT_INSTALL_DIR}"
   608 [ "${CT_TEST_SUITE}" = "y" ] && chmod -R u+w "${CT_TEST_SUITE_DIR}"
   609 
   610 trap - EXIT