mirror of
https://github.com/crosstool-ng/crosstool-ng.git
synced 2024-12-23 14:42:26 +00:00
musl: Add multilib support.
Signed-off-by: Alexey Neyman <stilor@att.net>
This commit is contained in:
parent
49d1d8f513
commit
d2af095eb2
@ -57,5 +57,12 @@ CT_DoArchUClibcHeaderDir() {
|
|||||||
:;
|
:;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Multilib/MUSL: Adjust header installation path for given CFLAGS
|
||||||
|
# Usage: CT_DoArchMUSLHeaderDir <path-variable> <cflags>
|
||||||
|
CT_DoArchMUSLHeaderDir() {
|
||||||
|
# Only needed if a given architecture may select different MUSL architectures.
|
||||||
|
:;
|
||||||
|
}
|
||||||
|
|
||||||
# Override from the actual arch implementation as needed.
|
# Override from the actual arch implementation as needed.
|
||||||
. "${CT_LIB_DIR}/scripts/build/arch/${CT_ARCH}.sh"
|
. "${CT_LIB_DIR}/scripts/build/arch/${CT_ARCH}.sh"
|
||||||
|
@ -167,3 +167,14 @@ CT_DoArchUClibcHeaderDir() {
|
|||||||
eval "${dir_var}="$( ${CT_TARGET}-gcc -print-multiarch ${cflags} )
|
eval "${dir_var}="$( ${CT_TARGET}-gcc -print-multiarch ${cflags} )
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CT_DoArchMUSLHeaderDir() {
|
||||||
|
local dir_var="${1}"
|
||||||
|
local cflags="${2}"
|
||||||
|
|
||||||
|
# If it is non-default multilib, add a suffix with architecture (reported by gcc)
|
||||||
|
# to the headers installation path.
|
||||||
|
if [ -n "${cflags}" ]; then
|
||||||
|
eval "${dir_var}="$( ${CT_TARGET}-gcc -print-multiarch ${cflags} )
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
@ -32,44 +32,52 @@ do_libc_post_cc() {
|
|||||||
:
|
:
|
||||||
}
|
}
|
||||||
|
|
||||||
# This backend builds the C library
|
|
||||||
# Usage: do_libc_backend param=value [...]
|
|
||||||
# Parameter : Definition : Type : Default
|
|
||||||
# libc_mode : 'startfiles' or 'final' : string : (none)
|
|
||||||
do_libc_backend() {
|
do_libc_backend() {
|
||||||
local libc_mode
|
local libc_mode
|
||||||
local -a extra_cflags
|
local arg
|
||||||
local -a extra_config
|
|
||||||
local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
|
|
||||||
local libc_headers libc_startfiles libc_full
|
|
||||||
local multi_os_dir multi_root multilib_dir
|
|
||||||
|
|
||||||
for arg in "$@"; do
|
for arg in "$@"; do
|
||||||
eval "${arg// /\\ }"
|
eval "${arg// /\\ }"
|
||||||
done
|
done
|
||||||
|
|
||||||
case "${libc_mode}" in
|
case "${libc_mode}" in
|
||||||
startfiles)
|
startfiles) CT_DoStep INFO "Installing C library headers & start files";;
|
||||||
CT_DoStep INFO "Installing C library headers & start files"
|
final) CT_DoStep INFO "Installing C library";;
|
||||||
libc_headers=y
|
*) CT_Abort "Unsupported (or unset) libc_mode='${libc_mode}'";;
|
||||||
libc_startfiles=y
|
|
||||||
libc_full=
|
|
||||||
;;
|
|
||||||
final)
|
|
||||||
CT_DoStep INFO "Installing C library"
|
|
||||||
libc_headers=
|
|
||||||
libc_startfiles=
|
|
||||||
libc_full=y
|
|
||||||
;;
|
|
||||||
*) CT_Abort "Unsupported (or unset) libc_mode='${libc_mode}'";;
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
multi_root=$( "${CT_TARGET}-gcc" -print-sysroot )
|
CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}"
|
||||||
multi_os_dir=$( "${CT_TARGET}-gcc" -print-multi-os-directory )
|
CT_IterateMultilibs do_libc_backend_once multilib libc_mode="${libc_mode}"
|
||||||
|
CT_Popd
|
||||||
|
CT_EndStep
|
||||||
|
}
|
||||||
|
|
||||||
|
# This backend builds the C library
|
||||||
|
# Usage: do_libc_backend param=value [...]
|
||||||
|
# Parameter : Definition : Type : Default
|
||||||
|
# libc_mode : 'startfiles' or 'final' : string : (none)
|
||||||
|
do_libc_backend_once() {
|
||||||
|
local libc_mode
|
||||||
|
local -a extra_cflags
|
||||||
|
local -a extra_config
|
||||||
|
local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
|
||||||
|
local multi_dir multi_os_dir multi_root multi_flags multi_index multi_count
|
||||||
|
local multilib_dir
|
||||||
|
local hdr_install_subdir
|
||||||
|
local arg f l
|
||||||
|
|
||||||
|
for arg in "$@"; do
|
||||||
|
eval "${arg// /\\ }"
|
||||||
|
done
|
||||||
|
|
||||||
|
CT_DoStep INFO "Building for multilib ${multi_index}/${multi_count}: '${multi_flags}'"
|
||||||
|
|
||||||
multilib_dir="/usr/lib/${multi_os_dir}"
|
multilib_dir="/usr/lib/${multi_os_dir}"
|
||||||
CT_SanitizeVarDir multilib_dir
|
CT_SanitizeVarDir multilib_dir
|
||||||
CT_DoExecLog ALL mkdir -p "${multi_root}${multilib_dir}"
|
CT_DoExecLog ALL mkdir -p "${multi_root}${multilib_dir}"
|
||||||
|
|
||||||
|
extra_cflags=( ${multi_flags} )
|
||||||
|
|
||||||
# From buildroot:
|
# From buildroot:
|
||||||
# gcc constant folding bug with weak aliases workaround
|
# gcc constant folding bug with weak aliases workaround
|
||||||
# See http://www.openwall.com/lists/musl/2014/05/15/1
|
# See http://www.openwall.com/lists/musl/2014/05/15/1
|
||||||
@ -87,29 +95,32 @@ do_libc_backend() {
|
|||||||
|
|
||||||
extra_config+=( "--enable-optimize=${CT_LIBC_MUSL_OPTIMIZE}" )
|
extra_config+=( "--enable-optimize=${CT_LIBC_MUSL_OPTIMIZE}" )
|
||||||
|
|
||||||
CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}"
|
# Same problem as with uClibc: different variants sometimes have
|
||||||
|
# incompatible headers.
|
||||||
|
CT_DoArchMUSLHeaderDir hdr_install_subdir "${multi_flags}"
|
||||||
|
if [ -n "${hdr_install_subdir}" ]; then
|
||||||
|
extra_config+=( "--includedir=/usr/include/${hdr_install_subdir}" )
|
||||||
|
fi
|
||||||
|
|
||||||
# NOTE: musl handles the build/host/target a little bit differently
|
# NOTE: musl handles the build/host/target a little bit differently
|
||||||
# then one would expect:
|
# then one would expect:
|
||||||
# build : not used
|
# build : not used
|
||||||
# host : same as --target
|
# host : same as --target
|
||||||
# target : the machine musl runs on
|
# target : the machine musl runs on
|
||||||
CT_DoExecLog CFG \
|
CT_DoExecLog CFG \
|
||||||
CFLAGS="${extra_cflags[@]}" \
|
CFLAGS="${extra_cflags[*]}" \
|
||||||
CROSS_COMPILE="${CT_TARGET}-" \
|
CROSS_COMPILE="${CT_TARGET}-" \
|
||||||
${src_dir}/configure \
|
${src_dir}/configure \
|
||||||
--host="${CT_TARGET}" \
|
--host="${multi_target}" \
|
||||||
--target="${CT_TARGET}" \
|
--target="${multi_target}" \
|
||||||
--prefix="/usr" \
|
--prefix="/usr" \
|
||||||
--libdir="${multilib_dir}" \
|
--libdir="${multilib_dir}" \
|
||||||
--disable-gcc-wrapper \
|
--disable-gcc-wrapper \
|
||||||
"${extra_config[@]}"
|
"${extra_config[@]}"
|
||||||
|
|
||||||
if [ "${libc_headers}" = "y" ]; then
|
if [ "${libc_mode}" = "startfiles" ]; then
|
||||||
CT_DoLog EXTRA "Installing C library headers"
|
CT_DoLog EXTRA "Installing C library headers"
|
||||||
CT_DoExecLog ALL ${make} DESTDIR="${multi_root}" install-headers
|
CT_DoExecLog ALL ${make} DESTDIR="${multi_root}" install-headers
|
||||||
fi
|
|
||||||
if [ "${libc_startfiles}" = "y" ]; then
|
|
||||||
CT_DoLog EXTRA "Building C library start files"
|
CT_DoLog EXTRA "Building C library start files"
|
||||||
CT_DoExecLog ALL ${make} DESTDIR="${multi_root}" \
|
CT_DoExecLog ALL ${make} DESTDIR="${multi_root}" \
|
||||||
obj/crt/crt1.o obj/crt/crti.o obj/crt/crtn.o
|
obj/crt/crt1.o obj/crt/crti.o obj/crt/crtn.o
|
||||||
@ -118,7 +129,7 @@ do_libc_backend() {
|
|||||||
CT_DoExecLog ALL ${CT_TARGET}-gcc -nostdlib \
|
CT_DoExecLog ALL ${CT_TARGET}-gcc -nostdlib \
|
||||||
-nostartfiles -shared -x c /dev/null -o "${multi_root}${multilib_dir}/libc.so"
|
-nostartfiles -shared -x c /dev/null -o "${multi_root}${multilib_dir}/libc.so"
|
||||||
fi
|
fi
|
||||||
if [ "${libc_full}" = "y" ]; then
|
if [ "${libc_mode}" = "final" ]; then
|
||||||
CT_DoLog EXTRA "Cleaning up start files"
|
CT_DoLog EXTRA "Cleaning up start files"
|
||||||
CT_DoExecLog ALL rm -f "${multi_root}${multilib_dir}/crt1.o" \
|
CT_DoExecLog ALL rm -f "${multi_root}${multilib_dir}/crt1.o" \
|
||||||
"${multi_root}${multilib_dir}/crti.o" \
|
"${multi_root}${multilib_dir}/crti.o" \
|
||||||
@ -130,6 +141,18 @@ do_libc_backend() {
|
|||||||
|
|
||||||
CT_DoLog EXTRA "Installing C library"
|
CT_DoLog EXTRA "Installing C library"
|
||||||
CT_DoExecLog ALL ${make} DESTDIR="${multi_root}" install
|
CT_DoExecLog ALL ${make} DESTDIR="${multi_root}" install
|
||||||
|
|
||||||
|
# Convert /lib/ld-* symlinks to relative paths so that they are valid
|
||||||
|
# both on the host and on the target.
|
||||||
|
for f in ${multi_root}/ld-musl-*; do
|
||||||
|
[ -L "${f}" ] || continue
|
||||||
|
l=$( readlink ${f} )
|
||||||
|
case "${l}" in
|
||||||
|
${multilib_dir}/*)
|
||||||
|
CT_DoExecLog ALL ln -sf "../${l}" "${f}"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
CT_EndStep
|
CT_EndStep
|
||||||
|
@ -172,7 +172,7 @@ do_libc_backend_once() {
|
|||||||
# at the final stage (see the note below), we may already have the subdirectory
|
# at the final stage (see the note below), we may already have the subdirectory
|
||||||
# in /usr/include.
|
# in /usr/include.
|
||||||
CT_DoArchUClibcHeaderDir hdr_install_subdir "${multi_flags}"
|
CT_DoArchUClibcHeaderDir hdr_install_subdir "${multi_flags}"
|
||||||
if [ -n "$hdr_install_subdir" ]; then
|
if [ -n "${hdr_install_subdir}" ]; then
|
||||||
CT_DoExecLog ALL cp -a "${multi_root}/usr/include" "${multi_root}/usr/include.saved"
|
CT_DoExecLog ALL cp -a "${multi_root}/usr/include" "${multi_root}/usr/include.saved"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -236,7 +236,7 @@ do_libc_backend_once() {
|
|||||||
|
|
||||||
# Now, if installing headers into a subdirectory, put everything in its place.
|
# Now, if installing headers into a subdirectory, put everything in its place.
|
||||||
# Remove the header subdirectory if it existed already.
|
# Remove the header subdirectory if it existed already.
|
||||||
if [ -n "$hdr_install_subdir" ]; then
|
if [ -n "${hdr_install_subdir}" ]; then
|
||||||
CT_DoExecLog ALL mv "${multi_root}/usr/include" "${multi_root}/usr/include.new"
|
CT_DoExecLog ALL mv "${multi_root}/usr/include" "${multi_root}/usr/include.new"
|
||||||
CT_DoExecLog ALL mv "${multi_root}/usr/include.saved" "${multi_root}/usr/include"
|
CT_DoExecLog ALL mv "${multi_root}/usr/include.saved" "${multi_root}/usr/include"
|
||||||
CT_DoExecLog ALL rm -rf "${multi_root}/usr/include/${hdr_install_subdir}"
|
CT_DoExecLog ALL rm -rf "${multi_root}/usr/include/${hdr_install_subdir}"
|
||||||
|
Loading…
Reference in New Issue
Block a user