binutils: split binutils to backend/frontend, a-la cc_core
author"Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jul 17 18:29:35 2011 +0200 (2011-07-17)
changeset 2926d304c8a7bfa8
parent 2925 d99b1adc4402
child 2927 ddaae597fd7c
binutils: split binutils to backend/frontend, a-la cc_core

Move the actual binutils code to a backend function that builds the
required combo of build/host/target as requested by a frontend.

This split is currently a no-op, but is required for the upcoming
canadian-cross rework, where we'll be needing to build two binutils,
one for build/build/target, and one for build/host/target.

This applies to the three binutils:
- GNU binutils
- elf2flt
- sstrip

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
scripts/build/binutils/binutils.sh
scripts/build/binutils/elf2flt.sh
scripts/build/binutils/sstrip.sh
steps.mk
     1.1 --- a/scripts/build/binutils/binutils.sh	Sun Jul 17 18:28:19 2011 +0200
     1.2 +++ b/scripts/build/binutils/binutils.sh	Sun Jul 17 18:29:35 2011 +0200
     1.3 @@ -15,39 +15,92 @@
     1.4      CT_Patch "binutils" "${CT_BINUTILS_VERSION}"
     1.5  }
     1.6  
     1.7 -# Build binutils
     1.8 -do_binutils() {
     1.9 +# Build binutils for host -> target
    1.10 +do_binutils_for_host() {
    1.11 +    local -a binutils_tools
    1.12 +    local -a binutils_opts
    1.13 +
    1.14 +    CT_DoStep INFO "Installing binutils for host"
    1.15 +    CT_mkdir_pushd "${CT_BUILD_DIR}/build-binutils-host-${CT_HOST}"
    1.16 +
    1.17 +    binutils_opts+=( "host=${CT_HOST}" )
    1.18 +    binutils_opts+=( "prefix=${CT_PREFIX_DIR}" )
    1.19 +    binutils_opts+=( "static_build=${CT_STATIC_TOOLCHAIN}" )
    1.20 +    binutils_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
    1.21 +    binutils_opts+=( "build_manuals=${CT_BUILD_MANUALS}" )
    1.22 +
    1.23 +    do_binutils_backend "${binutils_opts[@]}"
    1.24 +
    1.25 +    # Make those new tools available to the core C compilers to come.
    1.26 +    # Note: some components want the ${TARGET}-{ar,as,ld,strip} commands as
    1.27 +    # well. Create that.
    1.28 +    # Don't do it for canadian or cross-native, because the binutils
    1.29 +    # are not executable on the build machine.
    1.30 +    case "${CT_TOOLCHAIN_TYPE}" in
    1.31 +        cross|native)
    1.32 +            binutils_tools=( ar as ld strip )
    1.33 +            case "${CT_BINUTILS_LINKERS_LIST}" in
    1.34 +                ld)         binutils_tools+=( ld.bfd ) ;;
    1.35 +                gold)       binutils_tools+=( ld.gold ) ;;
    1.36 +                ld,gold)    binutils_tools+=( ld.bfd ld.gold ) ;;
    1.37 +                gold,ld)    binutils_tools+=( ld.bfd ld.gold ) ;;
    1.38 +            esac
    1.39 +            mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin"
    1.40 +            mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/bin"
    1.41 +            for t in "${binutils_tools[@]}"; do
    1.42 +                CT_DoExecLog ALL ln -sv                                         \
    1.43 +                                    "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}"    \
    1.44 +                                    "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin/${t}"
    1.45 +                CT_DoExecLog ALL ln -sv                                         \
    1.46 +                                    "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}"    \
    1.47 +                                    "${CT_BUILDTOOLS_PREFIX_DIR}/bin/${CT_TARGET}-${t}"
    1.48 +            done
    1.49 +            ;;
    1.50 +        *)  ;;
    1.51 +    esac
    1.52 +
    1.53 +    CT_Popd
    1.54 +    CT_EndStep
    1.55 +}
    1.56 +
    1.57 +# Build binutils for X -> target
    1.58 +#     Parameter     : description               : type      : default
    1.59 +#     host          : machine to run on         : tuple     : (none)
    1.60 +#     prefix        : prefix to install into    : dir       : (none)
    1.61 +#     static_build  : build statcially          : bool      : no
    1.62 +#     cflags        : host cflags to use        : string    : (empty)
    1.63 +#     build_manuals : whether to build manuals  : bool      : no
    1.64 +do_binutils_backend() {
    1.65 +    local host
    1.66 +    local prefix
    1.67 +    local static_build
    1.68 +    local cflags
    1.69 +    local build_manuals=no
    1.70      local -a extra_config
    1.71      local -a extra_make_flags
    1.72 -    local -a binutils_tools
    1.73      local -a manuals_for
    1.74      local -a manuals_install
    1.75 +    local arg
    1.76  
    1.77 -    mkdir -p "${CT_BUILD_DIR}/build-binutils"
    1.78 -    cd "${CT_BUILD_DIR}/build-binutils"
    1.79 -
    1.80 -    CT_DoStep INFO "Installing binutils"
    1.81 +    for arg in "$@"; do
    1.82 +        eval "${arg// /\\ }"
    1.83 +    done
    1.84  
    1.85      CT_DoLog EXTRA "Configuring binutils"
    1.86  
    1.87 -    binutils_tools=( ar as ld strip )
    1.88      if [ "${CT_BINUTILS_HAS_GOLD}" = "y" ]; then
    1.89          case "${CT_BINUTILS_LINKERS_LIST}" in
    1.90              ld)
    1.91                  extra_config+=( --enable-ld=yes --enable-gold=no )
    1.92 -                binutils_tools+=( ld.bfd )
    1.93                  ;;
    1.94              gold)
    1.95                  extra_config+=( --enable-ld=no --enable-gold=yes )
    1.96 -                binutils_tools+=( ld.gold )
    1.97                  ;;
    1.98              ld,gold)
    1.99                  extra_config+=( --enable-ld=default --enable-gold=yes )
   1.100 -                binutils_tools+=( ld.bfd ld.gold )
   1.101                  ;;
   1.102              gold,ld)
   1.103                  extra_config+=( --enable-ld=yes --enable-gold=default )
   1.104 -                binutils_tools+=( ld.bfd ld.gold )
   1.105                  ;;
   1.106          esac
   1.107          if [ "${CT_BINUTILS_GOLD_THREADED}" = "y" ]; then
   1.108 @@ -72,20 +125,20 @@
   1.109      CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   1.110  
   1.111      CT_DoExecLog CFG                                            \
   1.112 -    CFLAGS="${CT_CFLAGS_FOR_HOST}"                              \
   1.113 -    CXXFLAGS="${CT_CFLAGS_FOR_HOST}"                            \
   1.114 +    CFLAGS="${cflags}"                                          \
   1.115 +    CXXFLAGS="${cflags}"                                        \
   1.116      "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure"   \
   1.117          --build=${CT_BUILD}                                     \
   1.118 -        --host=${CT_HOST}                                       \
   1.119 +        --host=${host}                                          \
   1.120          --target=${CT_TARGET}                                   \
   1.121 -        --prefix=${CT_PREFIX_DIR}                               \
   1.122 +        --prefix=${prefix}                                      \
   1.123          --disable-werror                                        \
   1.124          "${extra_config[@]}"                                    \
   1.125          ${CT_ARCH_WITH_FLOAT}                                   \
   1.126          ${BINUTILS_SYSROOT_ARG}                                 \
   1.127          "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
   1.128  
   1.129 -    if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
   1.130 +    if [ "${static_build}" = "y" ]; then
   1.131          extra_make_flags+=("LDFLAGS=-static -all-static")
   1.132          CT_DoLog EXTRA "Prepare binutils for static build"
   1.133          CT_DoExecLog ALL make ${JOBSFLAGS} configure-host
   1.134 @@ -97,7 +150,7 @@
   1.135      CT_DoLog EXTRA "Installing binutils"
   1.136      CT_DoExecLog ALL make install
   1.137  
   1.138 -    if [ "${CT_BUILD_MANUALS}" = "y" ]; then
   1.139 +    if [ "${build_manuals}" = "y" ]; then
   1.140          CT_DoLog EXTRA "Building and installing the binutils manuals"
   1.141          manuals_for=( gas binutils ld gprof )
   1.142          if [ "${CT_BINUTILS_LINKER_GOLD}" = "y" ]; then
   1.143 @@ -112,39 +165,20 @@
   1.144      # Install the wrapper if needed
   1.145      if [ "${CT_BINUTILS_LD_WRAPPER}" = "y" ]; then
   1.146          CT_DoLog EXTRA "Installing ld wrapper"
   1.147 -        rm -f "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ld"
   1.148 -        rm -f "${CT_PREFIX_DIR}/${CT_TARGET}/bin/ld"
   1.149 +        rm -f "${prefix}/bin/${CT_TARGET}-ld"
   1.150 +        rm -f "${prefix}/${CT_TARGET}/bin/ld"
   1.151          sed -r -e "s/@@DEFAULT_LD@@/${CT_BINUTILS_LINKER_DEFAULT}/" \
   1.152              "${CT_LIB_DIR}/scripts/build/binutils/binutils-ld.in"   \
   1.153 -            >"${CT_PREFIX_DIR}/bin/${CT_TARGET}-ld"
   1.154 -        chmod +x "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ld"
   1.155 -        cp -a "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ld"    \
   1.156 -              "${CT_PREFIX_DIR}/${CT_TARGET}/bin/ld"
   1.157 +            >"${prefix}/bin/${CT_TARGET}-ld"
   1.158 +        chmod +x "${prefix}/bin/${CT_TARGET}-ld"
   1.159 +        cp -a "${prefix}/bin/${CT_TARGET}-ld"   \
   1.160 +              "${prefix}/${CT_TARGET}/bin/ld"
   1.161  
   1.162          # If needed, force using ld.bfd during the toolchain build
   1.163          if [ "${CT_BINUTILS_FORCE_LD_BFD}" = "y" ]; then
   1.164              export CTNG_LD_IS=bfd
   1.165          fi
   1.166      fi
   1.167 -
   1.168 -    # Make those new tools available to the core C compilers to come.
   1.169 -    # Note: some components want the ${TARGET}-{ar,as,ld,strip} commands as
   1.170 -    # well. Create that.
   1.171 -    # Don't do it for canadian or cross-native, because the binutils
   1.172 -    # are not executable on the build machine.
   1.173 -    case "${CT_TOOLCHAIN_TYPE}" in
   1.174 -        cross|native)
   1.175 -            mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin"
   1.176 -            mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/bin"
   1.177 -            for t in "${binutils_tools[@]}"; do
   1.178 -                ln -sv "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin/${t}"
   1.179 -                ln -sv "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" "${CT_BUILDTOOLS_PREFIX_DIR}/bin/${CT_TARGET}-${t}"
   1.180 -            done 2>&1 |CT_DoLog ALL
   1.181 -            ;;
   1.182 -        *)  ;;
   1.183 -    esac
   1.184 -
   1.185 -    CT_EndStep
   1.186  }
   1.187  
   1.188  # Now on for the target libraries
     2.1 --- a/scripts/build/binutils/elf2flt.sh	Sun Jul 17 18:28:19 2011 +0200
     2.2 +++ b/scripts/build/binutils/elf2flt.sh	Sun Jul 17 18:29:35 2011 +0200
     2.3 @@ -4,9 +4,9 @@
     2.4  # Licensed under the GPL v2. See COPYING in the root of this package
     2.5  
     2.6  # Default: do nothing
     2.7 -do_elf2flt_get()     { :; }
     2.8 -do_elf2flt_extract() { :; }
     2.9 -do_elf2flt()         { :; }
    2.10 +do_elf2flt_get()        { :; }
    2.11 +do_elf2flt_extract()    { :; }
    2.12 +do_elf2flt_for_host()   { :; }
    2.13  
    2.14  if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then
    2.15  
    2.16 @@ -25,25 +25,74 @@
    2.17      CT_Patch "elf2flt-cvs" "${CT_ELF2FLT_VERSION}"
    2.18  }
    2.19  
    2.20 -# Build elf2flt
    2.21 -do_elf2flt() {
    2.22 -    mkdir -p "${CT_BUILD_DIR}/build-elf2flt"
    2.23 -    cd "${CT_BUILD_DIR}/build-elf2flt"
    2.24 +# Build elf2flt for host -> target
    2.25 +do_elf2flt_for_host() {
    2.26 +    local -a elf2flt_opts
    2.27  
    2.28 -    CT_DoStep INFO "Installing elf2flt"
    2.29 +    CT_DoStep INFO "Installing elf2flt for host"
    2.30 +    CT_mkdir_pushd "${CT_BUILD_DIR}/build-elf2flt-host-${CT_HOST}"
    2.31 +
    2.32 +    elf2flt_opts+=( "host=${CT_HOST}" )
    2.33 +    elf2flt_opts+=( "prefix=${CT_PREFIX_DIR}" )
    2.34 +    elf2flt_opts+=( "static_build=${CT_STATIC_TOOLCHAIN}" )
    2.35 +    elf2flt_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
    2.36 +
    2.37 +    do_elf2flt_backend "${elf2flt_opts[@]}"
    2.38 +
    2.39 +    # Make those new tools available to the core C compilers to come.
    2.40 +    # Note: some components want the ${TARGET}-{ar,as,ld,strip} commands as
    2.41 +    # well. Create that.
    2.42 +    # Don't do it for canadian or cross-native, because the binutils
    2.43 +    # are not executable on the build machine.
    2.44 +    case "${CT_TOOLCHAIN_TYPE}" in
    2.45 +        cross|native)
    2.46 +            mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin"
    2.47 +            mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/bin"
    2.48 +            for t in elf2flt flthdr; do
    2.49 +                CT_DoExecLog ALL ln -sv                                         \
    2.50 +                                    "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}"    \
    2.51 +                                    "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin/${t}"
    2.52 +                CT_DoExecLog ALL ln -sv                                         \
    2.53 +                                    "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}"    \
    2.54 +                                    "${CT_BUILDTOOLS_PREFIX_DIR}/bin/${CT_TARGET}-${t}"
    2.55 +            done
    2.56 +            ;;
    2.57 +        *)  ;;
    2.58 +    esac
    2.59 +
    2.60 +    CT_Popd
    2.61 +    CT_EndStep
    2.62 +}
    2.63 +
    2.64 +# Build elf2flt for X -> target
    2.65 +#     Parameter     : description               : type      : default
    2.66 +#     host          : machine to run on         : tuple     : (none)
    2.67 +#     prefix        : prefix to install into    : dir       : (none)
    2.68 +#     static_build  : build statcially          : bool      : no
    2.69 +#     cflags        : host cflags to use        : string    : (empty)
    2.70 +do_elf2flt_backend() {
    2.71 +    local host
    2.72 +    local prefix
    2.73 +    local static_build
    2.74 +    local cflags
    2.75 +    local arg
    2.76 +
    2.77 +    for arg in "$@"; do
    2.78 +        eval "${arg// /\\ }"
    2.79 +    done
    2.80  
    2.81      elf2flt_opts=
    2.82 -    binutils_bld=${CT_BUILD_DIR}/build-binutils
    2.83 -    binutils_src=${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}
    2.84 +    binutils_bld="${CT_BUILD_DIR}/build-binutils-host-${CT_HOST}"
    2.85 +    binutils_src="${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}"
    2.86  
    2.87      CT_DoLog EXTRA "Configuring elf2flt"
    2.88      CT_DoExecLog CFG                                            \
    2.89 -    CFLAGS="${CT_CFLAGS_FOR_HOST}"                              \
    2.90 +    CFLAGS="${host_cflags}"                                     \
    2.91      "${CT_SRC_DIR}/elf2flt-cvs-${CT_ELF2FLT_VERSION}/configure" \
    2.92          --build=${CT_BUILD}                                     \
    2.93 -        --host=${CT_HOST}                                       \
    2.94 +        --host=${host}                                          \
    2.95          --target=${CT_TARGET}                                   \
    2.96 -        --prefix=${CT_PREFIX_DIR}                               \
    2.97 +        --prefix=${prefix}                                      \
    2.98          --with-bfd-include-dir=${binutils_bld}/bfd              \
    2.99          --with-binutils-include-dir=${binutils_src}/include     \
   2.100          --with-libbfd=${binutils_bld}/bfd/libbfd.a              \
   2.101 @@ -56,25 +105,6 @@
   2.102  
   2.103      CT_DoLog EXTRA "Installing elf2flt"
   2.104      CT_DoExecLog ALL make install
   2.105 -
   2.106 -    # Make those new tools available to the core C compilers to come.
   2.107 -    # Note: some components want the ${TARGET}-{ar,as,ld,strip} commands as
   2.108 -    # well. Create that.
   2.109 -    # Don't do it for canadian or cross-native, because the binutils
   2.110 -    # are not executable on the build machine.
   2.111 -    case "${CT_TOOLCHAIN_TYPE}" in
   2.112 -        cross|native)
   2.113 -            mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin"
   2.114 -            mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/bin"
   2.115 -            for t in elf2flt flthdr; do
   2.116 -                ln -sv "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin/${t}"
   2.117 -                ln -sv "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" "${CT_BUILDTOOLS_PREFIX_DIR}/bin/${CT_TARGET}-${t}"
   2.118 -            done 2>&1 |CT_DoLog ALL
   2.119 -            ;;
   2.120 -        *)  ;;
   2.121 -    esac
   2.122 -
   2.123 -    CT_EndStep
   2.124  }
   2.125  
   2.126  fi # CT_ARCH_BINFMT_FLAT
     3.1 --- a/scripts/build/binutils/sstrip.sh	Sun Jul 17 18:28:19 2011 +0200
     3.2 +++ b/scripts/build/binutils/sstrip.sh	Sun Jul 17 18:29:35 2011 +0200
     3.3 @@ -1,8 +1,8 @@
     3.4  # This will build and install sstrip to run on host and sstrip target files
     3.5  
     3.6 -do_sstrip_get() { :; }
     3.7 -do_sstrip_extract() { :; }
     3.8 -do_sstrip() { :; }
     3.9 +do_sstrip_get()      { :; }
    3.10 +do_sstrip_extract()  { :; }
    3.11 +do_sstrip_for_host() { :; }
    3.12  
    3.13  if [ "${CT_SSTRIP}" = "y" ]; then
    3.14      do_sstrip_get() {
    3.15 @@ -19,11 +19,13 @@
    3.16          CT_DoExecLog DEBUG cp -v "${CT_TARBALLS_DIR}/sstrip.c" "${CT_SRC_DIR}/sstrip"
    3.17      }
    3.18  
    3.19 -    do_sstrip() {
    3.20 +    # Build sstrip for host -> target
    3.21 +    # Note: we don't need sstrip to run on the build machine,
    3.22 +    # so we do not need the frontend/backend stuff...
    3.23 +    do_sstrip_for_host() {
    3.24          local sstrip_cflags
    3.25 -        CT_DoStep INFO "Installing sstrip"
    3.26 -        mkdir -p "${CT_BUILD_DIR}/build-sstrip"
    3.27 -        cd "${CT_BUILD_DIR}/build-sstrip"
    3.28 +        CT_DoStep INFO "Installing sstrip for host"
    3.29 +        CT_mkdir_pushd "${CT_BUILD_DIR}/build-sstrip-host"
    3.30  
    3.31          if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
    3.32              sstrip_cflags="-static"
    3.33 @@ -35,6 +37,7 @@
    3.34          CT_DoLog EXTRA "Installing sstrip"
    3.35          CT_DoExecLog ALL install -m 755 sstrip "${CT_PREFIX_DIR}/bin/${CT_TARGET}-sstrip"
    3.36  
    3.37 +        CT_Popd
    3.38          CT_EndStep
    3.39      }
    3.40  fi
     4.1 --- a/steps.mk	Sun Jul 17 18:28:19 2011 +0200
     4.2 +++ b/steps.mk	Sun Jul 17 18:29:35 2011 +0200
     4.3 @@ -23,9 +23,9 @@
     4.4              cloog               \
     4.5              mpc                 \
     4.6              libelf              \
     4.7 -            binutils            \
     4.8 -            elf2flt             \
     4.9 -            sstrip              \
    4.10 +            binutils_for_host   \
    4.11 +            elf2flt_for_host    \
    4.12 +            sstrip_for_host     \
    4.13              cc_core_pass_1      \
    4.14              kernel_headers      \
    4.15              libc_start_files    \