scripts/crosstool-NG.sh.in
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed Jan 13 20:46:01 2010 +0100 (2010-01-13)
changeset 1732 6b2ae7804c6f
parent 1726 f581da7fe34e
child 1753 fcc55af9aee5
child 1755 30d91bfc1f2a
permissions -rw-r--r--
debug/gdb: staticaly link to ncurses for the native gdb

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