scripts/crosstool-NG.sh.in
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sat Dec 31 16:23:27 2011 +0100 (2011-12-31)
changeset 2814 3dc2727ebffc
parent 2796 bdff4164a122
child 2838 822af73497bf
permissions -rw-r--r--
cc/gcc: add option to use system zlib

In some cases, it might be desirable to use the system zlib

Eg. because latest gcc seem to be totally borked when it comes
to multilib, and tries to build a multilib host zlib, when it
is *absolutely* *not* needed: we want mulitlib on the target,
not on the host! Sigh... :-(

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