scripts/crosstool-NG.sh.in
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jul 17 17:56:22 2011 +0200 (2011-07-17)
changeset 2889 f3b2199620f1
parent 2801 21f4f28e60ec
child 2924 0eab838768b1
permissions -rw-r--r--
cc/gcc: pass the install prefix to the core passes

Currently, the discrimination on the core compilers prefixes depends on
the type of core compiler to build.

This is not correct, and the caller of the core backend should specify
the prefix.

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