yann@1345: # This file adds functions to build binutils yann@1345: # Copyright 2007 Yann E. MORIN yann@1345: # Licensed under the GPL v2. See COPYING in the root of this package yann@1345: yann@1345: # Download binutils yann@1345: do_binutils_get() { david@3089: if [ "${CT_BINUTILS_CUSTOM}" = "y" ]; then david@3089: CT_GetCustom "binutils" "${CT_BINUTILS_VERSION}" \ david@3089: "${CT_BINUTILS_CUSTOM_LOCATION}" david@3089: else david@3089: CT_GetFile "binutils-${CT_BINUTILS_VERSION}" \ david@3089: {ftp,http}://{ftp.gnu.org/gnu,ftp.kernel.org/pub/linux/devel}/binutils \ david@3089: ftp://gcc.gnu.org/pub/binutils/{releases,snapshots} david@3089: fi diorcet@3123: diorcet@3123: if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then yann@3315: CT_GetGit elf2flt "${CT_ELF2FLT_GIT_CSET}" git://wh0rd.org/elf2flt.git diorcet@3123: fi yann@1345: } yann@1345: yann@1345: # Extract binutils yann@1345: do_binutils_extract() { david@3089: # If using custom directory location, nothing to do yann@3316: if ! [ "${CT_BINUTILS_CUSTOM}" = "y" \ david@3089: -a -d "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}" ]; then yann@3316: CT_Extract "binutils-${CT_BINUTILS_VERSION}" yann@3316: CT_Patch "binutils" "${CT_BINUTILS_VERSION}" david@3089: fi david@3089: diorcet@3123: if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then yann@3315: CT_Extract "elf2flt-${CT_ELF2FLT_GIT_CSET}" yann@3315: CT_Patch "elf2flt" "${CT_ELF2FLT_GIT_CSET}" diorcet@3123: fi yann@1345: } yann@1345: yann@2928: # Build binutils for build -> target yann@2928: do_binutils_for_build() { yann@2928: local -a binutils_opts yann@2928: yann@2928: case "${CT_TOOLCHAIN_TYPE}" in yann@2928: native|cross) return 0;; yann@2928: esac yann@2928: yann@2928: CT_DoStep INFO "Installing binutils for build" yann@2928: CT_mkdir_pushd "${CT_BUILD_DIR}/build-binutils-build-${CT_BUILD}" yann@2928: yann@2928: binutils_opts+=( "host=${CT_BUILD}" ) yann@2928: binutils_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" ) diorcet@3119: binutils_opts+=( "cflags=${CT_CFLAGS_FOR_BUILD}" ) diorcet@3119: binutils_opts+=( "ldflags=${CT_LDFLAGS_FOR_BUILD}" ) yann@2928: yann@2928: do_binutils_backend "${binutils_opts[@]}" yann@2928: yann@2928: CT_Popd diorcet@3123: diorcet@3123: if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then diorcet@3123: # We re-use binutils' options, plus our owns diorcet@3123: binutils_opts+=( "binutils_src=${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}" ) diorcet@3123: binutils_opts+=( "binutils_bld=${CT_BUILD_DIR}/build-binutils-build-${CT_BUILD}" ) diorcet@3123: diorcet@3123: CT_mkdir_pushd "${CT_BUILD_DIR}/build-elf2flt-build-${CT_BUILD}" diorcet@3123: diorcet@3123: do_elf2flt_backend "${binutils_opts[@]}" diorcet@3123: diorcet@3123: CT_Popd diorcet@3123: fi diorcet@3123: yann@2928: CT_EndStep yann@2928: } yann@2928: yann@2926: # Build binutils for host -> target yann@2926: do_binutils_for_host() { yann@2926: local -a binutils_tools yann@2926: local -a binutils_opts yann@2926: yann@2926: CT_DoStep INFO "Installing binutils for host" yann@2926: CT_mkdir_pushd "${CT_BUILD_DIR}/build-binutils-host-${CT_HOST}" yann@2926: yann@2926: binutils_opts+=( "host=${CT_HOST}" ) yann@2926: binutils_opts+=( "prefix=${CT_PREFIX_DIR}" ) yann@2926: binutils_opts+=( "static_build=${CT_STATIC_TOOLCHAIN}" ) yann@2926: binutils_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" ) diorcet@3119: binutils_opts+=( "ldflags=${CT_LDFLAGS_FOR_HOST}" ) yann@2926: binutils_opts+=( "build_manuals=${CT_BUILD_MANUALS}" ) yann@2926: yann@2926: do_binutils_backend "${binutils_opts[@]}" yann@2926: diorcet@3123: CT_Popd diorcet@3123: diorcet@3123: if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then diorcet@3123: # We re-use binutils' options, plus our owns diorcet@3123: binutils_opts+=( "binutils_src=${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}" ) diorcet@3123: binutils_opts+=( "binutils_bld=${CT_BUILD_DIR}/build-binutils-host-${CT_HOST}" ) diorcet@3123: diorcet@3123: CT_mkdir_pushd "${CT_BUILD_DIR}/build-elf2flt-host-${CT_HOST}" diorcet@3123: diorcet@3123: do_elf2flt_backend "${binutils_opts[@]}" diorcet@3123: diorcet@3123: CT_Popd diorcet@3123: fi diorcet@3123: yann@2926: # Make those new tools available to the core C compilers to come. mingw@3290: # Note: some components want the ${TARGET}-{ar,as,ld,ranlib,strip} commands mingw@3290: # as well. Create that. yann@2926: # Don't do it for canadian or cross-native, because the binutils yann@2926: # are not executable on the build machine. yann@2926: case "${CT_TOOLCHAIN_TYPE}" in yann@2926: cross|native) mingw@3290: binutils_tools=( ar as ld ranlib strip ) diorcet@3123: if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then diorcet@3123: binutils_tools+=( elf2flt flthdr ) diorcet@3123: fi yann@2926: case "${CT_BINUTILS_LINKERS_LIST}" in yann@2926: ld) binutils_tools+=( ld.bfd ) ;; yann@2926: gold) binutils_tools+=( ld.gold ) ;; yann@2926: ld,gold) binutils_tools+=( ld.bfd ld.gold ) ;; yann@2926: gold,ld) binutils_tools+=( ld.bfd ld.gold ) ;; yann@2926: esac yann@2926: mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin" yann@2926: mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/bin" yann@2926: for t in "${binutils_tools[@]}"; do yann@2926: CT_DoExecLog ALL ln -sv \ yann@2926: "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" \ yann@2926: "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin/${t}" yann@2926: CT_DoExecLog ALL ln -sv \ yann@2926: "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" \ yann@2926: "${CT_BUILDTOOLS_PREFIX_DIR}/bin/${CT_TARGET}-${t}" yann@2926: done yann@2926: ;; yann@2926: *) ;; yann@2926: esac yann@2926: yann@2926: CT_EndStep yann@2926: } yann@2926: yann@2926: # Build binutils for X -> target yann@2926: # Parameter : description : type : default yann@2926: # host : machine to run on : tuple : (none) yann@2926: # prefix : prefix to install into : dir : (none) yann@2926: # static_build : build statcially : bool : no diorcet@3119: # cflags : cflags to use : string : (empty) diorcet@3119: # ldflags : ldflags to use : string : (empty) yann@2926: # build_manuals : whether to build manuals : bool : no yann@2926: do_binutils_backend() { yann@2926: local host yann@2926: local prefix yann@2926: local static_build yann@2926: local cflags diorcet@3119: local ldflags yann@2926: local build_manuals=no yann@1483: local -a extra_config bryanhundven@2210: local -a extra_make_flags michael@2765: local -a manuals_for michael@2765: local -a manuals_install yann@2926: local arg yann@1483: yann@2926: for arg in "$@"; do yann@2926: eval "${arg// /\\ }" yann@2926: done yann@1345: yann@1345: CT_DoLog EXTRA "Configuring binutils" yann@2244: yann@2244: if [ "${CT_BINUTILS_HAS_GOLD}" = "y" ]; then yann@2244: case "${CT_BINUTILS_LINKERS_LIST}" in yann@2244: ld) yann@2244: extra_config+=( --enable-ld=yes --enable-gold=no ) yann@2244: ;; yann@2244: gold) yann@2244: extra_config+=( --enable-ld=no --enable-gold=yes ) yann@2244: ;; yann@2244: ld,gold) yann@2244: extra_config+=( --enable-ld=default --enable-gold=yes ) yann@2244: ;; yann@2244: gold,ld) yann@2244: extra_config+=( --enable-ld=yes --enable-gold=default ) yann@2244: ;; yann@2244: esac zhenqiang@3032: if [ "${CT_BINUTILS_GOLD_THREADS}" = "y" ]; then yann@2246: extra_config+=( --enable-threads ) yann@2246: fi yann@2244: fi yann@2245: if [ "${CT_BINUTILS_PLUGINS}" = "y" ]; then yann@2245: extra_config+=( --enable-plugins ) yann@2245: fi benoit@2488: if [ "${CT_BINUTILS_HAS_PKGVERSION_BUGURL}" = "y" ]; then benoit@2503: extra_config+=("--with-pkgversion=${CT_PKGVERSION}") benoit@2503: [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}") benoit@2488: fi yann@2816: if [ "${CT_MULTILIB}" = "y" ]; then yann@2816: extra_config+=("--enable-multilib") yann@2816: else yann@2816: extra_config+=("--disable-multilib") yann@2816: fi yann@2244: zhenqiang@2779: [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls") zhenqiang@2779: yann@2244: CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'" yann@2244: yann@2341: CT_DoExecLog CFG \ yann@2926: CFLAGS="${cflags}" \ yann@2926: CXXFLAGS="${cflags}" \ diorcet@3119: LDFLAGS="${ldflags}" \ yann@1345: "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure" \ yann@1345: --build=${CT_BUILD} \ yann@2926: --host=${host} \ yann@1345: --target=${CT_TARGET} \ yann@2926: --prefix=${prefix} \ yann@1345: --disable-werror \ yann@1483: "${extra_config[@]}" \ yann@1345: ${CT_ARCH_WITH_FLOAT} \ yann@2466: ${BINUTILS_SYSROOT_ARG} \ yann@2467: "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}" yann@1345: yann@2926: if [ "${static_build}" = "y" ]; then yann@2702: extra_make_flags+=("LDFLAGS=-static -all-static") bryanhundven@2210: CT_DoLog EXTRA "Prepare binutils for static build" yann@2702: CT_DoExecLog ALL make ${JOBSFLAGS} configure-host bryanhundven@2210: fi bryanhundven@2210: yann@1345: CT_DoLog EXTRA "Building binutils" yann@2275: CT_DoExecLog ALL make "${extra_make_flags[@]}" ${JOBSFLAGS} yann@1345: yann@1345: CT_DoLog EXTRA "Installing binutils" yann@1345: CT_DoExecLog ALL make install yann@1345: yann@2926: if [ "${build_manuals}" = "y" ]; then michael@2765: CT_DoLog EXTRA "Building and installing the binutils manuals" michael@2765: manuals_for=( gas binutils ld gprof ) michael@2765: if [ "${CT_BINUTILS_LINKER_GOLD}" = "y" ]; then michael@2765: manuals_for+=( gold ) michael@2765: fi michael@2765: manuals_install=( "${manuals_for[@]/#/install-pdf-}" ) michael@2765: manuals_install+=( "${manuals_for[@]/#/install-html-}" ) michael@2765: CT_DoExecLog ALL make ${JOBSFLAGS} pdf html michael@2765: CT_DoExecLog ALL make "${manuals_install[@]}" michael@2765: fi michael@2765: yann@2247: # Install the wrapper if needed yann@2247: if [ "${CT_BINUTILS_LD_WRAPPER}" = "y" ]; then yann@2247: CT_DoLog EXTRA "Installing ld wrapper" yann@2926: rm -f "${prefix}/bin/${CT_TARGET}-ld" yann@2926: rm -f "${prefix}/${CT_TARGET}/bin/ld" yann@2247: sed -r -e "s/@@DEFAULT_LD@@/${CT_BINUTILS_LINKER_DEFAULT}/" \ yann@2247: "${CT_LIB_DIR}/scripts/build/binutils/binutils-ld.in" \ yann@2926: >"${prefix}/bin/${CT_TARGET}-ld" yann@2926: chmod +x "${prefix}/bin/${CT_TARGET}-ld" yann@2926: cp -a "${prefix}/bin/${CT_TARGET}-ld" \ yann@2926: "${prefix}/${CT_TARGET}/bin/ld" yann@2376: yann@2376: # If needed, force using ld.bfd during the toolchain build yann@2376: if [ "${CT_BINUTILS_FORCE_LD_BFD}" = "y" ]; then yann@2376: export CTNG_LD_IS=bfd yann@2376: fi yann@2247: fi yann@1345: } yann@1345: diorcet@3123: # Build elf2flt for X -> target diorcet@3123: # Parameter : description : type : default diorcet@3123: # host : machine to run on : tuple : (none) diorcet@3123: # prefix : prefix to install into : dir : (none) diorcet@3123: # static_build : build statcially : bool : no diorcet@3123: # cflags : cflags to use : string : (empty) diorcet@3123: # ldflags : ldflags to use : string : (empty) diorcet@3123: # binutils_src : source dir of binutils : dir : (none) diorcet@3123: # binutils_bld : build dir of binutils : dir : (none) diorcet@3123: # build_manuals : whether to build manuals : bool : no diorcet@3123: do_elf2flt_backend() { diorcet@3123: local host diorcet@3123: local prefix diorcet@3123: local static_build diorcet@3123: local cflags diorcet@3123: local ldflags diorcet@3123: local binutils_bld diorcet@3123: local binutils_src diorcet@3123: local build_manuals diorcet@3123: local arg diorcet@3123: diorcet@3123: for arg in "$@"; do diorcet@3123: eval "${arg// /\\ }" diorcet@3123: done diorcet@3123: diorcet@3123: CT_DoLog EXTRA "Configuring elf2flt" diorcet@3123: CT_DoExecLog CFG \ diorcet@3123: CFLAGS="${cflags}" \ diorcet@3123: LDFLAGS="${ldflags}" \ diorcet@3123: "${CT_SRC_DIR}/elf2flt-${CT_ELF2FLT_VERSION}/configure" \ diorcet@3123: --build=${CT_BUILD} \ diorcet@3123: --host=${host} \ diorcet@3123: --target=${CT_TARGET} \ diorcet@3123: --prefix=${prefix} \ diorcet@3123: --with-bfd-include-dir=${binutils_bld}/bfd \ diorcet@3123: --with-binutils-include-dir=${binutils_src}/include \ diorcet@3123: --with-libbfd=${binutils_bld}/bfd/libbfd.a \ diorcet@3123: --with-libiberty=${binutils_bld}/libiberty/libiberty.a \ diorcet@3123: ${elf2flt_opts} \ diorcet@3123: "${CT_ELF2FLT_EXTRA_CONFIG_ARRAY[@]}" diorcet@3123: diorcet@3123: CT_DoLog EXTRA "Building elf2flt" diorcet@3123: CT_DoExecLog ALL make ${JOBSFLAGS} diorcet@3123: diorcet@3123: CT_DoLog EXTRA "Installing elf2flt" diorcet@3123: CT_DoExecLog ALL make install diorcet@3123: } diorcet@3123: yann@1345: # Now on for the target libraries yann@2906: do_binutils_for_target() { yann@1483: local -a extra_config yann@1483: local -a targets yann@1483: local -a build_targets yann@1483: local -a install_targets yann@1483: local t yann@1345: yann@1483: [ "${CT_BINUTILS_FOR_TARGET_IBERTY}" = "y" ] && targets+=("libiberty") yann@1483: [ "${CT_BINUTILS_FOR_TARGET_BFD}" = "y" ] && targets+=("bfd") yann@1483: for t in "${targets[@]}"; do yann@1483: build_targets+=("all-${t}") yann@1483: install_targets+=("install-${t}") yann@1483: done yann@1483: yann@1483: if [ "${#targets[@]}" -ne 0 ]; then yann@1345: CT_DoStep INFO "Installing binutils for target" yann@1345: mkdir -p "${CT_BUILD_DIR}/build-binutils-for-target" yann@1345: CT_Pushd "${CT_BUILD_DIR}/build-binutils-for-target" yann@1345: yann@1345: CT_DoLog EXTRA "Configuring binutils for target" benoit@2488: benoit@2488: if [ "${CT_BINUTILS_HAS_PKGVERSION_BUGURL}" = "y" ]; then benoit@2503: extra_config+=("--with-pkgversion=${CT_PKGVERSION}") benoit@2503: [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}") benoit@2488: fi yann@2816: if [ "${CT_MULTILIB}" = "y" ]; then yann@2816: extra_config+=("--enable-multilib") yann@2816: else yann@2816: extra_config+=("--disable-multilib") yann@2816: fi benoit@2488: zhenqiang@2779: [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls") zhenqiang@2779: yann@2333: CT_DoExecLog CFG \ yann@1345: "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure" \ yann@1345: --build=${CT_BUILD} \ yann@1345: --host=${CT_TARGET} \ yann@1345: --target=${CT_TARGET} \ yann@1345: --prefix=/usr \ yann@1345: --disable-werror \ yann@1345: --enable-shared \ yann@1345: --enable-static \ yann@1483: "${extra_config[@]}" \ yann@1345: ${CT_ARCH_WITH_FLOAT} \ benoit@2804: "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}" yann@1345: yann@1483: CT_DoLog EXTRA "Building binutils' libraries (${targets[*]}) for target" yann@2275: CT_DoExecLog ALL make ${JOBSFLAGS} "${build_targets[@]}" yann@1483: CT_DoLog EXTRA "Installing binutils' libraries (${targets[*]}) for target" yann@1483: CT_DoExecLog ALL make DESTDIR="${CT_SYSROOT_DIR}" "${install_targets[@]}" yann@1345: yann@1345: CT_Popd yann@1345: CT_EndStep yann@1345: fi yann@1345: }