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
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}
13 do_binutils_extract() {
14 CT_Extract "binutils-${CT_BINUTILS_VERSION}"
15 CT_Patch "binutils" "${CT_BINUTILS_VERSION}"
18 # Build binutils for host -> target
19 do_binutils_for_host() {
20 local -a binutils_tools
21 local -a binutils_opts
23 CT_DoStep INFO "Installing binutils for host"
24 CT_mkdir_pushd "${CT_BUILD_DIR}/build-binutils-host-${CT_HOST}"
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}" )
32 do_binutils_backend "${binutils_opts[@]}"
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
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
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 ) ;;
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}"
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() {
78 local build_manuals=no
80 local -a extra_make_flags
82 local -a manuals_install
89 CT_DoLog EXTRA "Configuring binutils"
91 if [ "${CT_BINUTILS_HAS_GOLD}" = "y" ]; then
92 case "${CT_BINUTILS_LINKERS_LIST}" in
94 extra_config+=( --enable-ld=yes --enable-gold=no )
97 extra_config+=( --enable-ld=no --enable-gold=yes )
100 extra_config+=( --enable-ld=default --enable-gold=yes )
103 extra_config+=( --enable-ld=yes --enable-gold=default )
106 if [ "${CT_BINUTILS_GOLD_THREADED}" = "y" ]; then
107 extra_config+=( --enable-threads )
110 if [ "${CT_BINUTILS_PLUGINS}" = "y" ]; then
111 extra_config+=( --enable-plugins )
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}")
117 if [ "${CT_MULTILIB}" = "y" ]; then
118 extra_config+=("--enable-multilib")
120 extra_config+=("--disable-multilib")
123 [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
125 CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
129 CXXFLAGS="${cflags}" \
130 "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure" \
131 --build=${CT_BUILD} \
133 --target=${CT_TARGET} \
136 "${extra_config[@]}" \
137 ${CT_ARCH_WITH_FLOAT} \
138 ${BINUTILS_SYSROOT_ARG} \
139 "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
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
147 CT_DoLog EXTRA "Building binutils"
148 CT_DoExecLog ALL make "${extra_make_flags[@]}" ${JOBSFLAGS}
150 CT_DoLog EXTRA "Installing binutils"
151 CT_DoExecLog ALL make install
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 )
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[@]}"
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"
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
184 # Now on for the target libraries
185 do_binutils_for_target() {
186 local -a extra_config
188 local -a build_targets
189 local -a install_targets
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}")
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"
204 CT_DoLog EXTRA "Configuring binutils for target"
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}")
210 if [ "${CT_MULTILIB}" = "y" ]; then
211 extra_config+=("--enable-multilib")
213 extra_config+=("--disable-multilib")
216 [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
219 "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure" \
220 --build=${CT_BUILD} \
221 --host=${CT_TARGET} \
222 --target=${CT_TARGET} \
227 "${extra_config[@]}" \
228 ${CT_ARCH_WITH_FLOAT} \
229 "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
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[@]}"