[Buildroot] [PATCH 3/5] toolchain-external: add support for musl C library

Thomas De Schampheleire patrickdepinguin at gmail.com
Sun Oct 6 06:57:56 UTC 2013


Thomas Petazzoni <thomas.petazzoni at free-electrons.com> wrote:
>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.
>
>Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
>---
> toolchain/Config.in                      |  9 +++++++++
> toolchain/helpers.mk                     | 11 +++++++++++
> toolchain/toolchain-external/Config.in   | 12 ++++++++++++
> toolchain/toolchain-external/ext-tool.mk | 11 ++++++++++-
> 4 files changed, 42 insertions(+), 1 deletion(-)
>
>diff --git a/toolchain/Config.in b/toolchain/Config.in
>index 17be32a..61eb520 100644
>--- a/toolchain/Config.in
>+++ b/toolchain/Config.in
>@@ -24,6 +24,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 d5443b5..e8d4168 100644
>--- a/toolchain/helpers.mk
>+++ b/toolchain/helpers.mk
>@@ -214,6 +214,17 @@ check_glibc = \
> 	$(call check_glibc_rpc_feature,$${SYSROOT_DIR})
> 
> #
>+# Check that the selected C library is really 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 c53577e..89c799e 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/ext-tool.mk b/toolchain/toolchain-external/ext-tool.mk
>index 8762a46..f642017 100644
>--- a/toolchain/toolchain-external/ext-tool.mk
>+++ b/toolchain/toolchain-external/ext-tool.mk
>@@ -63,6 +63,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
>@@ -369,7 +373,7 @@ $(STAMP_DIR)/ext-toolchain-checked: $(TOOLCHAIN_EXTERNAL_DEPENDENCIES)
> 	@$(call MESSAGE,"Checking external toolchain settings")
> 	$(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 ; \
>@@ -384,6 +388,8 @@ $(STAMP_DIR)/ext-toolchain-checked: $(TOOLCHAIN_EXTERNAL_DEPENDENCIES)
> 	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
>@@ -464,6 +470,9 @@ $(STAMP_DIR)/ext-toolchain-installed: $(STAMP_DIR)/ext-toolchain-checked
> 			$(call copy_toolchain_lib_root,$${ARCH_SYSROOT_DIR},$${SUPPORT_LIB_DIR},$${ARCH_LIB_DIR},$$libs,/usr/lib); \
> 		done ; \
> 	fi ; \
>+	if test "$(BR2_TOOLCHAIN_EXTERNAL_MUSL)" = "y" ; then \
>+		ln -sf libc.so $(TARGET_DIR)/lib/ld-musl-arm.so.1 ; \
>+	fi ; \

Is this intentionally arm-specific?

> 	$(call MESSAGE,"Copying external toolchain sysroot to staging...") ; \
> 	$(call copy_toolchain_sysroot,$${SYSROOT_DIR},$${ARCH_SYSROOT_DIR},$${ARCH_SUBDIR},$${ARCH_LIB_DIR},$${SUPPORT_LIB_DIR}) ; \
> 	if test "$(BR2_TOOLCHAIN_EXTERNAL_GDB_SERVER_COPY)" = "y"; then \




More information about the buildroot mailing list