scripts/crosstool-NG.sh.in
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sat Dec 31 16:23:27 2011 +0100 (2011-12-31)
changeset 2814 3dc2727ebffc
parent 2796 bdff4164a122
child 2838 822af73497bf
permissions -rw-r--r--
cc/gcc: add option to use system zlib

In some cases, it might be desirable to use the system zlib

Eg. because latest gcc seem to be totally borked when it comes
to multilib, and tries to build a multilib host zlib, when it
is *absolutely* *not* needed: we want mulitlib on the target,
not on the host! Sigh... :-(

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