scripts/build/binutils/binutils.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jul 24 23:52:28 2011 +0200 (2011-07-24)
changeset 2928 3f70dd642d34
parent 2926 d304c8a7bfa8
child 3032 712a8ed22762
permissions -rw-r--r--
binutils: add frontends for building to run on the build machine

In canadian-cross, we need binutils running on the build machine to be
able to build the target C library.

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