scripts/crosstool-NG.sh.in
author Cody Schafer <dev@codyps.com>
Fri May 09 19:13:49 2014 -0700 (2014-05-09)
changeset 3312 4876ff97e039
parent 3246 ff6b7a9bd370
permissions -rw-r--r--
cc/gcc: allow CC_EXTRA_CONFIG_ARRAY on baremetal

The final bare-metal compiler is built using the core backend.
Currently the core uses the CC_CORE_EXTRA_CONFIG_ARRAY variable.

While this works as supposed to, this can leave the user puzzled
in the menuconfig, since all he can see is the core options, not
the final options.

Only show the core options if any of the core passes are needed,
and use the final options in the core-backend if we're issuing
the bare-metal compiler.

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