yann@1156: #!@@CT_bash@@ yann@1: # Copyright 2007 Yann E. MORIN yann@1: # Licensed under the GPL v2. See COPYING in the root of this package. yann@1: yann@1: # This is the main entry point to crosstool yann@1: # This will: yann@1: # - download, extract and patch the toolchain components yann@1: # - build and install each components in turn yann@1: # - and eventually test the resulting toolchain yann@1: yann@1: # What this file does is prepare the environment, based upon the user-choosen yann@1: # options. It also checks the existing environment for un-friendly variables, yann@96: # and builds the tools. yann@1: yann@1: # Parse the common functions yann@501: # Note: some initialisation and sanitizing is done while parsing this file, yann@501: # most notably: yann@501: # - set trap handler on errors, yann@501: # - don't hash commands lookups, yann@501: # - initialise logging. yann@182: . "${CT_LIB_DIR}/scripts/functions" yann@1: yann@1: # Parse the configuration file yann@96: # It has some info about the logging facility, so include it early yann@2468: . .config.2 yann@1156: # Yes! We can do full logging from now on! yann@1: yann@3083: # If we want an interactive debug-shell, we must ensure these FDs yann@3083: # are indeed connected to a terminal (and not redirected in any way). yann@3083: if [ "${CT_DEBUG_INTERACTIVE}" = "y" -a ! \( -t 0 -a -t 6 -a -t 2 \) ]; then yann@3083: CT_DoLog ERROR "Can't spawn interactive debug-shell," yann@3083: CT_DoLog ERROR "because stdout/stderr has been redirected." yann@3083: exit 1 yann@3083: fi yann@3083: antony@2564: # Override the locale early, in case we ever translate crosstool-NG messages yann@2171: if [ -z "${CT_NO_OVERIDE_LC_MESSAGES}" ]; then yann@2171: export LC_ALL=C yann@2171: export LANG=C yann@2171: fi yann@1064: js@2044: # remove . from PATH since it can cause gcc build failures js@2044: CT_SanitizePath js@2044: yann@1416: # Some sanity checks in the environment and needed tools yann@1416: CT_DoLog INFO "Performing some trivial sanity checks" yann@1416: CT_TestAndAbort "Don't set LD_LIBRARY_PATH. It screws up the build." -n "${LD_LIBRARY_PATH}" yann@3063: CT_TestAndAbort "Don't set LIBRARY_PATH. It screws up the build." -n "${LIBRARY_PATH}" yann@3063: CT_TestAndAbort "Don't set LPATH. It screws up the build." -n "${LPATH}" yann@1416: CT_TestAndAbort "Don't set CFLAGS. It screws up the build." -n "${CFLAGS}" yann@1416: CT_TestAndAbort "Don't set CXXFLAGS. It screws up the build." -n "${CXXFLAGS}" yann@1416: CT_Test "GREP_OPTIONS screws up the build. Resetting." -n "${GREP_OPTIONS}" yann@1416: export GREP_OPTIONS= yann@2801: # Workaround against openSUSE 12.1 that breaks ./configure for cross-compilation: yann@2801: export CONFIG_SITE= yann@1416: yann@1416: # Some sanity checks on paths content yann@1416: for d in \ yann@1416: LOCAL_TARBALLS \ yann@1416: WORK \ yann@1416: PREFIX \ yann@1416: INSTALL \ yann@1416: ; do yann@1416: eval dir="\${CT_${d}_DIR}" yann@1416: case "${dir}" in yann@1416: *" "*) yann@1416: CT_Abort "'CT_${d}_DIR'='${dir}' contains a space in it.\nDon't use spaces in paths, it breaks things." yann@1416: ;; daniel@3129: *:*) daniel@3129: CT_Abort "'CT_${d}_DIR'='${dir}' contains a colon in it.\nDon't use colons in paths, it breaks things." daniel@3129: ;; yann@1416: esac yann@1416: done yann@1416: yann@1156: # Where will we work? yann@3081: CT_WORK_DIR="${CT_WORK_DIR:-${CT_TOP_DIR}/.build}" yann@1270: CT_DoExecLog ALL mkdir -p "${CT_WORK_DIR}" js@3082: CT_DoExecLog DEBUG rm -f "${CT_WORK_DIR}/backtrace" yann@1270: yann@1270: # Check build file system case-sensitiveness yann@1278: CT_DoExecLog DEBUG touch "${CT_WORK_DIR}/foo" yann@1270: CT_TestAndAbort "Your file system in '${CT_WORK_DIR}' is *not* case-sensitive!" -f "${CT_WORK_DIR}/FOO" yann@1278: CT_DoExecLog DEBUG rm -f "${CT_WORK_DIR}/foo" yann@1156: yann@1444: # Check the user is using an existing SHELL to be used by ./configure and Makefiles yann@2705: CT_TestOrAbort "The CONFIG_SHELL '${CT_CONFIG_SHELL}' is not valid" -f "${CT_CONFIG_SHELL}" -a -x "${CT_CONFIG_SHELL}" yann@1421: antony@2564: # Create the bin-override early yann@1219: # Contains symlinks to the tools found by ./configure yann@1156: # Note: CT_DoLog and CT_DoExecLog do not use any of those tool, so yann@1156: # they can be safely used richard@1726: CT_TOOLS_OVERIDE_DIR="${CT_WORK_DIR}/tools" antony@2564: CT_DoLog DEBUG "Creating bin-override for tools in '${CT_TOOLS_OVERIDE_DIR}'" richard@1726: CT_DoExecLog DEBUG mkdir -p "${CT_TOOLS_OVERIDE_DIR}/bin" yann@2838: cat "${CT_LIB_DIR}/paths.sh" |while read trash line; do yann@1156: tool="${line%%=*}" yann@1156: path="${line#*=}" yann@1517: CT_DoLog DEBUG "Creating script-override for '${tool}' -> '${path}'" yann@2838: # Note: we need to supress the " in the path because yann@2838: # there can be arguments in there (thanks autostuff...) yann@2838: printf "#${BANG}${CT_CONFIG_SHELL}\nexec ${path//\"/} \"\${@}\"\n" >"${CT_TOOLS_OVERIDE_DIR}/bin/${tool}" richard@1726: CT_DoExecLog ALL chmod 700 "${CT_TOOLS_OVERIDE_DIR}/bin/${tool}" yann@1156: done richard@1726: export PATH="${CT_TOOLS_OVERIDE_DIR}/bin:${PATH}" yann@1156: yann@1064: # Start date. Can't be done until we know the locale yann@1416: # Also requires the bin-override tools yann@1064: CT_STAR_DATE=$(CT_DoDate +%s%N) yann@1064: CT_STAR_DATE_HUMAN=$(CT_DoDate +%Y%m%d.%H%M%S) yann@1064: yann@1156: # Log real begining of build, now yann@379: CT_DoLog INFO "Build started ${CT_STAR_DATE_HUMAN}" yann@379: yann@2468: # We really need to extract from ,config and not .config.2, as we yann@2468: # do want the kconfig's values, not our mangled config with arrays. yann@894: CT_DoStep DEBUG "Dumping user-supplied crosstool-NG configuration" yann@1247: CT_DoExecLog DEBUG grep -E '^(# |)CT_' .config yann@96: CT_EndStep yann@63: yann@290: CT_DoLog DEBUG "Unsetting and unexporting MAKEFLAGS" yann@290: unset MAKEFLAGS yann@290: export MAKEFLAGS yann@290: yann@1: CT_DoLog INFO "Building environment variables" yann@1: yann@965: # Include sub-scripts instead of calling them: that way, we do not have to yann@965: # export any variable, nor re-parse the configuration and functions files. yann@1225: . "${CT_LIB_DIR}/scripts/build/internals.sh" yann@903: . "${CT_LIB_DIR}/scripts/build/arch/${CT_ARCH}.sh" richard@1727: . "${CT_LIB_DIR}/scripts/build/companion_tools.sh" yann@965: . "${CT_LIB_DIR}/scripts/build/kernel/${CT_KERNEL}.sh" yann@1318: . "${CT_LIB_DIR}/scripts/build/companion_libs/gmp.sh" yann@1318: . "${CT_LIB_DIR}/scripts/build/companion_libs/mpfr.sh" yann@1324: . "${CT_LIB_DIR}/scripts/build/companion_libs/ppl.sh" yann@1380: . "${CT_LIB_DIR}/scripts/build/companion_libs/cloog.sh" yann@1384: . "${CT_LIB_DIR}/scripts/build/companion_libs/mpc.sh" yann@1811: . "${CT_LIB_DIR}/scripts/build/companion_libs/libelf.sh" yann@1345: . "${CT_LIB_DIR}/scripts/build/binutils/binutils.sh" yann@1345: . "${CT_LIB_DIR}/scripts/build/binutils/elf2flt.sh" yann@1854: . "${CT_LIB_DIR}/scripts/build/binutils/sstrip.sh" yann@965: . "${CT_LIB_DIR}/scripts/build/libc/${CT_LIBC}.sh" yann@965: . "${CT_LIB_DIR}/scripts/build/cc/${CT_CC}.sh" yann@965: . "${CT_LIB_DIR}/scripts/build/debug.sh" mgl@1965: . "${CT_LIB_DIR}/scripts/build/test_suite.sh" yann@380: yann@335: # Target tuple: CT_TARGET needs a little love: yann@335: CT_DoBuildTargetTuple yann@1: yann@96: # Kludge: If any of the configured options needs CT_TARGET, yann@96: # then rescan the options file now: yann@2468: . .config.2 yann@96: yann@1663: # Sanity check some directories yann@1663: CT_TestAndAbort "'CT_PREFIX_DIR' is not set: where should I install?" -z "${CT_PREFIX_DIR}" yann@1663: yann@397: # Second kludge: merge user-supplied target CFLAGS with architecture-provided yann@531: # target CFLAGS. Do the same for LDFLAGS in case it happens in the future. yann@531: # Put user-supplied flags at the end, so that they take precedence. yann@397: CT_TARGET_CFLAGS="${CT_ARCH_TARGET_CFLAGS} ${CT_TARGET_CFLAGS}" yann@531: CT_TARGET_LDFLAGS="${CT_ARCH_TARGET_LDFLAGS} ${CT_TARGET_LDFLAGS}" yann@2467: CT_CC_CORE_EXTRA_CONFIG_ARRAY=( ${CT_ARCH_CC_CORE_EXTRA_CONFIG} "${CT_CC_CORE_EXTRA_CONFIG_ARRAY[@]}" ) yann@2467: CT_CC_EXTRA_CONFIG_ARRAY=( ${CT_ARCH_CC_EXTRA_CONFIG} "${CT_CC_EXTRA_CONFIG_ARRAY[@]}" ) yann@397: benoit@2503: # Compute the package version string benoit@2503: CT_PKGVERSION="crosstool-NG ${CT_VERSION}${CT_TOOLCHAIN_PKGVERSION:+ - ${CT_TOOLCHAIN_PKGVERSION}}" benoit@2503: yann@1416: # Compute the working directories names yann@610: CT_TARBALLS_DIR="${CT_WORK_DIR}/tarballs" yann@610: CT_SRC_DIR="${CT_WORK_DIR}/src" yann@610: CT_BUILD_DIR="${CT_WORK_DIR}/${CT_TARGET}/build" yann@2308: CT_BUILDTOOLS_PREFIX_DIR="${CT_WORK_DIR}/${CT_TARGET}/buildtools" yann@1272: CT_STATE_DIR="${CT_WORK_DIR}/${CT_TARGET}/state" yann@1272: CT_CONFIG_DIR="${CT_BUILD_DIR}/configs" yann@2931: # Note about HOST_COMPLIBS_DIR: it's always gonna be in the buildtools dir, or a yann@2931: # sub-dir. So we won't have to save/restore it, not even create it. yann@2931: # In case of cross or native, host-complibs are used for build-complibs; yann@2931: # in case of canadian or cross-native, host-complibs are specific yann@2931: case "${CT_TOOLCHAIN_TYPE}" in yann@2931: native|cross) yann@2931: CT_HOST_COMPLIBS_DIR="${CT_BUILDTOOLS_PREFIX_DIR}" yann@2931: ;; yann@2931: canadian|cross-native) yann@2931: CT_HOST_COMPLIBS_DIR="${CT_BUILDTOOLS_PREFIX_DIR}/complibs-host" yann@2931: ;; yann@2931: esac yann@1272: mgl@1965: # Compute test suite install directory mgl@1965: CT_TEST_SUITE_DIR=${CT_INSTALL_DIR}/test-suite mgl@1965: yann@143: # We must ensure that we can restart if asked for! yann@143: if [ -n "${CT_RESTART}" -a ! -d "${CT_STATE_DIR}" ]; then yann@143: CT_DoLog ERROR "You asked to restart a non-restartable build" yann@143: CT_DoLog ERROR "This happened because you didn't set CT_DEBUG_CT_SAVE_STEPS" yann@153: CT_DoLog ERROR "in the config options for the previous build, or the state" yann@425: CT_DoLog ERROR "directory for the previous build was deleted." yann@143: CT_Abort "I will stop here to avoid any carnage" yann@143: fi yann@143: yann@403: # If the local tarball directory does not exist, say so, and don't try to save there! yann@1662: if [ "${CT_SAVE_TARBALLS}" = "y" \ yann@1662: -a ! -d "${CT_LOCAL_TARBALLS_DIR}" ]; then yann@1662: CT_DoLog WARN "Directory '${CT_LOCAL_TARBALLS_DIR}' does not exist." yann@1662: CT_DoLog WARN "Will not save downloaded tarballs to local storage." yann@523: CT_SAVE_TARBALLS= yann@403: fi yann@403: yann@85: # Check now if we can write to the destination directory: yann@85: if [ -d "${CT_INSTALL_DIR}" ]; then yann@523: CT_TestAndAbort "Destination directory '${CT_INSTALL_DIR}' is not removable" ! -w $(dirname "${CT_INSTALL_DIR}") yann@85: fi yann@85: yann@96: # Good, now grab a bit of informations on the system we're being run on, yann@96: # just in case something goes awok, and it's not our fault: yann@523: CT_SYS_USER=$(id -un) yann@523: CT_SYS_HOSTNAME=$(hostname -f 2>/dev/null || true) yann@96: # Hmmm. Some non-DHCP-enabled machines do not have an FQDN... Fall back to node name. yann@523: CT_SYS_HOSTNAME="${CT_SYS_HOSTNAME:-$(uname -n)}" yann@523: CT_SYS_KERNEL=$(uname -s) yann@523: CT_SYS_REVISION=$(uname -r) titus@1954: CT_SYS_OS=$(uname -s) yann@523: CT_SYS_MACHINE=$(uname -m) yann@523: CT_SYS_PROCESSOR=$(uname -p) yann@523: CT_SYS_GCC=$(gcc -dumpversion) yann@523: CT_SYS_TARGET=$(CT_DoConfigGuess) yann@96: CT_TOOLCHAIN_ID="crosstool-${CT_VERSION} build ${CT_STAR_DATE_HUMAN} by ${CT_SYS_USER}@${CT_SYS_HOSTNAME}" yann@96: yann@96: CT_DoLog EXTRA "Preparing working directories" yann@96: yann@121: # Ah! The build directory shall be eradicated, even if we restart! yann@2543: # Ditto for the build tools install dir yann@2543: CT_DoForceRmdir "${CT_BUILD_DIR}" "${CT_BUILDTOOLS_PREFIX_DIR}" yann@121: yann@121: # Don't eradicate directories if we need to restart yann@121: if [ -z "${CT_RESTART}" ]; then yann@121: # Get rid of pre-existing installed toolchain and previous build directories. yann@121: if [ "${CT_FORCE_DOWNLOAD}" = "y" -a -d "${CT_TARBALLS_DIR}" ]; then yann@1138: CT_DoForceRmdir "${CT_TARBALLS_DIR}" yann@121: fi yann@121: if [ "${CT_FORCE_EXTRACT}" = "y" -a -d "${CT_SRC_DIR}" ]; then yann@1138: CT_DoForceRmdir "${CT_SRC_DIR}" yann@121: fi yann@2284: if [ -d "${CT_INSTALL_DIR}" -a "${CT_RM_RF_PREFIX_DIR}" = "y" ]; then yann@1138: CT_DoForceRmdir "${CT_INSTALL_DIR}" yann@121: fi yann@121: # In case we start anew, get rid of the previously saved state directory yann@121: if [ -d "${CT_STATE_DIR}" ]; then yann@1138: CT_DoForceRmdir "${CT_STATE_DIR}" yann@121: fi yann@96: fi yann@85: yann@121: # Create the directories we'll use, even if restarting: it does no harm to yann@121: # create already existent directories, and CT_BUILD_DIR needs to be created yann@121: # anyway yann@1135: CT_DoExecLog ALL mkdir -p "${CT_TARBALLS_DIR}" yann@1135: CT_DoExecLog ALL mkdir -p "${CT_SRC_DIR}" yann@1135: CT_DoExecLog ALL mkdir -p "${CT_BUILD_DIR}" yann@2308: CT_DoExecLog ALL mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/bin" yann@1272: CT_DoExecLog ALL mkdir -p "${CT_CONFIG_DIR}" yann@1135: CT_DoExecLog ALL mkdir -p "${CT_INSTALL_DIR}" yann@1135: CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}" yann@2931: CT_DoExecLog ALL mkdir -p "${CT_HOST_COMPLIBS_DIR}" yann@1272: yann@1272: # Only create the state dir if asked for a restartable build yann@1272: [ -n "${CT_DEBUG_CT_SAVE_STEPS}" ] && CT_DoExecLog ALL mkdir -p "${CT_STATE_DIR}" yann@121: yann@1270: # Check install file system case-sensitiveness yann@1278: CT_DoExecLog DEBUG touch "${CT_PREFIX_DIR}/foo" yann@1270: CT_TestAndAbort "Your file system in '${CT_PREFIX_DIR}' is *not* case-sensitive!" -f "${CT_PREFIX_DIR}/FOO" yann@1278: CT_DoExecLog DEBUG rm -f "${CT_PREFIX_DIR}/foo" yann@1270: yann@121: # Kludge: CT_INSTALL_DIR and CT_PREFIX_DIR might have grown read-only if yann@2339: # the previous build was successful. yann@1135: CT_DoExecLog ALL chmod -R u+w "${CT_INSTALL_DIR}" "${CT_PREFIX_DIR}" yann@85: yann@397: # Setting up the rest of the environment only if not restarting yann@121: if [ -z "${CT_RESTART}" ]; then yann@2279: case "${CT_SYSROOT_NAME}" in yann@2279: "") CT_SYSROOT_NAME="sysroot";; yann@2279: .) CT_Abort "Sysroot name is set to '.' which is forbidden";; yann@2279: *' '*) CT_Abort "Sysroot name contains forbidden space(s): '${CT_SYSROOT_NAME}'";; yann@2279: */*) CT_Abort "Sysroot name contains forbidden slash(es): '${CT_SYSROOT_NAME}'";; yann@2279: esac yann@2279: yann@2279: # Arrange paths depending on wether we use sysroot or not. yann@121: if [ "${CT_USE_SYSROOT}" = "y" ]; then yann@2653: CT_SYSROOT_REL_DIR="${CT_SYSROOT_DIR_PREFIX:+${CT_SYSROOT_DIR_PREFIX}/}${CT_SYSROOT_NAME}" yann@2286: CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/${CT_SYSROOT_REL_DIR}" yann@1219: CT_DEBUGROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/${CT_SYSROOT_DIR_PREFIX}/debug-root" yann@121: CT_HEADERS_DIR="${CT_SYSROOT_DIR}/usr/include" yann@2286: CT_SanitiseVarDir CT_SYSROOT_REL_DIR CT_SYSROOT_DIR CT_DEBUGROOT_DIR CT_HEADERS_DIR yann@121: BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}" yann@121: CC_CORE_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}" yann@121: CC_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}" yann@121: LIBC_SYSROOT_ARG="" yann@121: # glibc's prefix must be exactly /usr, else --with-sysroot'd gcc will get yann@121: # confused when $sysroot/usr/include is not present. yann@121: # Note: --prefix=/usr is magic! yann@121: # See http://www.gnu.org/software/libc/FAQ.html#s-2.2 yann@121: else yann@121: # plain old way. All libraries in prefix/target/lib yann@121: CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}" yann@1419: CT_DEBUGROOT_DIR="${CT_SYSROOT_DIR}" yann@121: CT_HEADERS_DIR="${CT_SYSROOT_DIR}/include" yann@2280: CT_SanitiseVarDir CT_SYSROOT_DIR CT_DEBUGROOT_DIR CT_HEADERS_DIR yann@121: # hack! Always use --with-sysroot for binutils. yann@121: # binutils 2.14 and later obey it, older binutils ignore it. yann@121: # Lets you build a working 32->64 bit cross gcc yann@121: BINUTILS_SYSROOT_ARG="--with-sysroot=${CT_SYSROOT_DIR}" yann@121: # Use --with-headers, else final gcc will define disable_glibc while yann@121: # building libgcc, and you'll have no profiling yann@121: CC_CORE_SYSROOT_ARG="--without-headers" yann@121: CC_SYSROOT_ARG="--with-headers=${CT_HEADERS_DIR}" yann@121: LIBC_SYSROOT_ARG="prefix=" yann@121: fi yann@1219: CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}" yann@1219: CT_DoExecLog ALL mkdir -p "${CT_DEBUGROOT_DIR}" yann@121: yann@121: # Prepare the 'lib' directories in sysroot, else the ../lib64 hack used by yann@1180: # 32 -> 64 bit crosscompilers won't work, and build of final gcc will fail yann@1180: # with: "ld: cannot open crti.o: No such file or directory" yann@1180: # Also prepare the lib directory in the install dir, else some 64 bit archs yann@1180: # won't build yann@1180: CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/lib" yann@1135: CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/lib" yann@1135: CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}/usr/lib" zhenqiang@2796: CT_DoExecLog ALL mkdir -p "${CT_HEADERS_DIR}" yann@121: yann@1420: if [ "${CT_USE_SYSROOT}" = "y" ]; then yann@2279: # Prevent gcc from installing its libraries outside of the sysroot yann@2653: CT_Pushd "${CT_PREFIX_DIR}/${CT_TARGET}" yann@2653: CT_DoExecLog ALL ln -sf "${CT_SYSROOT_REL_DIR}/lib" "lib" yann@2653: CT_Popd yann@1420: fi yann@740: anthony@2138: # Since we're *not* multilib on the target side, we want all the anthony@2138: # libraries to end up in "lib". We create "lib64" (for 64-bit anthony@2138: # build or host architectures) and "lib32" (for 32-bit emulation anthony@2138: # on 64-bit) as symlinks to "lib". anthony@2138: # anthony@2138: # Not all of these symlinks are necessary, but better safe than anthony@2138: # sorry. They are summarily removed by build/internals.sh:do_finish. anthony@2138: for d in \ anthony@2138: "${CT_PREFIX_DIR}" \ anthony@2138: "${CT_SYSROOT_DIR}" \ anthony@2138: "${CT_SYSROOT_DIR}/usr" \ anthony@2138: "${CT_PREFIX_DIR}/${CT_TARGET}" \ anthony@2138: ; do anthony@2138: CT_DoExecLog ALL ln -sf "lib" "${d}/lib32" anthony@2138: CT_DoExecLog ALL ln -sf "lib" "${d}/lib64" anthony@2138: done yann@740: yann@1041: # Determine build system if not set by the user titus@1958: if [ -z "${CT_BUILD}" ]; then titus@1958: CT_BUILD=$(CT_DoConfigGuess) titus@1958: fi yann@121: yann@1083: # Prepare mangling patterns to later modify BUILD and HOST (see below) yann@1041: case "${CT_TOOLCHAIN_TYPE}" in yann@1041: cross) yann@1426: # A cross-compiler runs on the same machine it is built on yann@1041: CT_HOST="${CT_BUILD}" yann@1041: build_mangle="build_" yann@1041: host_mangle="build_" yann@1426: target_mangle="" yann@1425: install_build_tools_for="BUILD HOST" yann@1041: ;; yann@1426: canadian) yann@1426: build_mangle="build_" yann@1426: host_mangle="host_" yann@1426: target_mangle="" yann@2936: install_build_tools_for="BUILD HOST" yann@1426: ;; yann@1041: *) CT_Abort "No code for '${CT_TOOLCHAIN_TYPE}' toolchain type!" yann@1041: ;; yann@1041: esac yann@1033: yann@1041: # Save the real tuples to generate shell-wrappers to the real tools yann@1041: CT_REAL_BUILD="${CT_BUILD}" yann@1041: CT_REAL_HOST="${CT_HOST}" yann@1426: CT_REAL_TARGET="${CT_TARGET}" yann@1041: yann@1082: # Canonicalise CT_BUILD and CT_HOST yann@1082: # Not only will it give us full-qualified tuples, but it will also ensure yann@1082: # that they are valid tuples (in case of typo with user-provided tuples) yann@1082: # That's way better than trying to rewrite config.sub ourselves... yann@1426: # CT_TARGET is already made canonical in CT_DoBuildTargetTuple yann@1089: CT_BUILD=$(CT_DoConfigSub "${CT_BUILD}") yann@1089: CT_HOST=$(CT_DoConfigSub "${CT_HOST}") yann@1041: yann@1041: # Modify BUILD and HOST so that gcc always generate a cross-compiler yann@1041: # even if any of the build, host or target machines are the same. yann@1041: # NOTE: we'll have to mangle the (BUILD|HOST)->TARGET x-compiler to yann@1041: # support canadain build, later... yann@1041: CT_BUILD="${CT_BUILD/-/-${build_mangle}}" yann@1041: CT_HOST="${CT_HOST/-/-${host_mangle}}" yann@1426: CT_TARGET="${CT_TARGET/-/-${target_mangle}}" yann@1041: yann@1041: # Now we have mangled our BUILD and HOST tuples, we must fake the new yann@1041: # cross-tools for those mangled tuples. yann@174: CT_DoLog DEBUG "Making build system tools available" yann@1425: for m in ${install_build_tools_for}; do yann@1041: r="CT_REAL_${m}" yann@1041: v="CT_${m}" yann@1041: p="CT_${m}_PREFIX" yann@1041: s="CT_${m}_SUFFIX" yann@1041: if [ -n "${!p}" ]; then yann@1041: t="${!p}" yann@1041: else yann@1041: t="${!r}-" yann@1041: fi yann@1041: yann@1129: for tool in ar as dlltool gcc g++ gcj gnatbind gnatmake ld nm objcopy objdump ranlib strip windres; do yann@1041: # First try with prefix + suffix yann@1041: # Then try with prefix only yann@1041: # Then try with suffix only, but only for BUILD, and HOST iff REAL_BUILD == REAL_HOST yann@1041: # Finally try with neither prefix nor suffix, but only for BUILD, and HOST iff REAL_BUILD == REAL_HOST yann@1041: # This is needed, because some tools have a prefix and yann@1041: # a suffix (eg. gcc), while others may have only one, yann@1041: # or even none (eg. binutils) yann@1041: where=$(CT_Which "${t}${tool}${!s}") yann@1041: [ -z "${where}" ] && where=$(CT_Which "${t}${tool}") yann@1041: if [ -z "${where}" \ yann@1041: -a \( "${m}" = "BUILD" \ yann@1041: -o "${CT_REAL_BUILD}" = "${!r}" \) ]; then yann@1041: where=$(CT_Which "${tool}${!s}") yann@1041: fi yann@1041: if [ -z "${where}" \ yann@1041: -a \( "${m}" = "BUILD" \ yann@1041: -o "${CT_REAL_BUILD}" = "${!r}" \) ]; then yann@1041: where=$(CT_Which "${tool}") yann@1041: fi yann@1041: yann@1041: # Not all tools are available for all platforms, but some are really, yann@1041: # bally needed yann@1041: if [ -n "${where}" ]; then yann@1041: CT_DoLog DEBUG " '${!v}-${tool}' -> '${where}'" titus@2795: printf "#${BANG}${CT_CONFIG_SHELL}\nexec '${where}' \"\${@}\"\n" >"${CT_BUILDTOOLS_PREFIX_DIR}/bin/${!v}-${tool}" yann@2308: CT_DoExecLog ALL chmod 700 "${CT_BUILDTOOLS_PREFIX_DIR}/bin/${!v}-${tool}" yann@1041: else yann@1041: case "${tool}" in yann@1176: # We'll at least need some of them... linux@1927: ar|as|gcc|ld|nm|objcopy|objdump|ranlib) yann@1041: CT_Abort "Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : either needed!" yann@1041: ;; yann@1176: # Some are conditionnally required yann@1176: # Add them in alphabetical (C locale) ordering linux@1927: g++) linux@1927: # g++ (needed for companion lib), only needed for HOST linux@1927: CT_TestAndAbort "Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : either needed!" "${m}" = "HOST" linux@1927: ;; yann@1176: gcj) yann@1176: CT_TestAndAbort "Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : either needed!" "${CT_CC_LANG_JAVA}" = "y" yann@1176: ;; linux@2060: strip) linux@2060: CT_TestAndAbort "Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : either needed!" "${CT_STRIP_ALL_TOOLCHAIN_EXECUTABLES}" = "y" linux@2060: ;; yann@1176: # If any other is missing, only warn at low level yann@1041: *) yann@1041: # It does not deserve a WARN level. yann@1041: CT_DoLog DEBUG " Missing: '${t}${tool}${!s}' or '${t}${tool}' or '${tool}' : not required." yann@1041: ;; yann@1041: esac yann@1041: fi yann@1041: done yann@121: done yann@121: yann@2305: # Some makeinfo versions are a pain in [put your most sensible body part here]. yann@2305: # Go ahead with those, by creating a wrapper that keeps partial files, and that yann@2305: # never fails: yann@2305: CT_DoLog DEBUG " 'makeinfo' -> '$(CT_Which makeinfo)'" titus@2795: printf "#${BANG}${CT_CONFIG_SHELL}\n$(CT_Which makeinfo) --force \"\${@}\"\ntrue\n" >"${CT_BUILDTOOLS_PREFIX_DIR}/bin/makeinfo" yann@2308: CT_DoExecLog ALL chmod 700 "${CT_BUILDTOOLS_PREFIX_DIR}/bin/makeinfo" yann@2305: yann@1041: # Carefully add paths in the order we want them: yann@1041: # - first try in ${CT_PREFIX_DIR}/bin yann@2924: # - then try the buildtools dir yann@1041: # - fall back to searching user's PATH yann@1041: # Of course, neither cross-native nor canadian can run on BUILD, yann@1041: # so don't add those PATHs in this case... yann@1041: case "${CT_TOOLCHAIN_TYPE}" in yann@2924: cross) export PATH="${CT_PREFIX_DIR}/bin:${CT_BUILDTOOLS_PREFIX_DIR}/bin:${PATH}";; yann@2308: canadian) export PATH="${CT_BUILDTOOLS_PREFIX_DIR}/bin:${PATH}";; yann@1041: *) ;; yann@1041: esac yann@1041: yann@2717: # Now we know our host and where to find the host tools, we can check yann@2717: # if static link was requested, but only if it was requested yann@2717: if [ "${CT_WANTS_STATIC_LINK}" = "y" ]; then yann@2717: tmp="${CT_BUILD_DIR}/.static-test" yann@2717: if ! "${CT_HOST}-gcc" -xc - -static -o "${tmp}" >/dev/null 2>&1 <<-_EOF_ yann@2717: int main() { return 0; } yann@2717: _EOF_ yann@2717: then yann@2717: CT_Abort "Static linking impossible on the host system '${CT_HOST}'" yann@2717: fi yann@2717: rm -f "${tmp}" yann@2717: fi yann@2717: yann@121: # Help gcc yann@121: CT_CFLAGS_FOR_HOST= michael@2701: [ "${CT_USE_PIPES}" = "y" ] && CT_CFLAGS_FOR_HOST+=" -pipe" michael@2727: CT_CFLAGS_FOR_HOST+=" ${CT_EXTRA_FLAGS_FOR_HOST}" yann@121: yann@1033: # Set the shell to be used by ./configure scripts and by Makefiles (those yann@1033: # that support it!). yann@2705: export CONFIG_SHELL="${CT_CONFIG_SHELL}" # for ./configure yann@2705: export SHELL="${CT_CONFIG_SHELL}" # for Makefiles yann@805: yann@121: # And help make go faster yann@2275: JOBSFLAGS= yann@2716: # Override the configured jobs with what's been given on the command line yann@2716: [ -n "${CT_JOBS}" ] && CT_PARALLEL_JOBS="${CT_JOBS}" michael@2695: # Use the number of processors+1 when automatically setting the number of michael@2695: # parallel jobs. Fall back to 1 if the host doesn't use GLIBC. michael@2695: AUTO_JOBS=$((`getconf _NPROCESSORS_ONLN 2> /dev/null || echo 0` + 1)) yann@2716: [ ${CT_PARALLEL_JOBS} -eq 0 ] && JOBSFLAGS="${JOBSFLAGS} -j${AUTO_JOBS}" michael@2695: [ ${CT_PARALLEL_JOBS} -gt 0 ] && JOBSFLAGS="${JOBSFLAGS} -j${CT_PARALLEL_JOBS}" yann@2275: [ ${CT_LOAD} -ne 0 ] && JOBSFLAGS="${JOBSFLAGS} -l${CT_LOAD}" yann@121: yann@2468: # We need to save the real .config with kconfig's value, yann@2468: # not our mangled .config.2 with arrays. yann@894: CT_DoLog EXTRA "Installing user-supplied crosstool-NG configuration" yann@1423: CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/bin" yann@1098: CT_DoExecLog DEBUG install -m 0755 "${CT_LIB_DIR}/scripts/toolchain-config.in" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config" tvb377@1814: CT_DoExecLog DEBUG sed -i -e 's,@@grep@@,"'"${grep}"'",;' "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config" yann@909: bzip2 -c -9 .config >>"${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config" yann@894: yann@121: CT_DoStep EXTRA "Dumping internal crosstool-NG configuration" yann@121: CT_DoLog EXTRA "Building a toolchain for:" yann@1041: CT_DoLog EXTRA " build = ${CT_REAL_BUILD}" yann@1041: CT_DoLog EXTRA " host = ${CT_REAL_HOST}" yann@121: CT_DoLog EXTRA " target = ${CT_TARGET}" yann@1247: set |grep -E '^CT_.+=' |sort |CT_DoLog DEBUG yann@1806: CT_DoLog DEBUG "Other environment:" yann@1806: printenv |grep -v -E '^CT_.+=' |CT_DoLog DEBUG yann@121: CT_EndStep yann@63: fi yann@63: yann@121: if [ -z "${CT_RESTART}" ]; then yann@2595: CT_DoStep INFO "Retrieving needed toolchain components' tarballs" yann@2595: do_companion_tools_get yann@2595: do_kernel_get yann@2595: do_gmp_get yann@2595: do_mpfr_get yann@2595: do_ppl_get yann@2595: do_cloog_get yann@2595: do_mpc_get yann@2595: do_libelf_get yann@2595: do_binutils_get yann@2595: do_elf2flt_get yann@2595: do_sstrip_get yann@2595: do_cc_get yann@2595: do_libc_get yann@2595: do_debug_get yann@2595: do_test_suite_get yann@2595: CT_EndStep yann@63: yann@121: if [ "${CT_ONLY_DOWNLOAD}" != "y" ]; then yann@121: if [ "${CT_FORCE_EXTRACT}" = "y" ]; then yann@1138: CT_DoForceRmdir "${CT_SRC_DIR}" yann@1135: CT_DoExecLog ALL mkdir -p "${CT_SRC_DIR}" yann@121: fi richard@1727: richard@1727: if [ "${CT_COMP_TOOLS}" = "y" ]; then richard@1727: CT_DoStep INFO "Extracting, patching and installing companion tools" richard@1727: do_companion_tools_extract richard@1727: do_companion_tools richard@1727: CT_EndStep richard@1727: fi richard@1727: yann@121: CT_DoStep INFO "Extracting and patching toolchain components" yann@121: do_kernel_extract yann@466: do_gmp_extract yann@466: do_mpfr_extract yann@1324: do_ppl_extract yann@1380: do_cloog_extract yann@1384: do_mpc_extract yann@1811: do_libelf_extract yann@121: do_binutils_extract yann@1755: do_elf2flt_extract yann@1854: do_sstrip_extract yann@331: do_cc_extract yann@121: do_libc_extract yann@121: do_debug_extract mgl@1965: do_test_suite_extract yann@121: CT_EndStep yann@121: fi yann@121: fi yann@85: yann@121: # Now for the job by itself. Go have a coffee! yann@121: if [ "${CT_ONLY_DOWNLOAD}" != "y" -a "${CT_ONLY_EXTRACT}" != "y" ]; then yann@121: # Because of CT_RESTART, this becomes quite complex yann@143: do_stop=0 yann@143: prev_step= yann@121: [ -n "${CT_RESTART}" ] && do_it=0 || do_it=1 yann@466: # Aha! CT_STEPS comes from steps.mk! yann@461: for step in ${CT_STEPS}; do yann@121: if [ ${do_it} -eq 0 ]; then yann@121: if [ "${CT_RESTART}" = "${step}" ]; then yann@121: CT_DoLoadState "${step}" yann@121: do_it=1 yann@143: do_stop=0 yann@121: fi yann@121: else yann@121: CT_DoSaveState ${step} yann@143: if [ ${do_stop} -eq 1 ]; then yann@523: CT_DoLog ERROR "Stopping just after step '${prev_step}', as requested." yann@143: exit 0 yann@143: fi yann@85: fi yann@121: if [ ${do_it} -eq 1 ]; then yann@2707: ( do_${step} ) yann@2964: # POSIX 1003.1-2008 does not say if "set -e" should catch a yann@2964: # sub-shell ending with !0. bash-3 does not, while bash-4 does, yann@2964: # so the following line is for bash-3; bash-4 would choke above. yann@2973: [ $? -eq 0 ] yann@135: if [ "${CT_STOP}" = "${step}" ]; then yann@143: do_stop=1 yann@135: fi yann@725: if [ "${CT_DEBUG_PAUSE_STEPS}" = "y" ]; then yann@523: CT_DoPause "Step '${step}' finished" yann@121: fi yann@121: fi yann@143: prev_step="${step}" yann@121: done yann@63: fi yann@1: yann@96: CT_DoEnd INFO yann@96: yann@1135: # From now-on, it can become impossible to log any time, because yann@1135: # either we're compressing the log file, or it can become RO any yann@1135: # moment... Consign all ouptut to oblivion... yann@1135: CT_DoLog INFO "Finishing installation (may take a few seconds)..." yann@1135: exec >/dev/null 2>&1 yann@2550: rm -f ${CT_PREFIX_DIR}/build.log.bz2 yann@2339: if [ "${CT_LOG_TO_FILE}" = "y" ]; then yann@2339: cp "${tmp_log_file}" "${CT_PREFIX_DIR}/build.log" yann@2339: if [ "${CT_LOG_FILE_COMPRESS}" = y ]; then yann@2339: bzip2 -9 "${CT_PREFIX_DIR}/build.log" yann@2339: fi yann@2339: fi yann@1135: [ "${CT_INSTALL_DIR_RO}" = "y" ] && chmod -R a-w "${CT_INSTALL_DIR}" yann@1966: [ "${CT_TEST_SUITE}" = "y" ] && chmod -R u+w "${CT_TEST_SUITE_DIR}" yann@1: yann@1: trap - EXIT