summaryrefslogtreecommitdiff
path: root/toolchain
diff options
context:
space:
mode:
authorThomas Petazzoni <thomas.petazzoni@free-electrons.com>2013-10-08 20:17:09 +0200
committerPeter Korsgaard <peter@korsgaard.com>2013-10-09 16:01:25 +0200
commita1d94aaa3a2191121b28cf19ba8472f2e8f87d01 (patch)
treebfc86978e17d63a9d15612e338a0609495b92d3a /toolchain
parent8e05ebca22c63b2bd1c0b09a8ead2a8250c105f5 (diff)
toolchain-external: add support for musl C library
This commit adds support for external toolchains based on the musl C library, as available from http://www.musl-libc.org. Note that the pre-built musl toolchains available from http://musl.codu.org/ are not working for the moment, since they lack sysroot support. However, this problem has been reported to the maintainer, who has already added sysroot support in his scripts at https://bitbucket.org/GregorR/musl-cross, and therefore the next version of the pre-built toolchains should work with Buildroot out-of-the-box. In the mean time, the musl-cross script must be used to build the toolchain. [Peter: reword comment] Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
Diffstat (limited to 'toolchain')
-rw-r--r--toolchain/Config.in9
-rw-r--r--toolchain/helpers.mk11
-rw-r--r--toolchain/toolchain-external/Config.in12
-rw-r--r--toolchain/toolchain-external/toolchain-external.mk18
4 files changed, 49 insertions, 1 deletions
diff --git a/toolchain/Config.in b/toolchain/Config.in
index 0f9a7dd9a..3980d790a 100644
--- a/toolchain/Config.in
+++ b/toolchain/Config.in
@@ -15,6 +15,15 @@ config BR2_TOOLCHAIN_USES_GLIBC
config BR2_TOOLCHAIN_USES_UCLIBC
bool
+config BR2_TOOLCHAIN_USES_MUSL
+ bool
+ select BR2_LARGEFILE
+ select BR2_INET_IPV6
+ select BR2_USE_WCHAR
+ select BR2_ENABLE_LOCALE
+ select BR2_TOOLCHAIN_HAS_THREADS
+ select BR2_TOOLCHAIN_HAS_THREADS_DEBUG
+
choice
prompt "Toolchain type"
help
diff --git a/toolchain/helpers.mk b/toolchain/helpers.mk
index a4a13c732..b6fe04c41 100644
--- a/toolchain/helpers.mk
+++ b/toolchain/helpers.mk
@@ -209,6 +209,17 @@ check_glibc = \
$(call check_glibc_rpc_feature,$${SYSROOT_DIR})
#
+# Check that the selected C library really is musl
+#
+# $1: sysroot directory
+check_musl = \
+ SYSROOT_DIR="$(strip $1)"; \
+ if test ! -f $${SYSROOT_DIR}/lib/libc.so -o -e $${SYSROOT_DIR}/lib/libm.so ; then \
+ echo "Incorrect selection of the C library" ; \
+ exit -1; \
+ fi
+
+#
# Check the conformity of Buildroot configuration with regard to the
# uClibc configuration of the external toolchain, for a particular
# feature.
diff --git a/toolchain/toolchain-external/Config.in b/toolchain/toolchain-external/Config.in
index c53577ef6..89c799e3d 100644
--- a/toolchain/toolchain-external/Config.in
+++ b/toolchain/toolchain-external/Config.in
@@ -860,6 +860,10 @@ config BR2_TOOLCHAIN_EXTERNAL_UCLIBC
bool
select BR2_TOOLCHAIN_USES_UCLIBC
+config BR2_TOOLCHAIN_EXTERNAL_MUSL
+ bool
+ select BR2_TOOLCHAIN_USES_MUSL
+
if BR2_TOOLCHAIN_EXTERNAL_CUSTOM
choice
@@ -882,6 +886,13 @@ config BR2_TOOLCHAIN_EXTERNAL_CUSTOM_GLIBC
eglibc configured to exclude key features may cause build failures to
some packages.
+config BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL
+ bool "musl"
+ select BR2_TOOLCHAIN_EXTERNAL_MUSL
+ help
+ Select this option if your external toolchain uses the
+ 'musl' C library, available from http://www.musl-libc.org/.
+
endchoice
if BR2_TOOLCHAIN_EXTERNAL_CUSTOM_UCLIBC
@@ -952,6 +963,7 @@ endif # BR2_TOOLCHAIN_EXTERNAL_CUSTOM_UCLIBC
config BR2_TOOLCHAIN_EXTERNAL_INET_RPC
bool "Toolchain has RPC support?"
select BR2_TOOLCHAIN_HAS_NATIVE_RPC
+ depends on !BR2_TOOLCHAIN_EXTERNAL_MUSL
default y if BR2_TOOLCHAIN_EXTERNAL_GLIBC
help
Select this option if your external toolchain supports
diff --git a/toolchain/toolchain-external/toolchain-external.mk b/toolchain/toolchain-external/toolchain-external.mk
index 2bfe64a88..b2266b6ac 100644
--- a/toolchain/toolchain-external/toolchain-external.mk
+++ b/toolchain/toolchain-external/toolchain-external.mk
@@ -68,6 +68,10 @@ ifeq ($(BR2_TOOLCHAIN_EXTERNAL_GLIBC),y)
LIB_EXTERNAL_LIBS+=libnss_files.so.* libnss_dns.so.*
endif
+ifeq ($(BR2_TOOLCHAIN_EXTERNAL_MUSL),y)
+LIB_EXTERNAL_LIBS += libc.so libgcc_s.so.*
+endif
+
ifeq ($(BR2_INSTALL_LIBSTDCPP),y)
USR_LIB_EXTERNAL_LIBS+=libstdc++.so.*
endif
@@ -353,7 +357,7 @@ endif
define TOOLCHAIN_EXTERNAL_CONFIGURE_CMDS
$(Q)$(call check_cross_compiler_exists,$(TOOLCHAIN_EXTERNAL_CC))
$(Q)LIBC_A_LOCATION=`readlink -f $$(LANG=C $(TOOLCHAIN_EXTERNAL_CC) -print-file-name=libc.a)` ; \
- SYSROOT_DIR=`echo $${LIBC_A_LOCATION} | sed -r -e 's:usr/lib(32|64)?/(.*/)?libc\.a::'` ; \
+ SYSROOT_DIR=`echo $${LIBC_A_LOCATION} | sed -r -e 's:(usr/)?lib(32|64)?/(.*/)?libc\.a::'` ; \
if test -z "$${SYSROOT_DIR}" ; then \
@echo "External toolchain doesn't support --sysroot. Cannot use." ; \
exit 1 ; \
@@ -368,11 +372,23 @@ define TOOLCHAIN_EXTERNAL_CONFIGURE_CMDS
fi ; \
if test "$(BR2_TOOLCHAIN_EXTERNAL_UCLIBC)" = "y" ; then \
$(call check_uclibc,$${SYSROOT_DIR}) ; \
+ elif test "$(BR2_TOOLCHAIN_EXTERNAL_MUSL)" = "y" ; then \
+ $(call check_musl,$${SYSROOT_DIR}) ; \
else \
$(call check_glibc,$${SYSROOT_DIR}) ; \
fi
endef
+# With the musl C library, the libc.so library directly plays the role
+# of the dynamic library loader. We just need to create a symbolic
+# link to libc.so with the appropriate name.
+ifeq ($(BR2_TOOLCHAIN_EXTERNAL_MUSL),y)
+define TOOLCHAIN_EXTERNAL_MUSL_LD_LINK
+ ln -sf libc.so $(TARGET_DIR)/lib/ld-musl-$(ARCH).so.1
+endef
+TOOLCHAIN_EXTERNAL_POST_INSTALL_STAGING_HOOKS += TOOLCHAIN_EXTERNAL_MUSL_LD_LINK
+endif
+
# Integration of the toolchain into Buildroot: find the main sysroot
# and the variant-specific sysroot, then copy the needed libraries to
# the $(TARGET_DIR) and copy the whole sysroot (libraries and headers)