scripts/build/libc/glibc-eglibc.sh-common
changeset 2825 1c5ca9b0a5a0
parent 2824 53d0a288209d
child 2826 4a21f0eb8b57
     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