scripts/crosstool-NG.sh.in
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Thu Dec 23 20:43:32 2010 +0100 (2010-12-23)
changeset 2307 2efd46963086
parent 2306 0a9e8cb7ccf4
child 2308 911b3a703497
permissions -rw-r--r--
buildtools: move to working directory

There is absolutely *no* reason for the buildtools (wrappers to gcc, g++,
as, ld... for the local machine) to be in the toolchain directory. Moreover,
they are removed after the build completes.

Move them out of the toolchain directory, and into the build directory (but
yet the part specific to the current toolchain). This means we no longer
need to explicitly remove them either, BTW, but we need to save/restore them
for the restart feature.

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