scripts/build/binutils/binutils.sh
author "Yann E. MORIN" <yann.morin.1998@free.fr>
Sun May 11 15:43:28 2014 +0200 (2014-05-11)
changeset 3315 464128a8fc3f
parent 3290 bddc642fc8eb
child 3316 42590ff8521c
permissions -rw-r--r--
binutils/elf2flt: use alternate mirror

The official elf2flt upstream has disapeared.

Switch to a mirror.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.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     if [ "${CT_BINUTILS_CUSTOM}" = "y" ]; then
     8         CT_GetCustom "binutils" "${CT_BINUTILS_VERSION}" \
     9                      "${CT_BINUTILS_CUSTOM_LOCATION}"
    10     else
    11         CT_GetFile "binutils-${CT_BINUTILS_VERSION}"                                        \
    12                    {ftp,http}://{ftp.gnu.org/gnu,ftp.kernel.org/pub/linux/devel}/binutils   \
    13                    ftp://gcc.gnu.org/pub/binutils/{releases,snapshots}
    14     fi
    15 
    16     if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then
    17         CT_GetGit elf2flt "${CT_ELF2FLT_GIT_CSET}" git://wh0rd.org/elf2flt.git
    18     fi
    19 }
    20 
    21 # Extract binutils
    22 do_binutils_extract() {
    23     # If using custom directory location, nothing to do
    24     if [ "${CT_BINUTILS_CUSTOM}" = "y" \
    25          -a -d "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}" ]; then
    26         return 0
    27     fi
    28 
    29     CT_Extract "binutils-${CT_BINUTILS_VERSION}"
    30     CT_Patch "binutils" "${CT_BINUTILS_VERSION}"
    31 
    32     if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then
    33         CT_Extract "elf2flt-${CT_ELF2FLT_GIT_CSET}"
    34         CT_Patch "elf2flt" "${CT_ELF2FLT_GIT_CSET}"
    35     fi
    36 }
    37 
    38 # Build binutils for build -> target
    39 do_binutils_for_build() {
    40     local -a binutils_opts
    41 
    42     case "${CT_TOOLCHAIN_TYPE}" in
    43         native|cross)   return 0;;
    44     esac
    45 
    46     CT_DoStep INFO "Installing binutils for build"
    47     CT_mkdir_pushd "${CT_BUILD_DIR}/build-binutils-build-${CT_BUILD}"
    48 
    49     binutils_opts+=( "host=${CT_BUILD}" )
    50     binutils_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" )
    51     binutils_opts+=( "cflags=${CT_CFLAGS_FOR_BUILD}" )
    52     binutils_opts+=( "ldflags=${CT_LDFLAGS_FOR_BUILD}" )
    53 
    54     do_binutils_backend "${binutils_opts[@]}"
    55 
    56     CT_Popd
    57 
    58     if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then
    59         # We re-use binutils' options, plus our owns
    60         binutils_opts+=( "binutils_src=${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}" )
    61         binutils_opts+=( "binutils_bld=${CT_BUILD_DIR}/build-binutils-build-${CT_BUILD}" )
    62 
    63         CT_mkdir_pushd "${CT_BUILD_DIR}/build-elf2flt-build-${CT_BUILD}"
    64 
    65         do_elf2flt_backend "${binutils_opts[@]}"
    66 
    67         CT_Popd
    68     fi
    69 
    70     CT_EndStep
    71 }
    72 
    73 # Build binutils for host -> target
    74 do_binutils_for_host() {
    75     local -a binutils_tools
    76     local -a binutils_opts
    77 
    78     CT_DoStep INFO "Installing binutils for host"
    79     CT_mkdir_pushd "${CT_BUILD_DIR}/build-binutils-host-${CT_HOST}"
    80 
    81     binutils_opts+=( "host=${CT_HOST}" )
    82     binutils_opts+=( "prefix=${CT_PREFIX_DIR}" )
    83     binutils_opts+=( "static_build=${CT_STATIC_TOOLCHAIN}" )
    84     binutils_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
    85     binutils_opts+=( "ldflags=${CT_LDFLAGS_FOR_HOST}" )
    86     binutils_opts+=( "build_manuals=${CT_BUILD_MANUALS}" )
    87 
    88     do_binutils_backend "${binutils_opts[@]}"
    89 
    90     CT_Popd
    91 
    92     if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then
    93         # We re-use binutils' options, plus our owns
    94         binutils_opts+=( "binutils_src=${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}" )
    95         binutils_opts+=( "binutils_bld=${CT_BUILD_DIR}/build-binutils-host-${CT_HOST}" )
    96 
    97         CT_mkdir_pushd "${CT_BUILD_DIR}/build-elf2flt-host-${CT_HOST}"
    98 
    99         do_elf2flt_backend "${binutils_opts[@]}"
   100 
   101         CT_Popd
   102     fi
   103 
   104     # Make those new tools available to the core C compilers to come.
   105     # Note: some components want the ${TARGET}-{ar,as,ld,ranlib,strip} commands
   106     # as well. Create that.
   107     # Don't do it for canadian or cross-native, because the binutils
   108     # are not executable on the build machine.
   109     case "${CT_TOOLCHAIN_TYPE}" in
   110         cross|native)
   111             binutils_tools=( ar as ld ranlib strip )
   112             if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then
   113                 binutils_tools+=( elf2flt flthdr )
   114             fi
   115             case "${CT_BINUTILS_LINKERS_LIST}" in
   116                 ld)         binutils_tools+=( ld.bfd ) ;;
   117                 gold)       binutils_tools+=( ld.gold ) ;;
   118                 ld,gold)    binutils_tools+=( ld.bfd ld.gold ) ;;
   119                 gold,ld)    binutils_tools+=( ld.bfd ld.gold ) ;;
   120             esac
   121             mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin"
   122             mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/bin"
   123             for t in "${binutils_tools[@]}"; do
   124                 CT_DoExecLog ALL ln -sv                                         \
   125                                     "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}"    \
   126                                     "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin/${t}"
   127                 CT_DoExecLog ALL ln -sv                                         \
   128                                     "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}"    \
   129                                     "${CT_BUILDTOOLS_PREFIX_DIR}/bin/${CT_TARGET}-${t}"
   130             done
   131             ;;
   132         *)  ;;
   133     esac
   134 
   135     CT_EndStep
   136 }
   137 
   138 # Build binutils for X -> target
   139 #     Parameter     : description               : type      : default
   140 #     host          : machine to run on         : tuple     : (none)
   141 #     prefix        : prefix to install into    : dir       : (none)
   142 #     static_build  : build statcially          : bool      : no
   143 #     cflags        : cflags to use             : string    : (empty)
   144 #     ldflags       : ldflags to use            : string    : (empty)
   145 #     build_manuals : whether to build manuals  : bool      : no
   146 do_binutils_backend() {
   147     local host
   148     local prefix
   149     local static_build
   150     local cflags
   151     local ldflags
   152     local build_manuals=no
   153     local -a extra_config
   154     local -a extra_make_flags
   155     local -a manuals_for
   156     local -a manuals_install
   157     local arg
   158 
   159     for arg in "$@"; do
   160         eval "${arg// /\\ }"
   161     done
   162 
   163     CT_DoLog EXTRA "Configuring binutils"
   164 
   165     if [ "${CT_BINUTILS_HAS_GOLD}" = "y" ]; then
   166         case "${CT_BINUTILS_LINKERS_LIST}" in
   167             ld)
   168                 extra_config+=( --enable-ld=yes --enable-gold=no )
   169                 ;;
   170             gold)
   171                 extra_config+=( --enable-ld=no --enable-gold=yes )
   172                 ;;
   173             ld,gold)
   174                 extra_config+=( --enable-ld=default --enable-gold=yes )
   175                 ;;
   176             gold,ld)
   177                 extra_config+=( --enable-ld=yes --enable-gold=default )
   178                 ;;
   179         esac
   180         if [ "${CT_BINUTILS_GOLD_THREADS}" = "y" ]; then
   181             extra_config+=( --enable-threads )
   182         fi
   183     fi
   184     if [ "${CT_BINUTILS_PLUGINS}" = "y" ]; then
   185         extra_config+=( --enable-plugins )
   186     fi
   187     if [ "${CT_BINUTILS_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   188         extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   189         [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   190     fi
   191     if [ "${CT_MULTILIB}" = "y" ]; then
   192         extra_config+=("--enable-multilib")
   193     else
   194         extra_config+=("--disable-multilib")
   195     fi
   196 
   197     [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
   198 
   199     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
   200 
   201     CT_DoExecLog CFG                                            \
   202     CFLAGS="${cflags}"                                          \
   203     CXXFLAGS="${cflags}"                                        \
   204     LDFLAGS="${ldflags}"                                        \
   205     "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure"   \
   206         --build=${CT_BUILD}                                     \
   207         --host=${host}                                          \
   208         --target=${CT_TARGET}                                   \
   209         --prefix=${prefix}                                      \
   210         --disable-werror                                        \
   211         "${extra_config[@]}"                                    \
   212         ${CT_ARCH_WITH_FLOAT}                                   \
   213         ${BINUTILS_SYSROOT_ARG}                                 \
   214         "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
   215 
   216     if [ "${static_build}" = "y" ]; then
   217         extra_make_flags+=("LDFLAGS=-static -all-static")
   218         CT_DoLog EXTRA "Prepare binutils for static build"
   219         CT_DoExecLog ALL make ${JOBSFLAGS} configure-host
   220     fi
   221 
   222     CT_DoLog EXTRA "Building binutils"
   223     CT_DoExecLog ALL make "${extra_make_flags[@]}" ${JOBSFLAGS}
   224 
   225     CT_DoLog EXTRA "Installing binutils"
   226     CT_DoExecLog ALL make install
   227 
   228     if [ "${build_manuals}" = "y" ]; then
   229         CT_DoLog EXTRA "Building and installing the binutils manuals"
   230         manuals_for=( gas binutils ld gprof )
   231         if [ "${CT_BINUTILS_LINKER_GOLD}" = "y" ]; then
   232             manuals_for+=( gold )
   233         fi
   234         manuals_install=( "${manuals_for[@]/#/install-pdf-}" )
   235         manuals_install+=( "${manuals_for[@]/#/install-html-}" )
   236         CT_DoExecLog ALL make ${JOBSFLAGS} pdf html
   237         CT_DoExecLog ALL make "${manuals_install[@]}"
   238     fi
   239 
   240     # Install the wrapper if needed
   241     if [ "${CT_BINUTILS_LD_WRAPPER}" = "y" ]; then
   242         CT_DoLog EXTRA "Installing ld wrapper"
   243         rm -f "${prefix}/bin/${CT_TARGET}-ld"
   244         rm -f "${prefix}/${CT_TARGET}/bin/ld"
   245         sed -r -e "s/@@DEFAULT_LD@@/${CT_BINUTILS_LINKER_DEFAULT}/" \
   246             "${CT_LIB_DIR}/scripts/build/binutils/binutils-ld.in"   \
   247             >"${prefix}/bin/${CT_TARGET}-ld"
   248         chmod +x "${prefix}/bin/${CT_TARGET}-ld"
   249         cp -a "${prefix}/bin/${CT_TARGET}-ld"   \
   250               "${prefix}/${CT_TARGET}/bin/ld"
   251 
   252         # If needed, force using ld.bfd during the toolchain build
   253         if [ "${CT_BINUTILS_FORCE_LD_BFD}" = "y" ]; then
   254             export CTNG_LD_IS=bfd
   255         fi
   256     fi
   257 }
   258 
   259 # Build elf2flt for X -> target
   260 #     Parameter     : description               : type      : default
   261 #     host          : machine to run on         : tuple     : (none)
   262 #     prefix        : prefix to install into    : dir       : (none)
   263 #     static_build  : build statcially          : bool      : no
   264 #     cflags        : cflags to use             : string    : (empty)
   265 #     ldflags       : ldflags to use            : string    : (empty)
   266 #     binutils_src  : source dir of binutils    : dir       : (none)
   267 #     binutils_bld  : build dir of binutils     : dir       : (none)
   268 #     build_manuals : whether to build manuals  : bool      : no
   269 do_elf2flt_backend() {
   270     local host
   271     local prefix
   272     local static_build
   273     local cflags
   274     local ldflags
   275     local binutils_bld
   276     local binutils_src
   277     local build_manuals
   278     local arg
   279 
   280     for arg in "$@"; do
   281         eval "${arg// /\\ }"
   282     done
   283 
   284     CT_DoLog EXTRA "Configuring elf2flt"
   285     CT_DoExecLog CFG                                            \
   286     CFLAGS="${cflags}"                                          \
   287     LDFLAGS="${ldflags}"                                        \
   288     "${CT_SRC_DIR}/elf2flt-${CT_ELF2FLT_VERSION}/configure"     \
   289         --build=${CT_BUILD}                                     \
   290         --host=${host}                                          \
   291         --target=${CT_TARGET}                                   \
   292         --prefix=${prefix}                                      \
   293         --with-bfd-include-dir=${binutils_bld}/bfd              \
   294         --with-binutils-include-dir=${binutils_src}/include     \
   295         --with-libbfd=${binutils_bld}/bfd/libbfd.a              \
   296         --with-libiberty=${binutils_bld}/libiberty/libiberty.a  \
   297         ${elf2flt_opts}                                         \
   298         "${CT_ELF2FLT_EXTRA_CONFIG_ARRAY[@]}"
   299 
   300     CT_DoLog EXTRA "Building elf2flt"
   301     CT_DoExecLog ALL make ${JOBSFLAGS}
   302 
   303     CT_DoLog EXTRA "Installing elf2flt"
   304     CT_DoExecLog ALL make install
   305 }
   306 
   307 # Now on for the target libraries
   308 do_binutils_for_target() {
   309     local -a extra_config
   310     local -a targets
   311     local -a build_targets
   312     local -a install_targets
   313     local t
   314 
   315     [ "${CT_BINUTILS_FOR_TARGET_IBERTY}" = "y" ] && targets+=("libiberty")
   316     [ "${CT_BINUTILS_FOR_TARGET_BFD}"    = "y" ] && targets+=("bfd")
   317     for t in "${targets[@]}"; do
   318         build_targets+=("all-${t}")
   319         install_targets+=("install-${t}")
   320     done
   321 
   322     if [ "${#targets[@]}" -ne 0 ]; then
   323         CT_DoStep INFO "Installing binutils for target"
   324         mkdir -p "${CT_BUILD_DIR}/build-binutils-for-target"
   325         CT_Pushd "${CT_BUILD_DIR}/build-binutils-for-target"
   326 
   327         CT_DoLog EXTRA "Configuring binutils for target"
   328 
   329         if [ "${CT_BINUTILS_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   330             extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   331             [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   332         fi
   333         if [ "${CT_MULTILIB}" = "y" ]; then
   334             extra_config+=("--enable-multilib")
   335         else
   336             extra_config+=("--disable-multilib")
   337         fi
   338 
   339         [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
   340 
   341         CT_DoExecLog CFG                                            \
   342         "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure"   \
   343             --build=${CT_BUILD}                                     \
   344             --host=${CT_TARGET}                                     \
   345             --target=${CT_TARGET}                                   \
   346             --prefix=/usr                                           \
   347             --disable-werror                                        \
   348             --enable-shared                                         \
   349             --enable-static                                         \
   350             "${extra_config[@]}"                                    \
   351             ${CT_ARCH_WITH_FLOAT}                                   \
   352             "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
   353 
   354         CT_DoLog EXTRA "Building binutils' libraries (${targets[*]}) for target"
   355         CT_DoExecLog ALL make ${JOBSFLAGS} "${build_targets[@]}"
   356         CT_DoLog EXTRA "Installing binutils' libraries (${targets[*]}) for target"
   357         CT_DoExecLog ALL make DESTDIR="${CT_SYSROOT_DIR}" "${install_targets[@]}"
   358 
   359         CT_Popd
   360         CT_EndStep
   361     fi
   362 }