scripts/crosstool-NG.sh.in
author Daniel Price <daniel.price@gmail.com>
Tue Nov 20 16:59:17 2012 -0800 (2012-11-20)
changeset 3126 333d3e40cbd1
parent 3125 15cd5dc25929
child 3163 06938bc1c6e7
permissions -rw-r--r--
scripts: refine static linking check to better guide the user

The current mechanism to check if static linking is possible, and the mesage
displayed on failure, can be puzzling to the unsuspecting user.

Also, the current implementation is not using the existing infrastructure,
and is thus difficult to enhance with new tests.

So, switch to using the standard CT_DoExecLog infra, and use four tests to
check for the host compiler:
- check we can run it
- check it can build a trivial program
- check it can statically link that program
- check if it statically link with libstdc++

That should cover most of the problems. Hopefully.

(At the same time, fix a typo in a comment)

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