scripts/crosstool-NG.sh.in
author Bart vdr. Meulen <bartvdrmeulen@gmail.com>
Sun Aug 02 16:45:43 2009 +0200 (2009-08-02)
changeset 1434 7e7290acccc1
parent 1426 cb3b1f427968
child 1448 8a21b4be90cd
permissions -rw-r--r--
fix wrapper script for symlinks

The wrapper script placed around the target binaries when
using the companion libraries does not work for symbolic links
The wrapper scripts needs to follow the links before calling the
actual binary

Signed-off-by: Bart vdr. Meulen <bartvdrmeulen@gmail.com>

---
     1 #!@@CT_bash@@
     2 # Copyright 2007 Yann E. MORIN
     3 # Licensed under the GPL v2. See COPYING in the root of this package.
     4 
     5 # This is the main entry point to crosstool
     6 # This will:
     7 #   - download, extract and patch the toolchain components
     8 #   - build and install each components in turn
     9 #   - and eventually test the resulting toolchain
    10 
    11 # What this file does is prepare the environment, based upon the user-choosen
    12 # options. It also checks the existing environment for un-friendly variables,
    13 # and builds the tools.
    14 
    15 # Parse the common functions
    16 # Note: some initialisation and sanitizing is done while parsing this file,
    17 # most notably:
    18 #  - set trap handler on errors,
    19 #  - don't hash commands lookups,
    20 #  - initialise logging.
    21 . "${CT_LIB_DIR}/scripts/functions"
    22 
    23 # Parse the configuration file
    24 # It has some info about the logging facility, so include it early
    25 . .config
    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 # Some sanity checks in the environment and needed tools
    32 CT_DoLog INFO "Performing some trivial sanity checks"
    33 CT_TestAndAbort "Don't set LD_LIBRARY_PATH. It screws up the build." -n "${LD_LIBRARY_PATH}"
    34 CT_TestAndAbort "Don't set CFLAGS. It screws up the build." -n "${CFLAGS}"
    35 CT_TestAndAbort "Don't set CXXFLAGS. It screws up the build." -n "${CXXFLAGS}"
    36 CT_Test "GREP_OPTIONS screws up the build. Resetting." -n "${GREP_OPTIONS}"
    37 export GREP_OPTIONS=
    38 
    39 # Some sanity checks on paths content
    40 for d in            \
    41     LOCAL_TARBALLS  \
    42     WORK            \
    43     PREFIX          \
    44     INSTALL         \
    45     ; do
    46         eval dir="\${CT_${d}_DIR}"
    47         case "${dir}" in
    48             *" "*)
    49                 CT_Abort "'CT_${d}_DIR'='${dir}' contains a space in it.\nDon't use spaces in paths, it breaks things."
    50                 ;;
    51         esac
    52 done
    53 
    54 # Where will we work?
    55 CT_WORK_DIR="${CT_WORK_DIR:-${CT_TOP_DIR}/targets}"
    56 CT_DoExecLog ALL mkdir -p "${CT_WORK_DIR}"
    57 
    58 # Check build file system case-sensitiveness
    59 CT_DoExecLog DEBUG touch "${CT_WORK_DIR}/foo"
    60 CT_TestAndAbort "Your file system in '${CT_WORK_DIR}' is *not* case-sensitive!" -f "${CT_WORK_DIR}/FOO"
    61 CT_DoExecLog DEBUG rm -f "${CT_WORK_DIR}/foo"
    62 
    63 # What's our shell?
    64 # Will be plain /bin/sh on most systems, except if we have /bin/ash and we
    65 # _explictly_ required using it
    66 CT_SHELL="/bin/sh"
    67 [ "${CT_CONFIG_SHELL_ASH}" = "y" -a -x "/bin/ash" ] && CT_SHELL="/bin/ash"
    68 
    69 # Create the bin-overide early
    70 # Contains symlinks to the tools found by ./configure
    71 # Note: CT_DoLog and CT_DoExecLog do not use any of those tool, so
    72 # they can be safely used
    73 CT_BIN_OVERIDE_DIR="${CT_WORK_DIR}/bin"
    74 CT_DoLog DEBUG "Creating bin-overide for tools in '${CT_BIN_OVERIDE_DIR}'"
    75 CT_DoExecLog DEBUG mkdir -p "${CT_BIN_OVERIDE_DIR}"
    76 cat "${CT_LIB_DIR}/paths.mk" |while read trash line; do
    77     tool="${line%%=*}"
    78     path="${line#*=}"
    79     CT_DoLog DEBUG "  '${tool}' -> '${path}'"
    80     printf "#${BANG}${CT_SHELL}\nexec '${path}' \"\${@}\"\n" >"${CT_BIN_OVERIDE_DIR}/${tool}"
    81     CT_DoExecLog ALL chmod 700 "${CT_BIN_OVERIDE_DIR}/${tool}"
    82 done
    83 export PATH="${CT_BIN_OVERIDE_DIR}:${PATH}"
    84 
    85 # Start date. Can't be done until we know the locale
    86 # Also requires the bin-override tools
    87 CT_STAR_DATE=$(CT_DoDate +%s%N)
    88 CT_STAR_DATE_HUMAN=$(CT_DoDate +%Y%m%d.%H%M%S)
    89 
    90 # Log real begining of build, now
    91 CT_DoLog INFO "Build started ${CT_STAR_DATE_HUMAN}"
    92 
    93 # renice oursleves
    94 CT_DoExecLog DEBUG renice ${CT_NICE} $$
    95 
    96 CT_DoStep DEBUG "Dumping user-supplied crosstool-NG configuration"
    97 CT_DoExecLog DEBUG grep -E '^(# |)CT_' .config
    98 CT_EndStep
    99 
   100 CT_DoLog DEBUG "Unsetting and unexporting MAKEFLAGS"
   101 unset MAKEFLAGS
   102 export MAKEFLAGS
   103 
   104 CT_DoLog INFO "Building environment variables"
   105 
   106 # Include sub-scripts instead of calling them: that way, we do not have to
   107 # export any variable, nor re-parse the configuration and functions files.
   108 . "${CT_LIB_DIR}/scripts/build/internals.sh"
   109 . "${CT_LIB_DIR}/scripts/build/arch/${CT_ARCH}.sh"
   110 . "${CT_LIB_DIR}/scripts/build/kernel/${CT_KERNEL}.sh"
   111 . "${CT_LIB_DIR}/scripts/build/companion_libs/gmp.sh"
   112 . "${CT_LIB_DIR}/scripts/build/companion_libs/mpfr.sh"
   113 . "${CT_LIB_DIR}/scripts/build/companion_libs/ppl.sh"
   114 . "${CT_LIB_DIR}/scripts/build/companion_libs/cloog.sh"
   115 . "${CT_LIB_DIR}/scripts/build/companion_libs/mpc.sh"
   116 . "${CT_LIB_DIR}/scripts/build/binutils/binutils.sh"
   117 . "${CT_LIB_DIR}/scripts/build/binutils/elf2flt.sh"
   118 . "${CT_LIB_DIR}/scripts/build/libc/${CT_LIBC}.sh"
   119 . "${CT_LIB_DIR}/scripts/build/cc/${CT_CC}.sh"
   120 . "${CT_LIB_DIR}/scripts/build/tools.sh"
   121 . "${CT_LIB_DIR}/scripts/build/debug.sh"
   122 
   123 # Target tuple: CT_TARGET needs a little love:
   124 CT_DoBuildTargetTuple
   125 
   126 # Kludge: If any of the configured options needs CT_TARGET,
   127 # then rescan the options file now:
   128 . .config
   129 
   130 # Second kludge: merge user-supplied target CFLAGS with architecture-provided
   131 # target CFLAGS. Do the same for LDFLAGS in case it happens in the future.
   132 # Put user-supplied flags at the end, so that they take precedence.
   133 CT_TARGET_CFLAGS="${CT_ARCH_TARGET_CFLAGS} ${CT_TARGET_CFLAGS}"
   134 CT_TARGET_LDFLAGS="${CT_ARCH_TARGET_LDFLAGS} ${CT_TARGET_LDFLAGS}"
   135 CT_CC_CORE_EXTRA_CONFIG="${CT_ARCH_CC_CORE_EXTRA_CONFIG} ${CT_CC_CORE_EXTRA_CONFIG}"
   136 CT_CC_EXTRA_CONFIG="${CT_ARCH_CC_EXTRA_CONFIG} ${CT_CC_EXTRA_CONFIG}"
   137 
   138 # Compute the working directories names
   139 CT_TARBALLS_DIR="${CT_WORK_DIR}/tarballs"
   140 CT_SRC_DIR="${CT_WORK_DIR}/src"
   141 CT_BUILD_DIR="${CT_WORK_DIR}/${CT_TARGET}/build"
   142 CT_STATE_DIR="${CT_WORK_DIR}/${CT_TARGET}/state"
   143 CT_CONFIG_DIR="${CT_BUILD_DIR}/configs"
   144 
   145 # Note: we'll always install the core compiler in its own directory, so as to
   146 # not mix the two builds: core and final.
   147 CT_CC_CORE_STATIC_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core-static"
   148 CT_CC_CORE_SHARED_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core-shared"
   149 
   150 # Set LD_LIBRARY_PATH to point to prefix/lib so we can find our own
   151 # libraries; add as first path, so we get hit first by the dynamic linker
   152 CT_SetLibPath "${CT_PREFIX_DIR}/lib" first
   153 
   154 # We must ensure that we can restart if asked for!
   155 if [ -n "${CT_RESTART}" -a ! -d "${CT_STATE_DIR}"  ]; then
   156     CT_DoLog ERROR "You asked to restart a non-restartable build"
   157     CT_DoLog ERROR "This happened because you didn't set CT_DEBUG_CT_SAVE_STEPS"
   158     CT_DoLog ERROR "in the config options for the previous build, or the state"
   159     CT_DoLog ERROR "directory for the previous build was deleted."
   160     CT_Abort "I will stop here to avoid any carnage"
   161 fi
   162 
   163 # If the local tarball directory does not exist, say so, and don't try to save there!
   164 if [ ! -d "${CT_LOCAL_TARBALLS_DIR}" ]; then
   165     CT_DoLog WARN "Directory '${CT_LOCAL_TARBALLS_DIR}' does not exist. Will not save downloaded tarballs to local storage."
   166     CT_SAVE_TARBALLS=
   167 fi
   168 
   169 # Check now if we can write to the destination directory:
   170 if [ -d "${CT_INSTALL_DIR}" ]; then
   171     CT_TestAndAbort "Destination directory '${CT_INSTALL_DIR}' is not removable" ! -w $(dirname "${CT_INSTALL_DIR}")
   172 fi
   173 
   174 # Good, now grab a bit of informations on the system we're being run on,
   175 # just in case something goes awok, and it's not our fault:
   176 CT_SYS_USER=$(id -un)
   177 CT_SYS_HOSTNAME=$(hostname -f 2>/dev/null || true)
   178 # Hmmm. Some non-DHCP-enabled machines do not have an FQDN... Fall back to node name.
   179 CT_SYS_HOSTNAME="${CT_SYS_HOSTNAME:-$(uname -n)}"
   180 CT_SYS_KERNEL=$(uname -s)
   181 CT_SYS_REVISION=$(uname -r)
   182 # MacOS X lacks '-o' :
   183 CT_SYS_OS=$(uname -o || echo "Unknown (maybe MacOS-X)")
   184 CT_SYS_MACHINE=$(uname -m)
   185 CT_SYS_PROCESSOR=$(uname -p)
   186 CT_SYS_GCC=$(gcc -dumpversion)
   187 CT_SYS_TARGET=$(CT_DoConfigGuess)
   188 CT_TOOLCHAIN_ID="crosstool-${CT_VERSION} build ${CT_STAR_DATE_HUMAN} by ${CT_SYS_USER}@${CT_SYS_HOSTNAME}"
   189 
   190 CT_DoLog EXTRA "Preparing working directories"
   191 
   192 # Ah! The build directory shall be eradicated, even if we restart!
   193 if [ -d "${CT_BUILD_DIR}" ]; then
   194     CT_DoForceRmdir "${CT_BUILD_DIR}"
   195 fi
   196 
   197 # Don't eradicate directories if we need to restart
   198 if [ -z "${CT_RESTART}" ]; then
   199     # Get rid of pre-existing installed toolchain and previous build directories.
   200     # We need to do that _before_ we can safely log, because the log file will
   201     # most probably be in the toolchain directory.
   202     if [ "${CT_FORCE_DOWNLOAD}" = "y" -a -d "${CT_TARBALLS_DIR}" ]; then
   203         CT_DoForceRmdir "${CT_TARBALLS_DIR}"
   204     fi
   205     if [ "${CT_FORCE_EXTRACT}" = "y" -a -d "${CT_SRC_DIR}" ]; then
   206         CT_DoForceRmdir "${CT_SRC_DIR}"
   207     fi
   208     if [ -d "${CT_INSTALL_DIR}" ]; then
   209         CT_DoForceRmdir "${CT_INSTALL_DIR}"
   210     fi
   211     # In case we start anew, get rid of the previously saved state directory
   212     if [ -d "${CT_STATE_DIR}" ]; then
   213         CT_DoForceRmdir "${CT_STATE_DIR}"
   214     fi
   215 fi
   216 
   217 # Create the directories we'll use, even if restarting: it does no harm to
   218 # create already existent directories, and CT_BUILD_DIR needs to be created
   219 # anyway
   220 CT_DoExecLog ALL mkdir -p "${CT_TARBALLS_DIR}"
   221 CT_DoExecLog ALL mkdir -p "${CT_SRC_DIR}"
   222 CT_DoExecLog ALL mkdir -p "${CT_BUILD_DIR}"
   223 CT_DoExecLog ALL mkdir -p "${CT_CONFIG_DIR}"
   224 CT_DoExecLog ALL mkdir -p "${CT_INSTALL_DIR}"
   225 CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}"
   226 if [ -z "${CT_CANADIAN}" ]; then
   227     CT_DoExecLog ALL mkdir -p "${CT_CC_CORE_STATIC_PREFIX_DIR}"
   228     CT_DoExecLog ALL mkdir -p "${CT_CC_CORE_SHARED_PREFIX_DIR}"
   229 fi
   230 
   231 # Only create the state dir if asked for a restartable build
   232 [ -n "${CT_DEBUG_CT_SAVE_STEPS}" ] && CT_DoExecLog ALL mkdir -p "${CT_STATE_DIR}"
   233 
   234 # Check install file system case-sensitiveness
   235 CT_DoExecLog DEBUG touch "${CT_PREFIX_DIR}/foo"
   236 CT_TestAndAbort "Your file system in '${CT_PREFIX_DIR}' is *not* case-sensitive!" -f "${CT_PREFIX_DIR}/FOO"
   237 CT_DoExecLog DEBUG rm -f "${CT_PREFIX_DIR}/foo"
   238 
   239 # Kludge: CT_INSTALL_DIR and CT_PREFIX_DIR might have grown read-only if
   240 # the previous build was successful. To be able to move the logfile there,
   241 # switch them back to read/write
   242 CT_DoExecLog ALL chmod -R u+w "${CT_INSTALL_DIR}" "${CT_PREFIX_DIR}"
   243 
   244 # Redirect log to the actual log file now we can
   245 # It's quite understandable that the log file will be installed in the install
   246 # directory, so we must first ensure it exists and is writeable (above) before
   247 # we can log there
   248 exec >/dev/null
   249 case "${CT_LOG_TO_FILE}" in
   250     y)  CT_LOG_FILE="${CT_PREFIX_DIR}/build.log"
   251         cat "${tmp_log_file}" >>"${CT_LOG_FILE}"
   252         rm -f "${tmp_log_file}"
   253         exec >>"${CT_LOG_FILE}"
   254         ;;
   255     *)  rm -f "${tmp_log_file}"
   256         ;;
   257 esac
   258 
   259 # Setting up the rest of the environment only if not restarting
   260 if [ -z "${CT_RESTART}" ]; then
   261     # Arrange paths depending on wether we use sys-root or not.
   262     if [ "${CT_USE_SYSROOT}" = "y" ]; then
   263         CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/${CT_SYSROOT_DIR_PREFIX}/sys-root"
   264         CT_DEBUGROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/${CT_SYSROOT_DIR_PREFIX}/debug-root"
   265         CT_HEADERS_DIR="${CT_SYSROOT_DIR}/usr/include"
   266         BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
   267         CC_CORE_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
   268         CC_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
   269         LIBC_SYSROOT_ARG=""
   270         # glibc's prefix must be exactly /usr, else --with-sysroot'd gcc will get
   271         # confused when $sysroot/usr/include is not present.
   272         # Note: --prefix=/usr is magic!
   273         # See http://www.gnu.org/software/libc/FAQ.html#s-2.2
   274     else
   275         # plain old way. All libraries in prefix/target/lib
   276         CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}"
   277         CT_DEBUGROOT_DIR="${CT_SYSROOT_DIR}"
   278         CT_HEADERS_DIR="${CT_SYSROOT_DIR}/include"
   279         # hack!  Always use --with-sysroot for binutils.
   280         # binutils 2.14 and later obey it, older binutils ignore it.
   281         # Lets you build a working 32->64 bit cross gcc
   282         BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
   283         # Use --with-headers, else final gcc will define disable_glibc while
   284         # building libgcc, and you'll have no profiling
   285         CC_CORE_SYSROOT_ARG="--without-headers"
   286         CC_SYSROOT_ARG="--with-headers=${CT_HEADERS_DIR}"
   287         LIBC_SYSROOT_ARG="prefix="
   288     fi
   289     CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}"
   290     CT_DoExecLog ALL mkdir -p "${CT_DEBUGROOT_DIR}"
   291 
   292     # Prepare the 'lib' directories in sysroot, else the ../lib64 hack used by
   293     # 32 -> 64 bit crosscompilers won't work, and build of final gcc will fail
   294     # with: "ld: cannot open crti.o: No such file or directory"
   295     # Also prepare the lib directory in the install dir, else some 64 bit archs
   296     # won't build
   297     CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/lib"
   298     CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/lib"
   299     CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
   300 
   301     if [ "${CT_USE_SYSROOT}" = "y" ]; then
   302       # Prevent gcc from installing its libraries outside of the sys-root
   303       CT_DoExecLog ALL ln -sf "./${CT_SYSROOT_DIR_PREFIX}/sys-root/lib" "${CT_PREFIX_DIR}/${CT_TARGET}/lib"
   304     fi
   305 
   306     # Now, in case we're 64 bits, just have lib64/ be a symlink to lib/
   307     # so as to have all libraries in the same directory (we can do that
   308     # because we are *not* multilib).
   309     if [ "${CT_ARCH_64}" = "y" ]; then
   310         CT_DoExecLog ALL ln -sf "lib" "${CT_PREFIX_DIR}/lib64"
   311         CT_DoExecLog ALL ln -sf "lib" "${CT_SYSROOT_DIR}/lib64"
   312         CT_DoExecLog ALL ln -sf "lib" "${CT_SYSROOT_DIR}/usr/lib64"
   313         CT_DoExecLog ALL ln -sf "lib" "${CT_PREFIX_DIR}/${CT_TARGET}/lib64"
   314     fi
   315 
   316     # Determine build system if not set by the user
   317     CT_Test "You did not specify the build system. That's OK, I can guess..." -z "${CT_BUILD}"
   318     case "${CT_BUILD}" in
   319         "") CT_BUILD=$("${CT_BUILD_PREFIX}gcc${CT_BUILD_SUFFIX}" -dumpmachine);;
   320     esac
   321 
   322     # Prepare mangling patterns to later modify BUILD and HOST (see below)
   323     case "${CT_TOOLCHAIN_TYPE}" in
   324         cross)
   325             # A cross-compiler runs on the same machine it is built on
   326             CT_HOST="${CT_BUILD}"
   327             build_mangle="build_"
   328             host_mangle="build_"
   329             target_mangle=""
   330             install_build_tools_for="BUILD HOST"
   331             ;;
   332         canadian)
   333             build_mangle="build_"
   334             host_mangle="host_"
   335             target_mangle=""
   336             install_build_tools_for="BUILD HOST TARGET"
   337             ;;
   338         *)  CT_Abort "No code for '${CT_TOOLCHAIN_TYPE}' toolchain type!"
   339             ;;
   340     esac
   341 
   342     # Save the real tuples to generate shell-wrappers to the real tools
   343     CT_REAL_BUILD="${CT_BUILD}"
   344     CT_REAL_HOST="${CT_HOST}"
   345     CT_REAL_TARGET="${CT_TARGET}"
   346 
   347     # Canonicalise CT_BUILD and CT_HOST
   348     # Not only will it give us full-qualified tuples, but it will also ensure
   349     # that they are valid tuples (in case of typo with user-provided tuples)
   350     # That's way better than trying to rewrite config.sub ourselves...
   351     # CT_TARGET is already made canonical in CT_DoBuildTargetTuple
   352     CT_BUILD=$(CT_DoConfigSub "${CT_BUILD}")
   353     CT_HOST=$(CT_DoConfigSub "${CT_HOST}")
   354 
   355     # Modify BUILD and HOST so that gcc always generate a cross-compiler
   356     # even if any of the build, host or target machines are the same.
   357     # NOTE: we'll have to mangle the (BUILD|HOST)->TARGET x-compiler to
   358     #       support canadain build, later...
   359     CT_BUILD="${CT_BUILD/-/-${build_mangle}}"
   360     CT_HOST="${CT_HOST/-/-${host_mangle}}"
   361     CT_TARGET="${CT_TARGET/-/-${target_mangle}}"
   362 
   363     # Now we have mangled our BUILD and HOST tuples, we must fake the new
   364     # cross-tools for those mangled tuples.
   365     CT_DoLog DEBUG "Making build system tools available"
   366     CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/buildtools"
   367     for m in ${install_build_tools_for}; do
   368         r="CT_REAL_${m}"
   369         v="CT_${m}"
   370         p="CT_${m}_PREFIX"
   371         s="CT_${m}_SUFFIX"
   372         if [ -n "${!p}" ]; then
   373             t="${!p}"
   374         else
   375             t="${!r}-"
   376         fi
   377 
   378         for tool in ar as dlltool gcc g++ gcj gnatbind gnatmake ld nm objcopy objdump ranlib strip windres; do
   379             # First try with prefix + suffix
   380             # Then try with prefix only
   381             # Then try with suffix only, but only for BUILD, and HOST iff REAL_BUILD == REAL_HOST
   382             # Finally try with neither prefix nor suffix, but only for BUILD, and HOST iff REAL_BUILD == REAL_HOST
   383             # This is needed, because some tools have a prefix and
   384             # a suffix (eg. gcc), while others may have only one,
   385             # or even none (eg. binutils)
   386             where=$(CT_Which "${t}${tool}${!s}")
   387             [ -z "${where}" ] && where=$(CT_Which "${t}${tool}")
   388             if [    -z "${where}"                         \
   389                  -a \(    "${m}" = "BUILD"                \
   390                        -o "${CT_REAL_BUILD}" = "${!r}" \) ]; then
   391                 where=$(CT_Which "${tool}${!s}")
   392             fi
   393             if [ -z "${where}"                            \
   394                  -a \(    "${m}" = "BUILD"                \
   395                        -o "${CT_REAL_BUILD}" = "${!r}" \) ]; then
   396                 where=$(CT_Which "${tool}")
   397             fi
   398 
   399             # Not all tools are available for all platforms, but some are really,
   400             # bally needed
   401             if [ -n "${where}" ]; then
   402                 CT_DoLog DEBUG "  '${!v}-${tool}' -> '${where}'"
   403                 printf "#${BANG}${CT_SHELL}\nexec '${where}' \"\${@}\"\n" >"${CT_PREFIX_DIR}/buildtools/${!v}-${tool}"
   404                 CT_DoExecLog ALL chmod 700 "${CT_PREFIX_DIR}/buildtools/${!v}-${tool}"
   405             else
   406                 case "${tool}" in
   407                     # We'll at least need some of them...
   408                     ar|as|gcc|g++|ld|nm|objcopy|objdump|ranlib)
   409                         CT_Abort "Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : either needed!"
   410                         ;;
   411                     # Some are conditionnally required
   412                     # Add them in alphabetical (C locale) ordering
   413                     gcj)
   414                         CT_TestAndAbort "Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : either needed!" "${CT_CC_LANG_JAVA}" = "y"
   415                         ;;
   416                     # If any other is missing, only warn at low level
   417                     *)
   418                         # It does not deserve a WARN level.
   419                         CT_DoLog DEBUG "  Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : not required."
   420                         ;;
   421                 esac
   422             fi
   423         done
   424     done
   425 
   426     # Carefully add paths in the order we want them:
   427     #  - first try in ${CT_PREFIX_DIR}/bin
   428     #  - then try in ${CT_CC_CORE_SHARED_PREFIX_DIR}/bin
   429     #  - then try in ${CT_CC_CORE_STATIC_PREFIX_DIR}/bin
   430     #  - fall back to searching user's PATH
   431     # Of course, neither cross-native nor canadian can run on BUILD,
   432     # so don't add those PATHs in this case...
   433     case "${CT_TOOLCHAIN_TYPE}" in
   434         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}";;
   435         canadian) export PATH="${CT_PREFIX_DIR}/buildtools:${PATH}";;
   436         *)  ;;
   437     esac
   438 
   439     # Some makeinfo versions are a pain in [put your most sensible body part here].
   440     # Go ahead with those, by creating a wrapper that keeps partial files, and that
   441     # never fails:
   442     CT_DoLog DEBUG "  'makeinfo' -> '$(CT_Which makeinfo)'"
   443     printf "#${BANG}${CT_SHELL}\n$(CT_Which makeinfo) --force \"\${@}\"\ntrue\n" >"${CT_PREFIX_DIR}/buildtools/makeinfo"
   444     CT_DoExecLog ALL chmod 700 "${CT_PREFIX_DIR}/buildtools/makeinfo"
   445 
   446     # Help gcc
   447     CT_CFLAGS_FOR_HOST=
   448     [ "${CT_USE_PIPES}" = "y" ] && CT_CFLAGS_FOR_HOST="${CT_CFLAGS_FOR_HOST} -pipe"
   449 
   450     # Override the configured jobs with what's been given on the command line
   451     [ -n "${CT_JOBS}" ] && CT_PARALLEL_JOBS="${CT_JOBS}"
   452 
   453     # Set the shell to be used by ./configure scripts and by Makefiles (those
   454     # that support it!).
   455     export CONFIG_SHELL="${CT_SHELL}"
   456 
   457     # And help make go faster
   458     PARALLELMFLAGS=
   459     [ ${CT_PARALLEL_JOBS} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -j${CT_PARALLEL_JOBS}"
   460     [ ${CT_LOAD} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -l${CT_LOAD}"
   461     export PARALLELMFLAGS
   462 
   463     CT_DoLog EXTRA "Installing user-supplied crosstool-NG configuration"
   464     CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/bin"
   465     CT_DoExecLog DEBUG install -m 0755 "${CT_LIB_DIR}/scripts/toolchain-config.in" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config"
   466     CT_DoExecLog DEBUG sed -r -i -e 's,@@grep@@,"'"${grep}"'",;' "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config"
   467     bzip2 -c -9 .config >>"${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config"
   468 
   469     CT_DoStep EXTRA "Dumping internal crosstool-NG configuration"
   470     CT_DoLog EXTRA "Building a toolchain for:"
   471     CT_DoLog EXTRA "  build  = ${CT_REAL_BUILD}"
   472     CT_DoLog EXTRA "  host   = ${CT_REAL_HOST}"
   473     CT_DoLog EXTRA "  target = ${CT_TARGET}"
   474     set |grep -E '^CT_.+=' |sort |CT_DoLog DEBUG
   475     CT_EndStep
   476 fi
   477 
   478 if [ -z "${CT_RESTART}" ]; then
   479     CT_DoStep INFO "Retrieving needed toolchain components' tarballs"
   480     do_kernel_get
   481     do_gmp_get
   482     do_mpfr_get
   483     do_ppl_get
   484     do_cloog_get
   485     do_mpc_get
   486     do_binutils_get
   487     do_cc_get
   488     do_libc_get
   489     do_tools_get
   490     do_debug_get
   491     CT_EndStep
   492 
   493     if [ "${CT_ONLY_DOWNLOAD}" != "y" ]; then
   494         if [ "${CT_FORCE_EXTRACT}" = "y" ]; then
   495             CT_DoForceRmdir "${CT_SRC_DIR}"
   496             CT_DoExecLog ALL mkdir -p "${CT_SRC_DIR}"
   497         fi
   498         CT_DoStep INFO "Extracting and patching toolchain components"
   499         do_kernel_extract
   500         do_gmp_extract
   501         do_mpfr_extract
   502         do_ppl_extract
   503         do_cloog_extract
   504         do_mpc_extract
   505         do_binutils_extract
   506         do_cc_extract
   507         do_libc_extract
   508         do_tools_extract
   509         do_debug_extract
   510         CT_EndStep
   511     fi
   512 fi
   513 
   514 # Now for the job by itself. Go have a coffee!
   515 if [ "${CT_ONLY_DOWNLOAD}" != "y" -a "${CT_ONLY_EXTRACT}" != "y" ]; then
   516     # Because of CT_RESTART, this becomes quite complex
   517     do_stop=0
   518     prev_step=
   519     [ -n "${CT_RESTART}" ] && do_it=0 || do_it=1
   520     # Aha! CT_STEPS comes from steps.mk!
   521     for step in ${CT_STEPS}; do
   522         if [ ${do_it} -eq 0 ]; then
   523             if [ "${CT_RESTART}" = "${step}" ]; then
   524                 CT_DoLoadState "${step}"
   525                 do_it=1
   526                 do_stop=0
   527             fi
   528         else
   529             CT_DoSaveState ${step}
   530             if [ ${do_stop} -eq 1 ]; then
   531                 CT_DoLog ERROR "Stopping just after step '${prev_step}', as requested."
   532                 exit 0
   533             fi
   534         fi
   535         if [ ${do_it} -eq 1 ]; then
   536             do_${step}
   537             if [ "${CT_STOP}" = "${step}" ]; then
   538                 do_stop=1
   539             fi
   540             if [ "${CT_DEBUG_PAUSE_STEPS}" = "y" ]; then
   541                 CT_DoPause "Step '${step}' finished"
   542             fi
   543         fi
   544         prev_step="${step}"
   545     done
   546 fi
   547 
   548 CT_DoEnd INFO
   549 
   550 # From now-on, it can become impossible to log any time, because
   551 # either we're compressing the log file, or it can become RO any
   552 # moment... Consign all ouptut to oblivion...
   553 CT_DoLog INFO "Finishing installation (may take a few seconds)..."
   554 exec >/dev/null 2>&1
   555 
   556 [ "${CT_LOG_FILE_COMPRESS}" = y ] && bzip2 -9 "${CT_LOG_FILE}"
   557 [ "${CT_INSTALL_DIR_RO}" = "y"  ] && chmod -R a-w "${CT_INSTALL_DIR}"
   558 
   559 trap - EXIT