scripts/crosstool-NG.sh.in
author Darcy Watkins <dwatkins@tranzeo.com>
Thu Aug 05 18:19:07 2010 +0200 (2010-08-05)
branch1.8
changeset 2073 a3b7a63dce01
parent 1966 10ad7f230f4b
child 2060 51e4597b07fc
permissions -rw-r--r--
cc/gcc: with static ppl, correctly link with libm

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