toolchain-external: improve musl external check
authorIlya Kuzmich <ilya.kuzmich@gmail.com>
Mon, 20 Mar 2017 05:56:10 +0000 (08:56 +0300)
committerThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Sun, 26 Mar 2017 13:21:38 +0000 (15:21 +0200)
The current test to verify if the toolchain uses musl or not is based on
checking if /lib/libc.so or /lib/libm.so exist in the sysroot. However,
some toolchains (notably Crosstool-NG ones) put these libraries in
/usr/lib/.

To fix this, build a minimal C program and check if the program
interpreter contains /lib/ld-musl.

Signed-off-by: Ilya Kuzmich <ilya.kuzmich@gmail.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
toolchain/helpers.mk
toolchain/toolchain-external/pkg-toolchain-external.mk

index 2f73ebbe8bb370c4edb80308f46729bfa97265e4..77303a86eb26b9b4f3c24642d86c628442b0c9b5 100644 (file)
@@ -197,13 +197,18 @@ check_glibc = \
 #
 # Check that the selected C library really is musl
 #
-# $1: sysroot directory
+# $1: cross-gcc path
+# $2: cross-readelf path
 check_musl = \
-       SYSROOT_DIR="$(strip $1)"; \
-       if test ! -f $${SYSROOT_DIR}/lib/libc.so -o -e $${SYSROOT_DIR}/lib/libm.so ; then \
+       __CROSS_CC=$(strip $1) ; \
+       __CROSS_READELF=$(strip $2) ; \
+       echo 'void main(void) {}' | $${__CROSS_CC} -x c -o $(BUILD_DIR)/.br-toolchain-test.tmp - >/dev/null 2>&1; \
+       if ! $${__CROSS_READELF} -l $(BUILD_DIR)/.br-toolchain-test.tmp 2> /dev/null | grep 'program interpreter: /lib/ld-musl' -q; then \
+               rm -f $(BUILD_DIR)/.br-toolchain-test.tmp*; \
                echo "Incorrect selection of the C library" ; \
                exit -1; \
-       fi
+       fi ; \
+       rm -f $(BUILD_DIR)/.br-toolchain-test.tmp*
 
 #
 # Check the conformity of Buildroot configuration with regard to the
index 1d12290cfbf2c2551f9b6edb56321889669fc159..8bb7b40d1207301f10e70ce75e38068976d4671d 100644 (file)
@@ -565,7 +565,9 @@ define $(2)_CONFIGURE_CMDS
        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}) ; \
+               $$(call check_musl,\
+                       "$$(TOOLCHAIN_EXTERNAL_CC) $$(TOOLCHAIN_EXTERNAL_CFLAGS)",\
+                       $$(TOOLCHAIN_EXTERNAL_READELF)) ; \
        else \
                $$(call check_glibc,$$$${SYSROOT_DIR}) ; \
        fi