1.1 --- a/scripts/build/libc/glibc-eglibc.sh-common Tue Nov 22 00:51:37 2011 +0100
1.2 +++ b/scripts/build/libc/glibc-eglibc.sh-common Wed Nov 23 00:11:36 2011 +0100
1.3 @@ -65,12 +65,105 @@
1.4 do_libc_backend libc_mode=final
1.5 }
1.6
1.7 +# This backend builds the C library once for each multilib
1.8 +# variant the compiler gives us
1.9 # Usage: do_libc_backend param=value [...]
1.10 # Parameter : Definition : Type : Default
1.11 # libc_mode : 'startfiles' or 'final' : string : (none)
1.12 +do_libc_backend() {
1.13 + local libc_mode
1.14 + local -a multilibs
1.15 + local multilib
1.16 + local multi_dir
1.17 + local multi_flags
1.18 + local extra_dir
1.19 + local arg f fn ln pre
1.20 +
1.21 + for arg in "$@"; do
1.22 + eval "${arg// /\\ }"
1.23 + done
1.24 +
1.25 + case "${libc_mode}" in
1.26 + startfiles) CT_DoStep INFO "Installing C library headers & start files";;
1.27 + final) CT_DoStep INFO "Installing C library";;
1.28 + *) CT_Abort "Unsupported (or unset) libc_mode='${libc_mode}'";;
1.29 + esac
1.30 +
1.31 + # If gcc is not configured for multilib, it still prints
1.32 + # a single line for the default settings
1.33 + multilibs=( $("${CT_TARGET}-gcc" -print-multi-lib 2>/dev/null) )
1.34 + for multilib in "${multilibs[@]}"; do
1.35 + multi_dir="${multilib%%;*}"
1.36 + if [ "${multi_dir}" != "." ]; then
1.37 + CT_DoStep INFO "Building for multilib subdir='${multi_dir}'"
1.38 +
1.39 + extra_flags="$( echo "${multilib#*;}" \
1.40 + |${sed} -r -e 's/@/ -/g;' \
1.41 + )"
1.42 + extra_dir="/${multi_dir}"
1.43 +
1.44 + # glibc install its files in ${extra_dir}/{usr/,}lib
1.45 + # while gcc expects them in {,usr/}lib/${extra_dir}.
1.46 + # Prepare some symlinks so glibc installs in fact in
1.47 + # the proper place
1.48 + # We do it in the start-files step, so it is not needed
1.49 + # to do it in the final step, as the symlinks will
1.50 + # already exist
1.51 + if [ "${libc_mode}" = "startfiles" ]; then
1.52 + CT_Pushd "${CT_SYSROOT_DIR}"
1.53 + CT_DoExecLog ALL mkdir -p "lib/${multi_dir}" \
1.54 + "usr/lib/${multi_dir}" \
1.55 + "${multi_dir}" \
1.56 + "${multi_dir}/usr"
1.57 + CT_DoExecLog ALL ln -sf "../lib/${multi_dir}" "${multi_dir}/lib"
1.58 + CT_DoExecLog ALL ln -sf "../../usr/lib/${multi_dir}" "${multi_dir}/usr/lib"
1.59 + CT_Popd
1.60 + fi
1.61 + else
1.62 + extra_dir=
1.63 + extra_flags=
1.64 + fi
1.65 +
1.66 + mkdir -p "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}"
1.67 + CT_Pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}"
1.68 +
1.69 + do_libc_backend_once extra_dir="${extra_dir}" \
1.70 + extra_flags="${extra_flags}" \
1.71 + "$@"
1.72 +
1.73 + CT_Popd
1.74 +
1.75 + if [ "${multi_dir}" != "." ]; then
1.76 + if [ "${libc_mode}" = "final" ]; then
1.77 + CT_DoLog EXTRA "Fixing up multilib location"
1.78 +
1.79 + # rewrite the library multiplexers
1.80 + for d in "lib/${multi_dir}" "usr/lib/${multi_dir}"; do
1.81 + for l in libc libpthread libgcc_s; do
1.82 + if [ -f "${CT_SYSROOT_DIR}/${d}/${l}.so" \
1.83 + -a ! -L ${CT_SYSROOT_DIR}/${d}/${l}.so ]
1.84 + then
1.85 + CT_DoExecLog DEBUG ${sed} -r -i \
1.86 + -e "s:/lib/:/lib/${multi_dir}/:g;" \
1.87 + "${CT_SYSROOT_DIR}/${d}/${l}.so"
1.88 + fi
1.89 + done
1.90 + done
1.91 + fi # libc_mode == final
1.92 + CT_EndStep
1.93 + fi
1.94 + done
1.95 +
1.96 + CT_EndStep
1.97 +}
1.98 +
1.99 +# This backend builds the C library once
1.100 +# Usage: do_libc_backend_once param=value [...]
1.101 +# Parameter : Definition : Type : Default
1.102 +# libc_mode : 'startfiles' or 'final' : string : (none)
1.103 # extra_flags : Extra CFLAGS to use (for multilib) : string : (empty)
1.104 # extra_dir : Extra subdir for multilib : string : (empty)
1.105 -do_libc_backend() {
1.106 +do_libc_backend_once() {
1.107 local libc_mode
1.108 local extra_flags
1.109 local extra_dir
1.110 @@ -87,14 +180,6 @@
1.111 shift
1.112 done
1.113
1.114 - case "${libc_mode}" in
1.115 - startfiles) CT_DoStep INFO "Installing C library headers & start files";;
1.116 - final) CT_DoStep INFO "Installing C library";;
1.117 - *) CT_Abort "Unsupported (or unset) libc_mode='${libc_mode}'";;
1.118 - esac
1.119 - mkdir -p "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}"
1.120 - cd "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}"
1.121 -
1.122 CT_DoLog EXTRA "Configuring C library"
1.123
1.124 case "${CT_LIBC}" in
1.125 @@ -353,8 +438,6 @@
1.126 do_libc_locales
1.127 fi
1.128 fi
1.129 -
1.130 - CT_EndStep
1.131 }
1.132
1.133 # This function finishes the C library install