scripts/crosstool-NG.sh.in
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Thu Jun 11 21:47:19 2009 +0000 (2009-06-11)
branch1.4
changeset 1451 25d050084e98
parent 1272 ddac62e7c428
child 1318 5416f4ba36bf
child 1453 bfdcc6076d3b
permissions -rw-r--r--
populate: fix installing dynamic linker 'ld.so'

The dynamic linker, ld.so, needs the execute bit to be set.
Detect tht the library being installed is in fact ld.so and
install it with 0755 instead of 0644.

Fix detecting src == dst.

Use a simpler command to copy src -> dst.

Also change echo to printf, get rid of 'echo -n', which is
highly non-portable.


-------- diffstat follows --------
/trunk/scripts/populate.in | 76 43 33 0 +++++++++++++++++++++++++++++-----------------------
1 file changed, 43 insertions(+), 33 deletions(-)
(transplanted from d7ddcb75e0f703e2ba6d17169167356389224870)
     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 [ -z "${CT_NO_OVERIDE_LC_MESSAGES}" ] && export LC_ALL=C
    30 
    31 # Where will we work?
    32 CT_WORK_DIR="${CT_WORK_DIR:-${CT_TOP_DIR}/targets}"
    33 CT_DoExecLog ALL mkdir -p "${CT_WORK_DIR}"
    34 
    35 # Check build file system case-sensitiveness
    36 CT_DoExecLog DEBUG touch "${CT_WORK_DIR}/foo"
    37 CT_TestAndAbort "Your file system in '${CT_WORK_DIR}' is *not* case-sensitive!" -f "${CT_WORK_DIR}/FOO"
    38 CT_DoExecLog DEBUG rm -f "${CT_WORK_DIR}/foo"
    39 
    40 # Create the bin-overide early
    41 # Contains symlinks to the tools found by ./configure
    42 # Note: CT_DoLog and CT_DoExecLog do not use any of those tool, so
    43 # they can be safely used
    44 CT_BIN_OVERIDE_DIR="${CT_WORK_DIR}/bin"
    45 CT_DoLog DEBUG "Creating bin-overide for tools in '${CT_BIN_OVERIDE_DIR}'"
    46 CT_DoExecLog DEBUG mkdir -p "${CT_BIN_OVERIDE_DIR}"
    47 cat "${CT_LIB_DIR}/paths.mk" |while read trash line; do
    48     tool="${line%%=*}"
    49     path="${line#*=}"
    50     CT_DoLog DEBUG "  '${tool}' -> '${path}'"
    51     printf "#${BANG}/bin/sh\nexec '${path}' \"\${@}\"\n" >"${CT_BIN_OVERIDE_DIR}/${tool}"
    52     CT_DoExecLog ALL chmod 700 "${CT_BIN_OVERIDE_DIR}/${tool}"
    53 done
    54 export PATH="${CT_BIN_OVERIDE_DIR}:${PATH}"
    55 
    56 # Start date. Can't be done until we know the locale
    57 CT_STAR_DATE=$(CT_DoDate +%s%N)
    58 CT_STAR_DATE_HUMAN=$(CT_DoDate +%Y%m%d.%H%M%S)
    59 
    60 # Log real begining of build, now
    61 CT_DoLog INFO "Build started ${CT_STAR_DATE_HUMAN}"
    62 
    63 # renice oursleves
    64 CT_DoExecLog DEBUG renice ${CT_NICE} $$
    65 
    66 CT_DoStep DEBUG "Dumping user-supplied crosstool-NG configuration"
    67 CT_DoExecLog DEBUG grep -E '^(# |)CT_' .config
    68 CT_EndStep
    69 
    70 # Some sanity checks in the environment and needed tools
    71 CT_DoLog INFO "Checking environment sanity"
    72 
    73 CT_DoLog DEBUG "Unsetting and unexporting MAKEFLAGS"
    74 unset MAKEFLAGS
    75 export MAKEFLAGS
    76 
    77 # Other environment sanity checks
    78 CT_TestAndAbort "Don't set LD_LIBRARY_PATH. It screws up the build." -n "${LD_LIBRARY_PATH}"
    79 CT_TestAndAbort "Don't set CFLAGS. It screws up the build." -n "${CFLAGS}"
    80 CT_TestAndAbort "Don't set CXXFLAGS. It screws up the build." -n "${CXXFLAGS}"
    81 CT_Test "GREP_OPTIONS screws up the build. Resetting." -n "${GREP_OPTIONS}"
    82 export GREP_OPTIONS=
    83 
    84 CT_DoLog INFO "Building environment variables"
    85 
    86 # Include sub-scripts instead of calling them: that way, we do not have to
    87 # export any variable, nor re-parse the configuration and functions files.
    88 . "${CT_LIB_DIR}/scripts/build/internals.sh"
    89 . "${CT_LIB_DIR}/scripts/build/arch/${CT_ARCH}.sh"
    90 . "${CT_LIB_DIR}/scripts/build/kernel/${CT_KERNEL}.sh"
    91 . "${CT_LIB_DIR}/scripts/build/gmp.sh"
    92 . "${CT_LIB_DIR}/scripts/build/mpfr.sh"
    93 . "${CT_LIB_DIR}/scripts/build/binutils.sh"
    94 . "${CT_LIB_DIR}/scripts/build/libc/${CT_LIBC}.sh"
    95 . "${CT_LIB_DIR}/scripts/build/cc/${CT_CC}.sh"
    96 . "${CT_LIB_DIR}/scripts/build/tools.sh"
    97 . "${CT_LIB_DIR}/scripts/build/debug.sh"
    98 
    99 # Target tuple: CT_TARGET needs a little love:
   100 CT_DoBuildTargetTuple
   101 
   102 # Kludge: If any of the configured options needs CT_TARGET,
   103 # then rescan the options file now:
   104 . .config
   105 
   106 # Second kludge: merge user-supplied target CFLAGS with architecture-provided
   107 # target CFLAGS. Do the same for LDFLAGS in case it happens in the future.
   108 # Put user-supplied flags at the end, so that they take precedence.
   109 CT_TARGET_CFLAGS="${CT_ARCH_TARGET_CFLAGS} ${CT_TARGET_CFLAGS}"
   110 CT_TARGET_LDFLAGS="${CT_ARCH_TARGET_LDFLAGS} ${CT_TARGET_LDFLAGS}"
   111 CT_CC_CORE_EXTRA_CONFIG="${CT_ARCH_CC_CORE_EXTRA_CONFIG} ${CT_CC_CORE_EXTRA_CONFIG}"
   112 CT_CC_EXTRA_CONFIG="${CT_ARCH_CC_EXTRA_CONFIG} ${CT_CC_EXTRA_CONFIG}"
   113 
   114 # Create the working directories
   115 CT_TARBALLS_DIR="${CT_WORK_DIR}/tarballs"
   116 CT_SRC_DIR="${CT_WORK_DIR}/src"
   117 CT_BUILD_DIR="${CT_WORK_DIR}/${CT_TARGET}/build"
   118 CT_STATE_DIR="${CT_WORK_DIR}/${CT_TARGET}/state"
   119 CT_CONFIG_DIR="${CT_BUILD_DIR}/configs"
   120 
   121 # Note: we'll always install the core compiler in its own directory, so as to
   122 # not mix the two builds: core and final.
   123 CT_CC_CORE_STATIC_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core-static"
   124 CT_CC_CORE_SHARED_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core-shared"
   125 
   126 # We must ensure that we can restart if asked for!
   127 if [ -n "${CT_RESTART}" -a ! -d "${CT_STATE_DIR}"  ]; then
   128     CT_DoLog ERROR "You asked to restart a non-restartable build"
   129     CT_DoLog ERROR "This happened because you didn't set CT_DEBUG_CT_SAVE_STEPS"
   130     CT_DoLog ERROR "in the config options for the previous build, or the state"
   131     CT_DoLog ERROR "directory for the previous build was deleted."
   132     CT_Abort "I will stop here to avoid any carnage"
   133 fi
   134 
   135 # If the local tarball directory does not exist, say so, and don't try to save there!
   136 if [ ! -d "${CT_LOCAL_TARBALLS_DIR}" ]; then
   137     CT_DoLog WARN "Directory '${CT_LOCAL_TARBALLS_DIR}' does not exist. Will not save downloaded tarballs to local storage."
   138     CT_SAVE_TARBALLS=
   139 fi
   140 
   141 # Some more sanity checks now that we have all paths set up
   142 case "${CT_LOCAL_TARBALLS_DIR},${CT_TARBALLS_DIR},${CT_SRC_DIR},${CT_BUILD_DIR},${CT_PREFIX_DIR},${CT_INSTALL_DIR}" in
   143     *" "*) CT_Abort "Don't use spaces in paths, it breaks things.";;
   144 esac
   145 
   146 # Check now if we can write to the destination directory:
   147 if [ -d "${CT_INSTALL_DIR}" ]; then
   148     CT_TestAndAbort "Destination directory '${CT_INSTALL_DIR}' is not removable" ! -w $(dirname "${CT_INSTALL_DIR}")
   149 fi
   150 
   151 # Good, now grab a bit of informations on the system we're being run on,
   152 # just in case something goes awok, and it's not our fault:
   153 CT_SYS_USER=$(id -un)
   154 CT_SYS_HOSTNAME=$(hostname -f 2>/dev/null || true)
   155 # Hmmm. Some non-DHCP-enabled machines do not have an FQDN... Fall back to node name.
   156 CT_SYS_HOSTNAME="${CT_SYS_HOSTNAME:-$(uname -n)}"
   157 CT_SYS_KERNEL=$(uname -s)
   158 CT_SYS_REVISION=$(uname -r)
   159 # MacOS X lacks '-o' :
   160 CT_SYS_OS=$(uname -o || echo "Unknown (maybe MacOS-X)")
   161 CT_SYS_MACHINE=$(uname -m)
   162 CT_SYS_PROCESSOR=$(uname -p)
   163 CT_SYS_GCC=$(gcc -dumpversion)
   164 CT_SYS_TARGET=$(CT_DoConfigGuess)
   165 CT_TOOLCHAIN_ID="crosstool-${CT_VERSION} build ${CT_STAR_DATE_HUMAN} by ${CT_SYS_USER}@${CT_SYS_HOSTNAME}"
   166 
   167 CT_DoLog EXTRA "Preparing working directories"
   168 
   169 # Ah! The build directory shall be eradicated, even if we restart!
   170 if [ -d "${CT_BUILD_DIR}" ]; then
   171     CT_DoForceRmdir "${CT_BUILD_DIR}"
   172 fi
   173 
   174 # Don't eradicate directories if we need to restart
   175 if [ -z "${CT_RESTART}" ]; then
   176     # Get rid of pre-existing installed toolchain and previous build directories.
   177     # We need to do that _before_ we can safely log, because the log file will
   178     # most probably be in the toolchain directory.
   179     if [ "${CT_FORCE_DOWNLOAD}" = "y" -a -d "${CT_TARBALLS_DIR}" ]; then
   180         CT_DoForceRmdir "${CT_TARBALLS_DIR}"
   181     fi
   182     if [ "${CT_FORCE_EXTRACT}" = "y" -a -d "${CT_SRC_DIR}" ]; then
   183         CT_DoForceRmdir "${CT_SRC_DIR}"
   184     fi
   185     if [ -d "${CT_INSTALL_DIR}" ]; then
   186         CT_DoForceRmdir "${CT_INSTALL_DIR}"
   187     fi
   188     # In case we start anew, get rid of the previously saved state directory
   189     if [ -d "${CT_STATE_DIR}" ]; then
   190         CT_DoForceRmdir "${CT_STATE_DIR}"
   191     fi
   192 fi
   193 
   194 # Create the directories we'll use, even if restarting: it does no harm to
   195 # create already existent directories, and CT_BUILD_DIR needs to be created
   196 # anyway
   197 CT_DoExecLog ALL mkdir -p "${CT_TARBALLS_DIR}"
   198 CT_DoExecLog ALL mkdir -p "${CT_SRC_DIR}"
   199 CT_DoExecLog ALL mkdir -p "${CT_BUILD_DIR}"
   200 CT_DoExecLog ALL mkdir -p "${CT_CONFIG_DIR}"
   201 CT_DoExecLog ALL mkdir -p "${CT_INSTALL_DIR}"
   202 CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}"
   203 CT_DoExecLog ALL mkdir -p "${CT_CC_CORE_STATIC_PREFIX_DIR}"
   204 CT_DoExecLog ALL mkdir -p "${CT_CC_CORE_SHARED_PREFIX_DIR}"
   205 
   206 # Only create the state dir if asked for a restartable build
   207 [ -n "${CT_DEBUG_CT_SAVE_STEPS}" ] && CT_DoExecLog ALL mkdir -p "${CT_STATE_DIR}"
   208 
   209 # Check install file system case-sensitiveness
   210 CT_DoExecLog DEBUG touch "${CT_PREFIX_DIR}/foo"
   211 CT_TestAndAbort "Your file system in '${CT_PREFIX_DIR}' is *not* case-sensitive!" -f "${CT_PREFIX_DIR}/FOO"
   212 CT_DoExecLog DEBUG rm -f "${CT_PREFIX_DIR}/foo"
   213 
   214 # Kludge: CT_INSTALL_DIR and CT_PREFIX_DIR might have grown read-only if
   215 # the previous build was successful. To be able to move the logfile there,
   216 # switch them back to read/write
   217 CT_DoExecLog ALL chmod -R u+w "${CT_INSTALL_DIR}" "${CT_PREFIX_DIR}"
   218 
   219 # Redirect log to the actual log file now we can
   220 # It's quite understandable that the log file will be installed in the install
   221 # directory, so we must first ensure it exists and is writeable (above) before
   222 # we can log there
   223 exec >/dev/null
   224 case "${CT_LOG_TO_FILE}" in
   225     y)  CT_LOG_FILE="${CT_PREFIX_DIR}/build.log"
   226         cat "${tmp_log_file}" >>"${CT_LOG_FILE}"
   227         rm -f "${tmp_log_file}"
   228         exec >>"${CT_LOG_FILE}"
   229         ;;
   230     *)  rm -f "${tmp_log_file}"
   231         ;;
   232 esac
   233 
   234 # Setting up the rest of the environment only if not restarting
   235 if [ -z "${CT_RESTART}" ]; then
   236     # What's our shell?
   237     # Will be plain /bin/sh on most systems, except if we have /bin/ash and we
   238     # _explictly_ required using it
   239     CT_SHELL="/bin/sh"
   240     [ "${CT_CONFIG_SHELL_ASH}" = "y" -a -x "/bin/ash" ] && CT_SHELL="/bin/ash"
   241 
   242     # Arrange paths depending on wether we use sys-root or not.
   243     if [ "${CT_USE_SYSROOT}" = "y" ]; then
   244         CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/${CT_SYSROOT_DIR_PREFIX}/sys-root"
   245         CT_DEBUGROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/${CT_SYSROOT_DIR_PREFIX}/debug-root"
   246         CT_HEADERS_DIR="${CT_SYSROOT_DIR}/usr/include"
   247         BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
   248         CC_CORE_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
   249         CC_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
   250         LIBC_SYSROOT_ARG=""
   251         # glibc's prefix must be exactly /usr, else --with-sysroot'd gcc will get
   252         # confused when $sysroot/usr/include is not present.
   253         # Note: --prefix=/usr is magic!
   254         # See http://www.gnu.org/software/libc/FAQ.html#s-2.2
   255     else
   256         # plain old way. All libraries in prefix/target/lib
   257         CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}"
   258         CT_HEADERS_DIR="${CT_SYSROOT_DIR}/include"
   259         # hack!  Always use --with-sysroot for binutils.
   260         # binutils 2.14 and later obey it, older binutils ignore it.
   261         # Lets you build a working 32->64 bit cross gcc
   262         BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
   263         # Use --with-headers, else final gcc will define disable_glibc while
   264         # building libgcc, and you'll have no profiling
   265         CC_CORE_SYSROOT_ARG="--without-headers"
   266         CC_SYSROOT_ARG="--with-headers=${CT_HEADERS_DIR}"
   267         LIBC_SYSROOT_ARG="prefix="
   268     fi
   269     CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}"
   270     CT_DoExecLog ALL mkdir -p "${CT_DEBUGROOT_DIR}"
   271 
   272     # Prepare the 'lib' directories in sysroot, else the ../lib64 hack used by
   273     # 32 -> 64 bit crosscompilers won't work, and build of final gcc will fail
   274     # with: "ld: cannot open crti.o: No such file or directory"
   275     # Also prepare the lib directory in the install dir, else some 64 bit archs
   276     # won't build
   277     CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/lib"
   278     CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/lib"
   279     CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
   280 
   281     # Prevent gcc from installing its libraries outside of the sys-root
   282     CT_DoExecLog ALL ln -sf "./${CT_SYSROOT_DIR_PREFIX}/sys-root/lib" "${CT_PREFIX_DIR}/${CT_TARGET}/lib"
   283 
   284     # Now, in case we're 64 bits, just have lib64/ be a symlink to lib/
   285     # so as to have all libraries in the same directory (we can do that
   286     # because we are *not* multilib).
   287     if [ "${CT_ARCH_64}" = "y" ]; then
   288         CT_DoExecLog ALL ln -sf "lib" "${CT_PREFIX_DIR}/lib64"
   289         CT_DoExecLog ALL ln -sf "lib" "${CT_SYSROOT_DIR}/lib64"
   290         CT_DoExecLog ALL ln -sf "lib" "${CT_SYSROOT_DIR}/usr/lib64"
   291         CT_DoExecLog ALL ln -sf "lib" "${CT_PREFIX_DIR}/${CT_TARGET}/lib64"
   292     fi
   293 
   294     # Determine build system if not set by the user
   295     CT_Test "You did not specify the build system. That's OK, I can guess..." -z "${CT_BUILD}"
   296     case "${CT_BUILD}" in
   297         "") CT_BUILD=$("${CT_BUILD_PREFIX}gcc${CT_BUILD_SUFFIX}" -dumpmachine);;
   298     esac
   299 
   300     # Prepare mangling patterns to later modify BUILD and HOST (see below)
   301     case "${CT_TOOLCHAIN_TYPE}" in
   302         cross)
   303             CT_HOST="${CT_BUILD}"
   304             build_mangle="build_"
   305             host_mangle="build_"
   306             ;;
   307         *)  CT_Abort "No code for '${CT_TOOLCHAIN_TYPE}' toolchain type!"
   308             ;;
   309     esac
   310 
   311     # Save the real tuples to generate shell-wrappers to the real tools
   312     CT_REAL_BUILD="${CT_BUILD}"
   313     CT_REAL_HOST="${CT_HOST}"
   314 
   315     # Canonicalise CT_BUILD and CT_HOST
   316     # Not only will it give us full-qualified tuples, but it will also ensure
   317     # that they are valid tuples (in case of typo with user-provided tuples)
   318     # That's way better than trying to rewrite config.sub ourselves...
   319     CT_BUILD=$(CT_DoConfigSub "${CT_BUILD}")
   320     CT_HOST=$(CT_DoConfigSub "${CT_HOST}")
   321 
   322     # Modify BUILD and HOST so that gcc always generate a cross-compiler
   323     # even if any of the build, host or target machines are the same.
   324     # NOTE: we'll have to mangle the (BUILD|HOST)->TARGET x-compiler to
   325     #       support canadain build, later...
   326     CT_BUILD="${CT_BUILD/-/-${build_mangle}}"
   327     CT_HOST="${CT_HOST/-/-${host_mangle}}"
   328 
   329     # Now we have mangled our BUILD and HOST tuples, we must fake the new
   330     # cross-tools for those mangled tuples.
   331     CT_DoLog DEBUG "Making build system tools available"
   332     CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/bin"
   333     for m in BUILD HOST; do
   334         r="CT_REAL_${m}"
   335         v="CT_${m}"
   336         p="CT_${m}_PREFIX"
   337         s="CT_${m}_SUFFIX"
   338         if [ -n "${!p}" ]; then
   339             t="${!p}"
   340         else
   341             t="${!r}-"
   342         fi
   343 
   344         for tool in ar as dlltool gcc g++ gcj gnatbind gnatmake ld nm objcopy objdump ranlib strip windres; do
   345             # First try with prefix + suffix
   346             # Then try with prefix only
   347             # Then try with suffix only, but only for BUILD, and HOST iff REAL_BUILD == REAL_HOST
   348             # Finally try with neither prefix nor suffix, but only for BUILD, and HOST iff REAL_BUILD == REAL_HOST
   349             # This is needed, because some tools have a prefix and
   350             # a suffix (eg. gcc), while others may have only one,
   351             # or even none (eg. binutils)
   352             where=$(CT_Which "${t}${tool}${!s}")
   353             [ -z "${where}" ] && where=$(CT_Which "${t}${tool}")
   354             if [    -z "${where}"                         \
   355                  -a \(    "${m}" = "BUILD"                \
   356                        -o "${CT_REAL_BUILD}" = "${!r}" \) ]; then
   357                 where=$(CT_Which "${tool}${!s}")
   358             fi
   359             if [ -z "${where}"                            \
   360                  -a \(    "${m}" = "BUILD"                \
   361                        -o "${CT_REAL_BUILD}" = "${!r}" \) ]; then
   362                 where=$(CT_Which "${tool}")
   363             fi
   364 
   365             # Not all tools are available for all platforms, but some are really,
   366             # bally needed
   367             if [ -n "${where}" ]; then
   368                 CT_DoLog DEBUG "  '${!v}-${tool}' -> '${where}'"
   369                 printf "#${BANG}${CT_SHELL}\nexec '${where}' \"\${@}\"\n" >"${CT_PREFIX_DIR}/bin/${!v}-${tool}"
   370                 CT_DoExecLog ALL chmod 700 "${CT_PREFIX_DIR}/bin/${!v}-${tool}"
   371             else
   372                 case "${tool}" in
   373                     # We'll at least need some of them...
   374                     ar|as|gcc|ld|nm|objcopy|objdump|ranlib)
   375                         CT_Abort "Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : either needed!"
   376                         ;;
   377                     # Some are conditionnally required
   378                     # Add them in alphabetical (C locale) ordering
   379                     gcj)
   380                         CT_TestAndAbort "Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : either needed!" "${CT_CC_LANG_JAVA}" = "y"
   381                         ;;
   382                     # If any other is missing, only warn at low level
   383                     *)
   384                         # It does not deserve a WARN level.
   385                         CT_DoLog DEBUG "  Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : not required."
   386                         ;;
   387                 esac
   388             fi
   389         done
   390     done
   391 
   392     # Carefully add paths in the order we want them:
   393     #  - first try in ${CT_PREFIX_DIR}/bin
   394     #  - then try in ${CT_CC_CORE_SHARED_PREFIX_DIR}/bin
   395     #  - then try in ${CT_CC_CORE_STATIC_PREFIX_DIR}/bin
   396     #  - fall back to searching user's PATH
   397     # Of course, neither cross-native nor canadian can run on BUILD,
   398     # so don't add those PATHs in this case...
   399     case "${CT_TOOLCHAIN_TYPE}" in
   400         cross)  export PATH="${CT_PREFIX_DIR}/bin:${CT_CC_CORE_SHARED_PREFIX_DIR}/bin:${CT_CC_CORE_STATIC_PREFIX_DIR}/bin:${PATH}";;
   401         *)  ;;
   402     esac
   403 
   404     # Some makeinfo versions are a pain in [put your most sensible body part here].
   405     # Go ahead with those, by creating a wrapper that keeps partial files, and that
   406     # never fails:
   407     CT_DoLog DEBUG "  'makeinfo' -> '$(CT_Which makeinfo)'"
   408     printf "#${BANG}/bin/sh\n$(CT_Which makeinfo) --force \"\${@}\"\ntrue\n" >"${CT_PREFIX_DIR}/bin/makeinfo"
   409     CT_DoExecLog ALL chmod 700 "${CT_PREFIX_DIR}/bin/makeinfo"
   410 
   411     # Help gcc
   412     CT_CFLAGS_FOR_HOST=
   413     [ "${CT_USE_PIPES}" = "y" ] && CT_CFLAGS_FOR_HOST="${CT_CFLAGS_FOR_HOST} -pipe"
   414 
   415     # Override the configured jobs with what's been given on the command line
   416     [ -n "${CT_JOBS}" ] && CT_PARALLEL_JOBS="${CT_JOBS}"
   417 
   418     # Set the shell to be used by ./configure scripts and by Makefiles (those
   419     # that support it!).
   420     export CONFIG_SHELL="${CT_SHELL}"
   421 
   422     # And help make go faster
   423     PARALLELMFLAGS=
   424     [ ${CT_PARALLEL_JOBS} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -j${CT_PARALLEL_JOBS}"
   425     [ ${CT_LOAD} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -l${CT_LOAD}"
   426     export PARALLELMFLAGS
   427 
   428     CT_DoLog EXTRA "Installing user-supplied crosstool-NG configuration"
   429     CT_DoExecLog DEBUG install -m 0755 "${CT_LIB_DIR}/scripts/toolchain-config.in" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config"
   430     CT_DoExecLog DEBUG sed -r -i -e 's,@@grep@@,"'"${grep}"'",;' "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config"
   431     bzip2 -c -9 .config >>"${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config"
   432 
   433     CT_DoStep EXTRA "Dumping internal crosstool-NG configuration"
   434     CT_DoLog EXTRA "Building a toolchain for:"
   435     CT_DoLog EXTRA "  build  = ${CT_REAL_BUILD}"
   436     CT_DoLog EXTRA "  host   = ${CT_REAL_HOST}"
   437     CT_DoLog EXTRA "  target = ${CT_TARGET}"
   438     set |grep -E '^CT_.+=' |sort |CT_DoLog DEBUG
   439     CT_EndStep
   440 fi
   441 
   442 if [ -z "${CT_RESTART}" ]; then
   443     CT_DoStep INFO "Retrieving needed toolchain components' tarballs"
   444     do_kernel_get
   445     do_gmp_get
   446     do_mpfr_get
   447     do_binutils_get
   448     do_cc_get
   449     do_libc_get
   450     do_tools_get
   451     do_debug_get
   452     CT_EndStep
   453 
   454     if [ "${CT_ONLY_DOWNLOAD}" != "y" ]; then
   455         if [ "${CT_FORCE_EXTRACT}" = "y" ]; then
   456             CT_DoForceRmdir "${CT_SRC_DIR}"
   457             CT_DoExecLog ALL mkdir -p "${CT_SRC_DIR}"
   458         fi
   459         CT_DoStep INFO "Extracting and patching toolchain components"
   460         do_kernel_extract
   461         do_gmp_extract
   462         do_mpfr_extract
   463         do_binutils_extract
   464         do_cc_extract
   465         do_libc_extract
   466         do_tools_extract
   467         do_debug_extract
   468         CT_EndStep
   469     fi
   470 fi
   471 
   472 # Now for the job by itself. Go have a coffee!
   473 if [ "${CT_ONLY_DOWNLOAD}" != "y" -a "${CT_ONLY_EXTRACT}" != "y" ]; then
   474     # Because of CT_RESTART, this becomes quite complex
   475     do_stop=0
   476     prev_step=
   477     [ -n "${CT_RESTART}" ] && do_it=0 || do_it=1
   478     # Aha! CT_STEPS comes from steps.mk!
   479     for step in ${CT_STEPS}; do
   480         if [ ${do_it} -eq 0 ]; then
   481             if [ "${CT_RESTART}" = "${step}" ]; then
   482                 CT_DoLoadState "${step}"
   483                 do_it=1
   484                 do_stop=0
   485             fi
   486         else
   487             CT_DoSaveState ${step}
   488             if [ ${do_stop} -eq 1 ]; then
   489                 CT_DoLog ERROR "Stopping just after step '${prev_step}', as requested."
   490                 exit 0
   491             fi
   492         fi
   493         if [ ${do_it} -eq 1 ]; then
   494             do_${step}
   495             if [ "${CT_STOP}" = "${step}" ]; then
   496                 do_stop=1
   497             fi
   498             if [ "${CT_DEBUG_PAUSE_STEPS}" = "y" ]; then
   499                 CT_DoPause "Step '${step}' finished"
   500             fi
   501         fi
   502         prev_step="${step}"
   503     done
   504 fi
   505 
   506 CT_DoEnd INFO
   507 
   508 # From now-on, it can become impossible to log any time, because
   509 # either we're compressing the log file, or it can become RO any
   510 # moment... Consign all ouptut to oblivion...
   511 CT_DoLog INFO "Finishing installation (may take a few seconds)..."
   512 exec >/dev/null 2>&1
   513 
   514 [ "${CT_LOG_FILE_COMPRESS}" = y ] && bzip2 -9 "${CT_LOG_FILE}"
   515 [ "${CT_INSTALL_DIR_RO}" = "y"  ] && chmod -R a-w "${CT_INSTALL_DIR}"
   516 
   517 trap - EXIT