From d2af095eb26c7c90312ed07238c5a8254af3c2f8 Mon Sep 17 00:00:00 2001 From: Alexey Neyman Date: Thu, 14 Apr 2016 00:30:34 -0700 Subject: musl: Add multilib support. Signed-off-by: Alexey Neyman diff --git a/scripts/build/arch.sh b/scripts/build/arch.sh index b75c1be..5c5edc9 100644 --- a/scripts/build/arch.sh +++ b/scripts/build/arch.sh @@ -57,5 +57,12 @@ CT_DoArchUClibcHeaderDir() { :; } +# Multilib/MUSL: Adjust header installation path for given CFLAGS +# Usage: CT_DoArchMUSLHeaderDir +CT_DoArchMUSLHeaderDir() { + # Only needed if a given architecture may select different MUSL architectures. + :; +} + # Override from the actual arch implementation as needed. . "${CT_LIB_DIR}/scripts/build/arch/${CT_ARCH}.sh" diff --git a/scripts/build/arch/x86.sh b/scripts/build/arch/x86.sh index 9cd14a0..56272ed 100644 --- a/scripts/build/arch/x86.sh +++ b/scripts/build/arch/x86.sh @@ -167,3 +167,14 @@ CT_DoArchUClibcHeaderDir() { eval "${dir_var}="$( ${CT_TARGET}-gcc -print-multiarch ${cflags} ) 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 +} diff --git a/scripts/build/libc/musl.sh b/scripts/build/libc/musl.sh index e31d110..2a0c04f 100644 --- a/scripts/build/libc/musl.sh +++ b/scripts/build/libc/musl.sh @@ -32,44 +32,52 @@ do_libc_post_cc() { : } +do_libc_backend() { + local libc_mode + local arg + + 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 + + CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-${libc_mode}" + 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() { +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 libc_headers libc_startfiles libc_full - local multi_os_dir multi_root multilib_dir + 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 - case "${libc_mode}" in - startfiles) - CT_DoStep INFO "Installing C library headers & start files" - libc_headers=y - 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 + CT_DoStep INFO "Building for multilib ${multi_index}/${multi_count}: '${multi_flags}'" - multi_root=$( "${CT_TARGET}-gcc" -print-sysroot ) - multi_os_dir=$( "${CT_TARGET}-gcc" -print-multi-os-directory ) multilib_dir="/usr/lib/${multi_os_dir}" CT_SanitizeVarDir multilib_dir CT_DoExecLog ALL mkdir -p "${multi_root}${multilib_dir}" + extra_cflags=( ${multi_flags} ) + # From buildroot: # gcc constant folding bug with weak aliases workaround # 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}" ) - 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 # then one would expect: # build : not used # host : same as --target # target : the machine musl runs on - CT_DoExecLog CFG \ - CFLAGS="${extra_cflags[@]}" \ - CROSS_COMPILE="${CT_TARGET}-" \ - ${src_dir}/configure \ - --host="${CT_TARGET}" \ - --target="${CT_TARGET}" \ - --prefix="/usr" \ - --libdir="${multilib_dir}" \ - --disable-gcc-wrapper \ + CT_DoExecLog CFG \ + CFLAGS="${extra_cflags[*]}" \ + CROSS_COMPILE="${CT_TARGET}-" \ + ${src_dir}/configure \ + --host="${multi_target}" \ + --target="${multi_target}" \ + --prefix="/usr" \ + --libdir="${multilib_dir}" \ + --disable-gcc-wrapper \ "${extra_config[@]}" - if [ "${libc_headers}" = "y" ]; then + if [ "${libc_mode}" = "startfiles" ]; then CT_DoLog EXTRA "Installing C library 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_DoExecLog ALL ${make} DESTDIR="${multi_root}" \ 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 \ -nostartfiles -shared -x c /dev/null -o "${multi_root}${multilib_dir}/libc.so" fi - if [ "${libc_full}" = "y" ]; then + if [ "${libc_mode}" = "final" ]; then CT_DoLog EXTRA "Cleaning up start files" CT_DoExecLog ALL rm -f "${multi_root}${multilib_dir}/crt1.o" \ "${multi_root}${multilib_dir}/crti.o" \ @@ -130,6 +141,18 @@ do_libc_backend() { CT_DoLog EXTRA "Installing C library" 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 CT_EndStep diff --git a/scripts/build/libc/uClibc.sh b/scripts/build/libc/uClibc.sh index 6e554f9..18f234e 100644 --- a/scripts/build/libc/uClibc.sh +++ b/scripts/build/libc/uClibc.sh @@ -172,7 +172,7 @@ do_libc_backend_once() { # at the final stage (see the note below), we may already have the subdirectory # in /usr/include. 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" fi @@ -236,7 +236,7 @@ do_libc_backend_once() { # Now, if installing headers into a subdirectory, put everything in its place. # 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.saved" "${multi_root}/usr/include" CT_DoExecLog ALL rm -rf "${multi_root}/usr/include/${hdr_install_subdir}" -- cgit v0.10.2-6-g49f6