zig icon indicating copy to clipboard operation
zig copied to clipboard

`zig cc --sysroot=...` does not work as expected for `#include`s

Open alexrp opened this issue 10 months ago • 3 comments

Zig Version

0.11.0

Steps to Reproduce and Observed Behavior

❯ echo "#include <test.h>" > test.c
❯ mkdir -p sys/usr/include
❯ touch sys/usr/include/test.h
❯ gcc --sysroot=$PWD/sys test.c -shared
❯ clang --sysroot=$PWD/sys test.c -shared
/usr/bin/ld: cannot find crti.o: No such file or directory
/usr/bin/ld: cannot find libgcc_s.so.1: No such file or directory
clang: error: linker command failed with exit code 1 (use -v to see invocation)
❯ zig cc --sysroot=$PWD/sys test.c -shared
test.c:1:10: fatal error: 'test.h' file not found
#include <test.h>
         ^~~~~~~~
1 error generated.

(The linker errors when using non-Zig clang are irrelevant; the important point is that the #include works.)

Extra context:

❯ gcc --sysroot=$PWD/sys -E -Wp,-v - < /dev/null
ignoring nonexistent directory "/home/alexrp/Source/tests/sys/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/home/alexrp/Source/tests/sys/usr/local/include"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/include-fixed/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/13/../../../../x86_64-linux-gnu/include"
ignoring nonexistent directory "/home/alexrp/Source/tests/sys/usr/include/x86_64-linux-gnu"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/13/include
 /home/alexrp/Source/tests/sys/usr/include
End of search list.
# 0 "<stdin>"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "<stdin>"
❯ clang --sysroot=$PWD/sys -E -Wp,-v - < /dev/null
clang -cc1 version 16.0.6 based upon LLVM 16.0.6 default target x86_64-pc-linux-gnu
ignoring nonexistent directory "/home/alexrp/Source/tests/sys/usr/local/include"
ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../x86_64-linux-gnu/include"
ignoring nonexistent directory "/home/alexrp/Source/tests/sys/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/llvm-16/lib/clang/16/include
 /home/alexrp/Source/tests/sys/usr/include
End of search list.
# 1 "<stdin>"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 374 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "<stdin>" 2
❯ zig cc --sysroot=$PWD/sys -E -Wp,-v - < /dev/null
clang -cc1 version 16.0.6 based upon LLVM 16.0.6 default target x86_64-linux-musl
ignoring nonexistent directory "/home/alexrp/Source/tests/sys/usr/local/include"
ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/13/../../../../x86_64-linux-gnu/include"
ignoring nonexistent directory "/home/alexrp/Source/tests/sys/include"
ignoring nonexistent directory "/opt/lib/clang/16/include"
#include "..." search starts here:
#include <...> search starts here:
 /home/alexrp/Source/tests/sys/usr/include
End of search list.
# 1 "<stdin>"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 375 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "<stdin>" 2

Expected Behavior

No preprocessor error.

alexrp avatar Apr 12 '24 23:04 alexrp

I don't use this option frequently so it's entirely possible I'm just misunderstanding how it's meant to be used. From reading relevant man pages, it seems like this should work though.

alexrp avatar Apr 12 '24 23:04 alexrp

Have you tried using -isystem for include? Does the same error occur on the master?

kassane avatar Apr 13 '24 21:04 kassane

Have you tried using -isystem for include?

Yes, that's one way to work around it in my case, although it doesn't have the same general semantics.

Does the same error occur on the master?

Yes (0.12.0-dev.3644+05d975576).

alexrp avatar Apr 14 '24 15:04 alexrp