scripts/crosstool-NG.sh.in
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sat Jan 22 23:20:18 2011 +0100 (2011-01-22)
changeset 2305 2ed26c646568
parent 2286 4960f5d9f829
child 2306 0a9e8cb7ccf4
permissions -rw-r--r--
scripts: create the makeinfo wrapper before we set PATH

If we set PATH to the tools wrappers before we create the
makeinfo wrapper, then we may well wrap an existing wrapper
from a previous run.

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