diff options
Diffstat (limited to 'scripts/build/libc/musl.sh')
-rw-r--r-- | scripts/build/libc/musl.sh | 140 |
1 files changed, 44 insertions, 96 deletions
diff --git a/scripts/build/libc/musl.sh b/scripts/build/libc/musl.sh index 4ccb84c..bc2a2e6 100644 --- a/scripts/build/libc/musl.sh +++ b/scripts/build/libc/musl.sh @@ -2,65 +2,31 @@ # Copyright 2013 Timo Teräs # Licensed under the GPL v2. See COPYING in the root of this package -do_libc_get() { - if [ "${CT_LIBC_MUSL_CUSTOM}" = "y" ]; then - CT_GetCustom "musl" "${CT_LIBC_MUSL_CUSTOM_VERSION}" \ - "${CT_LIBC_MUSL_CUSTOM_LOCATION}" - else # ! custom location - CT_GetFile "musl-${CT_LIBC_VERSION}" http://www.musl-libc.org/releases - fi # ! custom location +musl_post_cc() +{ + # MUSL creates dynamic linker symlink with absolute path - which works on the + # target but not on the host. We want our cross-ldd tool to work. + CT_MultilibFixupLDSO } -do_libc_extract() { - CT_Extract "musl-${CT_LIBC_VERSION}" - CT_Patch "musl" "${CT_LIBC_VERSION}" -} - -# Build and install headers and start files -do_libc_start_files() { - # Start files and Headers should be configured the same way as the - # final libc, but built and installed differently. - do_libc_backend libc_mode=startfiles -} - -# This function builds and install the full C library -do_libc() { - do_libc_backend libc_mode=final -} - -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}" +musl_main() +{ + CT_DoStep INFO "Installing C library" + CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc" + CT_IterateMultilibs musl_backend_once multilib CT_Popd CT_EndStep } # This backend builds the C library -# Usage: do_libc_backend param=value [...] +# Usage: musl_backend param=value [...] # Parameter : Definition : Type : Default -# libc_mode : 'startfiles' or 'final' : string : (none) -do_libc_backend_once() { - local libc_mode +# multi_* : as defined in CT_IterateMultilibs : (varies) : +musl_backend_once() +{ local -a extra_cflags local -a extra_config - local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}" + local src_dir="${CT_SRC_DIR}/musl" local multi_dir multi_os_dir multi_root multi_flags multi_index multi_count local multilib_dir local hdr_install_subdir @@ -78,13 +44,6 @@ do_libc_backend_once() { 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 - if [ "${CT_CC_GCC_4_9_or_later}" = "y" ]; then - extra_cflags+=("-fno-toplevel-reorder") - fi - if [ "${CT_LIBC_MUSL_DEBUG}" = "y" ]; then extra_config+=("--enable-debug") fi @@ -93,6 +52,11 @@ do_libc_backend_once() { extra_config+=("--enable-warnings") fi + case "${CT_SHARED_LIBS}" in + y) extra_config+=("--enable-shared");; + *) extra_config+=("--disable-shared");; + esac + extra_config+=( "--enable-optimize=${CT_LIBC_MUSL_OPTIMIZE}" ) # Same problem as with uClibc: different variants sometimes have @@ -102,13 +66,16 @@ do_libc_backend_once() { extra_config+=( "--includedir=/usr/include/${hdr_install_subdir}" ) fi + CT_SymlinkToolsMultilib + # 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[*]}" \ + CFLAGS="${CT_TARGET_CFLAGS} ${extra_cflags[*]}" \ + LDFLAGS="${CT_TARGET_LDFLAGS}" \ CROSS_COMPILE="${CT_TARGET}-" \ ${CONFIG_SHELL} \ ${src_dir}/configure \ @@ -119,45 +86,26 @@ do_libc_backend_once() { --disable-gcc-wrapper \ "${extra_config[@]}" - if [ "${libc_mode}" = "startfiles" ]; then - CT_DoLog EXTRA "Installing C library headers" - CT_DoExecLog ALL make DESTDIR="${multi_root}" install-headers - 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 - CT_DoLog EXTRA "Installing C library start files" - CT_DoExecLog ALL cp -av obj/crt/crt*.o "${multi_root}${multilib_dir}" - CT_DoExecLog ALL ${CT_TARGET}-${CT_CC} -nostdlib \ - -nostartfiles -shared -x c /dev/null -o "${multi_root}${multilib_dir}/libc.so" - fi - 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" \ - "${multi_root}${multilib_dir}/crtn.o" \ - "${multi_root}${multilib_dir}/libc.so" - - CT_DoLog EXTRA "Building C library" - CT_DoExecLog ALL make ${JOBSFLAGS} - - 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 - - # Any additional actions for this architecture - CT_DoArchMUSLPostInstall - fi + CT_DoLog EXTRA "Building C library" + CT_DoExecLog ALL make ${CT_JOBSFLAGS} + + 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 + + # Any additional actions for this architecture + CT_DoArchMUSLPostInstall CT_EndStep } |