scripts/crosstool-NG.sh.in
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Thu Jun 11 21:47:19 2009 +0000 (2009-06-11)
branch1.4
changeset 1451 25d050084e98
parent 1272 ddac62e7c428
child 1318 5416f4ba36bf
child 1453 bfdcc6076d3b
permissions -rw-r--r--
populate: fix installing dynamic linker 'ld.so'

The dynamic linker, ld.so, needs the execute bit to be set.
Detect tht the library being installed is in fact ld.so and
install it with 0755 instead of 0644.

Fix detecting src == dst.

Use a simpler command to copy src -> dst.

Also change echo to printf, get rid of 'echo -n', which is
highly non-portable.


-------- diffstat follows --------
/trunk/scripts/populate.in | 76 43 33 0 +++++++++++++++++++++++++++++-----------------------
1 file changed, 43 insertions(+), 33 deletions(-)
(transplanted from d7ddcb75e0f703e2ba6d17169167356389224870)
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@965
    25
. .config
yann@1156
    26
# Yes! We can do full logging from now on!
yann@1
    27
yann@1064
    28
# Overide the locale early, in case we ever translate crosstool-NG messages
yann@1064
    29
[ -z "${CT_NO_OVERIDE_LC_MESSAGES}" ] && export LC_ALL=C
yann@1064
    30
yann@1156
    31
# Where will we work?
yann@1156
    32
CT_WORK_DIR="${CT_WORK_DIR:-${CT_TOP_DIR}/targets}"
yann@1270
    33
CT_DoExecLog ALL mkdir -p "${CT_WORK_DIR}"
yann@1270
    34
yann@1270
    35
# Check build file system case-sensitiveness
yann@1278
    36
CT_DoExecLog DEBUG touch "${CT_WORK_DIR}/foo"
yann@1270
    37
CT_TestAndAbort "Your file system in '${CT_WORK_DIR}' is *not* case-sensitive!" -f "${CT_WORK_DIR}/FOO"
yann@1278
    38
CT_DoExecLog DEBUG rm -f "${CT_WORK_DIR}/foo"
yann@1156
    39
yann@1156
    40
# Create the bin-overide early
yann@1219
    41
# Contains symlinks to the tools found by ./configure
yann@1156
    42
# Note: CT_DoLog and CT_DoExecLog do not use any of those tool, so
yann@1156
    43
# they can be safely used
yann@1156
    44
CT_BIN_OVERIDE_DIR="${CT_WORK_DIR}/bin"
yann@1156
    45
CT_DoLog DEBUG "Creating bin-overide for tools in '${CT_BIN_OVERIDE_DIR}'"
yann@1156
    46
CT_DoExecLog DEBUG mkdir -p "${CT_BIN_OVERIDE_DIR}"
yann@1156
    47
cat "${CT_LIB_DIR}/paths.mk" |while read trash line; do
yann@1156
    48
    tool="${line%%=*}"
yann@1156
    49
    path="${line#*=}"
yann@1156
    50
    CT_DoLog DEBUG "  '${tool}' -> '${path}'"
yann@1156
    51
    printf "#${BANG}/bin/sh\nexec '${path}' \"\${@}\"\n" >"${CT_BIN_OVERIDE_DIR}/${tool}"
yann@1156
    52
    CT_DoExecLog ALL chmod 700 "${CT_BIN_OVERIDE_DIR}/${tool}"
yann@1156
    53
done
yann@1156
    54
export PATH="${CT_BIN_OVERIDE_DIR}:${PATH}"
yann@1156
    55
yann@1064
    56
# Start date. Can't be done until we know the locale
yann@1064
    57
CT_STAR_DATE=$(CT_DoDate +%s%N)
yann@1064
    58
CT_STAR_DATE_HUMAN=$(CT_DoDate +%Y%m%d.%H%M%S)
yann@1064
    59
yann@1156
    60
# Log real begining of build, now
yann@379
    61
CT_DoLog INFO "Build started ${CT_STAR_DATE_HUMAN}"
yann@379
    62
yann@96
    63
# renice oursleves
yann@762
    64
CT_DoExecLog DEBUG renice ${CT_NICE} $$
yann@1
    65
yann@894
    66
CT_DoStep DEBUG "Dumping user-supplied crosstool-NG configuration"
yann@1247
    67
CT_DoExecLog DEBUG grep -E '^(# |)CT_' .config
yann@96
    68
CT_EndStep
yann@63
    69
yann@1
    70
# Some sanity checks in the environment and needed tools
yann@1
    71
CT_DoLog INFO "Checking environment sanity"
yann@1
    72
yann@290
    73
CT_DoLog DEBUG "Unsetting and unexporting MAKEFLAGS"
yann@290
    74
unset MAKEFLAGS
yann@290
    75
export MAKEFLAGS
yann@290
    76
yann@1
    77
# Other environment sanity checks
yann@1
    78
CT_TestAndAbort "Don't set LD_LIBRARY_PATH. It screws up the build." -n "${LD_LIBRARY_PATH}"
yann@1
    79
CT_TestAndAbort "Don't set CFLAGS. It screws up the build." -n "${CFLAGS}"
yann@1
    80
CT_TestAndAbort "Don't set CXXFLAGS. It screws up the build." -n "${CXXFLAGS}"
yann@1
    81
CT_Test "GREP_OPTIONS screws up the build. Resetting." -n "${GREP_OPTIONS}"
yann@965
    82
export GREP_OPTIONS=
yann@1
    83
yann@1
    84
CT_DoLog INFO "Building environment variables"
yann@1
    85
yann@965
    86
# Include sub-scripts instead of calling them: that way, we do not have to
yann@965
    87
# export any variable, nor re-parse the configuration and functions files.
yann@1225
    88
. "${CT_LIB_DIR}/scripts/build/internals.sh"
yann@903
    89
. "${CT_LIB_DIR}/scripts/build/arch/${CT_ARCH}.sh"
yann@965
    90
. "${CT_LIB_DIR}/scripts/build/kernel/${CT_KERNEL}.sh"
yann@965
    91
. "${CT_LIB_DIR}/scripts/build/gmp.sh"
yann@965
    92
. "${CT_LIB_DIR}/scripts/build/mpfr.sh"
yann@965
    93
. "${CT_LIB_DIR}/scripts/build/binutils.sh"
yann@965
    94
. "${CT_LIB_DIR}/scripts/build/libc/${CT_LIBC}.sh"
yann@965
    95
. "${CT_LIB_DIR}/scripts/build/cc/${CT_CC}.sh"
yann@965
    96
. "${CT_LIB_DIR}/scripts/build/tools.sh"
yann@965
    97
. "${CT_LIB_DIR}/scripts/build/debug.sh"
yann@380
    98
yann@335
    99
# Target tuple: CT_TARGET needs a little love:
yann@335
   100
CT_DoBuildTargetTuple
yann@1
   101
yann@96
   102
# Kludge: If any of the configured options needs CT_TARGET,
yann@96
   103
# then rescan the options file now:
yann@1093
   104
. .config
yann@96
   105
yann@397
   106
# Second kludge: merge user-supplied target CFLAGS with architecture-provided
yann@531
   107
# target CFLAGS. Do the same for LDFLAGS in case it happens in the future.
yann@531
   108
# Put user-supplied flags at the end, so that they take precedence.
yann@397
   109
CT_TARGET_CFLAGS="${CT_ARCH_TARGET_CFLAGS} ${CT_TARGET_CFLAGS}"
yann@531
   110
CT_TARGET_LDFLAGS="${CT_ARCH_TARGET_LDFLAGS} ${CT_TARGET_LDFLAGS}"
yann@767
   111
CT_CC_CORE_EXTRA_CONFIG="${CT_ARCH_CC_CORE_EXTRA_CONFIG} ${CT_CC_CORE_EXTRA_CONFIG}"
yann@767
   112
CT_CC_EXTRA_CONFIG="${CT_ARCH_CC_EXTRA_CONFIG} ${CT_CC_EXTRA_CONFIG}"
yann@397
   113
yann@1156
   114
# Create the working directories
yann@610
   115
CT_TARBALLS_DIR="${CT_WORK_DIR}/tarballs"
yann@610
   116
CT_SRC_DIR="${CT_WORK_DIR}/src"
yann@610
   117
CT_BUILD_DIR="${CT_WORK_DIR}/${CT_TARGET}/build"
yann@1272
   118
CT_STATE_DIR="${CT_WORK_DIR}/${CT_TARGET}/state"
yann@1272
   119
CT_CONFIG_DIR="${CT_BUILD_DIR}/configs"
yann@1272
   120
yann@121
   121
# Note: we'll always install the core compiler in its own directory, so as to
yann@331
   122
# not mix the two builds: core and final.
yann@136
   123
CT_CC_CORE_STATIC_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core-static"
yann@136
   124
CT_CC_CORE_SHARED_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core-shared"
yann@85
   125
yann@143
   126
# We must ensure that we can restart if asked for!
yann@143
   127
if [ -n "${CT_RESTART}" -a ! -d "${CT_STATE_DIR}"  ]; then
yann@143
   128
    CT_DoLog ERROR "You asked to restart a non-restartable build"
yann@143
   129
    CT_DoLog ERROR "This happened because you didn't set CT_DEBUG_CT_SAVE_STEPS"
yann@153
   130
    CT_DoLog ERROR "in the config options for the previous build, or the state"
yann@425
   131
    CT_DoLog ERROR "directory for the previous build was deleted."
yann@143
   132
    CT_Abort "I will stop here to avoid any carnage"
yann@143
   133
fi
yann@143
   134
yann@403
   135
# If the local tarball directory does not exist, say so, and don't try to save there!
yann@403
   136
if [ ! -d "${CT_LOCAL_TARBALLS_DIR}" ]; then
yann@523
   137
    CT_DoLog WARN "Directory '${CT_LOCAL_TARBALLS_DIR}' does not exist. Will not save downloaded tarballs to local storage."
yann@523
   138
    CT_SAVE_TARBALLS=
yann@403
   139
fi
yann@403
   140
yann@1
   141
# Some more sanity checks now that we have all paths set up
yann@403
   142
case "${CT_LOCAL_TARBALLS_DIR},${CT_TARBALLS_DIR},${CT_SRC_DIR},${CT_BUILD_DIR},${CT_PREFIX_DIR},${CT_INSTALL_DIR}" in
yann@1
   143
    *" "*) CT_Abort "Don't use spaces in paths, it breaks things.";;
yann@1
   144
esac
yann@1
   145
yann@85
   146
# Check now if we can write to the destination directory:
yann@85
   147
if [ -d "${CT_INSTALL_DIR}" ]; then
yann@523
   148
    CT_TestAndAbort "Destination directory '${CT_INSTALL_DIR}' is not removable" ! -w $(dirname "${CT_INSTALL_DIR}")
yann@85
   149
fi
yann@85
   150
yann@96
   151
# Good, now grab a bit of informations on the system we're being run on,
yann@96
   152
# just in case something goes awok, and it's not our fault:
yann@523
   153
CT_SYS_USER=$(id -un)
yann@523
   154
CT_SYS_HOSTNAME=$(hostname -f 2>/dev/null || true)
yann@96
   155
# Hmmm. Some non-DHCP-enabled machines do not have an FQDN... Fall back to node name.
yann@523
   156
CT_SYS_HOSTNAME="${CT_SYS_HOSTNAME:-$(uname -n)}"
yann@523
   157
CT_SYS_KERNEL=$(uname -s)
yann@523
   158
CT_SYS_REVISION=$(uname -r)
yann@96
   159
# MacOS X lacks '-o' :
yann@523
   160
CT_SYS_OS=$(uname -o || echo "Unknown (maybe MacOS-X)")
yann@523
   161
CT_SYS_MACHINE=$(uname -m)
yann@523
   162
CT_SYS_PROCESSOR=$(uname -p)
yann@523
   163
CT_SYS_GCC=$(gcc -dumpversion)
yann@523
   164
CT_SYS_TARGET=$(CT_DoConfigGuess)
yann@96
   165
CT_TOOLCHAIN_ID="crosstool-${CT_VERSION} build ${CT_STAR_DATE_HUMAN} by ${CT_SYS_USER}@${CT_SYS_HOSTNAME}"
yann@96
   166
yann@96
   167
CT_DoLog EXTRA "Preparing working directories"
yann@96
   168
yann@121
   169
# Ah! The build directory shall be eradicated, even if we restart!
yann@85
   170
if [ -d "${CT_BUILD_DIR}" ]; then
yann@1138
   171
    CT_DoForceRmdir "${CT_BUILD_DIR}"
yann@85
   172
fi
yann@121
   173
yann@121
   174
# Don't eradicate directories if we need to restart
yann@121
   175
if [ -z "${CT_RESTART}" ]; then
yann@121
   176
    # Get rid of pre-existing installed toolchain and previous build directories.
yann@121
   177
    # We need to do that _before_ we can safely log, because the log file will
yann@121
   178
    # most probably be in the toolchain directory.
yann@121
   179
    if [ "${CT_FORCE_DOWNLOAD}" = "y" -a -d "${CT_TARBALLS_DIR}" ]; then
yann@1138
   180
        CT_DoForceRmdir "${CT_TARBALLS_DIR}"
yann@121
   181
    fi
yann@121
   182
    if [ "${CT_FORCE_EXTRACT}" = "y" -a -d "${CT_SRC_DIR}" ]; then
yann@1138
   183
        CT_DoForceRmdir "${CT_SRC_DIR}"
yann@121
   184
    fi
yann@121
   185
    if [ -d "${CT_INSTALL_DIR}" ]; then
yann@1138
   186
        CT_DoForceRmdir "${CT_INSTALL_DIR}"
yann@121
   187
    fi
yann@121
   188
    # In case we start anew, get rid of the previously saved state directory
yann@121
   189
    if [ -d "${CT_STATE_DIR}" ]; then
yann@1138
   190
        CT_DoForceRmdir "${CT_STATE_DIR}"
yann@121
   191
    fi
yann@96
   192
fi
yann@85
   193
yann@121
   194
# Create the directories we'll use, even if restarting: it does no harm to
yann@121
   195
# create already existent directories, and CT_BUILD_DIR needs to be created
yann@121
   196
# anyway
yann@1135
   197
CT_DoExecLog ALL mkdir -p "${CT_TARBALLS_DIR}"
yann@1135
   198
CT_DoExecLog ALL mkdir -p "${CT_SRC_DIR}"
yann@1135
   199
CT_DoExecLog ALL mkdir -p "${CT_BUILD_DIR}"
yann@1272
   200
CT_DoExecLog ALL mkdir -p "${CT_CONFIG_DIR}"
yann@1135
   201
CT_DoExecLog ALL mkdir -p "${CT_INSTALL_DIR}"
yann@1135
   202
CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}"
yann@1135
   203
CT_DoExecLog ALL mkdir -p "${CT_CC_CORE_STATIC_PREFIX_DIR}"
yann@1135
   204
CT_DoExecLog ALL mkdir -p "${CT_CC_CORE_SHARED_PREFIX_DIR}"
yann@1272
   205
yann@1272
   206
# Only create the state dir if asked for a restartable build
yann@1272
   207
[ -n "${CT_DEBUG_CT_SAVE_STEPS}" ] && CT_DoExecLog ALL mkdir -p "${CT_STATE_DIR}"
yann@121
   208
yann@1270
   209
# Check install file system case-sensitiveness
yann@1278
   210
CT_DoExecLog DEBUG touch "${CT_PREFIX_DIR}/foo"
yann@1270
   211
CT_TestAndAbort "Your file system in '${CT_PREFIX_DIR}' is *not* case-sensitive!" -f "${CT_PREFIX_DIR}/FOO"
yann@1278
   212
CT_DoExecLog DEBUG rm -f "${CT_PREFIX_DIR}/foo"
yann@1270
   213
yann@121
   214
# Kludge: CT_INSTALL_DIR and CT_PREFIX_DIR might have grown read-only if
yann@425
   215
# the previous build was successful. To be able to move the logfile there,
yann@121
   216
# switch them back to read/write
yann@1135
   217
CT_DoExecLog ALL chmod -R u+w "${CT_INSTALL_DIR}" "${CT_PREFIX_DIR}"
yann@85
   218
yann@63
   219
# Redirect log to the actual log file now we can
yann@63
   220
# It's quite understandable that the log file will be installed in the install
yann@63
   221
# directory, so we must first ensure it exists and is writeable (above) before
yann@63
   222
# we can log there
yann@112
   223
exec >/dev/null
yann@174
   224
case "${CT_LOG_TO_FILE}" in
yann@174
   225
    y)  CT_LOG_FILE="${CT_PREFIX_DIR}/build.log"
yann@174
   226
        cat "${tmp_log_file}" >>"${CT_LOG_FILE}"
yann@174
   227
        rm -f "${tmp_log_file}"
yann@174
   228
        exec >>"${CT_LOG_FILE}"
yann@174
   229
        ;;
yann@174
   230
    *)  rm -f "${tmp_log_file}"
yann@174
   231
        ;;
yann@63
   232
esac
yann@63
   233
yann@397
   234
# Setting up the rest of the environment only if not restarting
yann@121
   235
if [ -z "${CT_RESTART}" ]; then
yann@1041
   236
    # What's our shell?
yann@1041
   237
    # Will be plain /bin/sh on most systems, except if we have /bin/ash and we
yann@1041
   238
    # _explictly_ required using it
yann@1041
   239
    CT_SHELL="/bin/sh"
yann@1041
   240
    [ "${CT_CONFIG_SHELL_ASH}" = "y" -a -x "/bin/ash" ] && CT_SHELL="/bin/ash"
yann@63
   241
yann@121
   242
    # Arrange paths depending on wether we use sys-root or not.
yann@121
   243
    if [ "${CT_USE_SYSROOT}" = "y" ]; then
yann@1219
   244
        CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/${CT_SYSROOT_DIR_PREFIX}/sys-root"
yann@1219
   245
        CT_DEBUGROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/${CT_SYSROOT_DIR_PREFIX}/debug-root"
yann@121
   246
        CT_HEADERS_DIR="${CT_SYSROOT_DIR}/usr/include"
yann@121
   247
        BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
yann@121
   248
        CC_CORE_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
yann@121
   249
        CC_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
yann@121
   250
        LIBC_SYSROOT_ARG=""
yann@121
   251
        # glibc's prefix must be exactly /usr, else --with-sysroot'd gcc will get
yann@121
   252
        # confused when $sysroot/usr/include is not present.
yann@121
   253
        # Note: --prefix=/usr is magic!
yann@121
   254
        # See http://www.gnu.org/software/libc/FAQ.html#s-2.2
yann@121
   255
    else
yann@121
   256
        # plain old way. All libraries in prefix/target/lib
yann@121
   257
        CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}"
yann@121
   258
        CT_HEADERS_DIR="${CT_SYSROOT_DIR}/include"
yann@121
   259
        # hack!  Always use --with-sysroot for binutils.
yann@121
   260
        # binutils 2.14 and later obey it, older binutils ignore it.
yann@121
   261
        # Lets you build a working 32->64 bit cross gcc
yann@121
   262
        BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}"
yann@121
   263
        # Use --with-headers, else final gcc will define disable_glibc while
yann@121
   264
        # building libgcc, and you'll have no profiling
yann@121
   265
        CC_CORE_SYSROOT_ARG="--without-headers"
yann@121
   266
        CC_SYSROOT_ARG="--with-headers=${CT_HEADERS_DIR}"
yann@121
   267
        LIBC_SYSROOT_ARG="prefix="
yann@121
   268
    fi
yann@1219
   269
    CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}"
yann@1219
   270
    CT_DoExecLog ALL mkdir -p "${CT_DEBUGROOT_DIR}"
yann@121
   271
yann@121
   272
    # Prepare the 'lib' directories in sysroot, else the ../lib64 hack used by
yann@1180
   273
    # 32 -> 64 bit crosscompilers won't work, and build of final gcc will fail
yann@1180
   274
    # with: "ld: cannot open crti.o: No such file or directory"
yann@1180
   275
    # Also prepare the lib directory in the install dir, else some 64 bit archs
yann@1180
   276
    # won't build
yann@1180
   277
    CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/lib"
yann@1135
   278
    CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/lib"
yann@1135
   279
    CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/lib"
yann@121
   280
yann@740
   281
    # Prevent gcc from installing its libraries outside of the sys-root
yann@1219
   282
    CT_DoExecLog ALL ln -sf "./${CT_SYSROOT_DIR_PREFIX}/sys-root/lib" "${CT_PREFIX_DIR}/${CT_TARGET}/lib"
yann@740
   283
yann@740
   284
    # Now, in case we're 64 bits, just have lib64/ be a symlink to lib/
yann@740
   285
    # so as to have all libraries in the same directory (we can do that
yann@740
   286
    # because we are *not* multilib).
yann@1038
   287
    if [ "${CT_ARCH_64}" = "y" ]; then
yann@1180
   288
        CT_DoExecLog ALL ln -sf "lib" "${CT_PREFIX_DIR}/lib64"
yann@1135
   289
        CT_DoExecLog ALL ln -sf "lib" "${CT_SYSROOT_DIR}/lib64"
yann@1135
   290
        CT_DoExecLog ALL ln -sf "lib" "${CT_SYSROOT_DIR}/usr/lib64"
yann@1219
   291
        CT_DoExecLog ALL ln -sf "lib" "${CT_PREFIX_DIR}/${CT_TARGET}/lib64"
yann@1038
   292
    fi
yann@740
   293
yann@1041
   294
    # Determine build system if not set by the user
yann@1041
   295
    CT_Test "You did not specify the build system. That's OK, I can guess..." -z "${CT_BUILD}"
yann@1041
   296
    case "${CT_BUILD}" in
yann@1082
   297
        "") CT_BUILD=$("${CT_BUILD_PREFIX}gcc${CT_BUILD_SUFFIX}" -dumpmachine);;
yann@121
   298
    esac
yann@121
   299
yann@1083
   300
    # Prepare mangling patterns to later modify BUILD and HOST (see below)
yann@1041
   301
    case "${CT_TOOLCHAIN_TYPE}" in
yann@1041
   302
        cross)
yann@1041
   303
            CT_HOST="${CT_BUILD}"
yann@1041
   304
            build_mangle="build_"
yann@1041
   305
            host_mangle="build_"
yann@1041
   306
            ;;
yann@1041
   307
        *)  CT_Abort "No code for '${CT_TOOLCHAIN_TYPE}' toolchain type!"
yann@1041
   308
            ;;
yann@1041
   309
    esac
yann@1033
   310
yann@1041
   311
    # Save the real tuples to generate shell-wrappers to the real tools
yann@1041
   312
    CT_REAL_BUILD="${CT_BUILD}"
yann@1041
   313
    CT_REAL_HOST="${CT_HOST}"
yann@1041
   314
yann@1082
   315
    # Canonicalise CT_BUILD and CT_HOST
yann@1082
   316
    # Not only will it give us full-qualified tuples, but it will also ensure
yann@1082
   317
    # that they are valid tuples (in case of typo with user-provided tuples)
yann@1082
   318
    # That's way better than trying to rewrite config.sub ourselves...
yann@1089
   319
    CT_BUILD=$(CT_DoConfigSub "${CT_BUILD}")
yann@1089
   320
    CT_HOST=$(CT_DoConfigSub "${CT_HOST}")
yann@1041
   321
yann@1041
   322
    # Modify BUILD and HOST so that gcc always generate a cross-compiler
yann@1041
   323
    # even if any of the build, host or target machines are the same.
yann@1041
   324
    # NOTE: we'll have to mangle the (BUILD|HOST)->TARGET x-compiler to
yann@1041
   325
    #       support canadain build, later...
yann@1041
   326
    CT_BUILD="${CT_BUILD/-/-${build_mangle}}"
yann@1041
   327
    CT_HOST="${CT_HOST/-/-${host_mangle}}"
yann@1041
   328
yann@1041
   329
    # Now we have mangled our BUILD and HOST tuples, we must fake the new
yann@1041
   330
    # cross-tools for those mangled tuples.
yann@174
   331
    CT_DoLog DEBUG "Making build system tools available"
yann@1135
   332
    CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/bin"
yann@1041
   333
    for m in BUILD HOST; do
yann@1041
   334
        r="CT_REAL_${m}"
yann@1041
   335
        v="CT_${m}"
yann@1041
   336
        p="CT_${m}_PREFIX"
yann@1041
   337
        s="CT_${m}_SUFFIX"
yann@1041
   338
        if [ -n "${!p}" ]; then
yann@1041
   339
            t="${!p}"
yann@1041
   340
        else
yann@1041
   341
            t="${!r}-"
yann@1041
   342
        fi
yann@1041
   343
yann@1129
   344
        for tool in ar as dlltool gcc g++ gcj gnatbind gnatmake ld nm objcopy objdump ranlib strip windres; do
yann@1041
   345
            # First try with prefix + suffix
yann@1041
   346
            # Then try with prefix only
yann@1041
   347
            # Then try with suffix only, but only for BUILD, and HOST iff REAL_BUILD == REAL_HOST
yann@1041
   348
            # Finally try with neither prefix nor suffix, but only for BUILD, and HOST iff REAL_BUILD == REAL_HOST
yann@1041
   349
            # This is needed, because some tools have a prefix and
yann@1041
   350
            # a suffix (eg. gcc), while others may have only one,
yann@1041
   351
            # or even none (eg. binutils)
yann@1041
   352
            where=$(CT_Which "${t}${tool}${!s}")
yann@1041
   353
            [ -z "${where}" ] && where=$(CT_Which "${t}${tool}")
yann@1041
   354
            if [    -z "${where}"                         \
yann@1041
   355
                 -a \(    "${m}" = "BUILD"                \
yann@1041
   356
                       -o "${CT_REAL_BUILD}" = "${!r}" \) ]; then
yann@1041
   357
                where=$(CT_Which "${tool}${!s}")
yann@1041
   358
            fi
yann@1041
   359
            if [ -z "${where}"                            \
yann@1041
   360
                 -a \(    "${m}" = "BUILD"                \
yann@1041
   361
                       -o "${CT_REAL_BUILD}" = "${!r}" \) ]; then
yann@1041
   362
                where=$(CT_Which "${tool}")
yann@1041
   363
            fi
yann@1041
   364
yann@1041
   365
            # Not all tools are available for all platforms, but some are really,
yann@1041
   366
            # bally needed
yann@1041
   367
            if [ -n "${where}" ]; then
yann@1041
   368
                CT_DoLog DEBUG "  '${!v}-${tool}' -> '${where}'"
yann@1041
   369
                printf "#${BANG}${CT_SHELL}\nexec '${where}' \"\${@}\"\n" >"${CT_PREFIX_DIR}/bin/${!v}-${tool}"
yann@1135
   370
                CT_DoExecLog ALL chmod 700 "${CT_PREFIX_DIR}/bin/${!v}-${tool}"
yann@1041
   371
            else
yann@1041
   372
                case "${tool}" in
yann@1176
   373
                    # We'll at least need some of them...
yann@1041
   374
                    ar|as|gcc|ld|nm|objcopy|objdump|ranlib)
yann@1041
   375
                        CT_Abort "Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : either needed!"
yann@1041
   376
                        ;;
yann@1176
   377
                    # Some are conditionnally required
yann@1176
   378
                    # Add them in alphabetical (C locale) ordering
yann@1176
   379
                    gcj)
yann@1176
   380
                        CT_TestAndAbort "Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : either needed!" "${CT_CC_LANG_JAVA}" = "y"
yann@1176
   381
                        ;;
yann@1176
   382
                    # If any other is missing, only warn at low level
yann@1041
   383
                    *)
yann@1041
   384
                        # It does not deserve a WARN level.
yann@1041
   385
                        CT_DoLog DEBUG "  Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : not required."
yann@1041
   386
                        ;;
yann@1041
   387
                esac
yann@1041
   388
            fi
yann@1041
   389
        done
yann@121
   390
    done
yann@121
   391
yann@1041
   392
    # Carefully add paths in the order we want them:
yann@1041
   393
    #  - first try in ${CT_PREFIX_DIR}/bin
yann@1041
   394
    #  - then try in ${CT_CC_CORE_SHARED_PREFIX_DIR}/bin
yann@1041
   395
    #  - then try in ${CT_CC_CORE_STATIC_PREFIX_DIR}/bin
yann@1041
   396
    #  - fall back to searching user's PATH
yann@1041
   397
    # Of course, neither cross-native nor canadian can run on BUILD,
yann@1041
   398
    # so don't add those PATHs in this case...
yann@1041
   399
    case "${CT_TOOLCHAIN_TYPE}" in
yann@1041
   400
        cross)  export PATH="${CT_PREFIX_DIR}/bin:${CT_CC_CORE_SHARED_PREFIX_DIR}/bin:${CT_CC_CORE_STATIC_PREFIX_DIR}/bin:${PATH}";;
yann@1041
   401
        *)  ;;
yann@1041
   402
    esac
yann@1041
   403
yann@564
   404
    # Some makeinfo versions are a pain in [put your most sensible body part here].
yann@564
   405
    # Go ahead with those, by creating a wrapper that keeps partial files, and that
yann@564
   406
    # never fails:
yann@1135
   407
    CT_DoLog DEBUG "  'makeinfo' -> '$(CT_Which makeinfo)'"
yann@1083
   408
    printf "#${BANG}/bin/sh\n$(CT_Which makeinfo) --force \"\${@}\"\ntrue\n" >"${CT_PREFIX_DIR}/bin/makeinfo"
yann@1135
   409
    CT_DoExecLog ALL chmod 700 "${CT_PREFIX_DIR}/bin/makeinfo"
yann@564
   410
yann@121
   411
    # Help gcc
yann@121
   412
    CT_CFLAGS_FOR_HOST=
yann@121
   413
    [ "${CT_USE_PIPES}" = "y" ] && CT_CFLAGS_FOR_HOST="${CT_CFLAGS_FOR_HOST} -pipe"
yann@121
   414
yann@333
   415
    # Override the configured jobs with what's been given on the command line
yann@333
   416
    [ -n "${CT_JOBS}" ] && CT_PARALLEL_JOBS="${CT_JOBS}"
yann@333
   417
yann@1033
   418
    # Set the shell to be used by ./configure scripts and by Makefiles (those
yann@1033
   419
    # that support it!).
yann@1033
   420
    export CONFIG_SHELL="${CT_SHELL}"
yann@805
   421
yann@121
   422
    # And help make go faster
yann@121
   423
    PARALLELMFLAGS=
yann@121
   424
    [ ${CT_PARALLEL_JOBS} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -j${CT_PARALLEL_JOBS}"
yann@121
   425
    [ ${CT_LOAD} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -l${CT_LOAD}"
yann@568
   426
    export PARALLELMFLAGS
yann@121
   427
yann@894
   428
    CT_DoLog EXTRA "Installing user-supplied crosstool-NG configuration"
yann@1098
   429
    CT_DoExecLog DEBUG install -m 0755 "${CT_LIB_DIR}/scripts/toolchain-config.in" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config"
yann@1189
   430
    CT_DoExecLog DEBUG sed -r -i -e 's,@@grep@@,"'"${grep}"'",;' "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config"
yann@909
   431
    bzip2 -c -9 .config >>"${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config"
yann@894
   432
yann@121
   433
    CT_DoStep EXTRA "Dumping internal crosstool-NG configuration"
yann@121
   434
    CT_DoLog EXTRA "Building a toolchain for:"
yann@1041
   435
    CT_DoLog EXTRA "  build  = ${CT_REAL_BUILD}"
yann@1041
   436
    CT_DoLog EXTRA "  host   = ${CT_REAL_HOST}"
yann@121
   437
    CT_DoLog EXTRA "  target = ${CT_TARGET}"
yann@1247
   438
    set |grep -E '^CT_.+=' |sort |CT_DoLog DEBUG
yann@121
   439
    CT_EndStep
yann@63
   440
fi
yann@63
   441
yann@121
   442
if [ -z "${CT_RESTART}" ]; then
yann@121
   443
    CT_DoStep INFO "Retrieving needed toolchain components' tarballs"
yann@121
   444
    do_kernel_get
yann@466
   445
    do_gmp_get
yann@466
   446
    do_mpfr_get
yann@121
   447
    do_binutils_get
yann@331
   448
    do_cc_get
yann@121
   449
    do_libc_get
yann@148
   450
    do_tools_get
yann@121
   451
    do_debug_get
yann@63
   452
    CT_EndStep
yann@63
   453
yann@121
   454
    if [ "${CT_ONLY_DOWNLOAD}" != "y" ]; then
yann@121
   455
        if [ "${CT_FORCE_EXTRACT}" = "y" ]; then
yann@1138
   456
            CT_DoForceRmdir "${CT_SRC_DIR}"
yann@1135
   457
            CT_DoExecLog ALL mkdir -p "${CT_SRC_DIR}"
yann@121
   458
        fi
yann@121
   459
        CT_DoStep INFO "Extracting and patching toolchain components"
yann@121
   460
        do_kernel_extract
yann@466
   461
        do_gmp_extract
yann@466
   462
        do_mpfr_extract
yann@121
   463
        do_binutils_extract
yann@331
   464
        do_cc_extract
yann@121
   465
        do_libc_extract
yann@148
   466
        do_tools_extract
yann@121
   467
        do_debug_extract
yann@121
   468
        CT_EndStep
yann@121
   469
    fi
yann@121
   470
fi
yann@85
   471
yann@121
   472
# Now for the job by itself. Go have a coffee!
yann@121
   473
if [ "${CT_ONLY_DOWNLOAD}" != "y" -a "${CT_ONLY_EXTRACT}" != "y" ]; then
yann@121
   474
    # Because of CT_RESTART, this becomes quite complex
yann@143
   475
    do_stop=0
yann@143
   476
    prev_step=
yann@121
   477
    [ -n "${CT_RESTART}" ] && do_it=0 || do_it=1
yann@466
   478
    # Aha! CT_STEPS comes from steps.mk!
yann@461
   479
    for step in ${CT_STEPS}; do
yann@121
   480
        if [ ${do_it} -eq 0 ]; then
yann@121
   481
            if [ "${CT_RESTART}" = "${step}" ]; then
yann@121
   482
                CT_DoLoadState "${step}"
yann@121
   483
                do_it=1
yann@143
   484
                do_stop=0
yann@121
   485
            fi
yann@121
   486
        else
yann@121
   487
            CT_DoSaveState ${step}
yann@143
   488
            if [ ${do_stop} -eq 1 ]; then
yann@523
   489
                CT_DoLog ERROR "Stopping just after step '${prev_step}', as requested."
yann@143
   490
                exit 0
yann@143
   491
            fi
yann@85
   492
        fi
yann@121
   493
        if [ ${do_it} -eq 1 ]; then
yann@121
   494
            do_${step}
yann@135
   495
            if [ "${CT_STOP}" = "${step}" ]; then
yann@143
   496
                do_stop=1
yann@135
   497
            fi
yann@725
   498
            if [ "${CT_DEBUG_PAUSE_STEPS}" = "y" ]; then
yann@523
   499
                CT_DoPause "Step '${step}' finished"
yann@121
   500
            fi
yann@121
   501
        fi
yann@143
   502
        prev_step="${step}"
yann@121
   503
    done
yann@63
   504
fi
yann@1
   505
yann@96
   506
CT_DoEnd INFO
yann@96
   507
yann@1135
   508
# From now-on, it can become impossible to log any time, because
yann@1135
   509
# either we're compressing the log file, or it can become RO any
yann@1135
   510
# moment... Consign all ouptut to oblivion...
yann@1135
   511
CT_DoLog INFO "Finishing installation (may take a few seconds)..."
yann@1135
   512
exec >/dev/null 2>&1
yann@174
   513
yann@1135
   514
[ "${CT_LOG_FILE_COMPRESS}" = y ] && bzip2 -9 "${CT_LOG_FILE}"
yann@1135
   515
[ "${CT_INSTALL_DIR_RO}" = "y"  ] && chmod -R a-w "${CT_INSTALL_DIR}"
yann@1
   516
yann@1
   517
trap - EXIT