scripts/crosstool-NG.sh.in
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Mon Mar 29 00:15:32 2010 +0200 (2010-03-29)
changeset 1864 758d5137fe87
parent 1814 10579a8e9141
child 1893 f5dab3c43abf
permissions -rw-r--r--
scripts/populate: optimise search loop

Curently, populate will iterate over all ELF (shared objects|executables)
to look for missing NEEDED DSOs, adding to the list at every iterations
of the search loop.

Instead of looking again at previously handled ELF files, recursively
resolve every ELf files.

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