scripts/crosstool-NG.sh.in
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Wed Jan 06 18:42:41 2010 +0100 (2010-01-06)
changeset 1696 f04fb2d52023
parent 1663 e94f4ffddd1d
child 1726 f581da7fe34e
permissions -rw-r--r--
complibs/mpfr: add latest version 2.4.2

Note: the MPFR site happens to be down at the time I wrote
this message, and happens to be down quite often.

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