scripts/build/binutils/binutils.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jul 17 18:29:35 2011 +0200 (2011-07-17)
changeset 2926 d304c8a7bfa8
parent 2924 0eab838768b1
child 2928 3f70dd642d34
permissions -rw-r--r--
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>
     1 # This file adds functions to build binutils
     2 # Copyright 2007 Yann E. MORIN
     3 # Licensed under the GPL v2. See COPYING in the root of this package
     4 
     5 # Download binutils
     6 do_binutils_get() {
     7     CT_GetFile "binutils-${CT_BINUTILS_VERSION}"                                        \
     8                {ftp,http}://{ftp.gnu.org/gnu,ftp.kernel.org/pub/linux/devel}/binutils   \
     9                ftp://gcc.gnu.org/pub/binutils/{releases,snapshots}
    10 }
    11 
    12 # Extract binutils
    13 do_binutils_extract() {
    14     CT_Extract "binutils-${CT_BINUTILS_VERSION}"
    15     CT_Patch "binutils" "${CT_BINUTILS_VERSION}"
    16 }
    17 
    18 # Build binutils for host -> target
    19 do_binutils_for_host() {
    20     local -a binutils_tools
    21     local -a binutils_opts
    22 
    23     CT_DoStep INFO "Installing binutils for host"
    24     CT_mkdir_pushd "${CT_BUILD_DIR}/build-binutils-host-${CT_HOST}"
    25 
    26     binutils_opts+=( "host=${CT_HOST}" )
    27     binutils_opts+=( "prefix=${CT_PREFIX_DIR}" )
    28     binutils_opts+=( "static_build=${CT_STATIC_TOOLCHAIN}" )
    29     binutils_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
    30     binutils_opts+=( "build_manuals=${CT_BUILD_MANUALS}" )
    31 
    32     do_binutils_backend "${binutils_opts[@]}"
    33 
    34     # Make those new tools available to the core C compilers to come.
    35     # Note: some components want the ${TARGET}-{ar,as,ld,strip} commands as
    36     # well. Create that.
    37     # Don't do it for canadian or cross-native, because the binutils
    38     # are not executable on the build machine.
    39     case "${CT_TOOLCHAIN_TYPE}" in
    40         cross|native)
    41             binutils_tools=( ar as ld strip )
    42             case "${CT_BINUTILS_LINKERS_LIST}" in
    43                 ld)         binutils_tools+=( ld.bfd ) ;;
    44                 gold)       binutils_tools+=( ld.gold ) ;;
    45                 ld,gold)    binutils_tools+=( ld.bfd ld.gold ) ;;
    46                 gold,ld)    binutils_tools+=( ld.bfd ld.gold ) ;;
    47             esac
    48             mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin"
    49             mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/bin"
    50             for t in "${binutils_tools[@]}"; do
    51                 CT_DoExecLog ALL ln -sv                                         \
    52                                     "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}"    \
    53                                     "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin/${t}"
    54                 CT_DoExecLog ALL ln -sv                                         \
    55                                     "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}"    \
    56                                     "${CT_BUILDTOOLS_PREFIX_DIR}/bin/${CT_TARGET}-${t}"
    57             done
    58             ;;
    59         *)  ;;
    60     esac
    61 
    62     CT_Popd
    63     CT_EndStep
    64 }
    65 
    66 # Build binutils for X -> target
    67 #     Parameter     : description               : type      : default
    68 #     host          : machine to run on         : tuple     : (none)
    69 #     prefix        : prefix to install into    : dir       : (none)
    70 #     static_build  : build statcially          : bool      : no
    71 #     cflags        : host cflags to use        : string    : (empty)
    72 #     build_manuals : whether to build manuals  : bool      : no
    73 do_binutils_backend() {
    74     local host
    75     local prefix
    76     local static_build
    77     local cflags
    78     local build_manuals=no
    79     local -a extra_config
    80     local -a extra_make_flags
    81     local -a manuals_for
    82     local -a manuals_install
    83     local arg
    84 
    85     for arg in "$@"; do
    86         eval "${arg// /\\ }"
    87     done
    88 
    89     CT_DoLog EXTRA "Configuring binutils"
    90 
    91     if [ "${CT_BINUTILS_HAS_GOLD}" = "y" ]; then
    92         case "${CT_BINUTILS_LINKERS_LIST}" in
    93             ld)
    94                 extra_config+=( --enable-ld=yes --enable-gold=no )
    95                 ;;
    96             gold)
    97                 extra_config+=( --enable-ld=no --enable-gold=yes )
    98                 ;;
    99             ld,gold)
   100                 extra_config+=( --enable-ld=default --enable-gold=yes )
   101                 ;;
   102             gold,ld)
   103                 extra_config+=( --enable-ld=yes --enable-gold=default )
   104                 ;;
   105         esac
   106         if [ "${CT_BINUTILS_GOLD_THREADED}" = "y" ]; then
   107             extra_config+=( --enable-threads )
   108         fi
   109     fi
   110     if [ "${CT_BINUTILS_PLUGINS}" = "y" ]; then
   111         extra_config+=( --enable-plugins )
   112     fi
   113     if [ "${CT_BINUTILS_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   114         extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   115         [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   116     fi
   117     if [ "${CT_MULTILIB}" = "y" ]; then
   118         extra_config+=("--enable-multilib")
   119     else
   120         extra_config+=("--disable-multilib")
   121     fi
   122 
   123     [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
   124 
   125     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   126 
   127     CT_DoExecLog CFG                                            \
   128     CFLAGS="${cflags}"                                          \
   129     CXXFLAGS="${cflags}"                                        \
   130     "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure"   \
   131         --build=${CT_BUILD}                                     \
   132         --host=${host}                                          \
   133         --target=${CT_TARGET}                                   \
   134         --prefix=${prefix}                                      \
   135         --disable-werror                                        \
   136         "${extra_config[@]}"                                    \
   137         ${CT_ARCH_WITH_FLOAT}                                   \
   138         ${BINUTILS_SYSROOT_ARG}                                 \
   139         "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
   140 
   141     if [ "${static_build}" = "y" ]; then
   142         extra_make_flags+=("LDFLAGS=-static -all-static")
   143         CT_DoLog EXTRA "Prepare binutils for static build"
   144         CT_DoExecLog ALL make ${JOBSFLAGS} configure-host
   145     fi
   146 
   147     CT_DoLog EXTRA "Building binutils"
   148     CT_DoExecLog ALL make "${extra_make_flags[@]}" ${JOBSFLAGS}
   149 
   150     CT_DoLog EXTRA "Installing binutils"
   151     CT_DoExecLog ALL make install
   152 
   153     if [ "${build_manuals}" = "y" ]; then
   154         CT_DoLog EXTRA "Building and installing the binutils manuals"
   155         manuals_for=( gas binutils ld gprof )
   156         if [ "${CT_BINUTILS_LINKER_GOLD}" = "y" ]; then
   157             manuals_for+=( gold )
   158         fi
   159         manuals_install=( "${manuals_for[@]/#/install-pdf-}" )
   160         manuals_install+=( "${manuals_for[@]/#/install-html-}" )
   161         CT_DoExecLog ALL make ${JOBSFLAGS} pdf html
   162         CT_DoExecLog ALL make "${manuals_install[@]}"
   163     fi
   164 
   165     # Install the wrapper if needed
   166     if [ "${CT_BINUTILS_LD_WRAPPER}" = "y" ]; then
   167         CT_DoLog EXTRA "Installing ld wrapper"
   168         rm -f "${prefix}/bin/${CT_TARGET}-ld"
   169         rm -f "${prefix}/${CT_TARGET}/bin/ld"
   170         sed -r -e "s/@@DEFAULT_LD@@/${CT_BINUTILS_LINKER_DEFAULT}/" \
   171             "${CT_LIB_DIR}/scripts/build/binutils/binutils-ld.in"   \
   172             >"${prefix}/bin/${CT_TARGET}-ld"
   173         chmod +x "${prefix}/bin/${CT_TARGET}-ld"
   174         cp -a "${prefix}/bin/${CT_TARGET}-ld"   \
   175               "${prefix}/${CT_TARGET}/bin/ld"
   176 
   177         # If needed, force using ld.bfd during the toolchain build
   178         if [ "${CT_BINUTILS_FORCE_LD_BFD}" = "y" ]; then
   179             export CTNG_LD_IS=bfd
   180         fi
   181     fi
   182 }
   183 
   184 # Now on for the target libraries
   185 do_binutils_for_target() {
   186     local -a extra_config
   187     local -a targets
   188     local -a build_targets
   189     local -a install_targets
   190     local t
   191 
   192     [ "${CT_BINUTILS_FOR_TARGET_IBERTY}" = "y" ] && targets+=("libiberty")
   193     [ "${CT_BINUTILS_FOR_TARGET_BFD}"    = "y" ] && targets+=("bfd")
   194     for t in "${targets[@]}"; do
   195         build_targets+=("all-${t}")
   196         install_targets+=("install-${t}")
   197     done
   198 
   199     if [ "${#targets[@]}" -ne 0 ]; then
   200         CT_DoStep INFO "Installing binutils for target"
   201         mkdir -p "${CT_BUILD_DIR}/build-binutils-for-target"
   202         CT_Pushd "${CT_BUILD_DIR}/build-binutils-for-target"
   203 
   204         CT_DoLog EXTRA "Configuring binutils for target"
   205 
   206         if [ "${CT_BINUTILS_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   207             extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   208             [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   209         fi
   210         if [ "${CT_MULTILIB}" = "y" ]; then
   211             extra_config+=("--enable-multilib")
   212         else
   213             extra_config+=("--disable-multilib")
   214         fi
   215 
   216         [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
   217 
   218         CT_DoExecLog CFG                                            \
   219         "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure"   \
   220             --build=${CT_BUILD}                                     \
   221             --host=${CT_TARGET}                                     \
   222             --target=${CT_TARGET}                                   \
   223             --prefix=/usr                                           \
   224             --disable-werror                                        \
   225             --enable-shared                                         \
   226             --enable-static                                         \
   227             "${extra_config[@]}"                                    \
   228             ${CT_ARCH_WITH_FLOAT}                                   \
   229             "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
   230 
   231         CT_DoLog EXTRA "Building binutils' libraries (${targets[*]}) for target"
   232         CT_DoExecLog ALL make ${JOBSFLAGS} "${build_targets[@]}"
   233         CT_DoLog EXTRA "Installing binutils' libraries (${targets[*]}) for target"
   234         CT_DoExecLog ALL make DESTDIR="${CT_SYSROOT_DIR}" "${install_targets[@]}"
   235 
   236         CT_Popd
   237         CT_EndStep
   238     fi
   239 }