scripts/addToolsVersion: properly handle .in vs. .in.2
While most components have their version in the .in file, some
have it in the .in.2 (eg. elf2flt).
Currently, to handle this case, we indiscriminately munge both files,
but this is wrong: in the elf2flt case, if we add a binutils version,
we do not want it to be added to elf2flt, and conversely.
So, for each tool, we need to explicitly know what file to munge.
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
1 # This file contains the functions common to glibc and eglibc
3 # Extract the C library tarball(s)
7 # Extract the main tarball
8 CT_Extract "${CT_LIBC}-${CT_LIBC_VERSION}"
9 CT_Pushd "${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
10 CT_Patch nochdir "${CT_LIBC}" "${CT_LIBC_VERSION}"
12 # Extract the add-opns
13 for addon in $(do_libc_add_ons_list " "); do
14 # If the addon was bundled with the main archive, we do not
15 # need to extract it. Worse, if we were to try to extract
16 # it, we'd get an error.
17 if [ -d "${addon}" ]; then
18 CT_DoLog DEBUG "Add-on already present, spkipping extraction"
22 CT_Extract nochdir "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
24 CT_TestAndAbort "Error in add-on '${addon}': both short and long names in tarball" \
25 -d "${addon}" -a -d "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
27 # Some addons have the 'long' name, while others have the
28 # 'short' name, but patches are non-uniformly built with
29 # either the 'long' or 'short' name, whatever the addons name
30 # but we prefer the 'short' name and avoid duplicates.
31 if [ -d "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" ]; then
32 CT_DoExecLog FILE mv "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" "${addon}"
35 CT_DoExecLog FILE ln -s "${addon}" "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
37 CT_Patch nochdir "${CT_LIBC}" "${addon}-${CT_LIBC_VERSION}"
39 # Remove the long name since it can confuse configure scripts to run
40 # the same source twice.
41 rm "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
44 # The configure files may be older than the configure.in files
45 # if using a snapshot (or even some tarballs). Fake them being
47 find . -type f -name configure -exec touch {} \; 2>&1 |CT_DoLog ALL
51 if [ "${CT_LIBC_LOCALES}" = "y" ]; then
52 do_libc_locales_extract
56 # Build and install headers and start files
57 do_libc_start_files() {
58 # Start files and Headers should be configured the same way as the
59 # final libc, but built and installed differently.
60 do_libc_backend libc_mode=startfiles
63 # This function builds and install the full C library
65 do_libc_backend libc_mode=final
68 # This backend builds the C library once for each multilib
69 # variant the compiler gives us
70 # Usage: do_libc_backend param=value [...]
71 # Parameter : Definition : Type : Default
72 # libc_mode : 'startfiles' or 'final' : string : (none)
80 local libc_headers libc_startfiles libc_full
88 case "${libc_mode}" in
90 CT_DoStep INFO "Installing C library headers & start files"
96 CT_DoStep INFO "Installing C library"
101 *) CT_Abort "Unsupported (or unset) libc_mode='${libc_mode}'";;
104 # If gcc is not configured for multilib, it still prints
105 # a single line for the default settings
106 multilibs=( $("${CT_TARGET}-gcc" -print-multi-lib 2>/dev/null) )
107 for multilib in "${multilibs[@]}"; do
108 multi_dir="${multilib%%;*}"
109 if [ "${multi_dir}" != "." ]; then
110 CT_DoStep INFO "Building for multilib subdir='${multi_dir}'"
112 extra_flags="$( echo "${multilib#*;}" \
113 |${sed} -r -e 's/@/ -/g;' \
115 extra_dir="/${multi_dir}"
117 # glibc install its files in ${extra_dir}/{usr/,}lib
118 # while gcc expects them in {,usr/}lib/${extra_dir}.
119 # Prepare some symlinks so glibc installs in fact in
121 # We do it in the start-files step, so it is not needed
122 # to do it in the final step, as the symlinks will
124 if [ "${libc_mode}" = "startfiles" ]; then
125 CT_Pushd "${CT_SYSROOT_DIR}"
126 CT_DoExecLog ALL mkdir -p "lib/${multi_dir}" \
127 "usr/lib/${multi_dir}" \
130 CT_DoExecLog ALL ln -sf "../lib/${multi_dir}" "${multi_dir}/lib"
131 CT_DoExecLog ALL ln -sf "../../usr/lib/${multi_dir}" "${multi_dir}/usr/lib"
138 libc_headers="${hdr}"
141 CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}"
143 do_libc_backend_once extra_dir="${extra_dir}" \
144 extra_flags="${extra_flags}" \
145 libc_headers="${libc_headers}" \
146 libc_startfiles="${libc_startfiles}" \
147 libc_full="${libc_full}"
151 if [ "${multi_dir}" != "." ]; then
152 if [ "${libc_mode}" = "final" ]; then
153 CT_DoLog EXTRA "Fixing up multilib location"
155 # rewrite the library multiplexers
156 for d in "lib/${multi_dir}" "usr/lib/${multi_dir}"; do
157 for l in libc libpthread libgcc_s; do
158 if [ -f "${CT_SYSROOT_DIR}/${d}/${l}.so" \
159 -a ! -L ${CT_SYSROOT_DIR}/${d}/${l}.so ]
161 CT_DoExecLog DEBUG ${sed} -r -i \
162 -e "s:/lib/:/lib/${multi_dir}/:g;" \
163 "${CT_SYSROOT_DIR}/${d}/${l}.so"
167 # Remove the multi_dir now it is no longer useful
168 CT_DoExecLog DEBUG rm -rf "${CT_SYSROOT_DIR}/${multi_dir}"
169 fi # libc_mode == final
178 # This backend builds the C library once
179 # Usage: do_libc_backend_once param=value [...]
180 # Parameter : Definition : Type : Default
181 # libc_headers : Build libc headers : bool : n
182 # libc_startfiles : Build libc start-files : bool : n
183 # libc_full : Build full libc : bool : n
184 # extra_flags : Extra CFLAGS to use (for multilib) : string : (empty)
185 # extra_dir : Extra subdir for multilib : string : (empty)
186 do_libc_backend_once() {
188 local libc_startfiles
192 local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
194 local -a extra_config
195 local -a extra_make_args
205 CT_DoLog EXTRA "Configuring C library"
209 if [ "${CT_EGLIBC_CUSTOM_CONFIG}" = "y" ]; then
210 CT_DoExecLog ALL cp "${CT_CONFIG_DIR}/eglibc.config" option-groups.config
212 if [ "${CT_EGLIBC_OPT_SIZE}" = "y" ]; then
217 # always include rpc, the user can still override it with TI-RPC
218 extra_config+=( --enable-obsolete-rpc )
221 # glibc can't be built without -O2 (reference needed!)
223 # Also, if those two are missing, iconv build breaks
224 extra_config+=( --disable-debug --disable-sanity-checks )
228 # Add some default glibc config options if not given by user.
229 # We don't need to be conditional on wether the user did set different
230 # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY is passed after
233 extra_config+=("$(do_libc_min_kernel_config)")
235 case "${CT_THREADS}" in
236 nptl) extra_config+=("--with-__thread" "--with-tls");;
237 linuxthreads) extra_config+=("--with-__thread" "--without-tls" "--without-nptl");;
238 none) extra_config+=("--without-__thread" "--without-nptl")
239 case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
241 *) extra_config+=("--without-tls");;
246 case "${CT_SHARED_LIBS}" in
247 y) extra_config+=("--enable-shared");;
248 *) extra_config+=("--disable-shared");;
251 float_extra="$( echo "${extra_flags}" \
252 |${sed} -r -e '/^(.*[[:space:]])?-m(hard|soft)-float([[:space:]].*)?$/!d;' \
255 case "${float_extra}" in
256 hard) extra_config+=("--with-fp");;
257 soft) extra_config+=("--without-fp");;
259 case "${CT_ARCH_FLOAT}" in
260 hard|softfp) extra_config+=("--with-fp");;
261 soft) extra_config+=("--without-fp");;
266 if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then
267 extra_config+=("--disable-versioning")
270 if [ "${CT_LIBC_OLDEST_ABI}" != "" ]; then
271 extra_config+=("--enable-oldest-abi=${CT_LIBC_OLDEST_ABI}")
274 case "$(do_libc_add_ons_list ,)" in
275 "") extra_config+=("--enable-add-ons=no");;
276 *) extra_config+=("--enable-add-ons=$(do_libc_add_ons_list ,)");;
279 extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
280 [ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
282 # Extract the endianness options if any
283 # This should cover all possible endianness options
284 # in gcc, but it is prone to bit-rot... :-(
285 endian_extra="$( echo "${extra_flags}" \
286 |${sed} -r -e '/^(.*[[:space:]])?-(E[BL]|m((big|little)(-endian)?|e?[bl]))([[:space:]].*)?$/!d;' \
289 case "${endian_extra}" in
290 EB|mbig-endian|mbig|meb|mb)
291 extra_cc_args="${extra_cc_args} ${endian_extra}"
293 EL|mlittle-endian|mlittle|mel|ml)
294 extra_cc_args="${extra_cc_args} ${endian_extra}"
296 "") extra_cc_args="${extra_cc_args} ${CT_ARCH_ENDIAN_OPT}"
301 if [ "${CT_LIBC_GLIBC_FORCE_UNWIND}" = "y" ]; then
302 echo "libc_cv_forced_unwind=yes" >>config.cache
303 echo "libc_cv_c_cleanup=yes" >>config.cache
306 # Pre-seed the configparms file with values from the config option
307 printf "${CT_LIBC_GLIBC_CONFIGPARMS}\n" > configparms
309 cross_cc=$(CT_Which "${CT_TARGET}-gcc")
310 extra_cc_args+=" ${extra_flags}"
312 case "${CT_LIBC_ENABLE_FORTIFIED_BUILD}" in
314 *) glibc_cflags+=" -U_FORTIFY_SOURCE";;
316 glibc_cflags+=" ${CT_TARGET_CFLAGS} ${OPTIMIZE} ${CT_LIBC_GLIBC_EXTRA_CFLAGS}"
318 # ./configure is mislead by our tools override wrapper for bash
319 # so just tell it where the real bash is _on_the_target_!
321 # - ${ac_cv_path_BASH_SHELL} is only used to set BASH_SHELL
322 # - ${BASH_SHELL} is only used to set BASH
323 # - ${BASH} is only used to set the shebang
324 # in two scripts to run on the target
325 # So we can safely bypass bash detection at compile time.
326 # Should this change in a future eglibc release, we'd better
327 # directly mangle the generated scripts _after_ they get built,
328 # or even after they get installed...
329 echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache
331 # Configure with --prefix the way we want it on the target...
332 # There are a whole lot of settings here. You'll probably want
333 # to read up on what they all mean, and customize a bit, possibly by setting GLIBC_EXTRA_CONFIG_ARRAY
334 # Compare these options with the ones used when installing the glibc headers above - they're different.
335 # Adding "--without-gd" option to avoid error "memusagestat.c:36:16: gd.h: No such file or directory"
336 # See also http://sources.redhat.com/ml/libc-alpha/2000-07/msg00024.html.
337 # Set BUILD_CC, or we won't be able to build datafiles
338 # Run explicitly through CONFIG_SHELL, or the build breaks badly (loop-of-death)
339 # when the shell is not bash... Sigh... :-(
341 CT_DoLog DEBUG "Using gcc for target : '${cross_cc}'"
342 CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
343 CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'"
344 CT_DoLog DEBUG "Extra CC args passed : '${glibc_cflags}'"
345 CT_DoLog DEBUG "Extra flags (multilib) : '${extra_flags}'"
348 BUILD_CC="${CT_BUILD}-gcc" \
349 CFLAGS="${glibc_cflags}" \
350 CC="${CT_TARGET}-gcc ${CT_LIBC_EXTRA_CC_ARGS} ${extra_cc_args}" \
352 RANLIB=${CT_TARGET}-ranlib \
354 "${src_dir}/configure" \
356 --build=${CT_BUILD} \
357 --host=${CT_TARGET} \
358 --cache-file="$(pwd)/config.cache" \
362 --with-headers="${CT_HEADERS_DIR}" \
363 "${extra_config[@]}" \
364 "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[@]}"
367 case "${CT_ARCH},${CT_ARCH_CPU}" in
369 # http://sourceware.org/ml/crossgcc/2008-10/msg00068.html
370 CT_DoLog DEBUG "Activating support for memset on broken ppc-8xx (CPU15 erratum)"
371 extra_make_args+=( ASFLAGS="-DBROKEN_PPC_8xx_CPU15" )
375 if [ "${libc_headers}" = "y" ]; then
376 CT_DoLog EXTRA "Installing C library headers"
378 # use the 'install-headers' makefile target to install the
380 CT_DoExecLog ALL make ${JOBSFLAGS} \
381 install_root=${CT_SYSROOT_DIR}${extra_dir} \
382 install-bootstrap-headers=yes \
383 "${extra_make_args[@]}" \
386 # For glibc, a few headers need to be manually installed
387 if [ "${CT_LIBC}" = "glibc" ]; then
388 # Two headers -- stubs.h and features.h -- aren't installed by install-headers,
389 # so do them by hand. We can tolerate an empty stubs.h for the moment.
390 # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html
391 mkdir -p "${CT_HEADERS_DIR}/gnu"
392 CT_DoExecLog ALL touch "${CT_HEADERS_DIR}/gnu/stubs.h"
393 CT_DoExecLog ALL cp -v "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/include/features.h" \
394 "${CT_HEADERS_DIR}/features.h"
396 # Building the bootstrap gcc requires either setting inhibit_libc, or
397 # having a copy of stdio_lim.h... see
398 # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html
399 CT_DoExecLog ALL cp -v bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h"
401 # Following error building gcc-4.0.0's gcj:
402 # error: bits/syscall.h: No such file or directory
403 # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html
404 # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html
407 *) CT_DoExecLog ALL cp -v "misc/syscall-list.h" \
408 "${CT_HEADERS_DIR}/bits/syscall.h"
412 fi # libc_headers == y
414 if [ "${libc_startfiles}" = "y" ]; then
415 if [ "${CT_THREADS}" = "nptl" ]; then
416 CT_DoLog EXTRA "Installing C library start files"
418 # there are a few object files needed to link shared libraries,
419 # which we build and install by hand
420 CT_DoExecLog ALL mkdir -p "${CT_SYSROOT_DIR}${extra_dir}/usr/lib"
421 CT_DoExecLog ALL make ${JOBSFLAGS} \
422 "${extra_make_args[@]}" \
424 CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o \
425 "${CT_SYSROOT_DIR}${extra_dir}/usr/lib"
427 # Finally, 'libgcc_s.so' requires a 'libc.so' to link against.
428 # However, since we will never actually execute its code,
429 # it doesn't matter what it contains. So, treating '/dev/null'
430 # as a C source file, we produce a dummy 'libc.so' in one step
431 CT_DoExecLog ALL "${cross_cc}" -nostdlib \
435 -o "${CT_SYSROOT_DIR}${extra_dir}/usr/lib/libc.so"
437 fi # libc_headers == y
439 if [ "${libc_full}" = "y" ]; then
440 CT_DoLog EXTRA "Building C library"
441 CT_DoExecLog ALL make ${JOBSFLAGS} \
442 "${extra_make_args[@]}" \
445 CT_DoLog EXTRA "Installing C library"
446 CT_DoExecLog ALL make ${JOBSFLAGS} \
447 "${extra_make_args[@]}" \
448 install_root="${CT_SYSROOT_DIR}${extra_dir}" \
451 if [ "${CT_BUILD_MANUALS}" = "y" ]; then
452 CT_DoLog EXTRA "Building and installing the C library manual"
453 # Omit JOBSFLAGS as GLIBC has problems building the
454 # manuals in parallel
455 CT_DoExecLog ALL make pdf html
456 # EGLIBC doesn't have a install-{pdf.html}, and older
457 # versions leave the manuals in the source directory
458 CT_DoExecLog ALL mkdir -p ${CT_PREFIX_DIR}/share/doc
459 if [ "${CT_LIBC_EGLIBC_2_16_or_later}" = "y" ]; then
460 CT_DoExecLog ALL cp -av manual/*.pdf manual/libc \
461 ${CT_PREFIX_DIR}/share/doc
463 CT_DoExecLog ALL cp -av ${src_dir}/manual/*.pdf ${src_dir}/manual/libc \
464 ${CT_PREFIX_DIR}/share/doc
468 if [ "${CT_LIBC_LOCALES}" = "y" ]; then
474 # This function finishes the C library install
480 # Build up the addons list, separated with $1
481 do_libc_add_ons_list() {
483 local addons_list="$( echo "${CT_LIBC_ADDONS_LIST}" \
484 |sed -r -e "s/[[:space:],]/${sep}/g;" \
486 case "${CT_THREADS}" in
488 *) addons_list="${addons_list}${sep}${CT_THREADS}";;
490 [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
491 # Remove duplicate, leading and trailing separators
492 echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;"
495 # Compute up the minimum supported Linux kernel version
496 do_libc_min_kernel_config() {
497 local min_kernel_config
499 case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
500 *--enable-kernel*) ;;
501 *) if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then
502 # We can't rely on the kernel version from the configuration,
503 # because it might not be available if the user uses pre-installed
504 # headers. On the other hand, both method will have the kernel
505 # version installed in "usr/include/linux/version.h" in the sysroot.
506 # Parse that instead of having two code-paths.
507 version_code_file="${CT_SYSROOT_DIR}/usr/include/linux/version.h"
508 if [ ! -f "${version_code_file}" -o ! -r "${version_code_file}" ]; then
509 CT_Abort "Linux version is unavailable in installed headers files"
511 version_code="$( grep -E LINUX_VERSION_CODE "${version_code_file}" \
514 version=$(((version_code>>16)&0xFF))
515 patchlevel=$(((version_code>>8)&0xFF))
516 sublevel=$((version_code&0xFF))
517 min_kernel_config="${version}.${patchlevel}.${sublevel}"
518 elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then
519 # Trim the fourth part of the linux version, keeping only the first three numbers
520 min_kernel_config="$( echo "${CT_LIBC_GLIBC_MIN_KERNEL_VERSION}" \
521 |sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;' \
524 echo "--enable-kernel=${min_kernel_config}"