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