diff -r 0eab838768b1 -r d304c8a7bfa8 scripts/build/binutils/binutils.sh --- a/scripts/build/binutils/binutils.sh Sun Jan 01 17:49:44 2012 +0100 +++ b/scripts/build/binutils/binutils.sh Sun Jul 17 18:29:35 2011 +0200 @@ -15,39 +15,92 @@ CT_Patch "binutils" "${CT_BINUTILS_VERSION}" } -# Build binutils -do_binutils() { +# Build binutils for host -> target +do_binutils_for_host() { + local -a binutils_tools + local -a binutils_opts + + CT_DoStep INFO "Installing binutils for host" + CT_mkdir_pushd "${CT_BUILD_DIR}/build-binutils-host-${CT_HOST}" + + binutils_opts+=( "host=${CT_HOST}" ) + binutils_opts+=( "prefix=${CT_PREFIX_DIR}" ) + binutils_opts+=( "static_build=${CT_STATIC_TOOLCHAIN}" ) + binutils_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" ) + binutils_opts+=( "build_manuals=${CT_BUILD_MANUALS}" ) + + do_binutils_backend "${binutils_opts[@]}" + + # Make those new tools available to the core C compilers to come. + # Note: some components want the ${TARGET}-{ar,as,ld,strip} commands as + # well. Create that. + # Don't do it for canadian or cross-native, because the binutils + # are not executable on the build machine. + case "${CT_TOOLCHAIN_TYPE}" in + cross|native) + binutils_tools=( ar as ld strip ) + case "${CT_BINUTILS_LINKERS_LIST}" in + ld) binutils_tools+=( ld.bfd ) ;; + gold) binutils_tools+=( ld.gold ) ;; + ld,gold) binutils_tools+=( ld.bfd ld.gold ) ;; + gold,ld) binutils_tools+=( ld.bfd ld.gold ) ;; + esac + mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin" + mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/bin" + for t in "${binutils_tools[@]}"; do + CT_DoExecLog ALL ln -sv \ + "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" \ + "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin/${t}" + CT_DoExecLog ALL ln -sv \ + "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" \ + "${CT_BUILDTOOLS_PREFIX_DIR}/bin/${CT_TARGET}-${t}" + done + ;; + *) ;; + esac + + CT_Popd + CT_EndStep +} + +# Build binutils for X -> target +# Parameter : description : type : default +# host : machine to run on : tuple : (none) +# prefix : prefix to install into : dir : (none) +# static_build : build statcially : bool : no +# cflags : host cflags to use : string : (empty) +# build_manuals : whether to build manuals : bool : no +do_binutils_backend() { + local host + local prefix + local static_build + local cflags + local build_manuals=no local -a extra_config local -a extra_make_flags - local -a binutils_tools local -a manuals_for local -a manuals_install + local arg - mkdir -p "${CT_BUILD_DIR}/build-binutils" - cd "${CT_BUILD_DIR}/build-binutils" - - CT_DoStep INFO "Installing binutils" + for arg in "$@"; do + eval "${arg// /\\ }" + done CT_DoLog EXTRA "Configuring binutils" - binutils_tools=( ar as ld strip ) if [ "${CT_BINUTILS_HAS_GOLD}" = "y" ]; then case "${CT_BINUTILS_LINKERS_LIST}" in ld) extra_config+=( --enable-ld=yes --enable-gold=no ) - binutils_tools+=( ld.bfd ) ;; gold) extra_config+=( --enable-ld=no --enable-gold=yes ) - binutils_tools+=( ld.gold ) ;; ld,gold) extra_config+=( --enable-ld=default --enable-gold=yes ) - binutils_tools+=( ld.bfd ld.gold ) ;; gold,ld) extra_config+=( --enable-ld=yes --enable-gold=default ) - binutils_tools+=( ld.bfd ld.gold ) ;; esac if [ "${CT_BINUTILS_GOLD_THREADED}" = "y" ]; then @@ -72,20 +125,20 @@ CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'" CT_DoExecLog CFG \ - CFLAGS="${CT_CFLAGS_FOR_HOST}" \ - CXXFLAGS="${CT_CFLAGS_FOR_HOST}" \ + CFLAGS="${cflags}" \ + CXXFLAGS="${cflags}" \ "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure" \ --build=${CT_BUILD} \ - --host=${CT_HOST} \ + --host=${host} \ --target=${CT_TARGET} \ - --prefix=${CT_PREFIX_DIR} \ + --prefix=${prefix} \ --disable-werror \ "${extra_config[@]}" \ ${CT_ARCH_WITH_FLOAT} \ ${BINUTILS_SYSROOT_ARG} \ "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}" - if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then + if [ "${static_build}" = "y" ]; then extra_make_flags+=("LDFLAGS=-static -all-static") CT_DoLog EXTRA "Prepare binutils for static build" CT_DoExecLog ALL make ${JOBSFLAGS} configure-host @@ -97,7 +150,7 @@ CT_DoLog EXTRA "Installing binutils" CT_DoExecLog ALL make install - if [ "${CT_BUILD_MANUALS}" = "y" ]; then + if [ "${build_manuals}" = "y" ]; then CT_DoLog EXTRA "Building and installing the binutils manuals" manuals_for=( gas binutils ld gprof ) if [ "${CT_BINUTILS_LINKER_GOLD}" = "y" ]; then @@ -112,39 +165,20 @@ # Install the wrapper if needed if [ "${CT_BINUTILS_LD_WRAPPER}" = "y" ]; then CT_DoLog EXTRA "Installing ld wrapper" - rm -f "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ld" - rm -f "${CT_PREFIX_DIR}/${CT_TARGET}/bin/ld" + rm -f "${prefix}/bin/${CT_TARGET}-ld" + rm -f "${prefix}/${CT_TARGET}/bin/ld" sed -r -e "s/@@DEFAULT_LD@@/${CT_BINUTILS_LINKER_DEFAULT}/" \ "${CT_LIB_DIR}/scripts/build/binutils/binutils-ld.in" \ - >"${CT_PREFIX_DIR}/bin/${CT_TARGET}-ld" - chmod +x "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ld" - cp -a "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ld" \ - "${CT_PREFIX_DIR}/${CT_TARGET}/bin/ld" + >"${prefix}/bin/${CT_TARGET}-ld" + chmod +x "${prefix}/bin/${CT_TARGET}-ld" + cp -a "${prefix}/bin/${CT_TARGET}-ld" \ + "${prefix}/${CT_TARGET}/bin/ld" # If needed, force using ld.bfd during the toolchain build if [ "${CT_BINUTILS_FORCE_LD_BFD}" = "y" ]; then export CTNG_LD_IS=bfd fi fi - - # Make those new tools available to the core C compilers to come. - # Note: some components want the ${TARGET}-{ar,as,ld,strip} commands as - # well. Create that. - # Don't do it for canadian or cross-native, because the binutils - # are not executable on the build machine. - case "${CT_TOOLCHAIN_TYPE}" in - cross|native) - mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin" - mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/bin" - for t in "${binutils_tools[@]}"; do - ln -sv "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin/${t}" - ln -sv "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" "${CT_BUILDTOOLS_PREFIX_DIR}/bin/${CT_TARGET}-${t}" - done 2>&1 |CT_DoLog ALL - ;; - *) ;; - esac - - CT_EndStep } # Now on for the target libraries