scripts/crosstool.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Feb 17 22:08:06 2008 +0000 (2008-02-17)
changeset 431 8bde4c6ea47a
parent 419 5d4020b8d22e
child 441 f1326505e3e5
permissions -rwxr-xr-x
Robert P. J. DAY says:

apparently, the patchset for gcc 4.2.1 applies properly to the
source for gcc 4.2.2 and gcc 4.2.3. so, if you want, you can simply
add support for those last two just by augmenting menuconfig and
adding a couple symlinks for those two directories. seems like a
cheap way to add a couple new versions.
yann@1
     1
#!/bin/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@182
    16
. "${CT_LIB_DIR}/scripts/functions"
yann@1
    17
yann@1
    18
CT_STAR_DATE=`CT_DoDate +%s%N`
yann@1
    19
CT_STAR_DATE_HUMAN=`CT_DoDate +%Y%m%d.%H%M%S`
yann@1
    20
yann@96
    21
# Are we configured? We'll need that later...
yann@96
    22
CT_TestOrAbort "Configuration file not found. Please create one." -f "${CT_TOP_DIR}/.config"
yann@96
    23
yann@1
    24
# Parse the configuration file
yann@96
    25
# It has some info about the logging facility, so include it early
yann@1
    26
. "${CT_TOP_DIR}/.config"
yann@1
    27
yann@379
    28
# Yes! We can do full logging from now on!
yann@379
    29
CT_DoLog INFO "Build started ${CT_STAR_DATE_HUMAN}"
yann@379
    30
yann@96
    31
# renice oursleves
yann@96
    32
renice ${CT_NICE} $$ |CT_DoLog DEBUG
yann@1
    33
yann@96
    34
CT_DoStep DEBUG "Dumping crosstool-NG configuration"
yann@182
    35
cat "${CT_TOP_DIR}/.config" |egrep '^(# |)CT_' |CT_DoLog DEBUG
yann@96
    36
CT_EndStep
yann@63
    37
yann@1
    38
# Some sanity checks in the environment and needed tools
yann@1
    39
CT_DoLog INFO "Checking environment sanity"
yann@1
    40
yann@290
    41
CT_DoLog DEBUG "Unsetting and unexporting MAKEFLAGS"
yann@290
    42
unset MAKEFLAGS
yann@290
    43
export MAKEFLAGS
yann@290
    44
yann@1
    45
# Other environment sanity checks
yann@1
    46
CT_TestAndAbort "Don't set LD_LIBRARY_PATH. It screws up the build." -n "${LD_LIBRARY_PATH}"
yann@1
    47
CT_TestAndAbort "Don't set CFLAGS. It screws up the build." -n "${CFLAGS}"
yann@1
    48
CT_TestAndAbort "Don't set CXXFLAGS. It screws up the build." -n "${CXXFLAGS}"
yann@1
    49
CT_Test "GREP_OPTIONS screws up the build. Resetting." -n "${GREP_OPTIONS}"
yann@1
    50
GREP_OPTIONS=
yann@1
    51
CT_HasOrAbort awk
yann@1
    52
CT_HasOrAbort sed
yann@1
    53
CT_HasOrAbort bison
yann@1
    54
CT_HasOrAbort flex
yann@243
    55
CT_HasOrAbort lynx
yann@1
    56
yann@1
    57
CT_DoLog INFO "Building environment variables"
yann@1
    58
yann@380
    59
# Parse architecture-specific functions
yann@394
    60
. "${CT_LIB_DIR}/arch/${CT_ARCH}/functions"
yann@380
    61
yann@335
    62
# Target tuple: CT_TARGET needs a little love:
yann@335
    63
CT_DoBuildTargetTuple
yann@1
    64
yann@96
    65
# Kludge: If any of the configured options needs CT_TARGET,
yann@96
    66
# then rescan the options file now:
yann@96
    67
. "${CT_TOP_DIR}/.config"
yann@96
    68
yann@397
    69
# Second kludge: merge user-supplied target CFLAGS with architecture-provided
yann@397
    70
# target CFLAGS
yann@397
    71
CT_TARGET_CFLAGS="${CT_ARCH_TARGET_CFLAGS} ${CT_TARGET_CFLAGS}"
yann@397
    72
yann@1
    73
# Now, build up the variables from the user-configured options.
yann@1
    74
CT_KERNEL_FILE="${CT_KERNEL}-${CT_KERNEL_VERSION}"
yann@1
    75
CT_BINUTILS_FILE="binutils-${CT_BINUTILS_VERSION}"
yann@1
    76
CT_CC_FILE="${CT_CC}-${CT_CC_VERSION}"
yann@1
    77
CT_LIBC_FILE="${CT_LIBC}-${CT_LIBC_VERSION}"
yann@1
    78
yann@85
    79
# Where will we work?
yann@85
    80
CT_TARBALLS_DIR="${CT_TOP_DIR}/targets/tarballs"
yann@143
    81
CT_SRC_DIR="${CT_TOP_DIR}/targets/src"
yann@85
    82
CT_BUILD_DIR="${CT_TOP_DIR}/targets/${CT_TARGET}/build"
yann@96
    83
CT_DEBUG_INSTALL_DIR="${CT_INSTALL_DIR}/${CT_TARGET}/debug-root"
yann@121
    84
# Note: we'll always install the core compiler in its own directory, so as to
yann@331
    85
# not mix the two builds: core and final.
yann@136
    86
CT_CC_CORE_STATIC_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core-static"
yann@136
    87
CT_CC_CORE_SHARED_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core-shared"
yann@121
    88
CT_STATE_DIR="${CT_TOP_DIR}/targets/${CT_TARGET}/state"
yann@85
    89
yann@143
    90
# We must ensure that we can restart if asked for!
yann@143
    91
if [ -n "${CT_RESTART}" -a ! -d "${CT_STATE_DIR}"  ]; then
yann@143
    92
    CT_DoLog ERROR "You asked to restart a non-restartable build"
yann@143
    93
    CT_DoLog ERROR "This happened because you didn't set CT_DEBUG_CT_SAVE_STEPS"
yann@153
    94
    CT_DoLog ERROR "in the config options for the previous build, or the state"
yann@425
    95
    CT_DoLog ERROR "directory for the previous build was deleted."
yann@143
    96
    CT_Abort "I will stop here to avoid any carnage"
yann@143
    97
fi
yann@143
    98
yann@85
    99
# Make all path absolute, it so much easier!
yann@85
   100
CT_LOCAL_TARBALLS_DIR="`CT_MakeAbsolutePath \"${CT_LOCAL_TARBALLS_DIR}\"`"
yann@85
   101
yann@403
   102
# If the local tarball directory does not exist, say so, and don't try to save there!
yann@403
   103
if [ ! -d "${CT_LOCAL_TARBALLS_DIR}" ]; then
yann@403
   104
    CT_DoLog WARN "Directory \"${CT_LOCAL_TARBALLS_DIR}\" does not exist. Will not save downloaded tarballs to local storage."
yann@403
   105
    CT_SAVE_TARBALLS=""
yann@403
   106
fi
yann@403
   107
yann@1
   108
# Some more sanity checks now that we have all paths set up
yann@403
   109
case "${CT_LOCAL_TARBALLS_DIR},${CT_TARBALLS_DIR},${CT_SRC_DIR},${CT_BUILD_DIR},${CT_PREFIX_DIR},${CT_INSTALL_DIR}" in
yann@1
   110
    *" "*) CT_Abort "Don't use spaces in paths, it breaks things.";;
yann@1
   111
esac
yann@1
   112
yann@85
   113
# Check now if we can write to the destination directory:
yann@85
   114
if [ -d "${CT_INSTALL_DIR}" ]; then
yann@85
   115
    CT_TestAndAbort "Destination directory \"${CT_INSTALL_DIR}\" is not removable" ! -w `dirname "${CT_INSTALL_DIR}"`
yann@85
   116
fi
yann@85
   117
yann@96
   118
# Good, now grab a bit of informations on the system we're being run on,
yann@96
   119
# just in case something goes awok, and it's not our fault:
yann@96
   120
CT_SYS_USER="`id -un`"
yann@96
   121
CT_SYS_HOSTNAME=`hostname -f 2>/dev/null || true`
yann@96
   122
# Hmmm. Some non-DHCP-enabled machines do not have an FQDN... Fall back to node name.
yann@96
   123
CT_SYS_HOSTNAME="${CT_SYS_HOSTNAME:-`uname -n`}"
yann@96
   124
CT_SYS_KERNEL=`uname -s`
yann@96
   125
CT_SYS_REVISION=`uname -r`
yann@96
   126
# MacOS X lacks '-o' :
yann@96
   127
CT_SYS_OS=`uname -o || echo "Unknown (maybe MacOS-X)"`
yann@96
   128
CT_SYS_MACHINE=`uname -m`
yann@96
   129
CT_SYS_PROCESSOR=`uname -p`
yann@96
   130
CT_SYS_GCC=`gcc -dumpversion`
yann@182
   131
CT_SYS_TARGET=`CT_DoConfigGuess`
yann@96
   132
CT_TOOLCHAIN_ID="crosstool-${CT_VERSION} build ${CT_STAR_DATE_HUMAN} by ${CT_SYS_USER}@${CT_SYS_HOSTNAME}"
yann@96
   133
yann@96
   134
CT_DoLog EXTRA "Preparing working directories"
yann@96
   135
yann@121
   136
# Ah! The build directory shall be eradicated, even if we restart!
yann@85
   137
if [ -d "${CT_BUILD_DIR}" ]; then
yann@85
   138
    mv "${CT_BUILD_DIR}" "${CT_BUILD_DIR}.$$"
yann@96
   139
    chmod -R u+w "${CT_BUILD_DIR}.$$"
yann@320
   140
    setsid nohup rm -rf "${CT_BUILD_DIR}.$$" >/dev/null 2>&1 &
yann@85
   141
fi
yann@121
   142
yann@121
   143
# Don't eradicate directories if we need to restart
yann@121
   144
if [ -z "${CT_RESTART}" ]; then
yann@121
   145
    # Get rid of pre-existing installed toolchain and previous build directories.
yann@121
   146
    # We need to do that _before_ we can safely log, because the log file will
yann@121
   147
    # most probably be in the toolchain directory.
yann@121
   148
    if [ "${CT_FORCE_DOWNLOAD}" = "y" -a -d "${CT_TARBALLS_DIR}" ]; then
yann@121
   149
        mv "${CT_TARBALLS_DIR}" "${CT_TARBALLS_DIR}.$$"
yann@121
   150
        chmod -R u+w "${CT_TARBALLS_DIR}.$$"
yann@320
   151
        setsid nohup rm -rf "${CT_TARBALLS_DIR}.$$" >/dev/null 2>&1 &
yann@121
   152
    fi
yann@121
   153
    if [ "${CT_FORCE_EXTRACT}" = "y" -a -d "${CT_SRC_DIR}" ]; then
yann@121
   154
        mv "${CT_SRC_DIR}" "${CT_SRC_DIR}.$$"
yann@121
   155
        chmod -R u+w "${CT_SRC_DIR}.$$"
yann@320
   156
        setsid nohup rm -rf "${CT_SRC_DIR}.$$" >/dev/null 2>&1 &
yann@121
   157
    fi
yann@121
   158
    if [ -d "${CT_INSTALL_DIR}" ]; then
yann@121
   159
        mv "${CT_INSTALL_DIR}" "${CT_INSTALL_DIR}.$$"
yann@121
   160
        chmod -R u+w "${CT_INSTALL_DIR}.$$"
yann@320
   161
        setsid nohup rm -rf "${CT_INSTALL_DIR}.$$" >/dev/null 2>&1 &
yann@121
   162
    fi
yann@121
   163
    if [ -d "${CT_DEBUG_INSTALL_DIR}" ]; then
yann@121
   164
        mv "${CT_DEBUG_INSTALL_DIR}" "${CT_DEBUG_INSTALL_DIR}.$$"
yann@121
   165
        chmod -R u+w "${CT_DEBUG_INSTALL_DIR}.$$"
yann@320
   166
        setsid nohup rm -rf "${CT_DEBUG_INSTALL_DIR}.$$" >/dev/null 2>&1 &
yann@121
   167
    fi
yann@121
   168
    # In case we start anew, get rid of the previously saved state directory
yann@121
   169
    if [ -d "${CT_STATE_DIR}" ]; then
yann@121
   170
        mv "${CT_STATE_DIR}" "${CT_STATE_DIR}.$$"
yann@121
   171
        chmod -R u+w "${CT_STATE_DIR}.$$"
yann@320
   172
        setsid nohup rm -rf "${CT_STATE_DIR}.$$" >/dev/null 2>&1 &
yann@121
   173
    fi
yann@96
   174
fi
yann@85
   175
yann@121
   176
# Create the directories we'll use, even if restarting: it does no harm to
yann@121
   177
# create already existent directories, and CT_BUILD_DIR needs to be created
yann@121
   178
# anyway
yann@85
   179
mkdir -p "${CT_TARBALLS_DIR}"
yann@85
   180
mkdir -p "${CT_SRC_DIR}"
yann@85
   181
mkdir -p "${CT_BUILD_DIR}"
yann@85
   182
mkdir -p "${CT_INSTALL_DIR}"
yann@121
   183
mkdir -p "${CT_PREFIX_DIR}"
yann@96
   184
mkdir -p "${CT_DEBUG_INSTALL_DIR}"
yann@136
   185
mkdir -p "${CT_CC_CORE_STATIC_PREFIX_DIR}"
yann@136
   186
mkdir -p "${CT_CC_CORE_SHARED_PREFIX_DIR}"
yann@121
   187
mkdir -p "${CT_STATE_DIR}"
yann@121
   188
yann@121
   189
# Kludge: CT_INSTALL_DIR and CT_PREFIX_DIR might have grown read-only if
yann@425
   190
# the previous build was successful. To be able to move the logfile there,
yann@121
   191
# switch them back to read/write
yann@121
   192
chmod -R u+w "${CT_INSTALL_DIR}" "${CT_PREFIX_DIR}"
yann@85
   193
yann@63
   194
# Redirect log to the actual log file now we can
yann@63
   195
# It's quite understandable that the log file will be installed in the install
yann@63
   196
# directory, so we must first ensure it exists and is writeable (above) before
yann@63
   197
# we can log there
yann@112
   198
exec >/dev/null
yann@174
   199
case "${CT_LOG_TO_FILE}" in
yann@174
   200
    y)  CT_LOG_FILE="${CT_PREFIX_DIR}/build.log"
yann@174
   201
        cat "${tmp_log_file}" >>"${CT_LOG_FILE}"
yann@174
   202
        rm -f "${tmp_log_file}"
yann@174
   203
        exec >>"${CT_LOG_FILE}"
yann@174
   204
        ;;
yann@174
   205
    *)  rm -f "${tmp_log_file}"
yann@174
   206
        ;;
yann@63
   207
esac
yann@63
   208
yann@397
   209
# Setting up the rest of the environment only if not restarting
yann@121
   210
if [ -z "${CT_RESTART}" ]; then
yann@121
   211
    # Determine build system if not set by the user
yann@121
   212
    CT_Test "You did not specify the build system. That's OK, I can guess..." -z "${CT_BUILD}"
yann@182
   213
    CT_BUILD="${CT_BUILD:-`CT_DoConfigGuess`}"
yann@182
   214
    CT_BUILD=`CT_DoConfigSub "${CT_BUILD}"`
yann@63
   215
yann@121
   216
    # Arrange paths depending on wether we use sys-root or not.
yann@121
   217
    if [ "${CT_USE_SYSROOT}" = "y" ]; then
yann@121
   218
        CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/sys-root"
yann@121
   219
        CT_HEADERS_DIR="${CT_SYSROOT_DIR}/usr/include"
yann@121
   220
        BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
yann@121
   221
        CC_CORE_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
yann@121
   222
        CC_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
yann@121
   223
        LIBC_SYSROOT_ARG=""
yann@121
   224
        # glibc's prefix must be exactly /usr, else --with-sysroot'd gcc will get
yann@121
   225
        # confused when $sysroot/usr/include is not present.
yann@121
   226
        # Note: --prefix=/usr is magic!
yann@121
   227
        # See http://www.gnu.org/software/libc/FAQ.html#s-2.2
yann@121
   228
    else
yann@121
   229
        # plain old way. All libraries in prefix/target/lib
yann@121
   230
        CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}"
yann@121
   231
        CT_HEADERS_DIR="${CT_SYSROOT_DIR}/include"
yann@121
   232
        # hack!  Always use --with-sysroot for binutils.
yann@121
   233
        # binutils 2.14 and later obey it, older binutils ignore it.
yann@121
   234
        # Lets you build a working 32->64 bit cross gcc
yann@121
   235
        BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
yann@121
   236
        # Use --with-headers, else final gcc will define disable_glibc while
yann@121
   237
        # building libgcc, and you'll have no profiling
yann@121
   238
        CC_CORE_SYSROOT_ARG="--without-headers"
yann@121
   239
        CC_SYSROOT_ARG="--with-headers=${CT_HEADERS_DIR}"
yann@121
   240
        LIBC_SYSROOT_ARG="prefix="
yann@121
   241
    fi
yann@121
   242
yann@121
   243
    # Prepare the 'lib' directories in sysroot, else the ../lib64 hack used by
yann@121
   244
    # 32 -> 64 bit crosscompilers won't work, and build of final gcc will fail with
yann@121
   245
    #  "ld: cannot open crti.o: No such file or directory"
yann@121
   246
    mkdir -p "${CT_SYSROOT_DIR}/lib"
yann@121
   247
    mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
yann@121
   248
yann@121
   249
    # Canadian-cross are really picky on the way they are built. Tweak the values.
yann@136
   250
    CT_UNIQ_BUILD=`echo "${CT_BUILD}" |sed -r -e 's/-/-build_/'`
yann@121
   251
    if [ "${CT_CANADIAN}" = "y" ]; then
yann@121
   252
        # Arrange so that gcc never, ever think that build system == host system
yann@136
   253
        CT_CANADIAN_OPT="--build=${CT_UNIQ_BUILD}"
yann@121
   254
        # We shall have a compiler for this target!
yann@121
   255
        # Do test here...
yann@121
   256
    else
yann@121
   257
        CT_HOST="${CT_BUILD}"
yann@134
   258
        CT_CANADIAN_OPT="--build=${CT_BUILD}"
yann@121
   259
        # Add the target toolchain in the path so that we can build the C library
yann@136
   260
        # Carefully add paths in the order we want them:
yann@136
   261
        #  - first try in ${CT_PREFIX_DIR}/bin
yann@136
   262
        #  - then try in ${CT_CC_CORE_SHARED_PREFIX_DIR}/bin
yann@136
   263
        #  - then try in ${CT_CC_CORE_STATIC_PREFIX_DIR}/bin
yann@136
   264
        #  - fall back to searching user's PATH
yann@136
   265
        export PATH="${CT_PREFIX_DIR}/bin:${CT_CC_CORE_SHARED_PREFIX_DIR}/bin:${CT_CC_CORE_STATIC_PREFIX_DIR}/bin:${PATH}"
yann@121
   266
    fi
yann@121
   267
yann@121
   268
    # Modify GCC_HOST to never be equal to $BUILD or $TARGET
yann@121
   269
    # This strange operation causes gcc to always generate a cross-compiler
yann@121
   270
    # even if the build machine is the same kind as the host.
yann@121
   271
    # This is why CC has to be set when doing a canadian cross; you can't find a
yann@121
   272
    # host compiler by appending -gcc to our whacky $GCC_HOST
yann@121
   273
    # Kludge: it is reported that the above causes canadian crosses with cygwin
yann@121
   274
    # hosts to fail, so avoid it just in that one case.  It would be cleaner to
yann@121
   275
    # just move this into the non-canadian case above, but I'm afraid that might
yann@121
   276
    # cause some configure script somewhere to decide that since build==host, they
yann@121
   277
    # could run host binaries.
yann@121
   278
    # (Copied almost as-is from original crosstool):
yann@121
   279
    case "${CT_KERNEL},${CT_CANADIAN}" in
yann@121
   280
        cygwin,y) ;;
yann@136
   281
        *,y)      CT_HOST="`echo \"${CT_HOST}\" |sed -r -e 's/-/-host_/;'`";;
yann@121
   282
    esac
yann@121
   283
yann@121
   284
    # Ah! Recent versions of binutils need some of the build and/or host system
yann@121
   285
    # (read CT_BUILD and CT_HOST) tools to be accessible (ar is but an example).
yann@121
   286
    # Do that:
yann@174
   287
    CT_DoLog DEBUG "Making build system tools available"
yann@121
   288
    mkdir -p "${CT_PREFIX_DIR}/bin"
yann@121
   289
    for tool in ar as dlltool gcc g++ gnatbind gnatmake ld nm ranlib strip windres objcopy objdump; do
yann@210
   290
        tmp=`CT_Which ${tool}`
yann@210
   291
        if [ -n "${tmp}" ]; then
yann@210
   292
            ln -sfv "${tmp}" "${CT_PREFIX_DIR}/bin/${CT_BUILD}-${tool}"
yann@210
   293
            ln -sfv "${tmp}" "${CT_PREFIX_DIR}/bin/${CT_UNIQ_BUILD}-${tool}"
yann@210
   294
            ln -sfv "${tmp}" "${CT_PREFIX_DIR}/bin/${CT_HOST}-${tool}"
yann@123
   295
        fi |CT_DoLog DEBUG
yann@121
   296
    done
yann@121
   297
yann@121
   298
    # Help gcc
yann@121
   299
    CT_CFLAGS_FOR_HOST=
yann@121
   300
    [ "${CT_USE_PIPES}" = "y" ] && CT_CFLAGS_FOR_HOST="${CT_CFLAGS_FOR_HOST} -pipe"
yann@121
   301
yann@333
   302
    # Override the configured jobs with what's been given on the command line
yann@333
   303
    [ -n "${CT_JOBS}" ] && CT_PARALLEL_JOBS="${CT_JOBS}"
yann@333
   304
yann@121
   305
    # And help make go faster
yann@121
   306
    PARALLELMFLAGS=
yann@121
   307
    [ ${CT_PARALLEL_JOBS} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -j${CT_PARALLEL_JOBS}"
yann@121
   308
    [ ${CT_LOAD} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -l${CT_LOAD}"
yann@121
   309
yann@121
   310
    CT_DoStep EXTRA "Dumping internal crosstool-NG configuration"
yann@121
   311
    CT_DoLog EXTRA "Building a toolchain for:"
yann@121
   312
    CT_DoLog EXTRA "  build  = ${CT_BUILD}"
yann@121
   313
    CT_DoLog EXTRA "  host   = ${CT_HOST}"
yann@121
   314
    CT_DoLog EXTRA "  target = ${CT_TARGET}"
yann@121
   315
    set |egrep '^CT_.+=' |sort |CT_DoLog DEBUG
yann@121
   316
    CT_EndStep
yann@63
   317
fi
yann@63
   318
yann@1
   319
# Include sub-scripts instead of calling them: that way, we do not have to
yann@1
   320
# export any variable, nor re-parse the configuration and functions files.
yann@182
   321
. "${CT_LIB_DIR}/scripts/build/kernel_${CT_KERNEL}.sh"
yann@182
   322
. "${CT_LIB_DIR}/scripts/build/binutils.sh"
yann@182
   323
. "${CT_LIB_DIR}/scripts/build/libc_${CT_LIBC}.sh"
yann@182
   324
. "${CT_LIB_DIR}/scripts/build/cc_${CT_CC}.sh"
yann@182
   325
. "${CT_LIB_DIR}/scripts/build/debug.sh"
yann@182
   326
. "${CT_LIB_DIR}/scripts/build/tools.sh"
yann@63
   327
yann@121
   328
if [ -z "${CT_RESTART}" ]; then
yann@121
   329
    CT_DoStep INFO "Retrieving needed toolchain components' tarballs"
yann@121
   330
    do_kernel_get
yann@121
   331
    do_binutils_get
yann@331
   332
    do_cc_get
yann@121
   333
    do_libc_get
yann@148
   334
    do_tools_get
yann@121
   335
    do_debug_get
yann@63
   336
    CT_EndStep
yann@63
   337
yann@121
   338
    if [ "${CT_ONLY_DOWNLOAD}" != "y" ]; then
yann@121
   339
        if [ "${CT_FORCE_EXTRACT}" = "y" ]; then
yann@121
   340
            mv "${CT_SRC_DIR}" "${CT_SRC_DIR}.$$"
yann@320
   341
            setsid nohup rm -rf "${CT_SRC_DIR}.$$" >/dev/null 2>&1
yann@121
   342
        fi
yann@121
   343
        CT_DoStep INFO "Extracting and patching toolchain components"
yann@121
   344
        do_kernel_extract
yann@121
   345
        do_binutils_extract
yann@331
   346
        do_cc_extract
yann@121
   347
        do_libc_extract
yann@148
   348
        do_tools_extract
yann@121
   349
        do_debug_extract
yann@121
   350
        CT_EndStep
yann@121
   351
    fi
yann@121
   352
fi
yann@85
   353
yann@121
   354
# Now for the job by itself. Go have a coffee!
yann@121
   355
if [ "${CT_ONLY_DOWNLOAD}" != "y" -a "${CT_ONLY_EXTRACT}" != "y" ]; then
yann@121
   356
    # Because of CT_RESTART, this becomes quite complex
yann@143
   357
    do_stop=0
yann@143
   358
    prev_step=
yann@121
   359
    [ -n "${CT_RESTART}" ] && do_it=0 || do_it=1
yann@121
   360
    for step in libc_check_config       \
yann@121
   361
                kernel_check_config     \
yann@121
   362
                kernel_headers          \
yann@121
   363
                binutils                \
yann@152
   364
                cc_core_pass_1          \
yann@121
   365
                libc_headers            \
yann@136
   366
                libc_start_files        \
yann@152
   367
                cc_core_pass_2          \
yann@121
   368
                libc                    \
yann@121
   369
                cc                      \
yann@121
   370
                libc_finish             \
yann@148
   371
                tools                   \
yann@121
   372
                debug                   \
yann@121
   373
                ; do
yann@121
   374
        if [ ${do_it} -eq 0 ]; then
yann@121
   375
            if [ "${CT_RESTART}" = "${step}" ]; then
yann@121
   376
                CT_DoLoadState "${step}"
yann@121
   377
                do_it=1
yann@143
   378
                do_stop=0
yann@121
   379
            fi
yann@121
   380
        else
yann@121
   381
            CT_DoSaveState ${step}
yann@143
   382
            if [ ${do_stop} -eq 1 ]; then
yann@143
   383
                CT_DoLog ERROR "Stopping just after step \"${prev_step}\", as requested."
yann@143
   384
                exit 0
yann@143
   385
            fi
yann@85
   386
        fi
yann@121
   387
        if [ ${do_it} -eq 1 ]; then
yann@121
   388
            do_${step}
yann@135
   389
            if [ "${CT_STOP}" = "${step}" ]; then
yann@143
   390
                do_stop=1
yann@135
   391
            fi
yann@121
   392
            if [ "${CTDEBUG_CT_PAUSE_STEPS}" = "y" ]; then
yann@121
   393
                CT_DoPause "Step \"${step}\" finished"
yann@121
   394
            fi
yann@121
   395
        fi
yann@143
   396
        prev_step="${step}"
yann@121
   397
    done
yann@85
   398
yann@274
   399
    CT_DoLog DEBUG "Removing access to the build system tools"
yann@419
   400
    find "${CT_PREFIX_DIR}/bin" -name "${CT_BUILD}-"'*' -exec rm -fv {} \; |CT_DoLog DEBUG
yann@419
   401
    find "${CT_PREFIX_DIR}/bin" -name "${CT_UNIQ_BUILD}-"'*' -exec rm -fv {} \; |CT_DoLog DEBUG
yann@419
   402
    find "${CT_PREFIX_DIR}/bin" -name "${CT_HOST}-"'*' -exec rm -fv {} \; |CT_DoLog DEBUG
yann@274
   403
yann@217
   404
    # Install the /populator/
yann@254
   405
    CT_DoLog EXTRA "Installing the populate helper"
yann@217
   406
    sed -r -e 's,@@CT_READELF@@,'"${CT_PREFIX_DIR}/bin/${CT_TARGET}-readelf"',g;'   \
yann@217
   407
           -e 's,@@CT_SYSROOT_DIR@@,'"${CT_SYSROOT_DIR}"',g;'                       \
yann@217
   408
           "${CT_LIB_DIR}/tools/populate.in" >"${CT_PREFIX_DIR}/bin/${CT_TARGET}-populate"
yann@217
   409
    chmod 755 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-populate"
yann@217
   410
yann@121
   411
    # Create the aliases to the target tools
yann@321
   412
    CT_DoStep EXTRA "Creating toolchain aliases"
yann@321
   413
    CT_Pushd "${CT_PREFIX_DIR}/bin"
yann@321
   414
    for t in "${CT_TARGET}-"*; do
yann@321
   415
        if [ -n "${CT_TARGET_ALIAS}" ]; then
yann@121
   416
            _t="`echo \"$t\" |sed -r -e 's/^'\"${CT_TARGET}\"'-/'\"${CT_TARGET_ALIAS}\"'-/;'`"
yann@121
   417
            CT_DoLog DEBUG "Linking \"${_t}\" -> \"${t}\""
yann@321
   418
            ln -sv "${t}" "${_t}" 2>&1 |CT_DoLog ALL
yann@321
   419
        fi
yann@321
   420
        if [ -n "${CT_TARGET_ALIAS_SED_EXPR}" ]; then
yann@321
   421
            _t="`echo \"$t\" |sed -r -e \"${CT_TARGET_ALIAS_SED_EXPR}\"`"
yann@321
   422
            CT_DoLog DEBUG "Linking \"${_t}\" -> \"${t}\""
yann@321
   423
            ln -sv "${t}" "${_t}" 2>&1 |CT_DoLog ALL
yann@321
   424
        fi
yann@321
   425
    done
yann@321
   426
    CT_Popd
yann@321
   427
    CT_EndStep
yann@121
   428
yann@121
   429
    # Remove the generated documentation files
yann@121
   430
    if [ "${CT_REMOVE_DOCS}" = "y" ]; then
yann@121
   431
    	CT_DoLog INFO "Removing installed documentation"
yann@121
   432
        rm -rf "${CT_PREFIX_DIR}/"{,usr/}{man,info}
yann@121
   433
        rm -rf "${CT_SYSROOT_DIR}/"{,usr/}{man,info}
yann@121
   434
        rm -rf "${CT_DEBUG_INSTALL_DIR}/"{,usr/}{man,info}
yann@63
   435
    fi
yann@63
   436
fi
yann@1
   437
yann@96
   438
CT_DoEnd INFO
yann@96
   439
yann@174
   440
if [ "${CT_LOG_FILE_COMPRESS}" = y ]; then
yann@174
   441
    CT_DoLog EXTRA "Compressing log file"
yann@174
   442
    exec >/dev/null
yann@174
   443
    bzip2 -9 "${CT_LOG_FILE}"
yann@174
   444
fi
yann@174
   445
yann@174
   446
if [ "${CT_INSTALL_DIR_RO}" = "y" ]; then
yann@174
   447
    # OK, now we're done, set the toolchain read-only
yann@174
   448
    # Don't log, the log file may become read-only any moment...
yann@174
   449
    chmod -R a-w "${CT_INSTALL_DIR}" >/dev/null 2>&1
yann@174
   450
fi
yann@1
   451
yann@1
   452
trap - EXIT