scripts/crosstool-NG.sh.in
author "Benoît THÉBAUDEAU" <benoit.thebaudeau@advansee.com>
Tue May 31 20:12:35 2011 +0200 (2011-05-31)
changeset 2487 481cd34691f0
parent 2467 200836977ce6
child 2503 b5541f296b92
permissions -rw-r--r--
gcc: promote PKGVERSION and BUGURL options to toolchain level

This patch promotes the PKGVERSION and BUGURL options to toolchain level so that
all toolchain components supporting them can benefit from them.

These options are passed to configure through --with-pkgversion and
--with-bugurl.

They are supported by binutils 2.18+, gcc 4.3+, eglibc 2.9+ and gdb 7.0+.

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