scripts/crosstool-NG.sh.in
author Michael Hope <michael.hope@linaro.org>
Thu Sep 29 12:40:42 2011 +1300 (2011-09-29)
changeset 2695 f2495884ca3e
parent 2653 e5fc5c9ea78a
child 2701 99de89e9acba
permissions -rw-r--r--
config: add a 'auto' value for the number of parallel jobs

When CT_PARALLEL_JOBS is -1, set the number of parallel jobs to the
number of online CPUs + 1. Update documentation to match.

I find this useful when building in the cloud. You can use the same
.config file and have the build adapt to the number of processors
available. Limited testing shows that NCPUS+1 is faster than NCPUS+0
or NCPUS+2.

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