summaryrefslogtreecommitdiff
path: root/scripts/build/libc
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/build/libc')
-rw-r--r--scripts/build/libc/avr-libc.sh45
-rw-r--r--scripts/build/libc/bionic.sh34
-rw-r--r--scripts/build/libc/glibc.sh474
-rw-r--r--scripts/build/libc/mingw-w64.sh220
-rw-r--r--scripts/build/libc/mingw.sh178
-rw-r--r--scripts/build/libc/moxiebox.sh79
-rw-r--r--scripts/build/libc/musl.sh140
-rw-r--r--scripts/build/libc/newlib.sh76
-rw-r--r--scripts/build/libc/none.sh18
-rw-r--r--scripts/build/libc/uClibc-ng.sh (renamed from scripts/build/libc/uClibc.sh)295
10 files changed, 636 insertions, 923 deletions
diff --git a/scripts/build/libc/avr-libc.sh b/scripts/build/libc/avr-libc.sh
index f94b601..34eb0f5 100644
--- a/scripts/build/libc/avr-libc.sh
+++ b/scripts/build/libc/avr-libc.sh
@@ -1,24 +1,14 @@
# This file adds functions to build the avr-libc C library
-do_libc_get() {
- local libc_src
-
- libc_src="http://download.savannah.gnu.org/releases/avr-libc"
-
- if [ "${CT_LIBC_AVR_LIBC_CUSTOM}" = "y" ]; then
- CT_GetCustom "avr-libc" "${CT_LIBC_AVR_LIBC_CUSTOM_VERSION}" \
- "${CT_LIBC_AVR_LIBC_CUSTOM_LOCATION}"
- else # ! custom location
- CT_GetFile "avr-libc-${CT_LIBC_VERSION}" "${libc_src}"
- fi # ! custom location
-}
+avr_libc_post_cc()
+{
+ CT_DoStep INFO "Installing C library"
-do_libc_extract() {
- CT_Extract "avr-libc-${CT_LIBC_VERSION}"
- CT_Patch "avr-libc" "${CT_LIBC_VERSION}"
-}
+ CT_DoLog EXTRA "Copying sources to build directory"
+ CT_DoExecLog ALL cp -av "${CT_SRC_DIR}/avr-libc/." \
+ "${CT_BUILD_DIR}/build-libc-post-cc"
+ cd "${CT_BUILD_DIR}/build-libc-post-cc"
-do_libc_configure() {
CT_DoLog EXTRA "Configuring C library"
CT_DoExecLog CFG \
@@ -28,28 +18,9 @@ do_libc_configure() {
--host=${CT_TARGET} \
--prefix=${CT_PREFIX_DIR} \
"${CT_LIBC_AVR_LIBC_EXTRA_CONFIG_ARRAY[@]}"
-}
-
-do_libc_start_files() {
- :
-}
-
-do_libc() {
- :
-}
-
-do_libc_post_cc() {
- CT_DoStep INFO "Installing C library"
-
- CT_DoLog EXTRA "Copying sources to build directory"
- CT_DoExecLog ALL cp -av "${CT_SRC_DIR}/avr-libc-${CT_LIBC_VERSION}/." \
- "${CT_BUILD_DIR}/build-libc-post-cc"
- cd "${CT_BUILD_DIR}/build-libc-post-cc"
-
- do_libc_configure
CT_DoLog EXTRA "Building C library"
- CT_DoExecLog ALL make ${JOBSFLAGS}
+ CT_DoExecLog ALL make ${CT_JOBSFLAGS}
CT_DoLog EXTRA "Installing C library"
CT_DoExecLog ALL make install
diff --git a/scripts/build/libc/bionic.sh b/scripts/build/libc/bionic.sh
new file mode 100644
index 0000000..0ffd4d8
--- /dev/null
+++ b/scripts/build/libc/bionic.sh
@@ -0,0 +1,34 @@
+# This file adds functions to extract the bionic C library from the Android NDK
+# Copyright 2017 Howard Chu
+# Licensed under the GPL v2. See COPYING in the root of this package
+
+# Install Unified headers
+bionic_headers()
+{
+ CT_DoStep INFO "Installing C library headers"
+ CT_DoExecLog ALL cp -r "${CT_SRC_DIR}/android-ndk/sysroot/usr" "${CT_SYSROOT_DIR}"
+}
+
+bionic_main()
+{
+ local arch="${CT_ARCH}"
+ if [ "${CT_ARCH_64}" = "y" ]; then
+ if [ "${CT_ARCH}" = "x86" ]; then
+ arch="${arch}_"
+ fi
+ arch="${arch}64"
+ fi
+ CT_DoStep INFO "Installing C library binaries"
+ CT_DoExecLog ALL cp -r "${CT_SRC_DIR}/android-ndk/platforms/android-${CT_ANDROID_API}/arch-${arch}/usr" "${CT_SYSROOT_DIR}"
+
+ # NB: Modifying both CT_TARGET_CFLAGS and CT_ALL_TARGET_CFLAGS: the __ANDROID_API__
+ # definition needs to be passed into GCC build, or the resulting libstdc++ gets
+ # miscompiled (attempt to link against it results in unresolved symbols to stdout/...).
+ # And since __ANDROID_API__ is a user config option, placing it with other user-supplied
+ # options isn't completely out of character.
+ # On the other hand, CT_ALL_TARGET_CFLAGS in non-multilib builds is already set and does
+ # not get recalculated after GCC build, so setting CT_TARGET_CFLAGS is not reflected
+ # on other libraries/apps, such as gdbserver.
+ CT_EnvModify CT_TARGET_CFLAGS "${CT_TARGET_CFLAGS} -D__ANDROID_API__=${CT_ANDROID_API}"
+ CT_EnvModify CT_ALL_TARGET_CFLAGS "${CT_ALL_TARGET_CFLAGS} -D__ANDROID_API__=${CT_ANDROID_API}"
+}
diff --git a/scripts/build/libc/glibc.sh b/scripts/build/libc/glibc.sh
index 348c35a..c78f069 100644
--- a/scripts/build/libc/glibc.sh
+++ b/scripts/build/libc/glibc.sh
@@ -2,166 +2,58 @@
# Copyright 2007 Yann E. MORIN
# Licensed under the GPL v2. See COPYING in the root of this package
-do_libc_get() {
+glibc_get()
+{
local date
local version
- local -a addons_list
-
- addons_list=($(do_libc_add_ons_list " "))
-
- # Main source
- if [ "${CT_LIBC_GLIBC_CUSTOM}" = "y" ]; then
- CT_GetCustom "glibc" "${CT_LIBC_GLIBC_CUSTOM_VERSION}" \
- "${CT_LIBC_GLIBC_CUSTOM_LOCATION}"
- else
- case "${CT_LIBC_VERSION}" in
- linaro-*)
- CT_GetLinaro "glibc" "${CT_LIBC_VERSION}"
- ;;
- *)
- CT_GetFile "glibc-${CT_LIBC_VERSION}" \
- {http,ftp,https}://ftp.gnu.org/gnu/glibc \
- ftp://{sourceware.org,gcc.gnu.org}/pub/glibc/{releases,snapshots}
- ;;
- esac
- fi
-
- # C library addons
- for addon in "${addons_list[@]}"; do
- # Never ever try to download these add-ons,
- # they've always been internal
- case "${addon}" in
- nptl) continue;;
- esac
-
- case "${addon}:${CT_LIBC_GLIBC_PORTS_EXTERNAL}" in
- ports:y) ;;
- ports:*) continue;;
- esac
-
- if ! CT_GetFile "glibc-${addon}-${CT_LIBC_VERSION}" \
- http://mirrors.kernel.org/sourceware/glibc \
- {http,ftp,https}://ftp.gnu.org/gnu/glibc \
- ftp://{sourceware.org,gcc.gnu.org}/pub/glibc/{releases,snapshots}
- then
- # Some add-ons are bundled with glibc, others are
- # bundled in their own tarball. Eg. NPTL is internal,
- # while LinuxThreads was external. Also, for old
- # versions of glibc, the libidn add-on was external,
- # but with version >=2.10, it is internal.
- CT_DoLog DEBUG "Addon '${addon}' could not be downloaded."
- CT_DoLog DEBUG "We'll see later if we can find it in the source tree"
- fi
- done
+ CT_Fetch GLIBC
+ if [ "${CT_GLIBC_USE_PORTS_EXTERNAL}" = "y" ]; then
+ CT_Fetch GLIBC_PORTS
+ fi
return 0
}
-do_libc_extract() {
- local addon
-
- CT_Extract "${CT_LIBC}-${CT_LIBC_VERSION}"
- CT_Pushd "${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
- # Custom glibc won't get patched, because CT_GetCustom
- # marks custom glibc as patched.
- CT_Patch nochdir "${CT_LIBC}" "${CT_LIBC_VERSION}"
-
- for addon in $(do_libc_add_ons_list " "); do
- # If the addon was bundled with the main archive, we do not
- # need to extract it. Worse, if we were to try to extract
- # it, we'd get an error.
- if [ -d "${addon}" ]; then
- CT_DoLog DEBUG "Add-on '${addon}' already present, skipping extraction"
- continue
- fi
-
- CT_Extract nochdir "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
-
- CT_TestAndAbort "Error in add-on '${addon}': both short and long names in tarball" \
- -d "${addon}" -a -d "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
-
- # Some addons have the 'long' name, while others have the
- # 'short' name, but patches are non-uniformly built with
- # either the 'long' or 'short' name, whatever the addons name
- # but we prefer the 'short' name and avoid duplicates.
- if [ -d "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" ]; then
- CT_DoExecLog FILE mv "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}" "${addon}"
- fi
-
- CT_DoExecLog FILE ln -s "${addon}" "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
-
- CT_Patch nochdir "${CT_LIBC}" "${addon}-${CT_LIBC_VERSION}"
-
- # Remove the long name since it can confuse configure scripts to run
- # the same source twice.
- rm "${CT_LIBC}-${addon}-${CT_LIBC_VERSION}"
- done
-
- # The configure files may be older than the configure.in files
- # if using a snapshot (or even some tarballs). Fake them being
- # up to date.
- find . -type f -name configure -exec touch {} \; 2>&1 |CT_DoLog ALL
-
- CT_Popd
-}
-
-# 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
+glibc_extract()
+{
+ CT_ExtractPatch GLIBC
+ if [ "${CT_GLIBC_USE_PORTS_EXTERNAL}" = "y" ]; then
+ CT_ExtractPatch GLIBC_PORTS
+
+ # This may create a bogus symlink if glibc-ports is using custom
+ # sources or has an overlay (and glibc is shared). However,
+ # we do not support concurrent use of the source directory
+ # and next run, if using different glibc-ports source, will override
+ # this symlink anyway.
+ CT_DoExecLog ALL ln -sf "${CT_SRC_DIR}/${CT_GLIBC_PORTS_DIR_NAME}" \
+ "${CT_SRC_DIR}/${CT_GLIBC_DIR_NAME}/ports"
+ fi
}
# This function builds and install the full C library
-do_libc() {
- do_libc_backend libc_mode=final
-}
-
-do_libc_post_cc() {
- :
-}
-
-# This backend builds the C library once for each multilib
-# variant the compiler gives us
-# Usage: do_libc_backend param=value [...]
-# Parameter : Definition : Type : Default
-# libc_mode : 'startfiles' or 'final' : string : (none)
-do_libc_backend() {
- local libc_mode
+glibc_main()
+{
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_DoStep INFO "Installing C library"
+ CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc"
+ CT_IterateMultilibs glibc_backend_once multilib
CT_Popd
CT_EndStep
}
# This backend builds the C library once
-# Usage: do_libc_backend_once param=value [...]
+# Usage: glibc_backend_once param=value [...]
# Parameter : Definition : Type
-# libc_mode : 'startfiles' or 'final' : string : (empty)
# multi_* : as defined in CT_IterateMultilibs : (varies) :
-do_libc_backend_once() {
- local multi_flags multi_dir multi_os_dir multi_root multi_index multi_count
+glibc_backend_once()
+{
+ # Glibc seems to be smart enough to know about the cases that can coexist
+ # in the same root and installs them into proper multilib-os directory; all
+ # we need is to point to the right root.
+ local multi_flags multi_dir multi_os_dir multi_root multi_index multi_count multi_target
local build_cflags build_cppflags build_ldflags
- local startfiles_dir
- local src_dir="${CT_SRC_DIR}/${CT_LIBC}-${CT_LIBC_VERSION}"
+ local src_dir="${CT_SRC_DIR}/glibc"
local -a extra_config
local -a extra_make_args
local glibc_cflags
@@ -179,93 +71,95 @@ do_libc_backend_once() {
# Adjust target tuple according GLIBC quirks
CT_DoArchGlibcAdjustTuple multi_target
- # Glibc seems to be smart enough to know about the cases that can coexist
- # in the same root and installs them into proper multilib-os directory; all
- # we need is to point to the right root. We do need to handle multilib-os
- # here, though, for the first pass where we install crt*.o and a dummy
- # libc.so; we therefore install it to the most specific location of
- # <sysroot>/<suffix>/usr/lib/<multilib-os> where it is least likely to clash
- # with other multilib variants. We then remove these temporary files at
- # the beginning of the libc-final step and allow glibc to install them
- # where it thinks is proper.
- startfiles_dir="${multi_root}/usr/lib/${multi_os_dir}"
- CT_SanitizeVarDir startfiles_dir
-
- if [ "${libc_mode}" = "final" ]; then
- CT_DoLog EXTRA "Cleaning up start files"
- CT_DoExecLog ALL rm -f "${startfiles_dir}/crt1.o" \
- "${startfiles_dir}/crti.o" \
- "${startfiles_dir}/crtn.o" \
- "${startfiles_dir}/libc.so"
- fi
-
CT_DoLog EXTRA "Configuring C library"
- # Also, if those two are missing, iconv build breaks
+ # If those two are missing, iconv build breaks
extra_config+=( --disable-debug --disable-sanity-checks )
- # always include rpc, the user can still override it with TI-RPC
- extra_config+=( --enable-obsolete-rpc )
+ if [ "${CT_GLIBC_ENABLE_OBSOLETE_RPC}" = "y" ]; then
+ extra_config+=( --enable-obsolete-rpc )
+ fi
# Add some default glibc config options if not given by user.
# We don't need to be conditional on whether the user did set different
- # values, as they CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY is passed after
+ # values, as they CT_GLIBC_EXTRA_CONFIG_ARRAY is passed after
# extra_config
- extra_config+=("$(do_libc_min_kernel_config)")
+ extra_config+=("$(glibc_min_kernel_config)")
case "${CT_THREADS}" in
nptl) extra_config+=("--with-__thread" "--with-tls");;
linuxthreads) extra_config+=("--with-__thread" "--without-tls" "--without-nptl");;
none) extra_config+=("--without-__thread" "--without-nptl")
- case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
+ case "${CT_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
*-tls*) ;;
*) extra_config+=("--without-tls");;
esac
;;
esac
+ # FIXME static version of glibc seems to be broken:
+ # build tries to use libc-modules.h which is generated from
+ # soversions.i, which is only created for builds with shared libs.
case "${CT_SHARED_LIBS}" in
y) extra_config+=("--enable-shared");;
*) extra_config+=("--disable-shared");;
esac
- if [ "${CT_LIBC_DISABLE_VERSIONING}" = "y" ]; then
+ if [ "${CT_GLIBC_DISABLE_VERSIONING}" = "y" ]; then
extra_config+=("--disable-versioning")
fi
- if [ "${CT_LIBC_OLDEST_ABI}" != "" ]; then
- extra_config+=("--enable-oldest-abi=${CT_LIBC_OLDEST_ABI}")
+ if [ "${CT_GLIBC_OLDEST_ABI}" != "" ]; then
+ extra_config+=("--enable-oldest-abi=${CT_GLIBC_OLDEST_ABI}")
fi
- case "$(do_libc_add_ons_list ,)" in
+ case "$(glibc_add_ons_list ,)" in
"") extra_config+=("--enable-add-ons=no");;
- *) extra_config+=("--enable-add-ons=$(do_libc_add_ons_list ,)");;
+ *) extra_config+=("--enable-add-ons=$(glibc_add_ons_list ,)");;
esac
- extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
+ [ "${CT_GLIBC_ENABLE_WERROR}" != "y" ] && extra_config+=("--disable-werror")
+ [ -n "${CT_PKGVERSION}" ] && extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
[ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
+ if [ -n "${CT_GLIBC_SSP}" ]; then
+ extra_config+=("--enable-stack-protector=${CT_GLIBC_SSP}")
+ fi
+
touch config.cache
- if [ "${CT_LIBC_GLIBC_FORCE_UNWIND}" = "y" ]; then
+
+ # Until it became explicitly controllable with --enable-stack-protector=...,
+ # configure detected GCC support for -fstack-protector{,-strong} and
+ # tried to enable it in some parts of glibc - which then failed to build.
+ if [ -z "${CT_GLIBC_BUILD_SSP}" ]; then
+ echo "libc_cv_ssp=no" >>config.cache
+ echo "libc_cv_ssp_strong=no" >>config.cache
+ fi
+
+ if [ "${CT_GLIBC_FORCE_UNWIND}" = "y" ]; then
echo "libc_cv_forced_unwind=yes" >>config.cache
echo "libc_cv_c_cleanup=yes" >>config.cache
fi
# Pre-seed the configparms file with values from the config option
- printf "%s\n" "${CT_LIBC_GLIBC_CONFIGPARMS}" > configparms
+ printf "%s\n" "${CT_GLIBC_CONFIGPARMS}" > configparms
# glibc can't be built without -O2 (reference needed!)
- glibc_cflags+=" -O2"
+ glibc_cflags+=" -g -O2"
+
+ if [ "${CT_GLIBC_ENABLE_COMMON_FLAG}" = "y" ]; then
+ glibc_cflags+=" -fcommon"
+ fi
- case "${CT_LIBC_ENABLE_FORTIFIED_BUILD}" in
+ case "${CT_GLIBC_ENABLE_FORTIFIED_BUILD}" in
y) ;;
*) glibc_cflags+=" -U_FORTIFY_SOURCE";;
esac
# In the order of increasing precedence. Flags common to compiler and linker.
- glibc_cflags+=" ${CT_TARGET_CFLAGS}"
- glibc_cflags+=" ${CT_LIBC_GLIBC_EXTRA_CFLAGS}"
+ glibc_cflags+=" ${CT_ALL_TARGET_CFLAGS}"
+ glibc_cflags+=" ${CT_GLIBC_EXTRA_CFLAGS}"
glibc_cflags+=" ${multi_flags}"
# Analyze the resulting options for any extra configure switches to throw in.
@@ -279,6 +173,7 @@ do_libc_backend_once() {
;;
esac
done
+ CT_DoArchGlibcAdjustConfigure extra_config "${glibc_cflags}"
# ./configure is mislead by our tools override wrapper for bash
# so just tell it where the real bash is _on_the_target_!
@@ -293,6 +188,8 @@ do_libc_backend_once() {
# or even after they get installed...
echo "ac_cv_path_BASH_SHELL=/bin/bash" >>config.cache
+ CT_SymlinkToolsMultilib
+
# Configure with --prefix the way we want it on the target...
# There are a whole lot of settings here. You'll probably want
# to read up on what they all mean, and customize a bit, possibly
@@ -306,17 +203,19 @@ do_libc_backend_once() {
# Run explicitly through CONFIG_SHELL, or the build breaks badly (loop-of-death)
# when the shell is not bash... Sigh... :-(
- CT_DoLog DEBUG "Configuring with addons : '$(do_libc_add_ons_list ,)'"
+ CT_DoLog DEBUG "Configuring with addons : '$(glibc_add_ons_list ,)'"
CT_DoLog DEBUG "Extra config args passed : '${extra_config[*]}'"
CT_DoLog DEBUG "Extra CFLAGS passed : '${glibc_cflags}'"
- CT_DoLog DEBUG "Placing startfiles into : '${startfiles_dir}'"
CT_DoLog DEBUG "Configuring with --host : '${multi_target}'"
# CFLAGS are only applied when compiling .c files. .S files are compiled with ASFLAGS,
# but they are not passed by configure. Thus, pass everything in CC instead.
+ # The CFLAGS variable needs to be cleared, else the default "-g -O2"
+ # would override previous flags.
CT_DoExecLog CFG \
BUILD_CC=${CT_BUILD}-gcc \
CC="${CT_TARGET}-${CT_CC} ${glibc_cflags}" \
+ CFLAGS="" \
AR=${CT_TARGET}-ar \
RANLIB=${CT_TARGET}-ranlib \
"${CONFIG_SHELL}" \
@@ -330,9 +229,13 @@ do_libc_backend_once() {
--without-gd \
--with-headers="${CT_HEADERS_DIR}" \
"${extra_config[@]}" \
- "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[@]}"
+ "${CT_GLIBC_EXTRA_CONFIG_ARRAY[@]}"
# build hacks
+
+ # Mask C++ compiler. Glibc 2.29+ attempts to build some tests using gcc++, but
+ # we haven't built libstdc++ yet. Should really implement #808 after 1.24.0...
+ extra_make_args+=( CXX= )
case "${CT_ARCH},${CT_ARCH_CPU}" in
powerpc,8??)
# http://sourceware.org/ml/crossgcc/2008-10/msg00068.html
@@ -346,153 +249,86 @@ do_libc_backend_once() {
build_ldflags="${CT_LDFLAGS_FOR_BUILD}"
case "$CT_BUILD" in
- *mingw*|*cygwin*|*msys*|*darwin*)
+ *mingw*|*cygwin*|*msys*|*darwin*|*freebsd*)
# When installing headers on Cygwin, Darwin, MSYS2 and MinGW-w64 sunrpc needs
# gettext for building cross-rpcgen.
build_cppflags="${build_cppflags} -I${CT_BUILDTOOLS_PREFIX_DIR}/include/"
build_ldflags="${build_ldflags} -lintl -liconv"
+ case "$CT_BUILD" in
+ *cygwin*|*freebsd*)
+ # Additionally, stat in FreeBSD, Cygwin, and possibly others
+ # is always 64bit, so replace struct stat64 with stat.
+ build_cppflags="${build_cppflags} -Dstat64=stat"
+ ;;
+ esac
;;
esac
+
+ # Make sure glibc build system respects our provided CFLAGS.
+ extra_make_args+=( default_cflags= )
extra_make_args+=( "BUILD_CFLAGS=${build_cflags}" )
extra_make_args+=( "BUILD_CPPFLAGS=${build_cppflags}" )
extra_make_args+=( "BUILD_LDFLAGS=${build_ldflags}" )
- if [ "${libc_mode}" = "startfiles" -a ! -r "${multi_root}/.libc_headers_installed" ]; then
- CT_DoLog EXTRA "Installing C library headers"
- CT_DoExecLog ALL touch "${multi_root}/.libc_headers_installed"
-
- # use the 'install-headers' makefile target to install the
- # headers
- CT_DoExecLog ALL make ${JOBSFLAGS} \
- install_root=${multi_root} \
- install-bootstrap-headers=yes \
- "${extra_make_args[@]}" \
- install-headers
-
- # For glibc, a few headers need to be manually installed
- if [ "${CT_LIBC}" = "glibc" ]; then
- # Two headers -- stubs.h and features.h -- aren't installed by install-headers,
- # so do them by hand. We can tolerate an empty stubs.h for the moment.
- # See e.g. http://gcc.gnu.org/ml/gcc/2002-01/msg00900.html
- mkdir -p "${CT_HEADERS_DIR}/gnu"
- CT_DoExecLog ALL touch "${CT_HEADERS_DIR}/gnu/stubs.h"
- CT_DoExecLog ALL cp -v "${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}/include/features.h" \
- "${CT_HEADERS_DIR}/features.h"
-
- # Building the bootstrap gcc requires either setting inhibit_libc, or
- # having a copy of stdio_lim.h... see
- # http://sources.redhat.com/ml/libc-alpha/2003-11/msg00045.html
- CT_DoExecLog ALL cp -v bits/stdio_lim.h "${CT_HEADERS_DIR}/bits/stdio_lim.h"
-
- # Following error building gcc-4.0.0's gcj:
- # error: bits/syscall.h: No such file or directory
- # solved by following copy; see http://sourceware.org/ml/crossgcc/2005-05/msg00168.html
- # but it breaks arm, see http://sourceware.org/ml/crossgcc/2006-01/msg00091.html
- # Of course, only copy it if it does not already exist
- case "${CT_ARCH}" in
- arm) ;;
- *) if [ -f "${CT_HEADERS_DIR}/bits/syscall.h" ]; then
- CT_DoLog ALL "Not over-writing existing bits/syscall.h"
- elif [ -f "misc/bits/syscall.h" ]; then
- CT_DoExecLog ALL cp -v "misc/bits/syscall.h" \
- "${CT_HEADERS_DIR}/bits/syscall.h"
- else
- # "Old" glibces do not have the above file,
- # but provide this one:
- CT_DoExecLog ALL cp -v "misc/syscall-list.h" \
- "${CT_HEADERS_DIR}/bits/syscall.h"
- fi
- ;;
- esac
- fi
- elif [ "${libc_mode}" = "final" -a -r "${multi_root}/.libc_headers_installed" ]; then
- CT_DoExecLog ALL rm -f "${multi_root}/.libc_headers_installed"
- fi # installing headers
-
- if [ "${libc_mode}" = "startfiles" ]; then
- if [ "${CT_THREADS}" = "nptl" ]; then
- CT_DoLog EXTRA "Installing C library start files"
-
- # there are a few object files needed to link shared libraries,
- # which we build and install by hand
- CT_DoExecLog ALL mkdir -p "${startfiles_dir}"
- CT_DoExecLog ALL make ${JOBSFLAGS} \
- "${extra_make_args[@]}" \
- csu/subdir_lib
- CT_DoExecLog ALL cp csu/crt1.o csu/crti.o csu/crtn.o \
- "${startfiles_dir}"
-
- # Finally, 'libgcc_s.so' requires a 'libc.so' to link against.
- # However, since we will never actually execute its code,
- # it doesn't matter what it contains. So, treating '/dev/null'
- # as a C source file, we produce a dummy 'libc.so' in one step
- CT_DoExecLog ALL "${CT_TARGET}-${CT_CC}" ${multi_flags} \
- -nostdlib \
- -nostartfiles \
- -shared \
- -x c /dev/null \
- -o "${startfiles_dir}/libc.so"
- fi # threads == nptl
- fi # libc_mode = startfiles
-
- if [ "${libc_mode}" = "final" ]; then
- CT_DoLog EXTRA "Building C library"
- CT_DoExecLog ALL make ${JOBSFLAGS} \
- "${extra_make_args[@]}" \
- all
-
- CT_DoLog EXTRA "Installing C library"
- CT_DoExecLog ALL make ${JOBSFLAGS} \
- "${extra_make_args[@]}" \
- install_root="${multi_root}" \
- install
-
- if [ "${CT_BUILD_MANUALS}" = "y" -a "${multi_index}" = "${multi_count}" ]; then
- # We only need to build the manuals once. Only build them on the
- # last multilib target. If it's not multilib, it will happen on the
- # only target.
- CT_DoLog EXTRA "Building and installing the C library manual"
- # Omit JOBSFLAGS as GLIBC has problems building the
- # manuals in parallel
- CT_DoExecLog ALL make pdf html
- CT_DoExecLog ALL mkdir -p ${CT_PREFIX_DIR}/share/doc
- CT_DoExecLog ALL cp -av manual/*.pdf \
- manual/libc \
- ${CT_PREFIX_DIR}/share/doc
- fi
-
- if [ "${CT_LIBC_LOCALES}" = "y" -a "${multi_index}" = "${multi_count}" ]; then
- do_libc_locales
- fi
- fi # libc_mode = final
+ CT_DoLog EXTRA "Building C library"
+ CT_DoExecLog ALL make ${CT_JOBSFLAGS} \
+ "${extra_make_args[@]}" \
+ all
+
+ CT_DoLog EXTRA "Installing C library"
+ CT_DoExecLog ALL make ${CT_JOBSFLAGS} \
+ "${extra_make_args[@]}" \
+ install_root="${multi_root}" \
+ install
+
+ if [ "${CT_BUILD_MANUALS}" = "y" -a "${multi_index}" = "${multi_count}" ]; then
+ # We only need to build the manuals once. Only build them on the
+ # last multilib target. If it's not multilib, it will happen on the
+ # only target.
+ CT_DoLog EXTRA "Building and installing the C library manual"
+ # Omit CT_JOBSFLAGS as GLIBC has problems building the
+ # manuals in parallel
+ CT_DoExecLog ALL make pdf html
+ CT_DoExecLog ALL mkdir -p ${CT_PREFIX_DIR}/share/doc
+ CT_DoExecLog ALL cp -av manual/*.pdf \
+ manual/libc \
+ ${CT_PREFIX_DIR}/share/doc
+ fi
+
+ if [ "${CT_GLIBC_LOCALES}" = "y" -a "${multi_index}" = "${multi_count}" ]; then
+ glibc_locales
+ fi
CT_EndStep
}
# Build up the addons list, separated with $1
-do_libc_add_ons_list() {
+glibc_add_ons_list()
+{
local sep="$1"
- local addons_list="$( echo "${CT_LIBC_ADDONS_LIST}" \
- |sed -r -e "s/[[:space:],]/${sep}/g;" \
- )"
- if [ "${CT_LIBC_GLIBC_2_20_or_later}" != "y" ]; then
- case "${CT_THREADS}" in
- none) ;;
- *) addons_list="${addons_list}${sep}${CT_THREADS}";;
- esac
+ local addons_list
+
+ if [ "${CT_GLIBC_USE_PORTS_ADDON}" = "y" ]; then
+ addons_list="${addons_list}${sep}ports"
+ fi
+ if [ "${CT_GLIBC_USE_NPTL_ADDON}" = "y" ]; then
+ addons_list="${addons_list}${sep}nptl"
fi
- [ "${CT_LIBC_GLIBC_USE_PORTS}" = "y" ] && addons_list="${addons_list}${sep}ports"
- # Remove duplicate, leading and trailing separators
- echo "${addons_list}" |sed -r -e "s/${sep}+/${sep}/g; s/^${sep}//; s/${sep}\$//;"
+ if [ "${CT_GLIBC_USE_LIBIDN_ADDON}" = "y" ]; then
+ addons_list="${addons_list}${sep}libidn"
+ fi
+ echo "${addons_list#${sep}}" # Remove leading separator if any
}
# Compute up the minimum supported Linux kernel version
-do_libc_min_kernel_config() {
+glibc_min_kernel_config()
+{
local min_kernel_config
- case "${CT_LIBC_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
+ case "${CT_GLIBC_EXTRA_CONFIG_ARRAY[*]}" in
*--enable-kernel*) ;;
- *) if [ "${CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then
+ *) if [ "${CT_GLIBC_KERNEL_VERSION_AS_HEADERS}" = "y" ]; then
+ # TBD do we support that currently? We always seem to install kernel headers
# We can't rely on the kernel version from the configuration,
# because it might not be available if the user uses pre-installed
# headers. On the other hand, both method will have the kernel
@@ -509,9 +345,9 @@ do_libc_min_kernel_config() {
patchlevel=$(((version_code>>8)&0xFF))
sublevel=$((version_code&0xFF))
min_kernel_config="${version}.${patchlevel}.${sublevel}"
- elif [ "${CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then
+ elif [ "${CT_GLIBC_KERNEL_VERSION_CHOSEN}" = "y" ]; then
# Trim the fourth part of the linux version, keeping only the first three numbers
- min_kernel_config="$( echo "${CT_LIBC_GLIBC_MIN_KERNEL_VERSION}" \
+ min_kernel_config="$( echo "${CT_GLIBC_MIN_KERNEL_VERSION}" \
|sed -r -e 's/^([^.]+\.[^.]+\.[^.]+)(|\.[^.]+)$/\1/;' \
)"
fi
@@ -521,11 +357,21 @@ do_libc_min_kernel_config() {
}
# Build and install the libc locales
-do_libc_locales() {
- local src_dir="${CT_SRC_DIR}/glibc-${CT_LIBC_VERSION}"
+glibc_locales()
+{
+ local src_dir="${CT_SRC_DIR}/glibc"
local -a extra_config
local glibc_cflags
+ # To build locales, we'd need to build glibc for the build machine.
+ # Bail out if the host is not supported.
+ case "${CT_BUILD}" in
+ *-cygwin|*-darwin*)
+ CT_DoLog EXTRA "Skipping GNU libc locales: incompatible build machine"
+ return
+ ;;
+ esac
+
mkdir -p "${CT_BUILD_DIR}/build-localedef"
cd "${CT_BUILD_DIR}/build-localedef"
@@ -535,7 +381,7 @@ do_libc_locales() {
# a harmless: `configure: WARNING: unrecognized options: --with-bugurl...`
# If it's set, use it, if is a recognized option.
if [ ! "${CT_TOOLCHAIN_PKGVERSION}" = "" ]; then
- extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
+ [ -n "${CT_PKGVERSION}" ] && extra_config+=("--with-pkgversion=${CT_PKGVERSION}")
fi
if [ ! "${CT_TOOLCHAIN_BUGURL}" = "" ]; then
[ -n "${CT_TOOLCHAIN_BUGURL}" ] && extra_config+=("--with-bugurl=${CT_TOOLCHAIN_BUGURL}")
@@ -544,7 +390,7 @@ do_libc_locales() {
CT_DoLog DEBUG "Extra config args passed: '${extra_config[*]}'"
glibc_cflags="-O2 -fno-stack-protector"
- case "${CT_LIBC_ENABLE_FORTIFIED_BUILD}" in
+ case "${CT_GLIBC_ENABLE_FORTIFIED_BUILD}" in
y) ;;
*) glibc_cflags+=" -U_FORTIFY_SOURCE";;
esac
@@ -578,7 +424,7 @@ do_libc_locales() {
"${extra_config[@]}"
CT_DoLog EXTRA "Building C library localedef"
- CT_DoExecLog ALL make ${JOBSFLAGS}
+ CT_DoExecLog ALL make ${CT_JOBSFLAGS}
# The target's endianness and uint32_t alignment should be passed as options
# to localedef, but glibc's localedef does not support these options, which
@@ -586,7 +432,7 @@ do_libc_locales() {
# only if it has the same endianness and uint32_t alignment as the host's.
CT_DoLog EXTRA "Installing C library locales"
- CT_DoExecLog ALL make ${JOBSFLAGS} \
+ CT_DoExecLog ALL make ${CT_JOBSFLAGS} \
install_root="${CT_SYSROOT_DIR}" \
localedata/install-locales
}
diff --git a/scripts/build/libc/mingw-w64.sh b/scripts/build/libc/mingw-w64.sh
new file mode 100644
index 0000000..54e8d07
--- /dev/null
+++ b/scripts/build/libc/mingw-w64.sh
@@ -0,0 +1,220 @@
+# Copyright 2012 Yann Diorcet
+# Licensed under the GPL v2. See COPYING in the root of this package
+
+mingw_w64_set_install_prefix()
+{
+ MINGW_INSTALL_PREFIX=/usr/${CT_TARGET}
+ if [[ ${CT_MINGW_W64_VERSION} == 2* ]]; then
+ MINGW_INSTALL_PREFIX=/usr
+ fi
+}
+
+mingw_w64_headers() {
+ local -a sdk_opts
+
+ CT_DoStep INFO "Installing C library headers"
+
+ case "${CT_MINGW_DIRECTX}:${CT_MINGW_DDK}" in
+ y:y) sdk_opts+=( "--enable-sdk=all" );;
+ y:) sdk_opts+=( "--enable-sdk=directx" );;
+ :y) sdk_opts+=( "--enable-sdk=ddk" );;
+ :) ;;
+ esac
+
+ if [ "${CT_MINGW_SECURE_API}" = "y" ]; then
+ sdk_opts+=( "--enable-secure-api" )
+ fi
+
+ CT_mkdir_pushd "${CT_BUILD_DIR}/build-mingw-w64-headers"
+
+ CT_DoLog EXTRA "Configuring Headers"
+
+ mingw_w64_set_install_prefix
+ CT_DoExecLog CFG \
+ ${CONFIG_SHELL} \
+ "${CT_SRC_DIR}/mingw-w64/mingw-w64-headers/configure" \
+ --build=${CT_BUILD} \
+ --host=${CT_TARGET} \
+ --prefix=${MINGW_INSTALL_PREFIX} \
+ "${sdk_opts[@]}"
+
+ CT_DoLog EXTRA "Compile Headers"
+ CT_DoExecLog ALL make
+
+ CT_DoLog EXTRA "Installing Headers"
+ CT_DoExecLog ALL make install DESTDIR=${CT_SYSROOT_DIR}
+
+ CT_Popd
+
+ # It seems mingw is strangely set up to look into /mingw instead of
+ # /usr (notably when looking for the headers). This symlink is
+ # here to workaround this, and seems to be here to last... :-/
+ CT_DoExecLog ALL ln -sv "usr/${CT_TARGET}" "${CT_SYSROOT_DIR}/mingw"
+
+ CT_EndStep
+}
+
+do_check_mingw_vendor_tuple()
+{
+ CT_DoStep INFO "Checking configured vendor tuple"
+ if [ ${CT_TARGET_VENDOR} = "w64" ]; then
+ CT_DoLog DEBUG "The tuple is set to '${CT_TARGET_VENDOR}', as recommended by mingw-64 developers."
+ else
+ CT_DoLog WARN "The tuple vendor is '${CT_TARGET_VENDOR}', not equal to 'w64' and might break the toolchain!"
+ fi
+ CT_EndStep
+}
+
+do_mingw_tools()
+{
+ local f
+
+ for f in "${CT_MINGW_TOOL_LIST_ARRAY[@]}"; do
+ CT_mkdir_pushd "${f}"
+ if [ ! -d "${CT_SRC_DIR}/mingw-w64/mingw-w64-tools/${f}" ]; then
+ CT_DoLog WARN "Skipping ${f}: not found"
+ CT_Popd
+ continue
+ fi
+
+ CT_DoLog EXTRA "Configuring ${f}"
+ CT_DoExecLog CFG \
+ ${CONFIG_SHELL} \
+ "${CT_SRC_DIR}/mingw-w64/mingw-w64-tools/${f}/configure" \
+ --build=${CT_BUILD} \
+ --host=${CT_HOST} \
+ --target=${CT_TARGET} \
+ --program-prefix=${CT_TARGET}- \
+ --prefix="${CT_PREFIX_DIR}"
+
+ # mingw-w64 has issues with parallel builds, see mingw_w64_main
+ CT_DoLog EXTRA "Building ${f}"
+ CT_DoExecLog ALL make
+ CT_DoLog EXTRA "Installing ${f}"
+ CT_DoExecLog ALL make install
+ CT_Popd
+ done
+}
+
+do_mingw_pthreads()
+{
+ local multi_flags multi_dir multi_os_dir multi_root multi_index multi_count multi_target
+ local libprefix
+ local rcflags dlltoolflags
+
+ for arg in "$@"; do
+ eval "${arg// /\\ }"
+ done
+
+ CT_DoStep INFO "Building for multilib ${multi_index}/${multi_count}: '${multi_flags}'"
+
+ libprefix="${MINGW_INSTALL_PREFIX}/lib/${multi_os_dir}"
+ CT_SanitizeVarDir libprefix
+
+ CT_SymlinkToolsMultilib
+
+ # DLLTOOLFLAGS does not appear to be currently used by winpthread package, but
+ # the master package uses this variable and describes this as one of the changes
+ # needed for i686 in mingw-w64-doc/howto-build/mingw-w64-howto-build-adv.txt
+ case "${multi_target}" in
+ i[3456]86-*)
+ rcflags="-F pe-i386"
+ dlltoolflags="-m i386"
+ ;;
+ x86_64-*)
+ rcflags="-F pe-x86-64"
+ dlltoolflags="-m i386:x86_64"
+ ;;
+ *)
+ CT_Abort "Tuple ${multi_target} is not supported by mingw-w64"
+ ;;
+ esac
+
+ CT_DoLog EXTRA "Configuring mingw-w64-winpthreads"
+
+ CT_DoExecLog CFG \
+ CFLAGS="${multi_flags}" \
+ CXXFLAGS="${multi_flags}" \
+ RCFLAGS="${rcflags}" \
+ DLLTOOLFLAGS="${dlltoolflags}" \
+ ${CONFIG_SHELL} \
+ "${CT_SRC_DIR}/mingw-w64/mingw-w64-libraries/winpthreads/configure" \
+ --with-sysroot=${CT_SYSROOT_DIR} \
+ --prefix=${MINGW_INSTALL_PREFIX} \
+ --libdir=${libprefix} \
+ --build=${CT_BUILD} \
+ --host=${multi_target}
+
+ # mingw-w64 has issues with parallel builds, see mingw_w64_main
+ CT_DoLog EXTRA "Building mingw-w64-winpthreads"
+ CT_DoExecLog ALL make
+
+ CT_DoLog EXTRA "Installing mingw-w64-winpthreads"
+ CT_DoExecLog ALL make install DESTDIR=${CT_SYSROOT_DIR}
+
+ # Post-install hackery: all libwinpthread-1.dll end up being installed
+ # into /bin, which is broken on multilib install. Hence, stash it back
+ # into /lib - and after iterating over multilibs, copy the default one
+ # back into /bin.
+ if [ "${multi_index}" != 1 -o "${multi_count}" != 1 ]; then
+ CT_DoExecLog ALL mv "${CT_SYSROOT_DIR}${MINGW_INSTALL_PREFIX}/bin/libwinpthread-1.dll" \
+ "${CT_SYSROOT_DIR}${libprefix}/libwinpthread-1.dll"
+ if [ "${multi_index}" = 1 ]; then
+ default_libprefix="${libprefix}"
+ elif [ "${multi_index}" = "${multi_count}" ]; then
+ CT_DoExecLog ALL cp "${CT_SYSROOT_DIR}${default_libprefix}/libwinpthread-1.dll" \
+ "${CT_SYSROOT_DIR}${MINGW_INSTALL_PREFIX}/bin/libwinpthread-1.dll"
+ fi
+ fi
+
+ CT_EndStep
+}
+
+mingw_w64_main()
+{
+ # Used when iterating over libwinpthread
+ local default_libprefix
+
+ do_check_mingw_vendor_tuple
+
+ CT_DoStep INFO "Building mingw-w64"
+
+ CT_DoLog EXTRA "Configuring mingw-w64-crt"
+
+ CT_mkdir_pushd "${CT_BUILD_DIR}/build-mingw-w64-crt"
+
+ mingw_w64_set_install_prefix
+ CT_DoExecLog CFG \
+ ${CONFIG_SHELL} \
+ "${CT_SRC_DIR}/mingw-w64/mingw-w64-crt/configure" \
+ --with-sysroot=${CT_SYSROOT_DIR} \
+ --prefix=${MINGW_INSTALL_PREFIX} \
+ --build=${CT_BUILD} \
+ --host=${CT_TARGET}
+
+ # mingw-w64-crt has a missing dependency occasionally breaking the
+ # parallel build. See https://github.com/crosstool-ng/crosstool-ng/issues/246
+ # Do not pass ${CT_JOBSFLAGS} - build serially.
+ CT_DoLog EXTRA "Building mingw-w64-crt"
+ CT_DoExecLog ALL make
+
+ CT_DoLog EXTRA "Installing mingw-w64-crt"
+ CT_DoExecLog ALL make install DESTDIR=${CT_SYSROOT_DIR}
+ CT_EndStep
+
+ if [ "${CT_THREADS}" = "posix" ]; then
+ CT_DoStep INFO "Building mingw-w64-winpthreads"
+ CT_mkdir_pushd "${CT_BUILD_DIR}/build-mingw-w64-winpthreads"
+ CT_IterateMultilibs do_mingw_pthreads pthreads-multilib
+ CT_Popd
+ CT_EndStep
+ fi
+
+ if [ "${CT_MINGW_TOOLS}" = "y" ]; then
+ CT_DoStep INFO "Installing mingw-w64 companion tools"
+ CT_mkdir_pushd "${CT_BUILD_DIR}/build-mingw-w64-tools"
+ do_mingw_tools
+ CT_Popd
+ CT_EndStep
+ fi
+}
diff --git a/scripts/build/libc/mingw.sh b/scripts/build/libc/mingw.sh
deleted file mode 100644
index eb04cb6..0000000
--- a/scripts/build/libc/mingw.sh
+++ /dev/null
@@ -1,178 +0,0 @@
-# Copyright 2012 Yann Diorcet
-# Licensed under the GPL v2. See COPYING in the root of this package
-
-CT_WINAPI_VERSION_DOWNLOADED=
-
-do_libc_get() {
- CT_DoStep INFO "Fetching mingw-w64 source for ${CT_WINAPI_VERSION}"
- if [ "${CT_WINAPI_VERSION}" = "devel" ]; then
- CT_GetGit "mingw-w64" "ref=HEAD" "git://git.code.sf.net/p/mingw-w64/mingw-w64" CT_WINAPI_VERSION_DOWNLOADED
- CT_DoLog EXTRA "Fetched as ${CT_WINAPI_VERSION_DOWNLOADED}"
- else
- CT_GetFile "mingw-w64-v${CT_WINAPI_VERSION}" \
- http://downloads.sourceforge.net/sourceforge/mingw-w64
- CT_WINAPI_VERSION_DOWNLOADED=v${CT_WINAPI_VERSION}
- fi
- CT_EndStep
-}
-
-do_libc_extract() {
- CT_Extract "mingw-w64-${CT_WINAPI_VERSION_DOWNLOADED}"
- CT_Pushd "${CT_SRC_DIR}/mingw-w64-${CT_WINAPI_VERSION_DOWNLOADED}/"
- CT_Patch nochdir mingw-w64 "${CT_WINAPI_VERSION_DOWNLOADED}"
- CT_Popd
-}
-
-do_set_mingw_install_prefix(){
- MINGW_INSTALL_PREFIX=/usr/${CT_TARGET}
- if [[ ${CT_WINAPI_VERSION} == 2* ]]; then
- MINGW_INSTALL_PREFIX=/usr
- fi
-}
-
-do_libc_start_files() {
- local -a sdk_opts
-
- CT_DoStep INFO "Installing C library headers"
-
- case "${CT_MINGW_DIRECTX}:${CT_MINGW_DDK}" in
- y:y) sdk_opts+=( "--enable-sdk=all" );;
- y:) sdk_opts+=( "--enable-sdk=directx" );;
- :y) sdk_opts+=( "--enable-sdk=ddk" );;
- :) ;;
- esac
-
- CT_mkdir_pushd "${CT_BUILD_DIR}/build-mingw-w64-headers"
-
- CT_DoLog EXTRA "Configuring Headers"
-
- do_set_mingw_install_prefix
- CT_DoExecLog CFG \
- ${CONFIG_SHELL} \
- "${CT_SRC_DIR}/mingw-w64-${CT_WINAPI_VERSION_DOWNLOADED}/mingw-w64-headers/configure" \
- --build=${CT_BUILD} \
- --host=${CT_TARGET} \
- --prefix=${MINGW_INSTALL_PREFIX} \
- "${sdk_opts[@]}"
-
- CT_DoLog EXTRA "Compile Headers"
- CT_DoExecLog ALL make
-
- CT_DoLog EXTRA "Installing Headers"
- CT_DoExecLog ALL make install DESTDIR=${CT_SYSROOT_DIR}
-
- CT_Popd
-
- # It seems mingw is strangely set up to look into /mingw instead of
- # /usr (notably when looking for the headers). This symlink is
- # here to workaround this, and seems to be here to last... :-/
- CT_DoExecLog ALL ln -sv "usr/${CT_TARGET}" "${CT_SYSROOT_DIR}/mingw"
-
- CT_EndStep
-}
-
-do_check_mingw_vendor_tuple()
-{
- if [[ ${CT_WINAPI_VERSION} == 4* ]]; then
- CT_DoStep INFO "Checking vendor tuple configured in crosstool-ng .config"
- if [[ ${CT_TARGET_VENDOR} == w64 ]]; then
- CT_DoLog EXTRA "The tuple is set to '${CT_TARGET_VENDOR}', as recommended by mingw-64 team."
- else
- CT_DoLog WARN "WARNING! The tuple '${CT_TARGET_VENDOR}', is not equal to w64 and might break the toolchain! WARNING!"
- fi
- CT_EndStep
- fi
-}
-
-do_mingw_tools() {
- for f in gendef genidl genlib genpeimg widl
- do
- if [[ ! -d "${CT_SRC_DIR}/mingw-w64-${CT_WINAPI_VERSION_DOWNLOADED}/mingw-w64-tools/${f}" ]]; then
- continue;
- fi
-
- CT_mkdir_pushd "${CT_BUILD_DIR}/build-mingw-w64-tools/${f}"
-
- CT_DoExecLog CFG \
- ${CONFIG_SHELL} \
- "${CT_SRC_DIR}/mingw-w64-${CT_WINAPI_VERSION_DOWNLOADED}/mingw-w64-tools/${f}/configure" \
- --build=${CT_BUILD} \
- --host=${CT_HOST} \
- --target=${CT_TARGET} \
- --program-prefix=${CT_TARGET}- \
- --prefix="${CT_PREFIX_DIR}"
-
- CT_DoExecLog ALL ${make} ${JOBSFLAGS}
-
- CT_DoExecLog ALL ${make} install
-
- CT_Popd
- done
-}
-
-do_libc() {
- do_check_mingw_vendor_tuple
-
- CT_DoStep INFO "Building mingw-w64 files"
-
- CT_DoLog EXTRA "Configuring mingw-w64-crt"
-
- CT_mkdir_pushd "${CT_BUILD_DIR}/build-mingw-w64-crt"
-
- do_set_mingw_install_prefix
- CT_DoExecLog CFG \
- ${CONFIG_SHELL} \
- "${CT_SRC_DIR}/mingw-w64-${CT_WINAPI_VERSION_DOWNLOADED}/mingw-w64-crt/configure" \
- --with-sysroot=${CT_SYSROOT_DIR} \
- --prefix=${MINGW_INSTALL_PREFIX} \
- --build=${CT_BUILD} \
- --host=${CT_TARGET} \
-
- # mingw-w64-crt has a missing dependency occasionally breaking the
- # parallel build. See https://github.com/crosstool-ng/crosstool-ng/issues/246
- # Do not pass ${JOBSFLAGS} - build serially.
- CT_DoLog EXTRA "Building mingw-w64-crt"
- CT_DoExecLog ALL make
-
- CT_DoLog EXTRA "Installing mingw-w64-crt"
- CT_DoExecLog ALL make install DESTDIR=${CT_SYSROOT_DIR}
-
- if [[ ${CT_MINGW_TOOLS} == "y" ]]; then
- CT_DoLog EXTRA "Installing mingw-w64 companion tools"
- do_mingw_tools
- fi
-
- CT_EndStep
-
- if [ "${CT_THREADS}" = "posix" ]; then
- do_pthreads
- fi
-}
-
-do_libc_post_cc() {
- :
-}
-
-do_pthreads() {
- CT_DoStep INFO "Building mingw-w64-winpthreads files"
-
- CT_DoLog EXTRA "Configuring mingw-w64-winpthreads"
-
- CT_mkdir_pushd "${CT_BUILD_DIR}/build-mingw-w64-winpthreads"
-
- CT_DoExecLog CFG \
- ${CONFIG_SHELL} \
- "${CT_SRC_DIR}/mingw-w64-${CT_WINAPI_VERSION_DOWNLOADED}/mingw-w64-libraries/winpthreads/configure" \
- --with-sysroot=${CT_SYSROOT_DIR} \
- --prefix=${MINGW_INSTALL_PREFIX} \
- --build=${CT_BUILD} \
- --host=${CT_TARGET} \
-
- CT_DoLog EXTRA "Building mingw-w64-winpthreads"
- CT_DoExecLog ALL make ${JOBSFLAGS}
-
- CT_DoLog EXTRA "Installing mingw-w64-winpthreads"
- CT_DoExecLog ALL make install DESTDIR=${CT_SYSROOT_DIR}
-
- CT_EndStep
-}
diff --git a/scripts/build/libc/moxiebox.sh b/scripts/build/libc/moxiebox.sh
new file mode 100644
index 0000000..35e2ea4
--- /dev/null
+++ b/scripts/build/libc/moxiebox.sh
@@ -0,0 +1,79 @@
+# Functions to build the moxiebox runtime.
+
+. "${CT_LIB_DIR}/scripts/build/libc/newlib.sh"
+
+moxiebox_get()
+{
+ CT_Fetch NEWLIB
+ CT_Fetch MOXIEBOX
+}
+
+moxiebox_extract()
+{
+ CT_ExtractPatch NEWLIB
+ CT_ExtractPatch MOXIEBOX
+}
+
+moxiebox_headers()
+{
+ newlib_headers
+}
+
+moxiebox_main()
+{
+ newlib_main
+}
+
+moxiebox_post_cc()
+{
+ CT_DoStep INFO "Installing moxiebox runtime and VM"
+
+ CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-moxiebox"
+ CT_DoExecLog ALL cp -av "${CT_SRC_DIR}/moxiebox/." .
+
+ CT_DoLog EXTRA "Building SHA256-only libcrypto"
+ # Moxiebox needs libcrypto on the host, but it only uses SHA256 digest functions
+ # from it. We don't want to pull the whole OpenSSL for the host; fortunately,
+ # moxiebox comes with a standalone SHA256 implementation - which it only uses
+ # for the target library. Help it use the same implementation for the host.
+ CT_mkdir_pushd openssl
+ CT_DoExecLog ALL cp -v "${CT_LIB_DIR}/packages/moxiebox/"sha*.[ch] ./
+ CT_DoExecLog ALL "${CT_HOST}-gcc" -c sha256_wrap.c -O2 -Wall
+ CT_DoExecLog ALL "${CT_HOST}-ar" cru libcrypto.a sha256_wrap.o
+ CT_Popd
+
+ # Moxiebox includes a VM which we're building for the
+ # host machine.
+ CT_DoLog EXTRA "Configuring moxiebox"
+
+ CT_DoExecLog CFG ./autogen.sh
+
+ # moxiebox build script creates symlinks from the installation location to the build
+ # directory for the moxiebox library. This seems backwards. Instead, pass the search
+ # as part of the MOX_GCC definition.
+ # moxiebox also depends on the tools being named moxiebox-{gcc,as,ar}. However, failure
+ # to detect such tools is non-fatal in the configure and we need to override it in
+ # make's command line anyway.
+ CT_DoExecLog CFG \
+ LDFLAGS="${CT_LDFLAGS_FOR_HOST} -L${CT_BUILD_DIR}/build-libc-moxiebox/openssl" \
+ CFLAGS="${CT_CFLAGS_FOR_HOST} -I${CT_BUILD_DIR}/build-libc-moxiebox" \
+ CXXFLAGS="${CT_CFLAGS_FOR_HOST} -I${CT_BUILD_DIR}/build-libc-moxiebox" \
+ ./configure \
+ --host="${CT_HOST}"
+ CT_DoLog EXTRA "Building moxiebox"
+ CT_DoExecLog CFG make all \
+ MOX_GCC="${CT_TARGET}-gcc -B ${CT_BUILD_DIR}/build-libc-moxiebox/runtime -B ${CT_SYSROOT_DIR}/lib" \
+ MOX_AS="${CT_TARGET}-as" \
+ MOX_AR="${CT_TARGET}-ar"
+
+ CT_DoLog EXTRA "Installing moxiebox"
+
+ # moxiebox does not have install target. Copy the interesting stuff manually.
+ CT_DoExecLog ALL cp -v "${CT_BUILD_DIR}/build-libc-moxiebox/runtime/libsandboxrt.a" \
+ "${CT_BUILD_DIR}/build-libc-moxiebox/runtime/crt0.o" \
+ "${CT_SYSROOT_DIR}/lib/"
+ CT_DoExecLog ALL cp -v "${CT_BUILD_DIR}/build-libc-moxiebox/src/sandbox" \
+ "${CT_PREFIX_DIR}/bin"
+ CT_Popd
+ CT_EndStep
+}
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
}
diff --git a/scripts/build/libc/newlib.sh b/scripts/build/libc/newlib.sh
index 3b48507..72111a9 100644
--- a/scripts/build/libc/newlib.sh
+++ b/scripts/build/libc/newlib.sh
@@ -5,64 +5,32 @@
# Edited by Martin Lund <mgl@doredevelopment.dk>
#
-do_libc_get() {
- local libc_src="{http://mirrors.kernel.org/sourceware/newlib,
- ftp://sourceware.org/pub/newlib}"
-
- if [ "${CT_LIBC_NEWLIB_CUSTOM}" = "y" ]; then
- CT_GetCustom "newlib" "${CT_LIBC_NEWLIB_CUSTOM_VERSION}" \
- "${CT_LIBC_NEWLIB_CUSTOM_LOCATION}"
- else # ! custom location
- case "${CT_LIBC_VERSION}" in
- linaro-*)
- CT_GetLinaro "newlib" "${CT_LIBC_VERSION}"
- ;;
- *)
- # kernel.org mirror is outdated, keep last as a fallback
- CT_GetFile "newlib-${CT_LIBC_VERSION}" \
- ftp://sourceware.org/pub/newlib \
- http://mirrors.kernel.org/sourceware/newlib \
- http://mirrors.kernel.org/sources.redhat.com/newlib
- ;;
- esac
- fi # ! custom location
-}
-
-do_libc_extract() {
- CT_Extract "newlib-${CT_LIBC_VERSION}"
- CT_Patch "newlib" "${CT_LIBC_VERSION}"
-
- if [ -n "${CT_ARCH_XTENSA_CUSTOM_NAME}" ]; then
- CT_ConfigureXtensa "newlib" "${CT_LIBC_VERSION}"
- fi
-}
-
-do_libc_start_files() {
- CT_DoStep INFO "Installing C library headers & start files"
- CT_DoExecLog ALL cp -a "${CT_SRC_DIR}/newlib-${CT_LIBC_VERSION}/newlib/libc/include/." \
- "${CT_HEADERS_DIR}"
- if [ "${CT_ARCH_xtensa}" = "y" ]; then
+newlib_headers()
+{
+ CT_DoStep INFO "Installing C library headers"
+ CT_DoExecLog ALL cp -a "${CT_SRC_DIR}/newlib/newlib/libc/include/." "${CT_HEADERS_DIR}"
+ if [ "${CT_ARCH_XTENSA}" = "y" ]; then
CT_DoLog EXTRA "Installing Xtensa headers"
- CT_DoExecLog ALL cp -r "${CT_SRC_DIR}/newlib-${CT_LIBC_VERSION}/newlib/libc/sys/xtensa/include/." \
+ CT_DoExecLog ALL cp -r "${CT_SRC_DIR}/newlib/newlib/libc/sys/xtensa/include/." \
"${CT_HEADERS_DIR}"
fi
CT_EndStep
}
-do_libc() {
+newlib_main()
+{
local -a newlib_opts
local cflags_for_target
CT_DoStep INFO "Installing C library"
- mkdir -p "${CT_BUILD_DIR}/build-libc"
- cd "${CT_BUILD_DIR}/build-libc"
+ CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc"
CT_DoLog EXTRA "Configuring C library"
# Multilib is the default, so if it is not enabled, disable it.
if [ "${CT_MULTILIB}" != "y" ]; then
- extra_config+=("--disable-multilib")
+ newlib_opts+=("--disable-multilib")
fi
if [ "${CT_LIBC_NEWLIB_IO_FLOAT}" = "y" ]; then
@@ -86,16 +54,19 @@ do_libc() {
yn_args="IO_POS_ARGS:newlib-io-pos-args
IO_C99FMT:newlib-io-c99-formats
IO_LL:newlib-io-long-long
-NEWLIB_REGISTER_FINI:newlib-register-fini
+REGISTER_FINI:newlib-register-fini
NANO_MALLOC:newlib-nano-malloc
NANO_FORMATTED_IO:newlib-nano-formatted-io
-ATEXIT_DYNAMIC_ALLOC:atexit-dynamic-alloc
+ATEXIT_DYNAMIC_ALLOC:newlib-atexit-dynamic-alloc
GLOBAL_ATEXIT:newlib-global-atexit
LITE_EXIT:lite-exit
-REENT_SMALL:reent-small
-MULTITHREAD:multithread
+REENT_SMALL:newlib-reent-small
+MULTITHREAD:newlib-multithread
+RETARGETABLE_LOCKING:newlib-retargetable-locking
WIDE_ORIENT:newlib-wide-orient
-UNBUF_STREAM_OPT:unbuf-stream-opt
+FSEEK_OPTIMIZATION:newlib-fseek-optimization
+FVWRITE_IN_STREAMIO:newlib-fvwrite-in-streamio
+UNBUF_STREAM_OPT:newlib-unbuf-stream-opt
ENABLE_TARGET_OPTSPACE:target-optspace
"
@@ -118,7 +89,7 @@ ENABLE_TARGET_OPTSPACE:target-optspace
[ "${CT_LIBC_NEWLIB_LTO}" = "y" ] && \
CT_LIBC_NEWLIB_TARGET_CFLAGS="${CT_LIBC_NEWLIB_TARGET_CFLAGS} -flto"
- cflags_for_target="${CT_TARGET_CFLAGS} ${CT_LIBC_NEWLIB_TARGET_CFLAGS}"
+ cflags_for_target="${CT_ALL_TARGET_CFLAGS} ${CT_LIBC_NEWLIB_TARGET_CFLAGS}"
# Note: newlib handles the build/host/target a little bit differently
# than one would expect:
@@ -131,7 +102,7 @@ ENABLE_TARGET_OPTSPACE:target-optspace
AR_FOR_TARGET="`which ${CT_TARGET}-gcc-ar`" \
RANLIB_FOR_TARGET="`which ${CT_TARGET}-gcc-ranlib`" \
${CONFIG_SHELL} \
- "${CT_SRC_DIR}/newlib-${CT_LIBC_VERSION}/configure" \
+ "${CT_SRC_DIR}/newlib/configure" \
--host=${CT_BUILD} \
--target=${CT_TARGET} \
--prefix=${CT_PREFIX_DIR} \
@@ -139,7 +110,7 @@ ENABLE_TARGET_OPTSPACE:target-optspace
"${CT_LIBC_NEWLIB_EXTRA_CONFIG_ARRAY[@]}"
CT_DoLog EXTRA "Building C library"
- CT_DoExecLog ALL make ${JOBSFLAGS}
+ CT_DoExecLog ALL make ${CT_JOBSFLAGS}
CT_DoLog EXTRA "Installing C library"
CT_DoExecLog ALL make install
@@ -159,9 +130,6 @@ ENABLE_TARGET_OPTSPACE:target-optspace
"${CT_PREFIX_DIR}/share/doc/newlib"
fi
+ CT_Popd
CT_EndStep
}
-
-do_libc_post_cc() {
- :
-}
diff --git a/scripts/build/libc/none.sh b/scripts/build/libc/none.sh
index 8537a8e..5173afb 100644
--- a/scripts/build/libc/none.sh
+++ b/scripts/build/libc/none.sh
@@ -2,22 +2,12 @@
# Copyright 2008 Yann E. MORIN
# Licensed under the GPL v2. See COPYING in the root of this package
-do_libc_get() {
+none_get()
+{
:
}
-do_libc_extract() {
- :
-}
-
-do_libc_start_files() {
- :
-}
-
-do_libc() {
- :
-}
-
-do_libc_post_cc() {
+none_extract()
+{
:
}
diff --git a/scripts/build/libc/uClibc.sh b/scripts/build/libc/uClibc-ng.sh
index e87abaf..7b81d92 100644
--- a/scripts/build/libc/uClibc.sh
+++ b/scripts/build/libc/uClibc-ng.sh
@@ -2,96 +2,22 @@
# Copyright 2007 Yann E. MORIN
# Licensed under the GPL v2. See COPYING in the root of this package
-# This is a constant because it does not change very often.
-# We're in 2010, and are still using data from 7 years ago.
-uclibc_locales_version=030818
-uclibc_locale_tarball="uClibc-locale-${uclibc_locales_version}"
-
-if [ "${CT_LIBC_UCLIBC_NG}" = "y" ]; then
- uclibc_name="uClibc-ng"
- libc_src="http://downloads.uclibc-ng.org/releases/${CT_LIBC_VERSION}"
-else
- uclibc_name="uClibc"
- libc_src="http://www.uclibc.org/downloads
- http://www.uclibc.org/downloads/old-releases"
-fi
-
-# Download uClibc
-do_libc_get() {
- if [ "${CT_LIBC_UCLIBC_CUSTOM}" = "y" ]; then
- CT_GetCustom "${uclibc_name}" "${CT_LIBC_UCLIBC_CUSTOM_VERSION}" \
- "${CT_LIBC_UCLIBC_CUSTOM_LOCATION}"
- else
- CT_GetFile "${uclibc_name}-${CT_LIBC_VERSION}" ${libc_src}
- fi
- # uClibc locales
- if [ "${CT_LIBC_UCLIBC_LOCALES_PREGEN_DATA}" = "y" ]; then
- CT_GetFile "${uclibc_locale_tarball}" ${libc_src}
- fi
-
- return 0
-}
-
-# Extract uClibc
-do_libc_extract() {
- CT_Extract "${uclibc_name}-${CT_LIBC_VERSION}"
- CT_Patch "${uclibc_name}" "${CT_LIBC_VERSION}"
-
- # uClibc locales
- # Extracting pregen locales ourselves is kinda
- # broken, so just link it in place...
- if [ "${CT_LIBC_UCLIBC_LOCALES_PREGEN_DATA}" = "y" \
- -a ! -f "${CT_SRC_DIR}/.${uclibc_locale_tarball}.extracted" ]; then
- CT_Pushd "${CT_SRC_DIR}/${uclibc_name}-${CT_LIBC_VERSION}/extra/locale"
- CT_DoExecLog ALL ln -s "${CT_TARBALLS_DIR}/${uclibc_locale_tarball}.tgz" .
- CT_Popd
- touch "${CT_SRC_DIR}/.${uclibc_locale_tarball}.extracted"
- fi
-
- return 0
-}
-
-# 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
-}
-
-# Common backend for 1st and 2nd passes.
-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}"
-
-
+uClibc_ng_main()
+{
+ CT_DoStep INFO "Installing C library"
+ CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc"
+ CT_IterateMultilibs uClibc_ng_backend_once multilib
CT_Popd
CT_EndStep
}
# Common backend for 1st and 2nd passes, once per multilib.
-do_libc_backend_once() {
- local libc_mode
+uClibc_ng_backend_once()
+{
local multi_dir multi_os_dir multi_root multi_flags multi_index multi_count
local multilib_dir startfiles_dir
- local jflag=${CT_LIBC_UCLIBC_PARALLEL:+${JOBSFLAGS}}
+ local jflag=${CT_JOBSFLAGS}
local -a make_args
local extra_cflags f cfg_cflags cf
local hdr_install_subdir
@@ -102,17 +28,13 @@ do_libc_backend_once() {
CT_DoStep INFO "Building for multilib ${multi_index}/${multi_count}: '${multi_flags}'"
- # Simply copy files until uClibc has the ability to build out-of-tree
- CT_DoLog EXTRA "Copying sources to build dir"
- CT_DoExecLog ALL cp -aT "${CT_SRC_DIR}/${uclibc_name}-${CT_LIBC_VERSION}/." .
-
multilib_dir="lib/${multi_os_dir}"
startfiles_dir="${multi_root}/usr/${multilib_dir}"
CT_SanitizeVarDir multilib_dir startfiles_dir
# Construct make arguments:
# - uClibc uses the CROSS environment variable as a prefix to the compiler
- # tools to use. Since it requires core pass-1, thusly named compiler is
+ # tools to use. Since it requires core compiler, thusly named compiler is
# already available.
# - Note about CFLAGS: In uClibc, CFLAGS are generated by Rules.mak,
# depending on the configuration of the library. That is, they are tailored
@@ -121,20 +43,24 @@ do_libc_backend_once() {
# - We do _not_ want to strip anything for now, in case we specifically
# asked for a debug toolchain, thus the STRIPTOOL= assignment.
make_args=( CROSS_COMPILE="${CT_TARGET}-" \
+ HOSTCC="${CT_BUILD}-gcc" \
PREFIX="${multi_root}/" \
MULTILIB_DIR="${multilib_dir}" \
- LOCALE_DATA_FILENAME="${uclibc_locale_tarball}.tgz" \
STRIPTOOL=true \
${CT_LIBC_UCLIBC_VERBOSITY} \
)
+ # Simply copy files until uClibc has the ability to build out-of-tree
+ CT_DoLog EXTRA "Copying sources to build dir"
+ CT_DoExecLog ALL cp -av "${CT_SRC_DIR}/uClibc-ng/." .
+
# Force the date of the pregen locale data, as the
# newer ones that are referenced are not available
CT_DoLog EXTRA "Applying configuration"
# Use the default config if the user did not provide one.
if [ -z "${CT_LIBC_UCLIBC_CONFIG_FILE}" ]; then
- CT_LIBC_UCLIBC_CONFIG_FILE="${CT_LIB_DIR}/contrib/uClibc-defconfigs/${uclibc_name}.config"
+ CT_LIBC_UCLIBC_CONFIG_FILE="${CT_LIB_DIR}/packages/uClibc-ng/config"
fi
manage_uClibc_config "${CT_LIBC_UCLIBC_CONFIG_FILE}" .config "${multi_flags}"
@@ -176,63 +102,11 @@ do_libc_backend_once() {
CT_DoExecLog ALL cp -a "${multi_root}/usr/include" "${multi_root}/usr/include.saved"
fi
- if [ "${libc_mode}" = "startfiles" ]; then
- CT_DoLog EXTRA "Building headers"
- CT_DoExecLog ALL make "${make_args[@]}" headers
-
- # Ensure the directory for installing multilib-specific binaries exists.
- CT_DoExecLog ALL mkdir -p "${startfiles_dir}"
-
- CT_DoLog EXTRA "Installing headers"
- CT_DoExecLog ALL make "${make_args[@]}" install_headers
-
- # The check might look bogus, but it is the same condition as is used
- # by GCC build script to enable/disable shared library support.
- if [ "${CT_THREADS}" = "nptl" ]; then
- CT_DoLog EXTRA "Building start files"
- CT_DoExecLog ALL make ${jflag} "${make_args[@]}" \
- lib/crt1.o lib/crti.o lib/crtn.o
-
- # From: http://git.openembedded.org/cgit.cgi/openembedded/commit/?id=ad5668a7ac7e0436db92e55caaf3fdf782b6ba3b
- # libm.so is needed for ppc, as libgcc is linked against libm.so
- # No problem to create it for other archs.
- CT_DoLog EXTRA "Building dummy shared libs"
- CT_DoExecLog ALL "${CT_TARGET}-${CT_CC}" -nostdlib -nostartfiles \
- -shared ${multi_flags} -x c /dev/null -o libdummy.so
-
- CT_DoLog EXTRA "Installing start files"
- CT_DoExecLog ALL install -m 0644 lib/crt1.o lib/crti.o lib/crtn.o \
- "${startfiles_dir}"
-
- CT_DoLog EXTRA "Installing dummy shared libs"
- CT_DoExecLog ALL install -m 0755 libdummy.so "${startfiles_dir}/libc.so"
- CT_DoExecLog ALL install -m 0755 libdummy.so "${startfiles_dir}/libm.so"
- fi # CT_THREADS == nptl
- fi # libc_mode == startfiles
-
- if [ "${libc_mode}" = "final" ]; then
- CT_DoLog EXTRA "Cleaning up startfiles"
- CT_DoExecLog ALL rm -f "${startfiles_dir}/crt1.o" \
- "${startfiles_dir}/crti.o" \
- "${startfiles_dir}/crtn.o" \
- "${startfiles_dir}/libc.so" \
- "${startfiles_dir}/libm.so"
-
- CT_DoLog EXTRA "Building C library"
- CT_DoExecLog ALL make "${make_args[@]}" pregen
- CT_DoExecLog ALL make ${jflag} "${make_args[@]}" all
-
- # YEM-FIXME:
- # - we want to install 'runtime' files, eg. lib*.{a,so*}, crti.o and
- # such files, except the headers as they already are installed
- # - "make install_dev" installs the headers, the crti.o... and the
- # static libs, but not the dynamic libs
- # - "make install_runtime" installs the dynamic libs only
- # - "make install" calls install_runtime and install_dev
- # - so we're left with re-installing the headers... Sigh...
- CT_DoLog EXTRA "Installing C library"
- CT_DoExecLog ALL make "${make_args[@]}" install install_utils
- fi # libc_mode == final
+ CT_DoLog EXTRA "Building C library"
+ CT_DoExecLog ALL make "${make_args[@]}" pregen
+ CT_DoExecLog ALL make ${jflag} "${make_args[@]}" all
+ CT_DoLog EXTRA "Installing C library"
+ CT_DoExecLog ALL make "${make_args[@]}" install install_utils
# Now, if installing headers into a subdirectory, put everything in its place.
# Remove the header subdirectory if it existed already.
@@ -249,7 +123,8 @@ do_libc_backend_once() {
# Initialises the .config file to sensible values
# $1: original file
# $2: modified file
-manage_uClibc_config() {
+manage_uClibc_config()
+{
src="$1"
dst="$2"
flags="$3"
@@ -258,13 +133,13 @@ manage_uClibc_config() {
CT_DoExecLog ALL cp "${src}" "${dst}"
case "${CT_ARCH_ENDIAN}" in
- big)
+ big|big,little)
CT_KconfigDisableOption "ARCH_LITTLE_ENDIAN" "${dst}"
CT_KconfigDisableOption "ARCH_WANTS_LITTLE_ENDIAN" "${dst}"
CT_KconfigEnableOption "ARCH_BIG_ENDIAN" "${dst}"
CT_KconfigEnableOption "ARCH_WANTS_BIG_ENDIAN" "${dst}"
;;
- little)
+ little|little,big)
CT_KconfigDisableOption "ARCH_BIG_ENDIAN" "${dst}"
CT_KconfigDisableOption "ARCH_WANTS_BIG_ENDIAN" "${dst}"
CT_KconfigEnableOption "ARCH_LITTLE_ENDIAN" "${dst}"
@@ -276,6 +151,15 @@ manage_uClibc_config() {
CT_KconfigEnableOption "ARCH_USE_MMU" "${dst}"
else
CT_KconfigDisableOption "ARCH_USE_MMU" "${dst}"
+ CT_KconfigDisableOption "UCLIBC_FORMAT_FDPIC" "${dst}"
+ CT_KconfigDisableOption "UCLIBC_FORMAT_FLAT" "${dst}"
+ CT_KconfigDisableOption "UCLIBC_FORMAT_SHARED_FLAT" "${dst}"
+ case "${CT_ARCH_BINFMT_FLAT},${CT_ARCH_BINFMT_FDPIC},${CT_SHARED_LIBS}" in
+ y,,y) CT_KconfigEnableOption "UCLIBC_FORMAT_SHARED_FLAT" "${dst}";;
+ y,,) CT_KconfigEnableOption "UCLIBC_FORMAT_FLAT" "${dst}";;
+ ,y,*) CT_KconfigEnableOption "UCLIBC_FORMAT_FDPIC" "${dst}";;
+ *) CT_Abort "Unsupported binary format";;
+ esac
fi
if [ "${CT_SHARED_LIBS}" = "y" ]; then
@@ -324,27 +208,14 @@ manage_uClibc_config() {
# entirely if LOCALE is not set. If LOCALE was already set, we'll
# assume the user has already made all the appropriate generation
# arrangements. Note that having the uClibc Makefile download the
- # pregenerated locales is not compatible with crosstool; besides,
- # crosstool downloads them as part of getandpatch.sh.
- CT_KconfigDeleteOption "UCLIBC_DOWNLOAD_PREGENERATED_LOCALE" "${dst}"
- case "${CT_LIBC_UCLIBC_LOCALES}:${CT_LIBC_UCLIBC_LOCALES_PREGEN_DATA}" in
- :*)
- ;;
- y:)
+ # pregenerated locales is not compatible with crosstool.
+ if [ -z "${CT_LIBC_UCLIBC_LOCALES}" ]; then
+ CT_KconfigDisableOption "UCLIBC_HAS_LOCALE" "${dst}"
+ else
CT_KconfigEnableOption "UCLIBC_HAS_LOCALE" "${dst}"
CT_KconfigDeleteOption "UCLIBC_PREGENERATED_LOCALE_DATA" "${dst}"
- CT_KconfigDeleteOption "UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA" \
- "${dst}"
- CT_KconfigDeleteOption "UCLIBC_HAS_XLOCALE" "${dst}"
- ;;
- y:y)
- CT_KconfigEnableOption "UCLIBC_HAS_LOCALE" "${dst}"
- CT_KconfigEnableOption "UCLIBC_PREGENERATED_LOCALE_DATA" "${dst}"
- CT_KconfigDeleteOption "UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA" \
- "${dst}"
- CT_KconfigDeleteOption "UCLIBC_HAS_XLOCALE" "${dst}"
- ;;
- esac
+ CT_KconfigDeleteOption "UCLIBC_DOWNLOAD_PREGENERATED_LOCALE_DATA" "${dst}"
+ fi
# WCHAR support
if [ "${CT_LIBC_UCLIBC_WCHAR}" = "y" ]; then
@@ -360,6 +231,13 @@ manage_uClibc_config() {
CT_KconfigDisableOption "UCLIBC_HAS_IPV6" "${dst}"
fi
+ # Iconv support
+ if [ "${CT_LIBC_UCLIBC_LIBICONV}" = "y" ]; then
+ CT_KconfigEnableOption "UCLIBC_HAS_LIBICONV" "${dst}"
+ else
+ CT_KconfigDisableOption "UCLIBC_HAS_LIBICONV" "${dst}"
+ fi
+
# Force on options needed for C++ if we'll be making a C++ compiler.
# I'm not sure locales are a requirement for doing C++... Are they?
if [ "${CT_CC_LANG_CXX}" = "y" ]; then
@@ -368,11 +246,14 @@ manage_uClibc_config() {
fi
# Stack Smash Protection (SSP)
- if [ "${CT_CC_GCC_LIBSSP}" = "y" ]; then
+ if [ "${CT_LIBC_UCLIBC_HAS_SSP}" = "y" ]; then
CT_KconfigEnableOption "UCLIBC_HAS_SSP" "${dst}"
- CT_KconfigEnableOption "UCLIBC_BUILD_SSP" "${dst}"
else
CT_KconfigDisableOption "UCLIBC_HAS_SSP" "${dst}"
+ fi
+ if [ "${CT_LIBC_UCLIBC_BUILD_SSP}" = "y" ]; then
+ CT_KconfigEnableOption "UCLIBC_BUILD_SSP" "${dst}"
+ else
CT_KconfigDisableOption "UCLIBC_BUILD_SSP" "${dst}"
fi
@@ -381,28 +262,19 @@ manage_uClibc_config() {
CT_KconfigDisableOption "LINUXTHREADS_OLD" "${dst}"
CT_KconfigDisableOption "LINUXTHREADS_NEW" "${dst}"
CT_KconfigDisableOption "UCLIBC_HAS_THREADS_NATIVE" "${dst}"
- case "${CT_THREADS}:${CT_LIBC_UCLIBC_LNXTHRD}" in
- none:)
+ case "${CT_THREADS}" in
+ none)
;;
- linuxthreads:)
- # Newer version of uClibc-ng, no old/new dichotomy
+ linuxthreads)
CT_KconfigEnableOption "UCLIBC_HAS_THREADS" "${dst}"
CT_KconfigEnableOption "UCLIBC_HAS_LINUXTHREADS" "${dst}"
;;
- linuxthreads:old)
- CT_KconfigEnableOption "UCLIBC_HAS_THREADS" "${dst}"
- CT_KconfigEnableOption "LINUXTHREADS_OLD" "${dst}"
- ;;
- linuxthreads:new)
- CT_KconfigEnableOption "UCLIBC_HAS_THREADS" "${dst}"
- CT_KconfigEnableOption "LINUXTHREADS_NEW" "${dst}"
- ;;
- nptl:)
+ nptl)
CT_KconfigEnableOption "UCLIBC_HAS_THREADS" "${dst}"
CT_KconfigEnableOption "UCLIBC_HAS_THREADS_NATIVE" "${dst}"
;;
*)
- CT_Abort "Incorrect thread settings: CT_THREADS='${CT_THREAD}' CT_LIBC_UCLIBC_LNXTHRD='${CT_LIBC_UCLIBC_LNXTHRD}'"
+ CT_Abort "Incorrect thread settings: CT_THREADS='${CT_THREADS}'"
;;
esac
@@ -445,9 +317,14 @@ manage_uClibc_config() {
# Now allow architecture to tweak as it wants
CT_DoArchUClibcConfig "${dst}"
CT_DoArchUClibcCflags "${dst}" "${flags}"
+
+ # Preserve the config we created (before uclibc's `make olddefconfig`
+ # overrides anything).
+ CT_DoExecLog ALL cp "${dst}" "${dst}.created-by-ct-ng"
}
-do_libc_post_cc() {
+uClibc_ng_post_cc()
+{
# uClibc and GCC disagree where the dynamic linker lives. uClibc always
# places it in the MULTILIB_DIR, while gcc does that for *some* variants
# and expects it in /lib for the other. So, create a symlink from lib
@@ -455,51 +332,9 @@ do_libc_post_cc() {
# file in /lib. Thus, need to do this after all the variants are built.
# Moreover, need to do this after the final compiler is built: on targets
# that use elf2flt, the core compilers cannot find ld when running elf2flt.
- CT_DoStep INFO "Checking dynamic linker symlinks"
- CT_mkdir_pushd "${CT_BUILD_DIR}/build-libc-post_cc"
- echo "int main(void) { return 0; }" > test-ldso.c
- CT_IterateMultilibs do_libc_ldso_fixup ldso_fixup
- CT_Popd
- CT_EndStep
-}
+ CT_MultilibFixupLDSO
-do_libc_ldso_fixup() {
- local multi_dir multi_os_dir multi_root multi_flags multi_index multi_count
- local binary
- local ldso ldso_f ldso_d multilib_dir
-
- for arg in "$@"; do
- eval "${arg// /\\ }"
- done
-
- CT_DoLog EXTRA "Checking dynamic linker for multilib '${multi_flags}'"
-
- multilib_dir="/lib/${multi_os_dir}"
- CT_SanitizeVarDir multilib_dir
-
- CT_DoExecLog ALL "${CT_TARGET}-${CT_CC}" -o test-ldso ../test-ldso.c ${multi_flags}
- if [ -r "test-ldso.gdb" ]; then
- binary="test-ldso.gdb"
- else
- binary="test-ldso"
- fi
- if ${CT_TARGET}-readelf -Wl "${binary}" | grep -q 'Requesting program interpreter: '; then
- ldso=$( ${CT_TARGET}-readelf -Wl "${binary}" | \
- grep 'Requesting program interpreter: ' | \
- sed -e 's,.*: ,,' -e 's,\].*,,' )
- fi
- CT_DoLog DEBUG "Detected dynamic linker for multilib '${multi_flags}': '${ldso}'"
-
- ldso_d="${ldso%/ld*.so.*}"
- ldso_f="${ldso##*/}"
- # Create symlink if GCC produced an executable, dynamically linked, it was requesting
- # a linker not in the current directory, and there is no such file in the expected
- # ldso dir.
- if [ -n "${ldso}" -a "${ldso_d}" != "${multilib_dir}" -a ! -r "${multi_root}${ldso}" ]; then
- # Convert ldso_d to "how many levels we need to go up" and remove
- # leading slash.
- ldso_d=$( echo "${ldso_d#/}" | sed 's,[^/]\+,..,g' )
- CT_DoExecLog ALL ln -sf "${ldso_d}${multilib_dir}/${ldso_f}" \
- "${multi_root}${ldso}"
+ if [ -n "${CT_LIBC_UCLIBC_CONFIG_FILE}" ]; then
+ CT_InstallConfigurationFile "${CT_LIBC_UCLIBC_CONFIG_FILE}" libc
fi
}