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
29 CT_Extract "binutils-${CT_BINUTILS_VERSION}"
30 CT_Patch "binutils" "${CT_BINUTILS_VERSION}"
32 if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then
33 CT_Extract "elf2flt-${CT_ELF2FLT_GIT_CSET}"
34 CT_Patch "elf2flt" "${CT_ELF2FLT_GIT_CSET}"
38 # Build binutils for build -> target
39 do_binutils_for_build() {
40 local -a binutils_opts
42 case "${CT_TOOLCHAIN_TYPE}" in
43 native|cross) return 0;;
46 CT_DoStep INFO "Installing binutils for build"
47 CT_mkdir_pushd "${CT_BUILD_DIR}/build-binutils-build-${CT_BUILD}"
49 binutils_opts+=( "host=${CT_BUILD}" )
50 binutils_opts+=( "prefix=${CT_BUILDTOOLS_PREFIX_DIR}" )
51 binutils_opts+=( "cflags=${CT_CFLAGS_FOR_BUILD}" )
52 binutils_opts+=( "ldflags=${CT_LDFLAGS_FOR_BUILD}" )
54 do_binutils_backend "${binutils_opts[@]}"
58 if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then
59 # We re-use binutils' options, plus our owns
60 binutils_opts+=( "binutils_src=${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}" )
61 binutils_opts+=( "binutils_bld=${CT_BUILD_DIR}/build-binutils-build-${CT_BUILD}" )
63 CT_mkdir_pushd "${CT_BUILD_DIR}/build-elf2flt-build-${CT_BUILD}"
65 do_elf2flt_backend "${binutils_opts[@]}"
73 # Build binutils for host -> target
74 do_binutils_for_host() {
75 local -a binutils_tools
76 local -a binutils_opts
78 CT_DoStep INFO "Installing binutils for host"
79 CT_mkdir_pushd "${CT_BUILD_DIR}/build-binutils-host-${CT_HOST}"
81 binutils_opts+=( "host=${CT_HOST}" )
82 binutils_opts+=( "prefix=${CT_PREFIX_DIR}" )
83 binutils_opts+=( "static_build=${CT_STATIC_TOOLCHAIN}" )
84 binutils_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
85 binutils_opts+=( "ldflags=${CT_LDFLAGS_FOR_HOST}" )
86 binutils_opts+=( "build_manuals=${CT_BUILD_MANUALS}" )
88 do_binutils_backend "${binutils_opts[@]}"
92 if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then
93 # We re-use binutils' options, plus our owns
94 binutils_opts+=( "binutils_src=${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}" )
95 binutils_opts+=( "binutils_bld=${CT_BUILD_DIR}/build-binutils-host-${CT_HOST}" )
97 CT_mkdir_pushd "${CT_BUILD_DIR}/build-elf2flt-host-${CT_HOST}"
99 do_elf2flt_backend "${binutils_opts[@]}"
104 # Make those new tools available to the core C compilers to come.
105 # Note: some components want the ${TARGET}-{ar,as,ld,ranlib,strip} commands
106 # as well. Create that.
107 # Don't do it for canadian or cross-native, because the binutils
108 # are not executable on the build machine.
109 case "${CT_TOOLCHAIN_TYPE}" in
111 binutils_tools=( ar as ld ranlib strip )
112 if [ -n "${CT_ARCH_BINFMT_FLAT}" ]; then
113 binutils_tools+=( elf2flt flthdr )
115 case "${CT_BINUTILS_LINKERS_LIST}" in
116 ld) binutils_tools+=( ld.bfd ) ;;
117 gold) binutils_tools+=( ld.gold ) ;;
118 ld,gold) binutils_tools+=( ld.bfd ld.gold ) ;;
119 gold,ld) binutils_tools+=( ld.bfd ld.gold ) ;;
121 mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin"
122 mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/bin"
123 for t in "${binutils_tools[@]}"; do
124 CT_DoExecLog ALL ln -sv \
125 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" \
126 "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin/${t}"
127 CT_DoExecLog ALL ln -sv \
128 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" \
129 "${CT_BUILDTOOLS_PREFIX_DIR}/bin/${CT_TARGET}-${t}"
138 # Build binutils for X -> target
139 # Parameter : description : type : default
140 # host : machine to run on : tuple : (none)
141 # prefix : prefix to install into : dir : (none)
142 # static_build : build statcially : bool : no
143 # cflags : cflags to use : string : (empty)
144 # ldflags : ldflags to use : string : (empty)
145 # build_manuals : whether to build manuals : bool : no
146 do_binutils_backend() {
152 local build_manuals=no
153 local -a extra_config
154 local -a extra_make_flags
156 local -a manuals_install
163 CT_DoLog EXTRA "Configuring binutils"
165 if [ "${CT_BINUTILS_HAS_GOLD}" = "y" ]; then
166 case "${CT_BINUTILS_LINKERS_LIST}" in
168 extra_config+=( --enable-ld=yes --enable-gold=no )
171 extra_config+=( --enable-ld=no --enable-gold=yes )
174 extra_config+=( --enable-ld=default --enable-gold=yes )
177 extra_config+=( --enable-ld=yes --enable-gold=default )
180 if [ "${CT_BINUTILS_GOLD_THREADS}" = "y" ]; then
181 extra_config+=( --enable-threads )
184 if [ "${CT_BINUTILS_PLUGINS}" = "y" ]; then
185 extra_config+=( --enable-plugins )
187 if [ "${CT_BINUTILS_HAS_PKGVERSION_BUGURL}" = "y" ]; then
188 extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
189 [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
191 if [ "${CT_MULTILIB}" = "y" ]; then
192 extra_config+=("--enable-multilib")
194 extra_config+=("--disable-multilib")
197 [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
199 CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
203 CXXFLAGS="${cflags}" \
204 LDFLAGS="${ldflags}" \
205 "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure" \
206 --build=${CT_BUILD} \
208 --target=${CT_TARGET} \
211 "${extra_config[@]}" \
212 ${CT_ARCH_WITH_FLOAT} \
213 ${BINUTILS_SYSROOT_ARG} \
214 "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
216 if [ "${static_build}" = "y" ]; then
217 extra_make_flags+=("LDFLAGS=-static -all-static")
218 CT_DoLog EXTRA "Prepare binutils for static build"
219 CT_DoExecLog ALL make ${JOBSFLAGS} configure-host
222 CT_DoLog EXTRA "Building binutils"
223 CT_DoExecLog ALL make "${extra_make_flags[@]}" ${JOBSFLAGS}
225 CT_DoLog EXTRA "Installing binutils"
226 CT_DoExecLog ALL make install
228 if [ "${build_manuals}" = "y" ]; then
229 CT_DoLog EXTRA "Building and installing the binutils manuals"
230 manuals_for=( gas binutils ld gprof )
231 if [ "${CT_BINUTILS_LINKER_GOLD}" = "y" ]; then
232 manuals_for+=( gold )
234 manuals_install=( "${manuals_for[@]/#/install-pdf-}" )
235 manuals_install+=( "${manuals_for[@]/#/install-html-}" )
236 CT_DoExecLog ALL make ${JOBSFLAGS} pdf html
237 CT_DoExecLog ALL make "${manuals_install[@]}"
240 # Install the wrapper if needed
241 if [ "${CT_BINUTILS_LD_WRAPPER}" = "y" ]; then
242 CT_DoLog EXTRA "Installing ld wrapper"
243 rm -f "${prefix}/bin/${CT_TARGET}-ld"
244 rm -f "${prefix}/${CT_TARGET}/bin/ld"
245 sed -r -e "s/@@DEFAULT_LD@@/${CT_BINUTILS_LINKER_DEFAULT}/" \
246 "${CT_LIB_DIR}/scripts/build/binutils/binutils-ld.in" \
247 >"${prefix}/bin/${CT_TARGET}-ld"
248 chmod +x "${prefix}/bin/${CT_TARGET}-ld"
249 cp -a "${prefix}/bin/${CT_TARGET}-ld" \
250 "${prefix}/${CT_TARGET}/bin/ld"
252 # If needed, force using ld.bfd during the toolchain build
253 if [ "${CT_BINUTILS_FORCE_LD_BFD}" = "y" ]; then
254 export CTNG_LD_IS=bfd
259 # Build elf2flt for X -> target
260 # Parameter : description : type : default
261 # host : machine to run on : tuple : (none)
262 # prefix : prefix to install into : dir : (none)
263 # static_build : build statcially : bool : no
264 # cflags : cflags to use : string : (empty)
265 # ldflags : ldflags to use : string : (empty)
266 # binutils_src : source dir of binutils : dir : (none)
267 # binutils_bld : build dir of binutils : dir : (none)
268 # build_manuals : whether to build manuals : bool : no
269 do_elf2flt_backend() {
284 CT_DoLog EXTRA "Configuring elf2flt"
287 LDFLAGS="${ldflags}" \
288 "${CT_SRC_DIR}/elf2flt-${CT_ELF2FLT_VERSION}/configure" \
289 --build=${CT_BUILD} \
291 --target=${CT_TARGET} \
293 --with-bfd-include-dir=${binutils_bld}/bfd \
294 --with-binutils-include-dir=${binutils_src}/include \
295 --with-libbfd=${binutils_bld}/bfd/libbfd.a \
296 --with-libiberty=${binutils_bld}/libiberty/libiberty.a \
298 "${CT_ELF2FLT_EXTRA_CONFIG_ARRAY[@]}"
300 CT_DoLog EXTRA "Building elf2flt"
301 CT_DoExecLog ALL make ${JOBSFLAGS}
303 CT_DoLog EXTRA "Installing elf2flt"
304 CT_DoExecLog ALL make install
307 # Now on for the target libraries
308 do_binutils_for_target() {
309 local -a extra_config
311 local -a build_targets
312 local -a install_targets
315 [ "${CT_BINUTILS_FOR_TARGET_IBERTY}" = "y" ] && targets+=("libiberty")
316 [ "${CT_BINUTILS_FOR_TARGET_BFD}" = "y" ] && targets+=("bfd")
317 for t in "${targets[@]}"; do
318 build_targets+=("all-${t}")
319 install_targets+=("install-${t}")
322 if [ "${#targets[@]}" -ne 0 ]; then
323 CT_DoStep INFO "Installing binutils for target"
324 mkdir -p "${CT_BUILD_DIR}/build-binutils-for-target"
325 CT_Pushd "${CT_BUILD_DIR}/build-binutils-for-target"
327 CT_DoLog EXTRA "Configuring binutils for target"
329 if [ "${CT_BINUTILS_HAS_PKGVERSION_BUGURL}" = "y" ]; then
330 extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
331 [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
333 if [ "${CT_MULTILIB}" = "y" ]; then
334 extra_config+=("--enable-multilib")
336 extra_config+=("--disable-multilib")
339 [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
342 "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure" \
343 --build=${CT_BUILD} \
344 --host=${CT_TARGET} \
345 --target=${CT_TARGET} \
350 "${extra_config[@]}" \
351 ${CT_ARCH_WITH_FLOAT} \
352 "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
354 CT_DoLog EXTRA "Building binutils' libraries (${targets[*]}) for target"
355 CT_DoExecLog ALL make ${JOBSFLAGS} "${build_targets[@]}"
356 CT_DoLog EXTRA "Installing binutils' libraries (${targets[*]}) for target"
357 CT_DoExecLog ALL make DESTDIR="${CT_SYSROOT_DIR}" "${install_targets[@]}"