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}
16 if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then
17 CT_GetGit elf2flt "${CT_ELF2FLT_GIT_CSET}" git://wh0rd.org/elf2flt.git
22 do_binutils_extract() {
23 # If using custom directory location, nothing to do
24 if ! [ "${CT_BINUTILS_CUSTOM}" = "y" \
25 -a -d "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}" ]; then
26 CT_Extract "binutils-${CT_BINUTILS_VERSION}"
27 CT_Patch "binutils" "${CT_BINUTILS_VERSION}"
30 if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then
31 CT_Extract "elf2flt-${CT_ELF2FLT_GIT_CSET}"
32 CT_Patch "elf2flt" "${CT_ELF2FLT_GIT_CSET}"
36 # Build binutils for build -> target
37 do_binutils_for_build() {
38 local -a binutils_opts
40 case "${CT_TOOLCHAIN_TYPE}" in
41 native|cross) return 0;;
44 CT_DoStep INFO "Installing binutils for build"
45 CT_mkdir_pushd "${CT_BUILD_DIR}/build-binutils-build-${CT_BUILD}"
47 binutils_opts+=( "host=${CT_BUILD}" )
48 binutils_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" )
49 binutils_opts+=( "cflags=${CT_CFLAGS_FOR_BUILD}" )
50 binutils_opts+=( "ldflags=${CT_LDFLAGS_FOR_BUILD}" )
52 do_binutils_backend "${binutils_opts[@]}"
56 if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then
57 # We re-use binutils' options, plus our owns
58 binutils_opts+=( "binutils_src=${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}" )
59 binutils_opts+=( "binutils_bld=${CT_BUILD_DIR}/build-binutils-build-${CT_BUILD}" )
61 CT_mkdir_pushd "${CT_BUILD_DIR}/build-elf2flt-build-${CT_BUILD}"
63 do_elf2flt_backend "${binutils_opts[@]}"
71 # Build binutils for host -> target
72 do_binutils_for_host() {
73 local -a binutils_tools
74 local -a binutils_opts
76 CT_DoStep INFO "Installing binutils for host"
77 CT_mkdir_pushd "${CT_BUILD_DIR}/build-binutils-host-${CT_HOST}"
79 binutils_opts+=( "host=${CT_HOST}" )
80 binutils_opts+=( "prefix=${CT_PREFIX_DIR}" )
81 binutils_opts+=( "static_build=${CT_STATIC_TOOLCHAIN}" )
82 binutils_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
83 binutils_opts+=( "ldflags=${CT_LDFLAGS_FOR_HOST}" )
84 binutils_opts+=( "build_manuals=${CT_BUILD_MANUALS}" )
86 do_binutils_backend "${binutils_opts[@]}"
90 if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then
91 # We re-use binutils' options, plus our owns
92 binutils_opts+=( "binutils_src=${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}" )
93 binutils_opts+=( "binutils_bld=${CT_BUILD_DIR}/build-binutils-host-${CT_HOST}" )
95 CT_mkdir_pushd "${CT_BUILD_DIR}/build-elf2flt-host-${CT_HOST}"
97 do_elf2flt_backend "${binutils_opts[@]}"
102 # Make those new tools available to the core C compilers to come.
103 # Note: some components want the ${TARGET}-{ar,as,ld,ranlib,strip} commands
104 # as well. Create that.
105 # Don't do it for canadian or cross-native, because the binutils
106 # are not executable on the build machine.
107 case "${CT_TOOLCHAIN_TYPE}" in
109 binutils_tools=( ar as ld ranlib strip )
110 if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then
111 binutils_tools+=( elf2flt flthdr )
113 case "${CT_BINUTILS_LINKERS_LIST}" in
114 ld) binutils_tools+=( ld.bfd ) ;;
115 gold) binutils_tools+=( ld.gold ) ;;
116 ld,gold) binutils_tools+=( ld.bfd ld.gold ) ;;
117 gold,ld) binutils_tools+=( ld.bfd ld.gold ) ;;
119 mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin"
120 mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/bin"
121 for t in "${binutils_tools[@]}"; do
122 CT_DoExecLog ALL ln -sv \
123 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" \
124 "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin/${t}"
125 CT_DoExecLog ALL ln -sv \
126 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" \
127 "${CT_BUILDTOOLS_PREFIX_DIR}/bin/${CT_TARGET}-${t}"
136 # Build binutils for X -> target
137 # Parameter : description : type : default
138 # host : machine to run on : tuple : (none)
139 # prefix : prefix to install into : dir : (none)
140 # static_build : build statcially : bool : no
141 # cflags : cflags to use : string : (empty)
142 # ldflags : ldflags to use : string : (empty)
143 # build_manuals : whether to build manuals : bool : no
144 do_binutils_backend() {
150 local build_manuals=no
151 local -a extra_config
152 local -a extra_make_flags
154 local -a manuals_install
161 CT_DoLog EXTRA "Configuring binutils"
163 if [ "${CT_BINUTILS_HAS_GOLD}" = "y" ]; then
164 case "${CT_BINUTILS_LINKERS_LIST}" in
166 extra_config+=( --enable-ld=yes --enable-gold=no )
169 extra_config+=( --enable-ld=no --enable-gold=yes )
172 extra_config+=( --enable-ld=default --enable-gold=yes )
175 extra_config+=( --enable-ld=yes --enable-gold=default )
178 if [ "${CT_BINUTILS_GOLD_THREADS}" = "y" ]; then
179 extra_config+=( --enable-threads )
182 if [ "${CT_BINUTILS_PLUGINS}" = "y" ]; then
183 extra_config+=( --enable-plugins )
185 if [ "${CT_BINUTILS_HAS_PKGVERSION_BUGURL}" = "y" ]; then
186 extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
187 [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
189 if [ "${CT_MULTILIB}" = "y" ]; then
190 extra_config+=("--enable-multilib")
192 extra_config+=("--disable-multilib")
195 [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
197 CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
201 CXXFLAGS="${cflags}" \
202 LDFLAGS="${ldflags}" \
203 "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure" \
204 --build=${CT_BUILD} \
206 --target=${CT_TARGET} \
209 "${extra_config[@]}" \
210 ${CT_ARCH_WITH_FLOAT} \
211 ${BINUTILS_SYSROOT_ARG} \
212 "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
214 if [ "${static_build}" = "y" ]; then
215 extra_make_flags+=("LDFLAGS=-static -all-static")
216 CT_DoLog EXTRA "Prepare binutils for static build"
217 CT_DoExecLog ALL make ${JOBSFLAGS} configure-host
220 CT_DoLog EXTRA "Building binutils"
221 CT_DoExecLog ALL make "${extra_make_flags[@]}" ${JOBSFLAGS}
223 CT_DoLog EXTRA "Installing binutils"
224 CT_DoExecLog ALL make install
226 if [ "${build_manuals}" = "y" ]; then
227 CT_DoLog EXTRA "Building and installing the binutils manuals"
228 manuals_for=( gas binutils ld gprof )
229 if [ "${CT_BINUTILS_LINKER_GOLD}" = "y" ]; then
230 manuals_for+=( gold )
232 manuals_install=( "${manuals_for[@]/#/install-pdf-}" )
233 manuals_install+=( "${manuals_for[@]/#/install-html-}" )
234 CT_DoExecLog ALL make ${JOBSFLAGS} pdf html
235 CT_DoExecLog ALL make "${manuals_install[@]}"
238 # Install the wrapper if needed
239 if [ "${CT_BINUTILS_LD_WRAPPER}" = "y" ]; then
240 CT_DoLog EXTRA "Installing ld wrapper"
241 rm -f "${prefix}/bin/${CT_TARGET}-ld"
242 rm -f "${prefix}/${CT_TARGET}/bin/ld"
243 sed -r -e "s/@@DEFAULT_LD@@/${CT_BINUTILS_LINKER_DEFAULT}/" \
244 "${CT_LIB_DIR}/scripts/build/binutils/binutils-ld.in" \
245 >"${prefix}/bin/${CT_TARGET}-ld"
246 chmod +x "${prefix}/bin/${CT_TARGET}-ld"
247 cp -a "${prefix}/bin/${CT_TARGET}-ld" \
248 "${prefix}/${CT_TARGET}/bin/ld"
250 # If needed, force using ld.bfd during the toolchain build
251 if [ "${CT_BINUTILS_FORCE_LD_BFD}" = "y" ]; then
252 export CTNG_LD_IS=bfd
257 # Build elf2flt for X -> target
258 # Parameter : description : type : default
259 # host : machine to run on : tuple : (none)
260 # prefix : prefix to install into : dir : (none)
261 # static_build : build statcially : bool : no
262 # cflags : cflags to use : string : (empty)
263 # ldflags : ldflags to use : string : (empty)
264 # binutils_src : source dir of binutils : dir : (none)
265 # binutils_bld : build dir of binutils : dir : (none)
266 # build_manuals : whether to build manuals : bool : no
267 do_elf2flt_backend() {
282 CT_DoLog EXTRA "Configuring elf2flt"
285 LDFLAGS="${ldflags}" \
286 "${CT_SRC_DIR}/elf2flt-${CT_ELF2FLT_VERSION}/configure" \
287 --build=${CT_BUILD} \
289 --target=${CT_TARGET} \
291 --with-bfd-include-dir=${binutils_bld}/bfd \
292 --with-binutils-include-dir=${binutils_src}/include \
293 --with-libbfd=${binutils_bld}/bfd/libbfd.a \
294 --with-libiberty=${binutils_bld}/libiberty/libiberty.a \
296 "${CT_ELF2FLT_EXTRA_CONFIG_ARRAY[@]}"
298 CT_DoLog EXTRA "Building elf2flt"
299 CT_DoExecLog ALL make ${JOBSFLAGS}
301 CT_DoLog EXTRA "Installing elf2flt"
302 CT_DoExecLog ALL make install
305 # Now on for the target libraries
306 do_binutils_for_target() {
307 local -a extra_config
309 local -a build_targets
310 local -a install_targets
313 [ "${CT_BINUTILS_FOR_TARGET_IBERTY}" = "y" ] && targets+=("libiberty")
314 [ "${CT_BINUTILS_FOR_TARGET_BFD}" = "y" ] && targets+=("bfd")
315 for t in "${targets[@]}"; do
316 build_targets+=("all-${t}")
317 install_targets+=("install-${t}")
320 if [ "${#targets[@]}" -ne 0 ]; then
321 CT_DoStep INFO "Installing binutils for target"
322 mkdir -p "${CT_BUILD_DIR}/build-binutils-for-target"
323 CT_Pushd "${CT_BUILD_DIR}/build-binutils-for-target"
325 CT_DoLog EXTRA "Configuring binutils for target"
327 if [ "${CT_BINUTILS_HAS_PKGVERSION_BUGURL}" = "y" ]; then
328 extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
329 [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
331 if [ "${CT_MULTILIB}" = "y" ]; then
332 extra_config+=("--enable-multilib")
334 extra_config+=("--disable-multilib")
337 [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
340 "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure" \
341 --build=${CT_BUILD} \
342 --host=${CT_TARGET} \
343 --target=${CT_TARGET} \
348 "${extra_config[@]}" \
349 ${CT_ARCH_WITH_FLOAT} \
350 "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
352 CT_DoLog EXTRA "Building binutils' libraries (${targets[*]}) for target"
353 CT_DoExecLog ALL make ${JOBSFLAGS} "${build_targets[@]}"
354 CT_DoLog EXTRA "Installing binutils' libraries (${targets[*]}) for target"
355 CT_DoExecLog ALL make DESTDIR="${CT_SYSROOT_DIR}" "${install_targets[@]}"