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 build -> target
19 do_binutils_for_build() {
20 local -a binutils_opts
22 case "${CT_TOOLCHAIN_TYPE}" in
23 native|cross) return 0;;
26 CT_DoStep INFO "Installing binutils for build"
27 CT_mkdir_pushd "${CT_BUILD_DIR}/build-binutils-build-${CT_BUILD}"
29 binutils_opts+=( "host=${CT_BUILD}" )
30 binutils_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" )
32 do_binutils_backend "${binutils_opts[@]}"
38 # Build binutils for host -> target
39 do_binutils_for_host() {
40 local -a binutils_tools
41 local -a binutils_opts
43 CT_DoStep INFO "Installing binutils for host"
44 CT_mkdir_pushd "${CT_BUILD_DIR}/build-binutils-host-${CT_HOST}"
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}" )
52 do_binutils_backend "${binutils_opts[@]}"
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
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
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 ) ;;
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}"
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() {
98 local build_manuals=no
100 local -a extra_make_flags
102 local -a manuals_install
109 CT_DoLog EXTRA "Configuring binutils"
111 if [ "${CT_BINUTILS_HAS_GOLD}" = "y" ]; then
112 case "${CT_BINUTILS_LINKERS_LIST}" in
114 extra_config+=( --enable-ld=yes --enable-gold=no )
117 extra_config+=( --enable-ld=no --enable-gold=yes )
120 extra_config+=( --enable-ld=default --enable-gold=yes )
123 extra_config+=( --enable-ld=yes --enable-gold=default )
126 if [ "${CT_BINUTILS_GOLD_THREADS}" = "y" ]; then
127 extra_config+=( --enable-threads )
130 if [ "${CT_BINUTILS_PLUGINS}" = "y" ]; then
131 extra_config+=( --enable-plugins )
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}")
137 if [ "${CT_MULTILIB}" = "y" ]; then
138 extra_config+=("--enable-multilib")
140 extra_config+=("--disable-multilib")
143 [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
145 CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
149 CXXFLAGS="${cflags}" \
150 "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure" \
151 --build=${CT_BUILD} \
153 --target=${CT_TARGET} \
156 "${extra_config[@]}" \
157 ${CT_ARCH_WITH_FLOAT} \
158 ${BINUTILS_SYSROOT_ARG} \
159 "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
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
167 CT_DoLog EXTRA "Building binutils"
168 CT_DoExecLog ALL make "${extra_make_flags[@]}" ${JOBSFLAGS}
170 CT_DoLog EXTRA "Installing binutils"
171 CT_DoExecLog ALL make install
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 )
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[@]}"
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"
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
204 # Now on for the target libraries
205 do_binutils_for_target() {
206 local -a extra_config
208 local -a build_targets
209 local -a install_targets
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}")
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"
224 CT_DoLog EXTRA "Configuring binutils for target"
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}")
230 if [ "${CT_MULTILIB}" = "y" ]; then
231 extra_config+=("--enable-multilib")
233 extra_config+=("--disable-multilib")
236 [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
239 "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure" \
240 --build=${CT_BUILD} \
241 --host=${CT_TARGET} \
242 --target=${CT_TARGET} \
247 "${extra_config[@]}" \
248 ${CT_ARCH_WITH_FLOAT} \
249 "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
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[@]}"