scripts/crosstool-NG.sh.in
author "Yann E. MORIN" <yann.morin.1998@free.fr>
Mon Feb 25 21:19:31 2013 +0100 (2013-02-25)
changeset 3185 f89f8e6f8766
parent 3172 edb17e96ca60
child 3246 ff6b7a9bd370
permissions -rw-r--r--
Makefile: fix parrallel (-j) installs

Currently, we would remove previously installed patches before
installing the new ones. Unfortunately, that does not play well
with heavily parallel installs.

Now, we consider it is the responsibility of the user to first
uninstall any previous version before installing a new one.

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