summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorAlexey Neyman <stilor@att.net>2016-04-14 07:30:34 (GMT)
committerAlexey Neyman <stilor@att.net>2016-08-23 18:00:27 (GMT)
commitd2af095eb26c7c90312ed07238c5a8254af3c2f8 (patch)
treedb9a6de1d05df6f25fbc0fc787a959d7daac22aa /scripts
parent49d1d8f5136d20db62c4a3a6b0ef401d596d8db2 (diff)
musl: Add multilib support.
Signed-off-by: Alexey Neyman <stilor@att.net>
Diffstat (limited to 'scripts')
-rw-r--r--scripts/build/arch.sh7
-rw-r--r--scripts/build/arch/x86.sh11
-rw-r--r--scripts/build/libc/musl.sh91
-rw-r--r--scripts/build/libc/uClibc.sh4
4 files changed, 77 insertions, 36 deletions
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 <path-variable> <cflags>
+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}"