mailing list of musl libc
 help / color / Atom feed
* [musl-cross-make] [PATCH] litecross: Fix system header dir when building native toolchains
@ 2018-11-07  6:49 Michael Forney
  2020-03-23  4:34 ` [musl] [musl-cross-make] [PATCH v2] " Michael Forney
  0 siblings, 1 reply; 2+ messages in thread
From: Michael Forney @ 2018-11-07  6:49 UTC (permalink / raw)
  To: musl

By default, gcc will search in /usr/include relative to the sysroot,
but musl is configured with an empty prefix, so headers get installed
to /include. This causes gcc to fail to find the libc headers unless
a usr -> . symlink is created manually.

This is not an issue for cross toolchains because in that case, the
configured sysroot is /$(TARGET) which happens to match gcc_tooldir[0],
which is one of gcc's default search directories[1].

The system header directory can be configured with
--with-native-system-header-dir. However, this is not quite sufficient
because the stmp-fixinc target in gcc/Makefile tests for the existence
of that directory relative to the configured sysroot (/)[2]. Most
systems do not have /include, so this fails.

Since musl's fixinc.sh is a no-op[3], we can work around this by
clearing STMP_FIXINC, skipping fixincludes entirely.

[0] https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/configure.ac;h=b066cc609e1c2615e66307d5439f765a4f3b286b;hb=9fb89fa845c1b2e0a18d85ada0b077c84508ab78#l6319
[1] https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/config/linux.h;h=2ea4ff92c1df9e6d6297996004360ae7eeda2075;hb=9fb89fa845c1b2e0a18d85ada0b077c84508ab78#l180
[2] https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/Makefile.in;h=20bee0494b1bad4e3ec34e2eae291cf6eadc3aa1;hb=9fb89fa845c1b2e0a18d85ada0b077c84508ab78#l3078
[3] https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=fixincludes/mkfixinc.sh;h=0f9648608e94f97ab13da223d8192cb04c255772;hb=9fb89fa845c1b2e0a18d85ada0b077c84508ab78#l22
---
 litecross/Makefile | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/litecross/Makefile b/litecross/Makefile
index 2f78157..d1e52b6 100644
--- a/litecross/Makefile
+++ b/litecross/Makefile
@@ -55,6 +55,7 @@ MAKE += MULTILIB_OSDIRNAMES=
 MAKE += INFO_DEPS= infodir=
 MAKE += ac_cv_prog_lex_root=lex.yy.c
 MAKE += MAKEINFO=false
+MAKE += STMP_FIXINC=
 
 FULL_BINUTILS_CONFIG = \
 	$(COMMON_CONFIG) $(BINUTILS_CONFIG) $(TOOLCHAIN_CONFIG) \
@@ -70,6 +71,7 @@ FULL_GCC_CONFIG = --enable-languages=c,c++ \
 	--target=$(TARGET) --prefix= \
 	--libdir=/lib --disable-multilib \
 	--with-sysroot=$(SYSROOT) \
+	--with-native-system-header-dir=/include \
 	--enable-tls \
 	--disable-libmudflap --disable-libsanitizer \
 	--disable-gnu-indirect-function \
-- 
2.19.1



^ permalink raw reply	[flat|nested] 2+ messages in thread

* [musl] [musl-cross-make] [PATCH v2] litecross: Fix system header dir when building native toolchains
  2018-11-07  6:49 [musl-cross-make] [PATCH] litecross: Fix system header dir when building native toolchains Michael Forney
@ 2020-03-23  4:34 ` " Michael Forney
  0 siblings, 0 replies; 2+ messages in thread
From: Michael Forney @ 2020-03-23  4:34 UTC (permalink / raw)
  To: musl

By default, gcc will search in /usr/include relative to the sysroot,
but musl is configured with an empty prefix, so headers get installed
to /include. This causes gcc to fail to find the libc headers for
native toolchains unless a usr -> . symlink is created manually.

This is not an issue for cross toolchains because in that case, the
configured sysroot is /$(TARGET) which happens to match gcc_tooldir[0],
which is one of gcc's default search directories[1].

The system header directory can be configured with
--with-native-system-header-dir. However, this is not quite sufficient
because the stmp-fixinc target in gcc/Makefile tests for the existence
of that directory relative to the configured sysroot (/)[2]. Most
systems do not have /include, so this fails.

Since musl's fixinc.sh is a no-op[3], we can work around this by
clearing STMP_FIXINC, skipping fixincludes entirely.

This removes the need for creating the usr -> . symlink in the build
sysroot, and having to manually create this symlink for native
toolchains (as in [4]).

[0] https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/configure.ac;h=b066cc609e1c2615e66307d5439f765a4f3b286b;hb=9fb89fa845c1b2e0a18d85ada0b077c84508ab78#l6319
[1] https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/config/linux.h;h=2ea4ff92c1df9e6d6297996004360ae7eeda2075;hb=9fb89fa845c1b2e0a18d85ada0b077c84508ab78#l180
[2] https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/Makefile.in;h=20bee0494b1bad4e3ec34e2eae291cf6eadc3aa1;hb=9fb89fa845c1b2e0a18d85ada0b077c84508ab78#l3078
[3] https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=fixincludes/mkfixinc.sh;h=0f9648608e94f97ab13da223d8192cb04c255772;hb=9fb89fa845c1b2e0a18d85ada0b077c84508ab78#l22
[4] https://git.zv.io/toolchains/musl-cross-make/-/blob/5774ca4dc5bdb813e33052023d982ee073a5c6b8/scripts/buildall#L30
---
Hi,

Resending this patch because this is still an issue, and I realized
that the usr -> . symlink could also be removed in the build sysroot.
Anyone who has built a native toolchain with musl-cross-make has
probably run into this and worked around it by creating a usr -> .
symlink in the install directory manually.

To demonstrate that this only currently works by accident with
cross-compilers, I'll start with current musl-cross-make master,
and override the sysroot to something else:

$ make TARGET=aarch64-linux-musl SYSROOT=/something-else install
<snip>
$ echo '#include <stdlib.h>' | ./output/bin/aarch64-linux-musl-gcc -v -x c -
<snip>
ignoring nonexistent directory "/tmp/musl-cross-make/output/bin/../something-else/usr/local/include"
ignoring duplicate directory "/tmp/musl-cross-make/output/bin/../lib/gcc/../../lib/gcc/aarch64-linux-musl/9.2.0/../../../../aarch64-linux-musl/include"
ignoring nonexistent directory "/tmp/musl-cross-make/output/bin/../something-else/usr/include"
ignoring duplicate directory "/tmp/musl-cross-make/output/bin/../lib/gcc/../../lib/gcc/aarch64-linux-musl/9.2.0/include"
#include "..." search starts here:
#include <...> search starts here:
 /tmp/musl-cross-make/output/bin/../lib/gcc/aarch64-linux-musl/9.2.0/../../../../aarch64-linux-musl/include
 /tmp/musl-cross-make/output/bin/../lib/gcc/aarch64-linux-musl/9.2.0/include
End of search list.
GNU C17 (GCC) version 9.2.0 (aarch64-linux-musl)
        compiled by GNU C version 9.2.0, GMP version 6.1.2, MPFR version 4.0.2, MPC version 1.1.0, isl version none
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 32e14193b549d09fa3807c50f194d659
<stdin>:1:10: fatal error: stdlib.h: No such file or directory
compilation terminated.
$

As you can see, gcc *is* searching for headers in the /something-else
sysroot, but under the incorrect system header directory. It still
searches for headers in /aarch64-linux-musl/include since that is
the gcc tool directory.

To demonstrate the problem with native toolchains, let's build a
native toolchain and try to use it:

$ make TARGET=x86_64-linux-musl NATIVE=1 install
<snip>
$ echo '#include <stdlib.h>' | ./output-x86_64-linux-musl/bin/gcc -v -x c -
<snip>
ignoring nonexistent directory "/tmp/musl-cross-make/output-x86_64-linux-musl/bin/../lib/gcc/x86_64-linux-musl/9.2.0/../../../../x86_64-linux-musl/include"
ignoring nonexistent directory "/tmp/musl-cross-make/output-x86_64-linux-musl/bin/../usr/local/include"
ignoring nonexistent directory "/tmp/musl-cross-make/output-x86_64-linux-musl/bin/../lib/gcc/../../lib/gcc/x86_64-linux-musl/9.2.0/../../../../x86_64-linux-musl/include"
ignoring nonexistent directory "/tmp/musl-cross-make/output-x86_64-linux-musl/bin/../usr/include"
ignoring duplicate directory "/tmp/musl-cross-make/output-x86_64-linux-musl/bin/../lib/gcc/../../lib/gcc/x86_64-linux-musl/9.2.0/include"
#include "..." search starts here:
#include <...> search starts here:
 /tmp/musl-cross-make/output-x86_64-linux-musl/bin/../lib/gcc/x86_64-linux-musl/9.2.0/include
End of search list.
GNU C17 (GCC) version 9.2.0 (x86_64-linux-musl)
        compiled by GNU C version 9.2.0, GMP version 6.1.2, MPFR version 4.0.2, MPC version 1.1.0, isl version none
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 60320f85342923d8a86b40331aa7a54b
<stdin>:1:10: fatal error: stdlib.h: No such file or directory
compilation terminated.
$

With the proposed patch, both of these cases are fixed. Hopefully
this makes the problem clear.

 litecross/Makefile | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/litecross/Makefile b/litecross/Makefile
index 8ec0ed2..11ef946 100644
--- a/litecross/Makefile
+++ b/litecross/Makefile
@@ -55,6 +55,7 @@ MAKE += MULTILIB_OSDIRNAMES=
 MAKE += INFO_DEPS= infodir=
 MAKE += ac_cv_prog_lex_root=lex.yy
 MAKE += MAKEINFO=false
+MAKE += STMP_FIXINC=
 
 FULL_BINUTILS_CONFIG = \
 	--disable-separate-code \
@@ -74,6 +75,7 @@ FULL_GCC_CONFIG = --enable-languages=c,c++ \
 	--target=$(TARGET) --prefix= \
 	--libdir=/lib --disable-multilib \
 	--with-sysroot=$(SYSROOT) \
+	--with-native-system-header-dir=/include \
 	--enable-tls \
 	--disable-libmudflap --disable-libsanitizer \
 	--disable-gnu-indirect-function \
@@ -112,7 +114,7 @@ FULL_MUSL_CONFIG += CC="$(XGCC)" LIBCC="../obj_gcc/$(TARGET)/libgcc/libgcc.a"
 MUSL_VARS = AR=../obj_binutils/binutils/ar RANLIB=../obj_binutils/binutils/ranlib
 obj_musl/.lc_configured: | obj_gcc/gcc/.lc_built
 obj_musl/.lc_built: | obj_gcc/$(TARGET)/libgcc/libgcc.a
-obj_gcc/gcc/.lc_built: | obj_sysroot/usr obj_sysroot/lib32 obj_sysroot/lib64 obj_sysroot/include
+obj_gcc/gcc/.lc_built: | obj_sysroot/lib32 obj_sysroot/lib64 obj_sysroot/include
 obj_gcc/.lc_built: | obj_sysroot/.lc_libs obj_sysroot/.lc_headers
 obj_gcc/.lc_configured: obj_binutils/.lc_built
 else
@@ -197,9 +199,6 @@ obj_%:
 obj_sysroot/include:
 	mkdir -p $@
 
-obj_sysroot/usr: | obj_sysroot
-	ln -sf . $@
-
 obj_sysroot/lib32: | obj_sysroot
 	ln -sf lib $@
 
-- 
2.25.2


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, back to index

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-07  6:49 [musl-cross-make] [PATCH] litecross: Fix system header dir when building native toolchains Michael Forney
2020-03-23  4:34 ` [musl] [musl-cross-make] [PATCH v2] " Michael Forney

mailing list of musl libc

Archives are clonable: git clone --mirror http://inbox.vuxu.org/musl

Example config snippet for mirrors

Newsgroup available over NNTP:
	nntp://inbox.vuxu.org/vuxu.archive.musl


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git