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}" )
43 do_binutils_backend "${binutils_opts[@]}"
49 # Build binutils for host -> target
50 do_binutils_for_host() {
51 local -a binutils_tools
52 local -a binutils_opts
54 CT_DoStep INFO "Installing binutils for host"
55 CT_mkdir_pushd "${CT_BUILD_DIR}/build-binutils-host-${CT_HOST}"
57 binutils_opts+=( "host=${CT_HOST}" )
58 binutils_opts+=( "prefix=${CT_PREFIX_DIR}" )
59 binutils_opts+=( "static_build=${CT_STATIC_TOOLCHAIN}" )
60 binutils_opts+=( "cflags=${CT_CFLAGS_FOR_HOST}" )
61 binutils_opts+=( "build_manuals=${CT_BUILD_MANUALS}" )
63 do_binutils_backend "${binutils_opts[@]}"
65 # Make those new tools available to the core C compilers to come.
66 # Note: some components want the ${TARGET}-{ar,as,ld,strip} commands as
68 # Don't do it for canadian or cross-native, because the binutils
69 # are not executable on the build machine.
70 case "${CT_TOOLCHAIN_TYPE}" in
72 binutils_tools=( ar as ld strip )
73 case "${CT_BINUTILS_LINKERS_LIST}" in
74 ld) binutils_tools+=( ld.bfd ) ;;
75 gold) binutils_tools+=( ld.gold ) ;;
76 ld,gold) binutils_tools+=( ld.bfd ld.gold ) ;;
77 gold,ld) binutils_tools+=( ld.bfd ld.gold ) ;;
79 mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin"
80 mkdir -p "${CT_BUILDTOOLS_PREFIX_DIR}/bin"
81 for t in "${binutils_tools[@]}"; do
82 CT_DoExecLog ALL ln -sv \
83 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" \
84 "${CT_BUILDTOOLS_PREFIX_DIR}/${CT_TARGET}/bin/${t}"
85 CT_DoExecLog ALL ln -sv \
86 "${CT_PREFIX_DIR}/bin/${CT_TARGET}-${t}" \
87 "${CT_BUILDTOOLS_PREFIX_DIR}/bin/${CT_TARGET}-${t}"
97 # Build binutils for X -> target
98 # Parameter : description : type : default
99 # host : machine to run on : tuple : (none)
100 # prefix : prefix to install into : dir : (none)
101 # static_build : build statcially : bool : no
102 # cflags : host cflags to use : string : (empty)
103 # build_manuals : whether to build manuals : bool : no
104 do_binutils_backend() {
109 local build_manuals=no
110 local -a extra_config
111 local -a extra_make_flags
113 local -a manuals_install
120 CT_DoLog EXTRA "Configuring binutils"
122 if [ "${CT_BINUTILS_HAS_GOLD}" = "y" ]; then
123 case "${CT_BINUTILS_LINKERS_LIST}" in
125 extra_config+=( --enable-ld=yes --enable-gold=no )
128 extra_config+=( --enable-ld=no --enable-gold=yes )
131 extra_config+=( --enable-ld=default --enable-gold=yes )
134 extra_config+=( --enable-ld=yes --enable-gold=default )
137 if [ "${CT_BINUTILS_GOLD_THREADS}" = "y" ]; then
138 extra_config+=( --enable-threads )
141 if [ "${CT_BINUTILS_PLUGINS}" = "y" ]; then
142 extra_config+=( --enable-plugins )
144 if [ "${CT_BINUTILS_HAS_PKGVERSION_BUGURL}" = "y" ]; then
145 extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
146 [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
148 if [ "${CT_MULTILIB}" = "y" ]; then
149 extra_config+=("--enable-multilib")
151 extra_config+=("--disable-multilib")
154 [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
156 CT_DoLog DEBUG "Extra config passed: '${extra_config[*]}'"
160 CXXFLAGS="${cflags}" \
161 "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure" \
162 --build=${CT_BUILD} \
164 --target=${CT_TARGET} \
167 "${extra_config[@]}" \
168 ${CT_ARCH_WITH_FLOAT} \
169 ${BINUTILS_SYSROOT_ARG} \
170 "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
172 if [ "${static_build}" = "y" ]; then
173 extra_make_flags+=("LDFLAGS=-static -all-static")
174 CT_DoLog EXTRA "Prepare binutils for static build"
175 CT_DoExecLog ALL make ${JOBSFLAGS} configure-host
178 CT_DoLog EXTRA "Building binutils"
179 CT_DoExecLog ALL make "${extra_make_flags[@]}" ${JOBSFLAGS}
181 CT_DoLog EXTRA "Installing binutils"
182 CT_DoExecLog ALL make install
184 if [ "${build_manuals}" = "y" ]; then
185 CT_DoLog EXTRA "Building and installing the binutils manuals"
186 manuals_for=( gas binutils ld gprof )
187 if [ "${CT_BINUTILS_LINKER_GOLD}" = "y" ]; then
188 manuals_for+=( gold )
190 manuals_install=( "${manuals_for[@]/#/install-pdf-}" )
191 manuals_install+=( "${manuals_for[@]/#/install-html-}" )
192 CT_DoExecLog ALL make ${JOBSFLAGS} pdf html
193 CT_DoExecLog ALL make "${manuals_install[@]}"
196 # Install the wrapper if needed
197 if [ "${CT_BINUTILS_LD_WRAPPER}" = "y" ]; then
198 CT_DoLog EXTRA "Installing ld wrapper"
199 rm -f "${prefix}/bin/${CT_TARGET}-ld"
200 rm -f "${prefix}/${CT_TARGET}/bin/ld"
201 sed -r -e "s/@@DEFAULT_LD@@/${CT_BINUTILS_LINKER_DEFAULT}/" \
202 "${CT_LIB_DIR}/scripts/build/binutils/binutils-ld.in" \
203 >"${prefix}/bin/${CT_TARGET}-ld"
204 chmod +x "${prefix}/bin/${CT_TARGET}-ld"
205 cp -a "${prefix}/bin/${CT_TARGET}-ld" \
206 "${prefix}/${CT_TARGET}/bin/ld"
208 # If needed, force using ld.bfd during the toolchain build
209 if [ "${CT_BINUTILS_FORCE_LD_BFD}" = "y" ]; then
210 export CTNG_LD_IS=bfd
215 # Now on for the target libraries
216 do_binutils_for_target() {
217 local -a extra_config
219 local -a build_targets
220 local -a install_targets
223 [ "${CT_BINUTILS_FOR_TARGET_IBERTY}" = "y" ] && targets+=("libiberty")
224 [ "${CT_BINUTILS_FOR_TARGET_BFD}" = "y" ] && targets+=("bfd")
225 for t in "${targets[@]}"; do
226 build_targets+=("all-${t}")
227 install_targets+=("install-${t}")
230 if [ "${#targets[@]}" -ne 0 ]; then
231 CT_DoStep INFO "Installing binutils for target"
232 mkdir -p "${CT_BUILD_DIR}/build-binutils-for-target"
233 CT_Pushd "${CT_BUILD_DIR}/build-binutils-for-target"
235 CT_DoLog EXTRA "Configuring binutils for target"
237 if [ "${CT_BINUTILS_HAS_PKGVERSION_BUGURL}" = "y" ]; then
238 extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
239 [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
241 if [ "${CT_MULTILIB}" = "y" ]; then
242 extra_config+=("--enable-multilib")
244 extra_config+=("--disable-multilib")
247 [ "${CT_TOOLCHAIN_ENABLE_NLS}" != "y" ] && extra_config+=("--disable-nls")
250 "${CT_SRC_DIR}/binutils-${CT_BINUTILS_VERSION}/configure" \
251 --build=${CT_BUILD} \
252 --host=${CT_TARGET} \
253 --target=${CT_TARGET} \
258 "${extra_config[@]}" \
259 ${CT_ARCH_WITH_FLOAT} \
260 "${CT_BINUTILS_EXTRA_CONFIG_ARRAY[@]}"
262 CT_DoLog EXTRA "Building binutils' libraries (${targets[*]}) for target"
263 CT_DoExecLog ALL make ${JOBSFLAGS} "${build_targets[@]}"
264 CT_DoLog EXTRA "Installing binutils' libraries (${targets[*]}) for target"
265 CT_DoExecLog ALL make DESTDIR="${CT_SYSROOT_DIR}" "${install_targets[@]}"