musl: Add multilib support.

Signed-off-by: Alexey Neyman <stilor@att.net>
This commit is contained in:
Alexey Neyman 2016-04-14 00:30:34 -07:00
parent 49d1d8f513
commit d2af095eb2
4 changed files with 81 additions and 40 deletions

View File

@ -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"

View File

@ -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
}

View File

@ -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

View File

@ -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}"