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 if [ "${CT_BINUTILS_CUSTOM}" = "y" ]; then
8 CT_GetCustom "binutils" "${CT_BINUTILS_VERSION}" \
9 "${CT_BINUTILS_CUSTOM_LOCATION}"
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}
18 do_binutils_extract() {
19 # If using custom directory location, nothing to do
20 if [ "${CT_BINUTILS_CUSTOM}" = "y" \
21 -a -d "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}" ]; then
25 CT_Extract "binutils-${CT_BINUTILS_VERSION}"
26 CT_Patch "binutils" "${CT_BINUTILS_VERSION}"
29 # Build binutils for build -> target
30 do_binutils_for_build() {
31 local -a binutils_opts
33 case "${CT_TOOLCHAIN_TYPE}" in
34 native|cross) return 0;;
37 CT_DoStep INFO "Installing binutils for build"
38 CT_mkdir_pushd "${CT_BUILD_DIR}/build-binutils-build-${CT_BUILD}"
40 binutils_opts+=( "host=${CT_BUILD}" )
41 binutils_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" )
42 binutils_opts+=( "cflags=${CT_CFLAGS_FOR_BUILD}" )
43 binutils_opts+=( "ldflags=${CT_LDFLAGS_FOR_BUILD}" )
45 do_binutils_backend "${binutils_opts[@]}"
51 # Build binutils for host -> target
52 do_binutils_for_host() {
53 local -a binutils_tools
54 local -a binutils_opts
56 CT_DoStep INFO "Installing binutils for host"
57 CT_mkdir_pushd "${CT_BUILD_DIR}/build-binutils-host-${CT_HOST}"
59 binutils_opts+=( "host=${CT_HOST}" )
60 binutils_opts+=( "prefix=${CT_PREFIX_DIR}" )
61 binutils_opts+=( "static_build=${CT_STATIC_TOOLCHAIN}" )
62 binutils_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
63 binutils_opts+=( "ldflags=${CT_LDFLAGS_FOR_HOST}" )
64 binutils_opts+=( "build_manuals=${CT_BUILD_MANUALS}" )
66 do_binutils_backend "${binutils_opts[@]}"
68 # Make those new tools available to the core C compilers to come.
69 # Note: some components want the ${TARGET}-{ar,as,ld,strip} commands as
71 # Don't do it for canadian or cross-native, because the binutils
72 # are not executable on the build machine.
73 case "${CT_TOOLCHAIN_TYPE}" in
75 binutils_tools=( ar as ld strip )
76 case "${CT_BINUTILS_LINKERS_LIST}" in
77 ld) binutils_tools+=( ld.bfd ) ;;
78 gold) binutils_tools+=( ld.gold ) ;;
79 ld,gold) binutils_tools+=( ld.bfd ld.gold ) ;;
80 gold,ld) binutils_tools+=( ld.bfd ld.gold ) ;;
82 mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin"
83 mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/bin"
84 for t in "${binutils_tools[@]}"; do
85 CT_DoExecLog ALL ln -sv \
86 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" \
87 "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin/${t}"
88 CT_DoExecLog ALL ln -sv \
89 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" \
90 "${CT_BUILDTOOLS_PREFIX_DIR}/bin/${CT_TARGET}-${t}"
100 # Build binutils for X -> target
101 # Parameter : description : type : default
102 # host : machine to run on : tuple : (none)
103 # prefix : prefix to install into : dir : (none)
104 # static_build : build statcially : bool : no
105 # cflags : cflags to use : string : (empty)
106 # ldflags : ldflags to use : string : (empty)
107 # build_manuals : whether to build manuals : bool : no
108 do_binutils_backend() {
114 local build_manuals=no
115 local -a extra_config
116 local -a extra_make_flags
118 local -a manuals_install
125 CT_DoLog EXTRA "Configuring binutils"
127 if [ "${CT_BINUTILS_HAS_GOLD}" = "y" ]; then
128 case "${CT_BINUTILS_LINKERS_LIST}" in
130 extra_config+=( --enable-ld=yes --enable-gold=no )
133 extra_config+=( --enable-ld=no --enable-gold=yes )
136 extra_config+=( --enable-ld=default --enable-gold=yes )
139 extra_config+=( --enable-ld=yes --enable-gold=default )
142 if [ "${CT_BINUTILS_GOLD_THREADS}" = "y" ]; then
143 extra_config+=( --enable-threads )
146 if [ "${CT_BINUTILS_PLUGINS}" = "y" ]; then
147 extra_config+=( --enable-plugins )
149 if [ "${CT_BINUTILS_HAS_PKGVERSION_BUGURL}" = "y" ]; then
150 extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
151 [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
153 if [ "${CT_MULTILIB}" = "y" ]; then
154 extra_config+=("--enable-multilib")
156 extra_config+=("--disable-multilib")
159 [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
161 CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
165 CXXFLAGS="${cflags}" \
166 LDFLAGS="${ldflags}" \
167 "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure" \
168 --build=${CT_BUILD} \
170 --target=${CT_TARGET} \
173 "${extra_config[@]}" \
174 ${CT_ARCH_WITH_FLOAT} \
175 ${BINUTILS_SYSROOT_ARG} \
176 "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
178 if [ "${static_build}" = "y" ]; then
179 extra_make_flags+=("LDFLAGS=-static -all-static")
180 CT_DoLog EXTRA "Prepare binutils for static build"
181 CT_DoExecLog ALL make ${JOBSFLAGS} configure-host
184 CT_DoLog EXTRA "Building binutils"
185 CT_DoExecLog ALL make "${extra_make_flags[@]}" ${JOBSFLAGS}
187 CT_DoLog EXTRA "Installing binutils"
188 CT_DoExecLog ALL make install
190 if [ "${build_manuals}" = "y" ]; then
191 CT_DoLog EXTRA "Building and installing the binutils manuals"
192 manuals_for=( gas binutils ld gprof )
193 if [ "${CT_BINUTILS_LINKER_GOLD}" = "y" ]; then
194 manuals_for+=( gold )
196 manuals_install=( "${manuals_for[@]/#/install-pdf-}" )
197 manuals_install+=( "${manuals_for[@]/#/install-html-}" )
198 CT_DoExecLog ALL make ${JOBSFLAGS} pdf html
199 CT_DoExecLog ALL make "${manuals_install[@]}"
202 # Install the wrapper if needed
203 if [ "${CT_BINUTILS_LD_WRAPPER}" = "y" ]; then
204 CT_DoLog EXTRA "Installing ld wrapper"
205 rm -f "${prefix}/bin/${CT_TARGET}-ld"
206 rm -f "${prefix}/${CT_TARGET}/bin/ld"
207 sed -r -e "s/@@DEFAULT_LD@@/${CT_BINUTILS_LINKER_DEFAULT}/" \
208 "${CT_LIB_DIR}/scripts/build/binutils/binutils-ld.in" \
209 >"${prefix}/bin/${CT_TARGET}-ld"
210 chmod +x "${prefix}/bin/${CT_TARGET}-ld"
211 cp -a "${prefix}/bin/${CT_TARGET}-ld" \
212 "${prefix}/${CT_TARGET}/bin/ld"
214 # If needed, force using ld.bfd during the toolchain build
215 if [ "${CT_BINUTILS_FORCE_LD_BFD}" = "y" ]; then
216 export CTNG_LD_IS=bfd
221 # Now on for the target libraries
222 do_binutils_for_target() {
223 local -a extra_config
225 local -a build_targets
226 local -a install_targets
229 [ "${CT_BINUTILS_FOR_TARGET_IBERTY}" = "y" ] && targets+=("libiberty")
230 [ "${CT_BINUTILS_FOR_TARGET_BFD}" = "y" ] && targets+=("bfd")
231 for t in "${targets[@]}"; do
232 build_targets+=("all-${t}")
233 install_targets+=("install-${t}")
236 if [ "${#targets[@]}" -ne 0 ]; then
237 CT_DoStep INFO "Installing binutils for target"
238 mkdir -p "${CT_BUILD_DIR}/build-binutils-for-target"
239 CT_Pushd "${CT_BUILD_DIR}/build-binutils-for-target"
241 CT_DoLog EXTRA "Configuring binutils for target"
243 if [ "${CT_BINUTILS_HAS_PKGVERSION_BUGURL}" = "y" ]; then
244 extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
245 [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
247 if [ "${CT_MULTILIB}" = "y" ]; then
248 extra_config+=("--enable-multilib")
250 extra_config+=("--disable-multilib")
253 [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
256 "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure" \
257 --build=${CT_BUILD} \
258 --host=${CT_TARGET} \
259 --target=${CT_TARGET} \
264 "${extra_config[@]}" \
265 ${CT_ARCH_WITH_FLOAT} \
266 "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
268 CT_DoLog EXTRA "Building binutils' libraries (${targets[*]}) for target"
269 CT_DoExecLog ALL make ${JOBSFLAGS} "${build_targets[@]}"
270 CT_DoLog EXTRA "Installing binutils' libraries (${targets[*]}) for target"
271 CT_DoExecLog ALL make DESTDIR="${CT_SYSROOT_DIR}" "${install_targets[@]}"