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@965: . .config yann@1156: # Yes! We can do full logging from now on! yann@1: yann@1064: # Overide the locale early, in case we ever translate crosstool-NG messages yann@1064: [ -z "${CT_NO_OVERIDE_LC_MESSAGES}" ] && export LC_ALL=C yann@1064: yann@1156: # Where will we work? yann@1156: CT_WORK_DIR="${CT_WORK_DIR:-${CT_TOP_DIR}/targets}" yann@1270: CT_DoExecLog ALL mkdir -p "${CT_WORK_DIR}" 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@1156: # Create the bin-overide 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 yann@1156: CT_BIN_OVERIDE_DIR="${CT_WORK_DIR}/bin" yann@1156: CT_DoLog DEBUG "Creating bin-overide for tools in '${CT_BIN_OVERIDE_DIR}'" yann@1156: CT_DoExecLog DEBUG mkdir -p "${CT_BIN_OVERIDE_DIR}" yann@1156: cat "${CT_LIB_DIR}/paths.mk" |while read trash line; do yann@1156: tool="${line%%=*}" yann@1156: path="${line#*=}" yann@1156: CT_DoLog DEBUG " '${tool}' -> '${path}'" yann@1156: printf "#${BANG}/bin/sh\nexec '${path}' \"\${@}\"\n" >"${CT_BIN_OVERIDE_DIR}/${tool}" yann@1156: CT_DoExecLog ALL chmod 700 "${CT_BIN_OVERIDE_DIR}/${tool}" yann@1156: done yann@1156: export PATH="${CT_BIN_OVERIDE_DIR}:${PATH}" yann@1156: yann@1064: # Start date. Can't be done until we know the locale 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@96: # renice oursleves yann@762: CT_DoExecLog DEBUG renice ${CT_NICE} $$ yann@1: 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@1: # Some sanity checks in the environment and needed tools yann@1: CT_DoLog INFO "Checking environment sanity" yann@1: yann@290: CT_DoLog DEBUG "Unsetting and unexporting MAKEFLAGS" yann@290: unset MAKEFLAGS yann@290: export MAKEFLAGS yann@290: yann@1: # Other environment sanity checks yann@1: CT_TestAndAbort "Don't set LD_LIBRARY_PATH. It screws up the build." -n "${LD_LIBRARY_PATH}" yann@1: CT_TestAndAbort "Don't set CFLAGS. It screws up the build." -n "${CFLAGS}" yann@1: CT_TestAndAbort "Don't set CXXFLAGS. It screws up the build." -n "${CXXFLAGS}" yann@1: CT_Test "GREP_OPTIONS screws up the build. Resetting." -n "${GREP_OPTIONS}" yann@965: export GREP_OPTIONS= yann@1: 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" yann@965: . "${CT_LIB_DIR}/scripts/build/kernel/${CT_KERNEL}.sh" yann@965: . "${CT_LIB_DIR}/scripts/build/gmp.sh" yann@965: . "${CT_LIB_DIR}/scripts/build/mpfr.sh" yann@965: . "${CT_LIB_DIR}/scripts/build/binutils.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/tools.sh" yann@965: . "${CT_LIB_DIR}/scripts/build/debug.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@1093: . .config yann@96: 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@767: CT_CC_CORE_EXTRA_CONFIG="${CT_ARCH_CC_CORE_EXTRA_CONFIG} ${CT_CC_CORE_EXTRA_CONFIG}" yann@767: CT_CC_EXTRA_CONFIG="${CT_ARCH_CC_EXTRA_CONFIG} ${CT_CC_EXTRA_CONFIG}" yann@397: yann@1156: # Create the working directories 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@1272: CT_STATE_DIR="${CT_WORK_DIR}/${CT_TARGET}/state" yann@1272: CT_CONFIG_DIR="${CT_BUILD_DIR}/configs" yann@1272: yann@121: # Note: we'll always install the core compiler in its own directory, so as to yann@331: # not mix the two builds: core and final. yann@136: CT_CC_CORE_STATIC_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core-static" yann@136: CT_CC_CORE_SHARED_PREFIX_DIR="${CT_BUILD_DIR}/${CT_CC}-core-shared" yann@85: 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@403: if [ ! -d "${CT_LOCAL_TARBALLS_DIR}" ]; then yann@523: CT_DoLog WARN "Directory '${CT_LOCAL_TARBALLS_DIR}' does not exist. Will not save downloaded tarballs to local storage." yann@523: CT_SAVE_TARBALLS= yann@403: fi yann@403: yann@1: # Some more sanity checks now that we have all paths set up yann@403: case "${CT_LOCAL_TARBALLS_DIR},${CT_TARBALLS_DIR},${CT_SRC_DIR},${CT_BUILD_DIR},${CT_PREFIX_DIR},${CT_INSTALL_DIR}" in yann@1: *" "*) CT_Abort "Don't use spaces in paths, it breaks things.";; yann@1: esac yann@1: 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) yann@96: # MacOS X lacks '-o' : yann@523: CT_SYS_OS=$(uname -o || echo "Unknown (maybe MacOS-X)") 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@85: if [ -d "${CT_BUILD_DIR}" ]; then yann@1138: CT_DoForceRmdir "${CT_BUILD_DIR}" yann@85: fi 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: # We need to do that _before_ we can safely log, because the log file will yann@121: # most probably be in the toolchain directory. 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@121: if [ -d "${CT_INSTALL_DIR}" ]; 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@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@1135: CT_DoExecLog ALL mkdir -p "${CT_CC_CORE_STATIC_PREFIX_DIR}" yann@1135: CT_DoExecLog ALL mkdir -p "${CT_CC_CORE_SHARED_PREFIX_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@425: # the previous build was successful. To be able to move the logfile there, yann@121: # switch them back to read/write yann@1135: CT_DoExecLog ALL chmod -R u+w "${CT_INSTALL_DIR}" "${CT_PREFIX_DIR}" yann@85: yann@63: # Redirect log to the actual log file now we can yann@63: # It's quite understandable that the log file will be installed in the install yann@63: # directory, so we must first ensure it exists and is writeable (above) before yann@63: # we can log there yann@112: exec >/dev/null yann@174: case "${CT_LOG_TO_FILE}" in yann@174: y) CT_LOG_FILE="${CT_PREFIX_DIR}/build.log" yann@174: cat "${tmp_log_file}" >>"${CT_LOG_FILE}" yann@174: rm -f "${tmp_log_file}" yann@174: exec >>"${CT_LOG_FILE}" yann@174: ;; yann@174: *) rm -f "${tmp_log_file}" yann@174: ;; yann@63: esac yann@63: yann@397: # Setting up the rest of the environment only if not restarting yann@121: if [ -z "${CT_RESTART}" ]; then yann@1041: # What's our shell? yann@1041: # Will be plain /bin/sh on most systems, except if we have /bin/ash and we yann@1041: # _explictly_ required using it yann@1041: CT_SHELL="/bin/sh" yann@1041: [ "${CT_CONFIG_SHELL_ASH}" = "y" -a -x "/bin/ash" ] && CT_SHELL="/bin/ash" yann@63: yann@121: # Arrange paths depending on wether we use sys-root or not. yann@121: if [ "${CT_USE_SYSROOT}" = "y" ]; then yann@1219: CT_SYSROOT_DIR="${CT_PREFIX_DIR}/${CT_TARGET}/${CT_SYSROOT_DIR_PREFIX}/sys-root" 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@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@1453: CT_DEBUGROOT_DIR="${CT_SYSROOT_DIR}" yann@121: CT_HEADERS_DIR="${CT_SYSROOT_DIR}/include" 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" yann@121: yann@1454: if [ "${CT_USE_SYSROOT}" = "y" ]; then yann@1454: # Prevent gcc from installing its libraries outside of the sys-root yann@1454: CT_DoExecLog ALL ln -sf "./${CT_SYSROOT_DIR_PREFIX}/sys-root/lib" "${CT_PREFIX_DIR}/${CT_TARGET}/lib" yann@1454: fi yann@740: yann@740: # Now, in case we're 64 bits, just have lib64/ be a symlink to lib/ yann@740: # so as to have all libraries in the same directory (we can do that yann@740: # because we are *not* multilib). yann@1038: if [ "${CT_ARCH_64}" = "y" ]; then yann@1180: CT_DoExecLog ALL ln -sf "lib" "${CT_PREFIX_DIR}/lib64" yann@1135: CT_DoExecLog ALL ln -sf "lib" "${CT_SYSROOT_DIR}/lib64" yann@1135: CT_DoExecLog ALL ln -sf "lib" "${CT_SYSROOT_DIR}/usr/lib64" yann@1219: CT_DoExecLog ALL ln -sf "lib" "${CT_PREFIX_DIR}/${CT_TARGET}/lib64" yann@1038: fi yann@740: yann@1041: # Determine build system if not set by the user yann@1041: CT_Test "You did not specify the build system. That's OK, I can guess..." -z "${CT_BUILD}" yann@1041: case "${CT_BUILD}" in yann@1082: "") CT_BUILD=$("${CT_BUILD_PREFIX}gcc${CT_BUILD_SUFFIX}" -dumpmachine);; yann@121: esac 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@1041: CT_HOST="${CT_BUILD}" yann@1041: build_mangle="build_" yann@1041: host_mangle="build_" yann@1041: ;; 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@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@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@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@1135: CT_DoExecLog ALL mkdir -p "${CT_PREFIX_DIR}/bin" yann@1041: for m in BUILD HOST; 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}'" yann@1041: printf "#${BANG}${CT_SHELL}\nexec '${where}' \"\${@}\"\n" >"${CT_PREFIX_DIR}/bin/${!v}-${tool}" yann@1135: CT_DoExecLog ALL chmod 700 "${CT_PREFIX_DIR}/bin/${!v}-${tool}" yann@1041: else yann@1041: case "${tool}" in yann@1176: # We'll at least need some of them... yann@1041: 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 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: ;; 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@1041: # Carefully add paths in the order we want them: yann@1041: # - first try in ${CT_PREFIX_DIR}/bin yann@1041: # - then try in ${CT_CC_CORE_SHARED_PREFIX_DIR}/bin yann@1041: # - then try in ${CT_CC_CORE_STATIC_PREFIX_DIR}/bin 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@1041: cross) export PATH="${CT_PREFIX_DIR}/bin:${CT_CC_CORE_SHARED_PREFIX_DIR}/bin:${CT_CC_CORE_STATIC_PREFIX_DIR}/bin:${PATH}";; yann@1041: *) ;; yann@1041: esac yann@1041: yann@564: # Some makeinfo versions are a pain in [put your most sensible body part here]. yann@564: # Go ahead with those, by creating a wrapper that keeps partial files, and that yann@564: # never fails: yann@1135: CT_DoLog DEBUG " 'makeinfo' -> '$(CT_Which makeinfo)'" yann@1083: printf "#${BANG}/bin/sh\n$(CT_Which makeinfo) --force \"\${@}\"\ntrue\n" >"${CT_PREFIX_DIR}/bin/makeinfo" yann@1135: CT_DoExecLog ALL chmod 700 "${CT_PREFIX_DIR}/bin/makeinfo" yann@564: yann@121: # Help gcc yann@121: CT_CFLAGS_FOR_HOST= yann@121: [ "${CT_USE_PIPES}" = "y" ] && CT_CFLAGS_FOR_HOST="${CT_CFLAGS_FOR_HOST} -pipe" yann@121: yann@333: # Override the configured jobs with what's been given on the command line yann@333: [ -n "${CT_JOBS}" ] && CT_PARALLEL_JOBS="${CT_JOBS}" yann@333: yann@1033: # Set the shell to be used by ./configure scripts and by Makefiles (those yann@1033: # that support it!). yann@1033: export CONFIG_SHELL="${CT_SHELL}" yann@805: yann@121: # And help make go faster yann@121: PARALLELMFLAGS= yann@121: [ ${CT_PARALLEL_JOBS} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -j${CT_PARALLEL_JOBS}" yann@121: [ ${CT_LOAD} -ne 0 ] && PARALLELMFLAGS="${PARALLELMFLAGS} -l${CT_LOAD}" yann@568: export PARALLELMFLAGS yann@121: yann@894: CT_DoLog EXTRA "Installing user-supplied crosstool-NG configuration" yann@1098: CT_DoExecLog DEBUG install -m 0755 "${CT_LIB_DIR}/scripts/toolchain-config.in" "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ct-ng.config" yann@1189: CT_DoExecLog DEBUG sed -r -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@121: CT_EndStep yann@63: fi yann@63: yann@121: if [ -z "${CT_RESTART}" ]; then yann@121: CT_DoStep INFO "Retrieving needed toolchain components' tarballs" yann@121: do_kernel_get yann@466: do_gmp_get yann@466: do_mpfr_get yann@121: do_binutils_get yann@331: do_cc_get yann@121: do_libc_get yann@148: do_tools_get yann@121: do_debug_get yann@63: 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 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@121: do_binutils_extract yann@331: do_cc_extract yann@121: do_libc_extract yann@148: do_tools_extract yann@121: do_debug_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@121: do_${step} 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@174: yann@1135: [ "${CT_LOG_FILE_COMPRESS}" = y ] && bzip2 -9 "${CT_LOG_FILE}" yann@1135: [ "${CT_INSTALL_DIR_RO}" = "y" ] && chmod -R a-w "${CT_INSTALL_DIR}" yann@1: yann@1: trap - EXIT