scripts/crosstool-NG.sh.in
author Remy Bohmer <linux@bohmer.net>
Thu May 27 23:18:19 2010 +0200 (2010-05-27)
changeset 2060 51e4597b07fc
parent 2044 20dd8cef1c8a
child 2116 75ee9a87c0e4
permissions -rw-r--r--
scripts: add option to strip all toolchain executables

To reduce filesizes of the toolchain and even improve build times
of projects to be build with this toolchain it is usefull to strip
the delivered toolchain executables. Since it is not likely that we
will debug the toolchain executables itself we do not need the
debug information inside the executables itself.

Signed-off-by: Remy Bohmer <linux@bohmer.net>
     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
    26 # Yes! We can do full logging from now on!
    27 
    28 # Overide the locale early, in case we ever translate crosstool-NG messages
    29 [ -z "${CT_NO_OVERIDE_LC_MESSAGES}" ] && export LC_ALL=C
    30 
    31 # remove . from PATH since it can cause gcc build failures
    32 CT_SanitizePath
    33 
    34 # Some sanity checks in the environment and needed tools
    35 CT_DoLog INFO "Performing some trivial sanity checks"
    36 CT_TestAndAbort "Don't set LD_LIBRARY_PATH. It screws up the build." -n "${LD_LIBRARY_PATH}"
    37 CT_TestAndAbort "Don't set CFLAGS. It screws up the build." -n "${CFLAGS}"
    38 CT_TestAndAbort "Don't set CXXFLAGS. It screws up the build." -n "${CXXFLAGS}"
    39 CT_Test "GREP_OPTIONS screws up the build. Resetting." -n "${GREP_OPTIONS}"
    40 export GREP_OPTIONS=
    41 
    42 # Some sanity checks on paths content
    43 for d in            \
    44     LOCAL_TARBALLS  \
    45     WORK            \
    46     PREFIX          \
    47     INSTALL         \
    48     ; do
    49         eval dir="\${CT_${d}_DIR}"
    50         case "${dir}" in
    51             *" "*)
    52                 CT_Abort "'CT_${d}_DIR'='${dir}' contains a space in it.\nDon't use spaces in paths, it breaks things."
    53                 ;;
    54         esac
    55 done
    56 
    57 # Where will we work?
    58 CT_WORK_DIR="${CT_WORK_DIR:-${CT_TOP_DIR}/targets}"
    59 CT_DoExecLog ALL mkdir -p "${CT_WORK_DIR}"
    60 
    61 # Check build file system case-sensitiveness
    62 CT_DoExecLog DEBUG touch "${CT_WORK_DIR}/foo"
    63 CT_TestAndAbort "Your file system in '${CT_WORK_DIR}' is *not* case-sensitive!" -f "${CT_WORK_DIR}/FOO"
    64 CT_DoExecLog DEBUG rm -f "${CT_WORK_DIR}/foo"
    65 
    66 # What's our shell?
    67 # Will be plain /bin/sh on most systems, except if we have /bin/ash and we
    68 # _explictly_ required using it
    69 case "${CT_CONFIG_SHELL}" in
    70     sh)     CT_SHELL="/bin/sh";;
    71     ash)    CT_SHELL="/bin/ash";;
    72     bash)   CT_SHELL="${BASH}";;
    73     custom) CT_SHELL="${CT_CONFIG_SHELL_CUSTOM_PATH}";;
    74 esac
    75 
    76 # Check the user is using an existing SHELL to be used by ./configure and Makefiles
    77 CT_TestOrAbort "The CONFIG_SHELL '${CT_CONFIG_SHELL}' (${CT_SHELL}) is not valid" -f "${CT_SHELL}" -a -x "${CT_SHELL}"
    78 
    79 # Create the bin-overide early
    80 # Contains symlinks to the tools found by ./configure
    81 # Note: CT_DoLog and CT_DoExecLog do not use any of those tool, so
    82 # they can be safely used
    83 CT_TOOLS_OVERIDE_DIR="${CT_WORK_DIR}/tools"
    84 CT_DoLog DEBUG "Creating bin-overide for tools in '${CT_TOOLS_OVERIDE_DIR}'"
    85 CT_DoExecLog DEBUG mkdir -p "${CT_TOOLS_OVERIDE_DIR}/bin"
    86 cat "${CT_LIB_DIR}/paths.mk" |while read trash line; do
    87     tool="${line%%=*}"
    88     path="${line#*=}"
    89     CT_DoLog DEBUG "Creating script-override for '${tool}' -> '${path}'"
    90     printf "#${BANG}${CT_SHELL}\nexec '${path}' \"\${@}\"\n" >"${CT_TOOLS_OVERIDE_DIR}/bin/${tool}"
    91     CT_DoExecLog ALL chmod 700 "${CT_TOOLS_OVERIDE_DIR}/bin/${tool}"
    92 done
    93 export PATH="${CT_TOOLS_OVERIDE_DIR}/bin:${PATH}"
    94 
    95 # Start date. Can't be done until we know the locale
    96 # Also requires the bin-override tools
    97 CT_STAR_DATE=$(CT_DoDate +%s%N)
    98 CT_STAR_DATE_HUMAN=$(CT_DoDate +%Y%m%d.%H%M%S)
    99 
   100 # Log real begining of build, now
   101 CT_DoLog INFO "Build started ${CT_STAR_DATE_HUMAN}"
   102 
   103 CT_DoStep DEBUG "Dumping user-supplied crosstool-NG configuration"
   104 CT_DoExecLog DEBUG grep -E '^(# |)CT_' .config
   105 CT_EndStep
   106 
   107 CT_DoLog DEBUG "Unsetting and unexporting MAKEFLAGS"
   108 unset MAKEFLAGS
   109 export MAKEFLAGS
   110 
   111 CT_DoLog INFO "Building environment variables"
   112 
   113 # Include sub-scripts instead of calling them: that way, we do not have to
   114 # export any variable, nor re-parse the configuration and functions files.
   115 . "${CT_LIB_DIR}/scripts/build/internals.sh"
   116 . "${CT_LIB_DIR}/scripts/build/arch/${CT_ARCH}.sh"
   117 . "${CT_LIB_DIR}/scripts/build/companion_tools.sh"
   118 . "${CT_LIB_DIR}/scripts/build/kernel/${CT_KERNEL}.sh"
   119 . "${CT_LIB_DIR}/scripts/build/companion_libs/gmp.sh"
   120 . "${CT_LIB_DIR}/scripts/build/companion_libs/mpfr.sh"
   121 . "${CT_LIB_DIR}/scripts/build/companion_libs/ppl.sh"
   122 . "${CT_LIB_DIR}/scripts/build/companion_libs/cloog.sh"
   123 . "${CT_LIB_DIR}/scripts/build/companion_libs/mpc.sh"
   124 . "${CT_LIB_DIR}/scripts/build/companion_libs/libelf.sh"
   125 . "${CT_LIB_DIR}/scripts/build/binutils/binutils.sh"
   126 . "${CT_LIB_DIR}/scripts/build/binutils/elf2flt.sh"
   127 . "${CT_LIB_DIR}/scripts/build/binutils/sstrip.sh"
   128 . "${CT_LIB_DIR}/scripts/build/libc/${CT_LIBC}.sh"
   129 . "${CT_LIB_DIR}/scripts/build/cc/${CT_CC}.sh"
   130 . "${CT_LIB_DIR}/scripts/build/debug.sh"
   131 . "${CT_LIB_DIR}/scripts/build/test_suite.sh"
   132 
   133 # Target tuple: CT_TARGET needs a little love:
   134 CT_DoBuildTargetTuple
   135 
   136 # Kludge: If any of the configured options needs CT_TARGET,
   137 # then rescan the options file now:
   138 . .config
   139 
   140 # Sanity check some directories
   141 CT_TestAndAbort "'CT_PREFIX_DIR' is not set: where should I install?" -z "${CT_PREFIX_DIR}"
   142 
   143 # Second kludge: merge user-supplied target CFLAGS with architecture-provided
   144 # target CFLAGS. Do the same for LDFLAGS in case it happens in the future.
   145 # Put user-supplied flags at the end, so that they take precedence.
   146 CT_TARGET_CFLAGS="${CT_ARCH_TARGET_CFLAGS} ${CT_TARGET_CFLAGS}"
   147 CT_TARGET_LDFLAGS="${CT_ARCH_TARGET_LDFLAGS} ${CT_TARGET_LDFLAGS}"
   148 CT_CC_CORE_EXTRA_CONFIG="${CT_ARCH_CC_CORE_EXTRA_CONFIG} ${CT_CC_CORE_EXTRA_CONFIG}"
   149 CT_CC_EXTRA_CONFIG="${CT_ARCH_CC_EXTRA_CONFIG} ${CT_CC_EXTRA_CONFIG}"
   150 
   151 # Compute the working directories names
   152 CT_TARBALLS_DIR="${CT_WORK_DIR}/tarballs"
   153 CT_SRC_DIR="${CT_WORK_DIR}/src"
   154 CT_BUILD_DIR="${CT_WORK_DIR}/${CT_TARGET}/build"
   155 CT_STATE_DIR="${CT_WORK_DIR}/${CT_TARGET}/state"
   156 CT_CONFIG_DIR="${CT_BUILD_DIR}/configs"
   157 if [ "${CT_COMPLIBS_SHARED}" = "y" ]; then
   158     CT_COMPLIBS_DIR="${CT_PREFIX_DIR}"
   159     # Set LD_LIBRARY_PATH to point to prefix/lib so we can find our own
   160     # libraries; add as first path, so we get hit first by the dynamic linker
   161     CT_SetLibPath "${CT_COMPLIBS_DIR}/lib" first
   162 else
   163     CT_COMPLIBS_DIR="${CT_BUILD_DIR}/static"
   164 fi
   165 
   166 # Compute test suite install directory
   167 CT_TEST_SUITE_DIR=${CT_INSTALL_DIR}/test-suite
   168 
   169 # Note: we'll always install the core compiler in its own directory, so as to
   170 # not mix the two builds: core and final.
   171 CT_CC_CORE_STATIC_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core-static"
   172 CT_CC_CORE_SHARED_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core-shared"
   173 
   174 # We must ensure that we can restart if asked for!
   175 if [ -n "${CT_RESTART}" -a ! -d "${CT_STATE_DIR}"  ]; then
   176     CT_DoLog ERROR "You asked to restart a non-restartable build"
   177     CT_DoLog ERROR "This happened because you didn't set CT_DEBUG_CT_SAVE_STEPS"
   178     CT_DoLog ERROR "in the config options for the previous build, or the state"
   179     CT_DoLog ERROR "directory for the previous build was deleted."
   180     CT_Abort "I will stop here to avoid any carnage"
   181 fi
   182 
   183 # If the local tarball directory does not exist, say so, and don't try to save there!
   184 if [    "${CT_SAVE_TARBALLS}" = "y"     \
   185      -a ! -d "${CT_LOCAL_TARBALLS_DIR}" ]; then
   186     CT_DoLog WARN "Directory '${CT_LOCAL_TARBALLS_DIR}' does not exist."
   187     CT_DoLog WARN "Will not save downloaded tarballs to local storage."
   188     CT_SAVE_TARBALLS=
   189 fi
   190 
   191 # Check now if we can write to the destination directory:
   192 if [ -d "${CT_INSTALL_DIR}" ]; then
   193     CT_TestAndAbort "Destination directory '${CT_INSTALL_DIR}' is not removable" ! -w $(dirname "${CT_INSTALL_DIR}")
   194 fi
   195 
   196 # Good, now grab a bit of informations on the system we're being run on,
   197 # just in case something goes awok, and it's not our fault:
   198 CT_SYS_USER=$(id -un)
   199 CT_SYS_HOSTNAME=$(hostname -f 2>/dev/null || true)
   200 # Hmmm. Some non-DHCP-enabled machines do not have an FQDN... Fall back to node name.
   201 CT_SYS_HOSTNAME="${CT_SYS_HOSTNAME:-$(uname -n)}"
   202 CT_SYS_KERNEL=$(uname -s)
   203 CT_SYS_REVISION=$(uname -r)
   204 CT_SYS_OS=$(uname -s)
   205 CT_SYS_MACHINE=$(uname -m)
   206 CT_SYS_PROCESSOR=$(uname -p)
   207 CT_SYS_GCC=$(gcc -dumpversion)
   208 CT_SYS_TARGET=$(CT_DoConfigGuess)
   209 CT_TOOLCHAIN_ID="crosstool-${CT_VERSION} build ${CT_STAR_DATE_HUMAN} by ${CT_SYS_USER}@${CT_SYS_HOSTNAME}"
   210 
   211 CT_DoLog EXTRA "Preparing working directories"
   212 
   213 # Ah! The build directory shall be eradicated, even if we restart!
   214 if [ -d "${CT_BUILD_DIR}" ]; then
   215     CT_DoForceRmdir "${CT_BUILD_DIR}"
   216 fi
   217 
   218 # Don't eradicate directories if we need to restart
   219 if [ -z "${CT_RESTART}" ]; then
   220     # Get rid of pre-existing installed toolchain and previous build directories.
   221     # We need to do that _before_ we can safely log, because the log file will
   222     # most probably be in the toolchain directory.
   223     if [ "${CT_FORCE_DOWNLOAD}" = "y" -a -d "${CT_TARBALLS_DIR}" ]; then
   224         CT_DoForceRmdir "${CT_TARBALLS_DIR}"
   225     fi
   226     if [ "${CT_FORCE_EXTRACT}" = "y" -a -d "${CT_SRC_DIR}" ]; then
   227         CT_DoForceRmdir "${CT_SRC_DIR}"
   228     fi
   229     if [ -d "${CT_INSTALL_DIR}" ]; then
   230         CT_DoForceRmdir "${CT_INSTALL_DIR}"
   231     fi
   232     # In case we start anew, get rid of the previously saved state directory
   233     if [ -d "${CT_STATE_DIR}" ]; then
   234         CT_DoForceRmdir "${CT_STATE_DIR}"
   235     fi
   236 fi
   237 
   238 # Create the directories we'll use, even if restarting: it does no harm to
   239 # create already existent directories, and CT_BUILD_DIR needs to be created
   240 # anyway
   241 CT_DoExecLog ALL mkdir -p "${CT_TARBALLS_DIR}"
   242 CT_DoExecLog ALL mkdir -p "${CT_SRC_DIR}"
   243 CT_DoExecLog ALL mkdir -p "${CT_BUILD_DIR}"
   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. To be able to move the logfile there,
   263 # switch them back to read/write
   264 CT_DoExecLog ALL chmod -R u+w "${CT_INSTALL_DIR}" "${CT_PREFIX_DIR}"
   265 
   266 # Redirect log to the actual log file now we can
   267 # It's quite understandable that the log file will be installed in the install
   268 # directory, so we must first ensure it exists and is writeable (above) before
   269 # we can log there
   270 exec >/dev/null
   271 case "${CT_LOG_TO_FILE}" in
   272     y)  CT_LOG_FILE="${CT_PREFIX_DIR}/build.log"
   273         cat "${tmp_log_file}" >>"${CT_LOG_FILE}"
   274         rm -f "${tmp_log_file}"
   275         exec >>"${CT_LOG_FILE}"
   276         ;;
   277     *)  rm -f "${tmp_log_file}"
   278         ;;
   279 esac
   280 
   281 # Setting up the rest of the environment only if not restarting
   282 if [ -z "${CT_RESTART}" ]; then
   283     # Arrange paths depending on wether we use sys-root or not.
   284     if [ "${CT_USE_SYSROOT}" = "y" ]; then
   285         CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/${CT_SYSROOT_DIR_PREFIX}/sys-root"
   286         CT_DEBUGROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/${CT_SYSROOT_DIR_PREFIX}/debug-root"
   287         CT_HEADERS_DIR="${CT_SYSROOT_DIR}/usr/include"
   288         BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
   289         CC_CORE_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
   290         CC_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
   291         LIBC_SYSROOT_ARG=""
   292         # glibc's prefix must be exactly /usr, else --with-sysroot'd gcc will get
   293         # confused when $sysroot/usr/include is not present.
   294         # Note: --prefix=/usr is magic!
   295         # See http://www.gnu.org/software/libc/FAQ.html#s-2.2
   296     else
   297         # plain old way. All libraries in prefix/target/lib
   298         CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}"
   299         CT_DEBUGROOT_DIR="${CT_SYSROOT_DIR}"
   300         CT_HEADERS_DIR="${CT_SYSROOT_DIR}/include"
   301         # hack!  Always use --with-sysroot for binutils.
   302         # binutils 2.14 and later obey it, older binutils ignore it.
   303         # Lets you build a working 32->64 bit cross gcc
   304         BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
   305         # Use --with-headers, else final gcc will define disable_glibc while
   306         # building libgcc, and you'll have no profiling
   307         CC_CORE_SYSROOT_ARG="--without-headers"
   308         CC_SYSROOT_ARG="--with-headers=${CT_HEADERS_DIR}"
   309         LIBC_SYSROOT_ARG="prefix="
   310     fi
   311     CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}"
   312     CT_DoExecLog ALL mkdir -p "${CT_DEBUGROOT_DIR}"
   313 
   314     # Prepare the 'lib' directories in sysroot, else the ../lib64 hack used by
   315     # 32 -> 64 bit crosscompilers won't work, and build of final gcc will fail
   316     # with: "ld: cannot open crti.o: No such file or directory"
   317     # Also prepare the lib directory in the install dir, else some 64 bit archs
   318     # won't build
   319     CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/lib"
   320     CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/lib"
   321     CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
   322     CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/include"
   323 
   324     if [ "${CT_USE_SYSROOT}" = "y" ]; then
   325         # Prevent gcc from installing its libraries outside of the sys-root
   326         CT_DoExecLog ALL ln -sf "./${CT_SYSROOT_DIR_PREFIX}/sys-root/lib" "${CT_PREFIX_DIR}/${CT_TARGET}/lib"
   327         # Prevent libc from installing its headers outside of the sysroot
   328         CT_DoExecLog ALL ln -sf "./${CT_SYSROOT_DIR_PREFIX}/sys-root/usr/include" "${CT_PREFIX_DIR}/${CT_TARGET}/include"
   329     fi
   330 
   331     # Now, in case we're 64 bits, just have lib64/ be a symlink to lib/
   332     # so as to have all libraries in the same directory (we can do that
   333     # because we are *not* multilib).
   334     if [ "${CT_ARCH_64}" = "y" ]; then
   335         CT_DoExecLog ALL ln -sf "lib" "${CT_PREFIX_DIR}/lib64"
   336         CT_DoExecLog ALL ln -sf "lib" "${CT_SYSROOT_DIR}/lib64"
   337         CT_DoExecLog ALL ln -sf "lib" "${CT_SYSROOT_DIR}/usr/lib64"
   338         CT_DoExecLog ALL ln -sf "lib" "${CT_PREFIX_DIR}/${CT_TARGET}/lib64"
   339     fi
   340 
   341     # Determine build system if not set by the user
   342     if [ -z "${CT_BUILD}" ]; then
   343         CT_BUILD=$(CT_DoConfigGuess)
   344     fi
   345 
   346     # Prepare mangling patterns to later modify BUILD and HOST (see below)
   347     case "${CT_TOOLCHAIN_TYPE}" in
   348         cross)
   349             # A cross-compiler runs on the same machine it is built on
   350             CT_HOST="${CT_BUILD}"
   351             build_mangle="build_"
   352             host_mangle="build_"
   353             target_mangle=""
   354             install_build_tools_for="BUILD HOST"
   355             ;;
   356         canadian)
   357             build_mangle="build_"
   358             host_mangle="host_"
   359             target_mangle=""
   360             install_build_tools_for="BUILD HOST TARGET"
   361             ;;
   362         *)  CT_Abort "No code for '${CT_TOOLCHAIN_TYPE}' toolchain type!"
   363             ;;
   364     esac
   365 
   366     # Save the real tuples to generate shell-wrappers to the real tools
   367     CT_REAL_BUILD="${CT_BUILD}"
   368     CT_REAL_HOST="${CT_HOST}"
   369     CT_REAL_TARGET="${CT_TARGET}"
   370 
   371     # Canonicalise CT_BUILD and CT_HOST
   372     # Not only will it give us full-qualified tuples, but it will also ensure
   373     # that they are valid tuples (in case of typo with user-provided tuples)
   374     # That's way better than trying to rewrite config.sub ourselves...
   375     # CT_TARGET is already made canonical in CT_DoBuildTargetTuple
   376     CT_BUILD=$(CT_DoConfigSub "${CT_BUILD}")
   377     CT_HOST=$(CT_DoConfigSub "${CT_HOST}")
   378 
   379     # Modify BUILD and HOST so that gcc always generate a cross-compiler
   380     # even if any of the build, host or target machines are the same.
   381     # NOTE: we'll have to mangle the (BUILD|HOST)->TARGET x-compiler to
   382     #       support canadain build, later...
   383     CT_BUILD="${CT_BUILD/-/-${build_mangle}}"
   384     CT_HOST="${CT_HOST/-/-${host_mangle}}"
   385     CT_TARGET="${CT_TARGET/-/-${target_mangle}}"
   386 
   387     # Now we have mangled our BUILD and HOST tuples, we must fake the new
   388     # cross-tools for those mangled tuples.
   389     CT_DoLog DEBUG "Making build system tools available"
   390     CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/buildtools"
   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_PREFIX_DIR}/buildtools/${!v}-${tool}"
   428                 CT_DoExecLog ALL chmod 700 "${CT_PREFIX_DIR}/buildtools/${!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     # Carefully add paths in the order we want them:
   458     #  - first try in ${CT_PREFIX_DIR}/bin
   459     #  - then try in ${CT_CC_CORE_SHARED_PREFIX_DIR}/bin
   460     #  - then try in ${CT_CC_CORE_STATIC_PREFIX_DIR}/bin
   461     #  - fall back to searching user's PATH
   462     # Of course, neither cross-native nor canadian can run on BUILD,
   463     # so don't add those PATHs in this case...
   464     case "${CT_TOOLCHAIN_TYPE}" in
   465         cross)  export PATH="${CT_PREFIX_DIR}/buildtools:${CT_PREFIX_DIR}/bin:${CT_CC_CORE_SHARED_PREFIX_DIR}/bin:${CT_CC_CORE_STATIC_PREFIX_DIR}/bin:${PATH}";;
   466         canadian) export PATH="${CT_PREFIX_DIR}/buildtools:${PATH}";;
   467         *)  ;;
   468     esac
   469 
   470     # Some makeinfo versions are a pain in [put your most sensible body part here].
   471     # Go ahead with those, by creating a wrapper that keeps partial files, and that
   472     # never fails:
   473     CT_DoLog DEBUG "  'makeinfo' -> '$(CT_Which makeinfo)'"
   474     printf "#${BANG}${CT_SHELL}\n$(CT_Which makeinfo) --force \"\${@}\"\ntrue\n" >"${CT_PREFIX_DIR}/buildtools/makeinfo"
   475     CT_DoExecLog ALL chmod 700 "${CT_PREFIX_DIR}/buildtools/makeinfo"
   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     PARALLELMFLAGS=
   491     [ ${CT_PARALLEL_JOBS} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -j${CT_PARALLEL_JOBS}"
   492     [ ${CT_LOAD} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -l${CT_LOAD}"
   493     export PARALLELMFLAGS
   494 
   495     CT_DoLog EXTRA "Installing user-supplied crosstool-NG configuration"
   496     CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/bin"
   497     CT_DoExecLog DEBUG install -m 0755 "${CT_LIB_DIR}/scripts/toolchain-config.in" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config"
   498     CT_DoExecLog DEBUG sed -i -e 's,@@grep@@,"'"${grep}"'",;' "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config"
   499     bzip2 -c -9 .config >>"${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config"
   500 
   501     CT_DoStep EXTRA "Dumping internal crosstool-NG configuration"
   502     CT_DoLog EXTRA "Building a toolchain for:"
   503     CT_DoLog EXTRA "  build  = ${CT_REAL_BUILD}"
   504     CT_DoLog EXTRA "  host   = ${CT_REAL_HOST}"
   505     CT_DoLog EXTRA "  target = ${CT_TARGET}"
   506     set |grep -E '^CT_.+=' |sort |CT_DoLog DEBUG
   507     CT_DoLog DEBUG "Other environment:"
   508     printenv |grep -v -E '^CT_.+=' |CT_DoLog DEBUG
   509     CT_EndStep
   510 fi
   511 
   512 if [ -z "${CT_RESTART}" ]; then
   513     if [ "${CT_FORBID_DOWNLOAD}" = "y" ]; then
   514         CT_DoLog INFO "Downloading forbidden by configuration, skipping downloads"
   515     else
   516         CT_DoStep INFO "Retrieving needed toolchain components' tarballs"
   517         do_companion_tools_get
   518         do_kernel_get
   519         do_gmp_get
   520         do_mpfr_get
   521         do_ppl_get
   522         do_cloog_get
   523         do_mpc_get
   524         do_libelf_get
   525         do_binutils_get
   526         do_elf2flt_get
   527         do_sstrip_get
   528         do_cc_get
   529         do_libc_get
   530         do_debug_get
   531         do_test_suite_get
   532         CT_EndStep
   533     fi
   534 
   535     if [ "${CT_ONLY_DOWNLOAD}" != "y" ]; then
   536         if [ "${CT_FORCE_EXTRACT}" = "y" ]; then
   537             CT_DoForceRmdir "${CT_SRC_DIR}"
   538             CT_DoExecLog ALL mkdir -p "${CT_SRC_DIR}"
   539         fi
   540 
   541         if [ "${CT_COMP_TOOLS}" = "y" ]; then
   542           CT_DoStep INFO "Extracting, patching and installing companion tools"
   543           do_companion_tools_extract
   544           do_companion_tools
   545           CT_EndStep
   546         fi
   547 
   548         CT_DoStep INFO "Extracting and patching toolchain components"
   549         do_kernel_extract
   550         do_gmp_extract
   551         do_mpfr_extract
   552         do_ppl_extract
   553         do_cloog_extract
   554         do_mpc_extract
   555         do_libelf_extract
   556         do_binutils_extract
   557         do_elf2flt_extract
   558         do_sstrip_extract
   559         do_cc_extract
   560         do_libc_extract
   561         do_debug_extract
   562         do_test_suite_extract
   563         CT_EndStep
   564     fi
   565 fi
   566 
   567 # Now for the job by itself. Go have a coffee!
   568 if [ "${CT_ONLY_DOWNLOAD}" != "y" -a "${CT_ONLY_EXTRACT}" != "y" ]; then
   569     # Because of CT_RESTART, this becomes quite complex
   570     do_stop=0
   571     prev_step=
   572     [ -n "${CT_RESTART}" ] && do_it=0 || do_it=1
   573     # Aha! CT_STEPS comes from steps.mk!
   574     for step in ${CT_STEPS}; do
   575         if [ ${do_it} -eq 0 ]; then
   576             if [ "${CT_RESTART}" = "${step}" ]; then
   577                 CT_DoLoadState "${step}"
   578                 do_it=1
   579                 do_stop=0
   580             fi
   581         else
   582             CT_DoSaveState ${step}
   583             if [ ${do_stop} -eq 1 ]; then
   584                 CT_DoLog ERROR "Stopping just after step '${prev_step}', as requested."
   585                 exit 0
   586             fi
   587         fi
   588         if [ ${do_it} -eq 1 ]; then
   589             do_${step}
   590             if [ "${CT_STOP}" = "${step}" ]; then
   591                 do_stop=1
   592             fi
   593             if [ "${CT_DEBUG_PAUSE_STEPS}" = "y" ]; then
   594                 CT_DoPause "Step '${step}' finished"
   595             fi
   596         fi
   597         prev_step="${step}"
   598     done
   599 fi
   600 
   601 CT_DoEnd INFO
   602 
   603 # From now-on, it can become impossible to log any time, because
   604 # either we're compressing the log file, or it can become RO any
   605 # moment... Consign all ouptut to oblivion...
   606 CT_DoLog INFO "Finishing installation (may take a few seconds)..."
   607 exec >/dev/null 2>&1
   608 
   609 [ "${CT_LOG_FILE_COMPRESS}" = y ] && bzip2 -9 "${CT_LOG_FILE}"
   610 [ "${CT_INSTALL_DIR_RO}" = "y"  ] && chmod -R a-w "${CT_INSTALL_DIR}"
   611 [ "${CT_TEST_SUITE}" = "y" ] && chmod -R u+w "${CT_TEST_SUITE_DIR}"
   612 
   613 trap - EXIT