mirror of
https://github.com/crosstool-ng/crosstool-ng.git
synced 2025-01-03 11:34:09 +00:00
libc/glibc: add multilib-cacpable backend
For mutlilib, the C library must be built once for each variants. Special care must be taken to put the resulting libraries in the proper places. Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
This commit is contained in:
parent
a5006075b7
commit
9d53aa6475
@ -65,12 +65,105 @@ do_libc() {
|
|||||||
do_libc_backend libc_mode=final
|
do_libc_backend libc_mode=final
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# This backend builds the C library once for each multilib
|
||||||
|
# variant the compiler gives us
|
||||||
# Usage: do_libc_backend param=value [...]
|
# Usage: do_libc_backend param=value [...]
|
||||||
# Parameter : Definition : Type : Default
|
# Parameter : Definition : Type : Default
|
||||||
# libc_mode : 'startfiles' or 'final' : string : (none)
|
# libc_mode : 'startfiles' or 'final' : string : (none)
|
||||||
|
do_libc_backend() {
|
||||||
|
local libc_mode
|
||||||
|
local -a multilibs
|
||||||
|
local multilib
|
||||||
|
local multi_dir
|
||||||
|
local multi_flags
|
||||||
|
local extra_dir
|
||||||
|
local arg f fn ln pre
|
||||||
|
|
||||||
|
for arg in "$@"; do
|
||||||
|
eval "${arg// /\\ }"
|
||||||
|
done
|
||||||
|
|
||||||
|
case "${libc_mode}" in
|
||||||
|
startfiles) CT_DoStep INFO "Installing C library headers & start files";;
|
||||||
|
final) CT_DoStep INFO "Installing C library";;
|
||||||
|
*) CT_Abort "Unsupported (or unset) libc_mode='${libc_mode}'";;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# If gcc is not configured for multilib, it still prints
|
||||||
|
# a single line for the default settings
|
||||||
|
multilibs=( $("${CT_TARGET}-gcc" -print-multi-lib 2>/dev/null) )
|
||||||
|
for multilib in "${multilibs[@]}"; do
|
||||||
|
multi_dir="${multilib%%;*}"
|
||||||
|
if [ "${multi_dir}" != "." ]; then
|
||||||
|
CT_DoStep INFO "Building for multilib subdir='${multi_dir}'"
|
||||||
|
|
||||||
|
extra_flags="$( echo "${multilib#*;}" \
|
||||||
|
|${sed} -r -e 's/@/ -/g;' \
|
||||||
|
)"
|
||||||
|
extra_dir="/${multi_dir}"
|
||||||
|
|
||||||
|
# glibc install its files in ${extra_dir}/{usr/,}lib
|
||||||
|
# while gcc expects them in {,usr/}lib/${extra_dir}.
|
||||||
|
# Prepare some symlinks so glibc installs in fact in
|
||||||
|
# the proper place
|
||||||
|
# We do it in the start-files step, so it is not needed
|
||||||
|
# to do it in the final step, as the symlinks will
|
||||||
|
# already exist
|
||||||
|
if [ "${libc_mode}" = "startfiles" ]; then
|
||||||
|
CT_Pushd "${CT_SYSROOT_DIR}"
|
||||||
|
CT_DoExecLog ALL mkdir -p "lib/${multi_dir}" \
|
||||||
|
"usr/lib/${multi_dir}" \
|
||||||
|
"${multi_dir}" \
|
||||||
|
"${multi_dir}/usr"
|
||||||
|
CT_DoExecLog ALL ln -sf "../lib/${multi_dir}" "${multi_dir}/lib"
|
||||||
|
CT_DoExecLog ALL ln -sf "../../usr/lib/${multi_dir}" "${multi_dir}/usr/lib"
|
||||||
|
CT_Popd
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
extra_dir=
|
||||||
|
extra_flags=
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}"
|
||||||
|
CT_Pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}"
|
||||||
|
|
||||||
|
do_libc_backend_once extra_dir="${extra_dir}" \
|
||||||
|
extra_flags="${extra_flags}" \
|
||||||
|
"$@"
|
||||||
|
|
||||||
|
CT_Popd
|
||||||
|
|
||||||
|
if [ "${multi_dir}" != "." ]; then
|
||||||
|
if [ "${libc_mode}" = "final" ]; then
|
||||||
|
CT_DoLog EXTRA "Fixing up multilib location"
|
||||||
|
|
||||||
|
# rewrite the library multiplexers
|
||||||
|
for d in "lib/${multi_dir}" "usr/lib/${multi_dir}"; do
|
||||||
|
for l in libc libpthread libgcc_s; do
|
||||||
|
if [ -f "${CT_SYSROOT_DIR}/${d}/${l}.so" \
|
||||||
|
-a ! -L ${CT_SYSROOT_DIR}/${d}/${l}.so ]
|
||||||
|
then
|
||||||
|
CT_DoExecLog DEBUG ${sed} -r -i \
|
||||||
|
-e "s:/lib/:/lib/${multi_dir}/:g;" \
|
||||||
|
"${CT_SYSROOT_DIR}/${d}/${l}.so"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
fi # libc_mode == final
|
||||||
|
CT_EndStep
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
CT_EndStep
|
||||||
|
}
|
||||||
|
|
||||||
|
# This backend builds the C library once
|
||||||
|
# Usage: do_libc_backend_once param=value [...]
|
||||||
|
# Parameter : Definition : Type : Default
|
||||||
|
# libc_mode : 'startfiles' or 'final' : string : (none)
|
||||||
# extra_flags : Extra CFLAGS to use (for multilib) : string : (empty)
|
# extra_flags : Extra CFLAGS to use (for multilib) : string : (empty)
|
||||||
# extra_dir : Extra subdir for multilib : string : (empty)
|
# extra_dir : Extra subdir for multilib : string : (empty)
|
||||||
do_libc_backend() {
|
do_libc_backend_once() {
|
||||||
local libc_mode
|
local libc_mode
|
||||||
local extra_flags
|
local extra_flags
|
||||||
local extra_dir
|
local extra_dir
|
||||||
@ -87,14 +180,6 @@ do_libc_backend() {
|
|||||||
shift
|
shift
|
||||||
done
|
done
|
||||||
|
|
||||||
case "${libc_mode}" in
|
|
||||||
startfiles) CT_DoStep INFO "Installing C library headers & start files";;
|
|
||||||
final) CT_DoStep INFO "Installing C library";;
|
|
||||||
*) CT_Abort "Unsupported (or unset) libc_mode='${libc_mode}'";;
|
|
||||||
esac
|
|
||||||
mkdir -p "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}"
|
|
||||||
cd "${CT_BUILD_DIR}/build-libc-${libc_mode}${extra_dir//\//_}"
|
|
||||||
|
|
||||||
CT_DoLog EXTRA "Configuring C library"
|
CT_DoLog EXTRA "Configuring C library"
|
||||||
|
|
||||||
case "${CT_LIBC}" in
|
case "${CT_LIBC}" in
|
||||||
@ -353,8 +438,6 @@ do_libc_backend() {
|
|||||||
do_libc_locales
|
do_libc_locales
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
CT_EndStep
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# This function finishes the C library install
|
# This function finishes the C library install
|
||||||
|
Loading…
Reference in New Issue
Block a user