scripts/crosstool-NG.sh.in
author Cody Schafer <dev@codyps.com>
Fri May 09 19:13:49 2014 -0700 (2014-05-09)
changeset 3312 4876ff97e039
parent 3246 ff6b7a9bd370
permissions -rw-r--r--
cc/gcc: allow CC_EXTRA_CONFIG_ARRAY on baremetal

The final bare-metal compiler is built using the core backend.
Currently the core uses the CC_CORE_EXTRA_CONFIG_ARRAY variable.

While this works as supposed to, this can leave the user puzzled
in the menuconfig, since all he can see is the core options, not
the final options.

Only show the core options if any of the core passes are needed,
and use the final options in the core-backend if we're issuing
the bare-metal compiler.

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