zig
zig copied to clipboard
`zig cc --sysroot=...` does not work as expected for `#include`s
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.
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.
Have you tried using -isystem
for include?
Does the same error occur on the master?
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
).