scripts/crosstool-NG.sh.in
author Michael Hope <michael.hope@linaro.org>
Thu Sep 29 12:40:42 2011 +1300 (2011-09-29)
changeset 2695 f2495884ca3e
parent 2653 e5fc5c9ea78a
child 2701 99de89e9acba
permissions -rw-r--r--
config: add a 'auto' value for the number of parallel jobs

When CT_PARALLEL_JOBS is -1, set the number of parallel jobs to the
number of online CPUs + 1. Update documentation to match.

I find this useful when building in the cloud. You can use the same
.config file and have the build adapt to the number of processors
available. Limited testing shows that NCPUS+1 is faster than NCPUS+0
or NCPUS+2.

Signed-off-by: Michael Hope <michael.hope@linaro.org>
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@2468
    25
. .config.2
yann@1156
    26
# Yes! We can do full logging from now on!
yann@1
    27
antony@2564
    28
# Override 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
antony@2564
    82
# Create the bin-override 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"
antony@2564
    87
CT_DoLog DEBUG "Creating bin-override 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@2468
   106
# We really need to extract from ,config and not .config.2, as we
yann@2468
   107
# do want the kconfig's values, not our mangled config with arrays.
yann@894
   108
CT_DoStep DEBUG "Dumping user-supplied crosstool-NG configuration"
yann@1247
   109
CT_DoExecLog DEBUG grep -E '^(# |)CT_' .config
yann@96
   110
CT_EndStep
yann@63
   111
yann@290
   112
CT_DoLog DEBUG "Unsetting and unexporting MAKEFLAGS"
yann@290
   113
unset MAKEFLAGS
yann@290
   114
export MAKEFLAGS
yann@290
   115
yann@1
   116
CT_DoLog INFO "Building environment variables"
yann@1
   117
yann@965
   118
# Include sub-scripts instead of calling them: that way, we do not have to
yann@965
   119
# export any variable, nor re-parse the configuration and functions files.
yann@1225
   120
. "${CT_LIB_DIR}/scripts/build/internals.sh"
yann@903
   121
. "${CT_LIB_DIR}/scripts/build/arch/${CT_ARCH}.sh"
richard@1727
   122
. "${CT_LIB_DIR}/scripts/build/companion_tools.sh"
yann@965
   123
. "${CT_LIB_DIR}/scripts/build/kernel/${CT_KERNEL}.sh"
yann@1318
   124
. "${CT_LIB_DIR}/scripts/build/companion_libs/gmp.sh"
yann@1318
   125
. "${CT_LIB_DIR}/scripts/build/companion_libs/mpfr.sh"
yann@1324
   126
. "${CT_LIB_DIR}/scripts/build/companion_libs/ppl.sh"
yann@1380
   127
. "${CT_LIB_DIR}/scripts/build/companion_libs/cloog.sh"
yann@1384
   128
. "${CT_LIB_DIR}/scripts/build/companion_libs/mpc.sh"
yann@1811
   129
. "${CT_LIB_DIR}/scripts/build/companion_libs/libelf.sh"
yann@1345
   130
. "${CT_LIB_DIR}/scripts/build/binutils/binutils.sh"
yann@1345
   131
. "${CT_LIB_DIR}/scripts/build/binutils/elf2flt.sh"
yann@1854
   132
. "${CT_LIB_DIR}/scripts/build/binutils/sstrip.sh"
yann@965
   133
. "${CT_LIB_DIR}/scripts/build/libc/${CT_LIBC}.sh"
yann@965
   134
. "${CT_LIB_DIR}/scripts/build/cc/${CT_CC}.sh"
yann@965
   135
. "${CT_LIB_DIR}/scripts/build/debug.sh"
mgl@1965
   136
. "${CT_LIB_DIR}/scripts/build/test_suite.sh"
yann@380
   137
yann@335
   138
# Target tuple: CT_TARGET needs a little love:
yann@335
   139
CT_DoBuildTargetTuple
yann@1
   140
yann@96
   141
# Kludge: If any of the configured options needs CT_TARGET,
yann@96
   142
# then rescan the options file now:
yann@2468
   143
. .config.2
yann@96
   144
yann@1663
   145
# Sanity check some directories
yann@1663
   146
CT_TestAndAbort "'CT_PREFIX_DIR' is not set: where should I install?" -z "${CT_PREFIX_DIR}"
yann@1663
   147
yann@397
   148
# Second kludge: merge user-supplied target CFLAGS with architecture-provided
yann@531
   149
# target CFLAGS. Do the same for LDFLAGS in case it happens in the future.
yann@531
   150
# Put user-supplied flags at the end, so that they take precedence.
yann@397
   151
CT_TARGET_CFLAGS="${CT_ARCH_TARGET_CFLAGS} ${CT_TARGET_CFLAGS}"
yann@531
   152
CT_TARGET_LDFLAGS="${CT_ARCH_TARGET_LDFLAGS} ${CT_TARGET_LDFLAGS}"
yann@2467
   153
CT_CC_CORE_EXTRA_CONFIG_ARRAY=( ${CT_ARCH_CC_CORE_EXTRA_CONFIG} "${CT_CC_CORE_EXTRA_CONFIG_ARRAY[@]}" )
yann@2467
   154
CT_CC_EXTRA_CONFIG_ARRAY=( ${CT_ARCH_CC_EXTRA_CONFIG} "${CT_CC_EXTRA_CONFIG_ARRAY[@]}" )
yann@397
   155
benoit@2503
   156
# Compute the package version string
benoit@2503
   157
CT_PKGVERSION="crosstool-NG ${CT_VERSION}${CT_TOOLCHAIN_PKGVERSION:+ - ${CT_TOOLCHAIN_PKGVERSION}}"
benoit@2503
   158
yann@1416
   159
# Compute the working directories names
yann@610
   160
CT_TARBALLS_DIR="${CT_WORK_DIR}/tarballs"
yann@610
   161
CT_SRC_DIR="${CT_WORK_DIR}/src"
yann@610
   162
CT_BUILD_DIR="${CT_WORK_DIR}/${CT_TARGET}/build"
yann@2308
   163
CT_BUILDTOOLS_PREFIX_DIR="${CT_WORK_DIR}/${CT_TARGET}/buildtools"
yann@1272
   164
CT_STATE_DIR="${CT_WORK_DIR}/${CT_TARGET}/state"
yann@1272
   165
CT_CONFIG_DIR="${CT_BUILD_DIR}/configs"
yann@2381
   166
CT_COMPLIBS_DIR="${CT_BUILD_DIR}/static"
yann@1272
   167
mgl@1965
   168
# Compute test suite install directory
mgl@1965
   169
CT_TEST_SUITE_DIR=${CT_INSTALL_DIR}/test-suite
mgl@1965
   170
yann@121
   171
# Note: we'll always install the core compiler in its own directory, so as to
yann@331
   172
# not mix the two builds: core and final.
yann@136
   173
CT_CC_CORE_STATIC_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core-static"
yann@136
   174
CT_CC_CORE_SHARED_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core-shared"
yann@85
   175
yann@143
   176
# We must ensure that we can restart if asked for!
yann@143
   177
if [ -n "${CT_RESTART}" -a ! -d "${CT_STATE_DIR}"  ]; then
yann@143
   178
    CT_DoLog ERROR "You asked to restart a non-restartable build"
yann@143
   179
    CT_DoLog ERROR "This happened because you didn't set CT_DEBUG_CT_SAVE_STEPS"
yann@153
   180
    CT_DoLog ERROR "in the config options for the previous build, or the state"
yann@425
   181
    CT_DoLog ERROR "directory for the previous build was deleted."
yann@143
   182
    CT_Abort "I will stop here to avoid any carnage"
yann@143
   183
fi
yann@143
   184
yann@403
   185
# If the local tarball directory does not exist, say so, and don't try to save there!
yann@1662
   186
if [    "${CT_SAVE_TARBALLS}" = "y"     \
yann@1662
   187
     -a ! -d "${CT_LOCAL_TARBALLS_DIR}" ]; then
yann@1662
   188
    CT_DoLog WARN "Directory '${CT_LOCAL_TARBALLS_DIR}' does not exist."
yann@1662
   189
    CT_DoLog WARN "Will not save downloaded tarballs to local storage."
yann@523
   190
    CT_SAVE_TARBALLS=
yann@403
   191
fi
yann@403
   192
yann@85
   193
# Check now if we can write to the destination directory:
yann@85
   194
if [ -d "${CT_INSTALL_DIR}" ]; then
yann@523
   195
    CT_TestAndAbort "Destination directory '${CT_INSTALL_DIR}' is not removable" ! -w $(dirname "${CT_INSTALL_DIR}")
yann@85
   196
fi
yann@85
   197
yann@96
   198
# Good, now grab a bit of informations on the system we're being run on,
yann@96
   199
# just in case something goes awok, and it's not our fault:
yann@523
   200
CT_SYS_USER=$(id -un)
yann@523
   201
CT_SYS_HOSTNAME=$(hostname -f 2>/dev/null || true)
yann@96
   202
# Hmmm. Some non-DHCP-enabled machines do not have an FQDN... Fall back to node name.
yann@523
   203
CT_SYS_HOSTNAME="${CT_SYS_HOSTNAME:-$(uname -n)}"
yann@523
   204
CT_SYS_KERNEL=$(uname -s)
yann@523
   205
CT_SYS_REVISION=$(uname -r)
titus@1954
   206
CT_SYS_OS=$(uname -s)
yann@523
   207
CT_SYS_MACHINE=$(uname -m)
yann@523
   208
CT_SYS_PROCESSOR=$(uname -p)
yann@523
   209
CT_SYS_GCC=$(gcc -dumpversion)
yann@523
   210
CT_SYS_TARGET=$(CT_DoConfigGuess)
yann@96
   211
CT_TOOLCHAIN_ID="crosstool-${CT_VERSION} build ${CT_STAR_DATE_HUMAN} by ${CT_SYS_USER}@${CT_SYS_HOSTNAME}"
yann@96
   212
yann@96
   213
CT_DoLog EXTRA "Preparing working directories"
yann@96
   214
yann@121
   215
# Ah! The build directory shall be eradicated, even if we restart!
yann@2543
   216
# Ditto for the build tools install dir
yann@2543
   217
CT_DoForceRmdir "${CT_BUILD_DIR}" "${CT_BUILDTOOLS_PREFIX_DIR}"
yann@121
   218
yann@121
   219
# Don't eradicate directories if we need to restart
yann@121
   220
if [ -z "${CT_RESTART}" ]; then
yann@121
   221
    # Get rid of pre-existing installed toolchain and previous build directories.
yann@121
   222
    if [ "${CT_FORCE_DOWNLOAD}" = "y" -a -d "${CT_TARBALLS_DIR}" ]; then
yann@1138
   223
        CT_DoForceRmdir "${CT_TARBALLS_DIR}"
yann@121
   224
    fi
yann@121
   225
    if [ "${CT_FORCE_EXTRACT}" = "y" -a -d "${CT_SRC_DIR}" ]; then
yann@1138
   226
        CT_DoForceRmdir "${CT_SRC_DIR}"
yann@121
   227
    fi
yann@2284
   228
    if [ -d "${CT_INSTALL_DIR}" -a "${CT_RM_RF_PREFIX_DIR}" = "y" ]; then
yann@1138
   229
        CT_DoForceRmdir "${CT_INSTALL_DIR}"
yann@121
   230
    fi
yann@121
   231
    # In case we start anew, get rid of the previously saved state directory
yann@121
   232
    if [ -d "${CT_STATE_DIR}" ]; then
yann@1138
   233
        CT_DoForceRmdir "${CT_STATE_DIR}"
yann@121
   234
    fi
yann@96
   235
fi
yann@85
   236
yann@121
   237
# Create the directories we'll use, even if restarting: it does no harm to
yann@121
   238
# create already existent directories, and CT_BUILD_DIR needs to be created
yann@121
   239
# anyway
yann@1135
   240
CT_DoExecLog ALL mkdir -p "${CT_TARBALLS_DIR}"
yann@1135
   241
CT_DoExecLog ALL mkdir -p "${CT_SRC_DIR}"
yann@1135
   242
CT_DoExecLog ALL mkdir -p "${CT_BUILD_DIR}"
yann@2308
   243
CT_DoExecLog ALL mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/bin"
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@2339
   262
# the previous build was successful.
yann@1135
   263
CT_DoExecLog ALL chmod -R u+w "${CT_INSTALL_DIR}" "${CT_PREFIX_DIR}"
yann@85
   264
yann@397
   265
# Setting up the rest of the environment only if not restarting
yann@121
   266
if [ -z "${CT_RESTART}" ]; then
yann@2279
   267
    case "${CT_SYSROOT_NAME}" in
yann@2279
   268
        "")     CT_SYSROOT_NAME="sysroot";;
yann@2279
   269
        .)      CT_Abort "Sysroot name is set to '.' which is forbidden";;
yann@2279
   270
        *' '*)  CT_Abort "Sysroot name contains forbidden space(s): '${CT_SYSROOT_NAME}'";;
yann@2279
   271
        */*)    CT_Abort "Sysroot name contains forbidden slash(es): '${CT_SYSROOT_NAME}'";;
yann@2279
   272
    esac
yann@2279
   273
yann@2279
   274
    # Arrange paths depending on wether we use sysroot or not.
yann@121
   275
    if [ "${CT_USE_SYSROOT}" = "y" ]; then
yann@2653
   276
        CT_SYSROOT_REL_DIR="${CT_SYSROOT_DIR_PREFIX:+${CT_SYSROOT_DIR_PREFIX}/}${CT_SYSROOT_NAME}"
yann@2286
   277
        CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/${CT_SYSROOT_REL_DIR}"
yann@1219
   278
        CT_DEBUGROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/${CT_SYSROOT_DIR_PREFIX}/debug-root"
yann@121
   279
        CT_HEADERS_DIR="${CT_SYSROOT_DIR}/usr/include"
yann@2286
   280
        CT_SanitiseVarDir CT_SYSROOT_REL_DIR CT_SYSROOT_DIR CT_DEBUGROOT_DIR CT_HEADERS_DIR 
yann@121
   281
        BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
yann@121
   282
        CC_CORE_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
yann@121
   283
        CC_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
yann@121
   284
        LIBC_SYSROOT_ARG=""
yann@121
   285
        # glibc's prefix must be exactly /usr, else --with-sysroot'd gcc will get
yann@121
   286
        # confused when $sysroot/usr/include is not present.
yann@121
   287
        # Note: --prefix=/usr is magic!
yann@121
   288
        # See http://www.gnu.org/software/libc/FAQ.html#s-2.2
yann@121
   289
    else
yann@121
   290
        # plain old way. All libraries in prefix/target/lib
yann@121
   291
        CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}"
yann@1419
   292
        CT_DEBUGROOT_DIR="${CT_SYSROOT_DIR}"
yann@121
   293
        CT_HEADERS_DIR="${CT_SYSROOT_DIR}/include"
yann@2280
   294
        CT_SanitiseVarDir CT_SYSROOT_DIR CT_DEBUGROOT_DIR CT_HEADERS_DIR 
yann@121
   295
        # hack!  Always use --with-sysroot for binutils.
yann@121
   296
        # binutils 2.14 and later obey it, older binutils ignore it.
yann@121
   297
        # Lets you build a working 32->64 bit cross gcc
yann@121
   298
        BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
yann@121
   299
        # Use --with-headers, else final gcc will define disable_glibc while
yann@121
   300
        # building libgcc, and you'll have no profiling
yann@121
   301
        CC_CORE_SYSROOT_ARG="--without-headers"
yann@121
   302
        CC_SYSROOT_ARG="--with-headers=${CT_HEADERS_DIR}"
yann@121
   303
        LIBC_SYSROOT_ARG="prefix="
yann@121
   304
    fi
yann@1219
   305
    CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}"
yann@1219
   306
    CT_DoExecLog ALL mkdir -p "${CT_DEBUGROOT_DIR}"
yann@121
   307
yann@121
   308
    # Prepare the 'lib' directories in sysroot, else the ../lib64 hack used by
yann@1180
   309
    # 32 -> 64 bit crosscompilers won't work, and build of final gcc will fail
yann@1180
   310
    # with: "ld: cannot open crti.o: No such file or directory"
yann@1180
   311
    # Also prepare the lib directory in the install dir, else some 64 bit archs
yann@1180
   312
    # won't build
yann@1180
   313
    CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/lib"
yann@1135
   314
    CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/lib"
yann@1135
   315
    CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
yann@1928
   316
    CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/include"
yann@121
   317
yann@1420
   318
    if [ "${CT_USE_SYSROOT}" = "y" ]; then
yann@2279
   319
        # Prevent gcc from installing its libraries outside of the sysroot
yann@2653
   320
        CT_Pushd "${CT_PREFIX_DIR}/${CT_TARGET}"
yann@2653
   321
        CT_DoExecLog ALL ln -sf "${CT_SYSROOT_REL_DIR}/lib" "lib"
yann@2653
   322
        CT_Popd
yann@1420
   323
    fi
yann@740
   324
anthony@2138
   325
    # Since we're *not* multilib on the target side, we want all the
anthony@2138
   326
    # libraries to end up in "lib".  We create "lib64" (for 64-bit
anthony@2138
   327
    # build or host architectures) and "lib32" (for 32-bit emulation
anthony@2138
   328
    # on 64-bit) as symlinks to "lib".
anthony@2138
   329
    #
anthony@2138
   330
    # Not all of these symlinks are necessary, but better safe than
anthony@2138
   331
    # sorry. They are summarily removed by build/internals.sh:do_finish.
anthony@2138
   332
    for d in                            \
anthony@2138
   333
        "${CT_PREFIX_DIR}"              \
anthony@2138
   334
        "${CT_SYSROOT_DIR}"             \
anthony@2138
   335
        "${CT_SYSROOT_DIR}/usr"         \
anthony@2138
   336
        "${CT_PREFIX_DIR}/${CT_TARGET}" \
anthony@2138
   337
    ; do
anthony@2138
   338
        CT_DoExecLog ALL ln -sf "lib" "${d}/lib32"
anthony@2138
   339
        CT_DoExecLog ALL ln -sf "lib" "${d}/lib64"
anthony@2138
   340
    done
yann@740
   341
yann@1041
   342
    # Determine build system if not set by the user
titus@1958
   343
    if [ -z "${CT_BUILD}" ]; then
titus@1958
   344
        CT_BUILD=$(CT_DoConfigGuess)
titus@1958
   345
    fi
yann@121
   346
yann@1083
   347
    # Prepare mangling patterns to later modify BUILD and HOST (see below)
yann@1041
   348
    case "${CT_TOOLCHAIN_TYPE}" in
yann@1041
   349
        cross)
yann@1426
   350
            # A cross-compiler runs on the same machine it is built on
yann@1041
   351
            CT_HOST="${CT_BUILD}"
yann@1041
   352
            build_mangle="build_"
yann@1041
   353
            host_mangle="build_"
yann@1426
   354
            target_mangle=""
yann@1425
   355
            install_build_tools_for="BUILD HOST"
yann@1041
   356
            ;;
yann@1426
   357
        canadian)
yann@1426
   358
            build_mangle="build_"
yann@1426
   359
            host_mangle="host_"
yann@1426
   360
            target_mangle=""
yann@1426
   361
            install_build_tools_for="BUILD HOST TARGET"
yann@1426
   362
            ;;
yann@1041
   363
        *)  CT_Abort "No code for '${CT_TOOLCHAIN_TYPE}' toolchain type!"
yann@1041
   364
            ;;
yann@1041
   365
    esac
yann@1033
   366
yann@1041
   367
    # Save the real tuples to generate shell-wrappers to the real tools
yann@1041
   368
    CT_REAL_BUILD="${CT_BUILD}"
yann@1041
   369
    CT_REAL_HOST="${CT_HOST}"
yann@1426
   370
    CT_REAL_TARGET="${CT_TARGET}"
yann@1041
   371
yann@1082
   372
    # Canonicalise CT_BUILD and CT_HOST
yann@1082
   373
    # Not only will it give us full-qualified tuples, but it will also ensure
yann@1082
   374
    # that they are valid tuples (in case of typo with user-provided tuples)
yann@1082
   375
    # That's way better than trying to rewrite config.sub ourselves...
yann@1426
   376
    # CT_TARGET is already made canonical in CT_DoBuildTargetTuple
yann@1089
   377
    CT_BUILD=$(CT_DoConfigSub "${CT_BUILD}")
yann@1089
   378
    CT_HOST=$(CT_DoConfigSub "${CT_HOST}")
yann@1041
   379
yann@1041
   380
    # Modify BUILD and HOST so that gcc always generate a cross-compiler
yann@1041
   381
    # even if any of the build, host or target machines are the same.
yann@1041
   382
    # NOTE: we'll have to mangle the (BUILD|HOST)->TARGET x-compiler to
yann@1041
   383
    #       support canadain build, later...
yann@1041
   384
    CT_BUILD="${CT_BUILD/-/-${build_mangle}}"
yann@1041
   385
    CT_HOST="${CT_HOST/-/-${host_mangle}}"
yann@1426
   386
    CT_TARGET="${CT_TARGET/-/-${target_mangle}}"
yann@1041
   387
yann@1041
   388
    # Now we have mangled our BUILD and HOST tuples, we must fake the new
yann@1041
   389
    # cross-tools for those mangled tuples.
yann@174
   390
    CT_DoLog DEBUG "Making build system tools available"
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@2308
   427
                printf "#${BANG}${CT_SHELL}\nexec '${where}' \"\${@}\"\n" >"${CT_BUILDTOOLS_PREFIX_DIR}/bin/${!v}-${tool}"
yann@2308
   428
                CT_DoExecLog ALL chmod 700 "${CT_BUILDTOOLS_PREFIX_DIR}/bin/${!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
                        ;;
linux@2060
   444
                    strip)
linux@2060
   445
                        CT_TestAndAbort "Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : either needed!" "${CT_STRIP_ALL_TOOLCHAIN_EXECUTABLES}" = "y"
linux@2060
   446
                        ;;
yann@1176
   447
                    # If any other is missing, only warn at low level
yann@1041
   448
                    *)
yann@1041
   449
                        # It does not deserve a WARN level.
yann@1041
   450
                        CT_DoLog DEBUG "  Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : not required."
yann@1041
   451
                        ;;
yann@1041
   452
                esac
yann@1041
   453
            fi
yann@1041
   454
        done
yann@121
   455
    done
yann@121
   456
yann@2305
   457
    # Some makeinfo versions are a pain in [put your most sensible body part here].
yann@2305
   458
    # Go ahead with those, by creating a wrapper that keeps partial files, and that
yann@2305
   459
    # never fails:
yann@2305
   460
    CT_DoLog DEBUG "  'makeinfo' -> '$(CT_Which makeinfo)'"
yann@2308
   461
    printf "#${BANG}${CT_SHELL}\n$(CT_Which makeinfo) --force \"\${@}\"\ntrue\n" >"${CT_BUILDTOOLS_PREFIX_DIR}/bin/makeinfo"
yann@2308
   462
    CT_DoExecLog ALL chmod 700 "${CT_BUILDTOOLS_PREFIX_DIR}/bin/makeinfo"
yann@2305
   463
yann@1041
   464
    # Carefully add paths in the order we want them:
yann@1041
   465
    #  - first try in ${CT_PREFIX_DIR}/bin
yann@1041
   466
    #  - then try in ${CT_CC_CORE_SHARED_PREFIX_DIR}/bin
yann@1041
   467
    #  - then try in ${CT_CC_CORE_STATIC_PREFIX_DIR}/bin
yann@1041
   468
    #  - fall back to searching user's PATH
yann@1041
   469
    # Of course, neither cross-native nor canadian can run on BUILD,
yann@1041
   470
    # so don't add those PATHs in this case...
yann@1041
   471
    case "${CT_TOOLCHAIN_TYPE}" in
yann@2308
   472
        cross)  export PATH="${CT_BUILDTOOLS_PREFIX_DIR}/bin:${CT_PREFIX_DIR}/bin:${CT_CC_CORE_SHARED_PREFIX_DIR}/bin:${CT_CC_CORE_STATIC_PREFIX_DIR}/bin:${PATH}";;
yann@2308
   473
        canadian) export PATH="${CT_BUILDTOOLS_PREFIX_DIR}/bin:${PATH}";;
yann@1041
   474
        *)  ;;
yann@1041
   475
    esac
yann@1041
   476
yann@121
   477
    # Help gcc
yann@121
   478
    CT_CFLAGS_FOR_HOST=
yann@121
   479
    [ "${CT_USE_PIPES}" = "y" ] && CT_CFLAGS_FOR_HOST="${CT_CFLAGS_FOR_HOST} -pipe"
yann@121
   480
yann@333
   481
    # Override the configured jobs with what's been given on the command line
yann@333
   482
    [ -n "${CT_JOBS}" ] && CT_PARALLEL_JOBS="${CT_JOBS}"
yann@333
   483
yann@1033
   484
    # Set the shell to be used by ./configure scripts and by Makefiles (those
yann@1033
   485
    # that support it!).
yann@1444
   486
    export CONFIG_SHELL="${CT_SHELL}"   # for ./configure
yann@1444
   487
    export SHELL="${CT_SHELL}"          # for Makefiles
yann@805
   488
yann@121
   489
    # And help make go faster
yann@2275
   490
    JOBSFLAGS=
michael@2695
   491
    # Use the number of processors+1 when automatically setting the number of
michael@2695
   492
    # parallel jobs.  Fall back to 1 if the host doesn't use GLIBC.
michael@2695
   493
    AUTO_JOBS=$((`getconf _NPROCESSORS_ONLN 2> /dev/null || echo 0` + 1))
michael@2695
   494
    [ ${CT_PARALLEL_JOBS} -eq -1 ] && JOBSFLAGS="${JOBSFLAGS} -j${AUTO_JOBS}"
michael@2695
   495
    [ ${CT_PARALLEL_JOBS} -gt 0 ] && JOBSFLAGS="${JOBSFLAGS} -j${CT_PARALLEL_JOBS}"
yann@2275
   496
    [ ${CT_LOAD} -ne 0 ] && JOBSFLAGS="${JOBSFLAGS} -l${CT_LOAD}"
yann@121
   497
yann@2468
   498
    # We need to save the real .config with kconfig's value,
yann@2468
   499
    # not our mangled .config.2 with arrays.
yann@894
   500
    CT_DoLog EXTRA "Installing user-supplied crosstool-NG configuration"
yann@1423
   501
    CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/bin"
yann@1098
   502
    CT_DoExecLog DEBUG install -m 0755 "${CT_LIB_DIR}/scripts/toolchain-config.in" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config"
tvb377@1814
   503
    CT_DoExecLog DEBUG sed -i -e 's,@@grep@@,"'"${grep}"'",;' "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config"
yann@909
   504
    bzip2 -c -9 .config >>"${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config"
yann@894
   505
yann@121
   506
    CT_DoStep EXTRA "Dumping internal crosstool-NG configuration"
yann@121
   507
    CT_DoLog EXTRA "Building a toolchain for:"
yann@1041
   508
    CT_DoLog EXTRA "  build  = ${CT_REAL_BUILD}"
yann@1041
   509
    CT_DoLog EXTRA "  host   = ${CT_REAL_HOST}"
yann@121
   510
    CT_DoLog EXTRA "  target = ${CT_TARGET}"
yann@1247
   511
    set |grep -E '^CT_.+=' |sort |CT_DoLog DEBUG
yann@1806
   512
    CT_DoLog DEBUG "Other environment:"
yann@1806
   513
    printenv |grep -v -E '^CT_.+=' |CT_DoLog DEBUG
yann@121
   514
    CT_EndStep
yann@63
   515
fi
yann@63
   516
yann@121
   517
if [ -z "${CT_RESTART}" ]; then
yann@2595
   518
    CT_DoStep INFO "Retrieving needed toolchain components' tarballs"
yann@2595
   519
    do_companion_tools_get
yann@2595
   520
    do_kernel_get
yann@2595
   521
    do_gmp_get
yann@2595
   522
    do_mpfr_get
yann@2595
   523
    do_ppl_get
yann@2595
   524
    do_cloog_get
yann@2595
   525
    do_mpc_get
yann@2595
   526
    do_libelf_get
yann@2595
   527
    do_binutils_get
yann@2595
   528
    do_elf2flt_get
yann@2595
   529
    do_sstrip_get
yann@2595
   530
    do_cc_get
yann@2595
   531
    do_libc_get
yann@2595
   532
    do_debug_get
yann@2595
   533
    do_test_suite_get
yann@2595
   534
    CT_EndStep
yann@63
   535
yann@121
   536
    if [ "${CT_ONLY_DOWNLOAD}" != "y" ]; then
yann@121
   537
        if [ "${CT_FORCE_EXTRACT}" = "y" ]; then
yann@1138
   538
            CT_DoForceRmdir "${CT_SRC_DIR}"
yann@1135
   539
            CT_DoExecLog ALL mkdir -p "${CT_SRC_DIR}"
yann@121
   540
        fi
richard@1727
   541
richard@1727
   542
        if [ "${CT_COMP_TOOLS}" = "y" ]; then
richard@1727
   543
          CT_DoStep INFO "Extracting, patching and installing companion tools"
richard@1727
   544
          do_companion_tools_extract
richard@1727
   545
          do_companion_tools
richard@1727
   546
          CT_EndStep
richard@1727
   547
        fi
richard@1727
   548
yann@121
   549
        CT_DoStep INFO "Extracting and patching toolchain components"
yann@121
   550
        do_kernel_extract
yann@466
   551
        do_gmp_extract
yann@466
   552
        do_mpfr_extract
yann@1324
   553
        do_ppl_extract
yann@1380
   554
        do_cloog_extract
yann@1384
   555
        do_mpc_extract
yann@1811
   556
        do_libelf_extract
yann@121
   557
        do_binutils_extract
yann@1755
   558
        do_elf2flt_extract
yann@1854
   559
        do_sstrip_extract
yann@331
   560
        do_cc_extract
yann@121
   561
        do_libc_extract
yann@121
   562
        do_debug_extract
mgl@1965
   563
        do_test_suite_extract
yann@121
   564
        CT_EndStep
yann@121
   565
    fi
yann@121
   566
fi
yann@85
   567
yann@121
   568
# Now for the job by itself. Go have a coffee!
yann@121
   569
if [ "${CT_ONLY_DOWNLOAD}" != "y" -a "${CT_ONLY_EXTRACT}" != "y" ]; then
yann@121
   570
    # Because of CT_RESTART, this becomes quite complex
yann@143
   571
    do_stop=0
yann@143
   572
    prev_step=
yann@121
   573
    [ -n "${CT_RESTART}" ] && do_it=0 || do_it=1
yann@466
   574
    # Aha! CT_STEPS comes from steps.mk!
yann@461
   575
    for step in ${CT_STEPS}; do
yann@121
   576
        if [ ${do_it} -eq 0 ]; then
yann@121
   577
            if [ "${CT_RESTART}" = "${step}" ]; then
yann@121
   578
                CT_DoLoadState "${step}"
yann@121
   579
                do_it=1
yann@143
   580
                do_stop=0
yann@121
   581
            fi
yann@121
   582
        else
yann@121
   583
            CT_DoSaveState ${step}
yann@143
   584
            if [ ${do_stop} -eq 1 ]; then
yann@523
   585
                CT_DoLog ERROR "Stopping just after step '${prev_step}', as requested."
yann@143
   586
                exit 0
yann@143
   587
            fi
yann@85
   588
        fi
yann@121
   589
        if [ ${do_it} -eq 1 ]; then
yann@121
   590
            do_${step}
yann@135
   591
            if [ "${CT_STOP}" = "${step}" ]; then
yann@143
   592
                do_stop=1
yann@135
   593
            fi
yann@725
   594
            if [ "${CT_DEBUG_PAUSE_STEPS}" = "y" ]; then
yann@523
   595
                CT_DoPause "Step '${step}' finished"
yann@121
   596
            fi
yann@121
   597
        fi
yann@143
   598
        prev_step="${step}"
yann@121
   599
    done
yann@63
   600
fi
yann@1
   601
yann@96
   602
CT_DoEnd INFO
yann@96
   603
yann@1135
   604
# From now-on, it can become impossible to log any time, because
yann@1135
   605
# either we're compressing the log file, or it can become RO any
yann@1135
   606
# moment... Consign all ouptut to oblivion...
yann@1135
   607
CT_DoLog INFO "Finishing installation (may take a few seconds)..."
yann@1135
   608
exec >/dev/null 2>&1
yann@2550
   609
rm -f ${CT_PREFIX_DIR}/build.log.bz2
yann@2339
   610
if [ "${CT_LOG_TO_FILE}" = "y" ]; then
yann@2339
   611
    cp "${tmp_log_file}" "${CT_PREFIX_DIR}/build.log"
yann@2339
   612
    if [ "${CT_LOG_FILE_COMPRESS}" = y ]; then
yann@2339
   613
        bzip2 -9 "${CT_PREFIX_DIR}/build.log"
yann@2339
   614
    fi
yann@2339
   615
fi
yann@1135
   616
[ "${CT_INSTALL_DIR_RO}" = "y"  ] && chmod -R a-w "${CT_INSTALL_DIR}"
yann@1966
   617
[ "${CT_TEST_SUITE}" = "y" ] && chmod -R u+w "${CT_TEST_SUITE_DIR}"
yann@1
   618
yann@1
   619
trap - EXIT