scripts/build/binutils/binutils.sh
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jul 17 22:43:07 2011 +0200 (2011-07-17)
changeset 2893 a8a65758664f
parent 2804 8946dd980d9e
child 2906 af58fa8b5caa
permissions -rw-r--r--
cc/gcc: do not use the core pass-2 to build the baremetal compiler

In case we build a baremetal compiler, use the standard passes:
- core_cc is used to build the C library;
- as such, it is meant to run on build, not host;
- the final compiler is meant to run on host;

As the current final compiler step can not build a baremetal compiler,
call the core backend from the final step.

NB: Currently, newlib is built during the start_files pass, so we have
to have a core compiler by then... Once we can build the baremetal
compiler from the final cc step, then we can move the newlib build to
the proper step, and then get rid of the core pass-1 static compiler...

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
    19 do_binutils() {
    20     local -a extra_config
    21     local -a extra_make_flags
    22     local -a binutils_tools
    23     local -a manuals_for
    24     local -a manuals_install
    25 
    26     mkdir -p "${CT_BUILD_DIR}/build-binutils"
    27     cd "${CT_BUILD_DIR}/build-binutils"
    28 
    29     CT_DoStep INFO "Installing binutils"
    30 
    31     CT_DoLog EXTRA "Configuring binutils"
    32 
    33     binutils_tools=( ar as ld strip )
    34     if [ "${CT_BINUTILS_HAS_GOLD}" = "y" ]; then
    35         case "${CT_BINUTILS_LINKERS_LIST}" in
    36             ld)
    37                 extra_config+=( --enable-ld=yes --enable-gold=no )
    38                 binutils_tools+=( ld.bfd )
    39                 ;;
    40             gold)
    41                 extra_config+=( --enable-ld=no --enable-gold=yes )
    42                 binutils_tools+=( ld.gold )
    43                 ;;
    44             ld,gold)
    45                 extra_config+=( --enable-ld=default --enable-gold=yes )
    46                 binutils_tools+=( ld.bfd ld.gold )
    47                 ;;
    48             gold,ld)
    49                 extra_config+=( --enable-ld=yes --enable-gold=default )
    50                 binutils_tools+=( ld.bfd ld.gold )
    51                 ;;
    52         esac
    53         if [ "${CT_BINUTILS_GOLD_THREADED}" = "y" ]; then
    54             extra_config+=( --enable-threads )
    55         fi
    56     fi
    57     if [ "${CT_BINUTILS_PLUGINS}" = "y" ]; then
    58         extra_config+=( --enable-plugins )
    59     fi
    60     if [ "${CT_BINUTILS_HAS_PKGVERSION_BUGURL}" = "y" ]; then
    61         extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
    62         [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
    63     fi
    64     if [ "${CT_MULTILIB}" = "y" ]; then
    65         extra_config+=("--enable-multilib")
    66     else
    67         extra_config+=("--disable-multilib")
    68     fi
    69 
    70     [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
    71 
    72     CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
    73 
    74     CT_DoExecLog CFG                                            \
    75     CFLAGS="${CT_CFLAGS_FOR_HOST}"                              \
    76     CXXFLAGS="${CT_CFLAGS_FOR_HOST}"                            \
    77     "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure"   \
    78         --build=${CT_BUILD}                                     \
    79         --host=${CT_HOST}                                       \
    80         --target=${CT_TARGET}                                   \
    81         --prefix=${CT_PREFIX_DIR}                               \
    82         --disable-werror                                        \
    83         "${extra_config[@]}"                                    \
    84         ${CT_ARCH_WITH_FLOAT}                                   \
    85         ${BINUTILS_SYSROOT_ARG}                                 \
    86         "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
    87 
    88     if [ "${CT_STATIC_TOOLCHAIN}" = "y" ]; then
    89         extra_make_flags+=("LDFLAGS=-static -all-static")
    90         CT_DoLog EXTRA "Prepare binutils for static build"
    91         CT_DoExecLog ALL make ${JOBSFLAGS} configure-host
    92     fi
    93 
    94     CT_DoLog EXTRA "Building binutils"
    95     CT_DoExecLog ALL make "${extra_make_flags[@]}" ${JOBSFLAGS}
    96 
    97     CT_DoLog EXTRA "Installing binutils"
    98     CT_DoExecLog ALL make install
    99 
   100     if [ "${CT_BUILD_MANUALS}" = "y" ]; then
   101         CT_DoLog EXTRA "Building and installing the binutils manuals"
   102         manuals_for=( gas binutils ld gprof )
   103         if [ "${CT_BINUTILS_LINKER_GOLD}" = "y" ]; then
   104             manuals_for+=( gold )
   105         fi
   106         manuals_install=( "${manuals_for[@]/#/install-pdf-}" )
   107         manuals_install+=( "${manuals_for[@]/#/install-html-}" )
   108         CT_DoExecLog ALL make ${JOBSFLAGS} pdf html
   109         CT_DoExecLog ALL make "${manuals_install[@]}"
   110     fi
   111 
   112     # Install the wrapper if needed
   113     if [ "${CT_BINUTILS_LD_WRAPPER}" = "y" ]; then
   114         CT_DoLog EXTRA "Installing ld wrapper"
   115         rm -f "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ld"
   116         rm -f "${CT_PREFIX_DIR}/${CT_TARGET}/bin/ld"
   117         sed -r -e "s/@@DEFAULT_LD@@/${CT_BINUTILS_LINKER_DEFAULT}/" \
   118             "${CT_LIB_DIR}/scripts/build/binutils/binutils-ld.in"   \
   119             >"${CT_PREFIX_DIR}/bin/${CT_TARGET}-ld"
   120         chmod +x "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ld"
   121         cp -a "${CT_PREFIX_DIR}/bin/${CT_TARGET}-ld"    \
   122               "${CT_PREFIX_DIR}/${CT_TARGET}/bin/ld"
   123 
   124         # If needed, force using ld.bfd during the toolchain build
   125         if [ "${CT_BINUTILS_FORCE_LD_BFD}" = "y" ]; then
   126             export CTNG_LD_IS=bfd
   127         fi
   128     fi
   129 
   130     # Make those new tools available to the core C compilers to come.
   131     # Note: some components want the ${TARGET}-{ar,as,ld,strip} commands as
   132     # well. Create that.
   133     mkdir -p "${CT_CC_CORE_STATIC_PREFIX_DIR}/${CT_TARGET}/bin"
   134     mkdir -p "${CT_CC_CORE_STATIC_PREFIX_DIR}/bin"
   135     mkdir -p "${CT_CC_CORE_SHARED_PREFIX_DIR}/${CT_TARGET}/bin"
   136     mkdir -p "${CT_CC_CORE_SHARED_PREFIX_DIR}/bin"
   137     for t in "${binutils_tools[@]}"; do
   138         ln -sv "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" "${CT_CC_CORE_STATIC_PREFIX_DIR}/${CT_TARGET}/bin/${t}"
   139         ln -sv "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" "${CT_CC_CORE_STATIC_PREFIX_DIR}/bin/${CT_TARGET}-${t}"
   140         ln -sv "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" "${CT_CC_CORE_SHARED_PREFIX_DIR}/${CT_TARGET}/bin/${t}"
   141         ln -sv "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" "${CT_CC_CORE_SHARED_PREFIX_DIR}/bin/${CT_TARGET}-${t}"
   142     done 2>&1 |CT_DoLog ALL
   143 
   144     CT_EndStep
   145 }
   146 
   147 # Now on for the target libraries
   148 do_binutils_target() {
   149     local -a extra_config
   150     local -a targets
   151     local -a build_targets
   152     local -a install_targets
   153     local t
   154 
   155     [ "${CT_BINUTILS_FOR_TARGET_IBERTY}" = "y" ] && targets+=("libiberty")
   156     [ "${CT_BINUTILS_FOR_TARGET_BFD}"    = "y" ] && targets+=("bfd")
   157     for t in "${targets[@]}"; do
   158         build_targets+=("all-${t}")
   159         install_targets+=("install-${t}")
   160     done
   161 
   162     if [ "${#targets[@]}" -ne 0 ]; then
   163         CT_DoStep INFO "Installing binutils for target"
   164         mkdir -p "${CT_BUILD_DIR}/build-binutils-for-target"
   165         CT_Pushd "${CT_BUILD_DIR}/build-binutils-for-target"
   166 
   167         CT_DoLog EXTRA "Configuring binutils for target"
   168 
   169         if [ "${CT_BINUTILS_HAS_PKGVERSION_BUGURL}" = "y" ]; then
   170             extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
   171             [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
   172         fi
   173         if [ "${CT_MULTILIB}" = "y" ]; then
   174             extra_config+=("--enable-multilib")
   175         else
   176             extra_config+=("--disable-multilib")
   177         fi
   178 
   179         [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
   180 
   181         CT_DoExecLog CFG                                            \
   182         "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure"   \
   183             --build=${CT_BUILD}                                     \
   184             --host=${CT_TARGET}                                     \
   185             --target=${CT_TARGET}                                   \
   186             --prefix=/usr                                           \
   187             --disable-werror                                        \
   188             --enable-shared                                         \
   189             --enable-static                                         \
   190             "${extra_config[@]}"                                    \
   191             ${CT_ARCH_WITH_FLOAT}                                   \
   192             "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
   193 
   194         CT_DoLog EXTRA "Building binutils' libraries (${targets[*]}) for target"
   195         CT_DoExecLog ALL make ${JOBSFLAGS} "${build_targets[@]}"
   196         CT_DoLog EXTRA "Installing binutils' libraries (${targets[*]}) for target"
   197         CT_DoExecLog ALL make DESTDIR="${CT_SYSROOT_DIR}" "${install_targets[@]}"
   198 
   199         CT_Popd
   200         CT_EndStep
   201     fi
   202 }