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