scripts/crosstool-NG.sh.in
author Johannes Stezenbach <js@sig21.net>
Tue Oct 30 00:22:25 2012 +0000 (2012-10-30)
changeset 3097 5c67476c7342
parent 3082 39ec9e913d79
child 3111 a9130ff13b19
child 3129 b8e00eab8f81
permissions -rw-r--r--
scripts/functions: fix endless loop in debug-shell with IO redirection

CT_DEBUG_INTERACTIVE is disabled when stdin, stdout or
stderr are redirected, but the check is only done at
the start of the build and doesn't catch when individual
build commands use redirection. When stdin is redirected
it will cause the debug shell to exit immediately, causing
and endless loop. Thus, save the stdin/our/err file handles
and restore them before invoking the debug shell.

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