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>

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