Skip to content

[zig cc] command line -isystem paths are incorrectly searched after zig's system paths, instead of before #24243

@henderkes

Description

@henderkes

Zig Version

0.15-dev

Steps to Reproduce and Observed Behavior

I figured out why it happens. zig cc is not behaving like gcc and clang do with -isystem and -I directories.

zig cc

[m@M-TH build]$ zig cc -E -H iconv.c -isystem /home/m/static-php-cli/buildroot/include | grep iconv
. /usr/lib/zig/libc/include/generic-glibc/iconv.h
.. /usr/lib/zig/libc/include/generic-glibc/features.h
... /usr/lib/zig/libc/include/generic-glibc/features-time64.h
.... /usr/lib/zig/libc/include/x86_64-linux-gnu/bits/wordsize.h
.... /usr/lib/zig/libc/include/x86_64-linux-gnu/bits/timesize.h
..... /usr/lib/zig/libc/include/x86_64-linux-gnu/bits/wordsize.h
... /usr/lib/zig/libc/include/generic-glibc/stdc-predef.h
... /usr/lib/zig/libc/include/generic-glibc/sys/cdefs.h
.... /usr/lib/zig/libc/include/x86_64-linux-gnu/bits/wordsize.h
.... /usr/lib/zig/libc/include/x86_64-linux-gnu/bits/long-double.h
... /usr/lib/zig/libc/include/x86_64-linux-gnu/gnu/stubs.h
.... /usr/lib/zig/libc/include/x86_64-linux-gnu/gnu/stubs-64.h
...

clang:

[m@M-TH build]$ clang -E -H iconv.c -isystem /home/m/static-php-cli/buildroot/include | grep iconv
. /home/m/static-php-cli/buildroot/include/iconv.h
.. /usr/bin/../lib/clang/19/include/stddef.h
... /usr/bin/../lib/clang/19/include/__stddef_header_macro.h
... /usr/bin/../lib/clang/19/include/__stddef_ptrdiff_t.h
... /usr/bin/../lib/clang/19/include/__stddef_size_t.h
... /usr/bin/../lib/clang/19/include/__stddef_wchar_t.h
... /usr/bin/../lib/clang/19/include/__stddef_null.h
... /usr/bin/../lib/clang/19/include/__stddef_max_align_t.h
... /usr/bin/../lib/clang/19/include/__stddef_offsetof.h
...

gcc:

[m@M-TH build]$ gcc -E -H iconv.c -isystem /home/m/static-php-cli/buildroot/include | grep iconv
. /home/m/static-php-cli/buildroot/include/iconv.h
.. /usr/lib/gcc/x86_64-redhat-linux/14/include/stddef.h
.. /usr/include/errno.h
... /usr/include/features.h
.... /usr/include/features-time64.h
..... /usr/include/bits/wordsize.h
..... /usr/include/bits/timesize.h
...... /usr/include/bits/wordsize.h
.... /usr/include/sys/cdefs.h
..... /usr/include/bits/wordsize.h
..... /usr/include/bits/long-double.h
.... /usr/include/gnu/stubs.h
..... /usr/include/gnu/stubs-64.h
...

But the real issue is this:

[m@M-TH build]$ zig cc -E -H iconv.c -isystem /home/m/static-php-cli/buildroot/include -I/home/m/static-php-cli/buildroot/include | grep iconv
. /usr/lib/zig/libc/include/generic-glibc/iconv.h
.. /usr/lib/zig/libc/include/generic-glibc/features.h
... /usr/lib/zig/libc/include/generic-glibc/features-time64.h
.... /usr/lib/zig/libc/include/x86_64-linux-gnu/bits/wordsize.h
.... /usr/lib/zig/libc/include/x86_64-linux-gnu/bits/timesize.h
..... /usr/lib/zig/libc/include/x86_64-linux-gnu/bits/wordsize.h
... /usr/lib/zig/libc/include/generic-glibc/stdc-predef.h

# or 

[m@M-TH build]$ zig cc -E -H iconv.c -I/home/m/static-php-cli/buildroot/include -isystem /home/m/static-php-cli/buildroot/include | grep iconv
. /usr/lib/zig/libc/include/generic-glibc/iconv.h
.. /usr/lib/zig/libc/include/generic-glibc/features.h
... /usr/lib/zig/libc/include/generic-glibc/features-time64.h
.... /usr/lib/zig/libc/include/x86_64-linux-gnu/bits/wordsize.h
.... /usr/lib/zig/libc/include/x86_64-linux-gnu/bits/timesize.h
..... /usr/lib/zig/libc/include/x86_64-linux-gnu/bits/wordsize.h
... /usr/lib/zig/libc/include/generic-glibc/stdc-predef.h

Zig ignores the -I directory, if it is also specified as a -isystem dir.

zig cc without isystem:

[m@M-TH build]$ zig cc -E -H iconv.c -I/home/m/static-php-cli/buildroot/include | grep iconv
. /home/m/static-php-cli/buildroot/include/iconv.h
.. /usr/lib/zig/include/stddef.h
... /usr/lib/zig/include/__stddef_header_macro.h
... /usr/lib/zig/include/__stddef_ptrdiff_t.h
... /usr/lib/zig/include/__stddef_size_t.h
... /usr/lib/zig/include/__stddef_wchar_t.h
... /usr/lib/zig/include/__stddef_null.h
... /usr/lib/zig/include/__stddef_max_align_t.h
... /usr/lib/zig/include/__stddef_offsetof.h
.. /usr/lib/zig/libc/include/generic-glibc/errno.h

Since the php build unconditionally adds all our directories as isystem directories to supress warnings during extension compilation, this cannot be worked around short of patching zig.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugObserved behavior contradicts documented or intended behaviorcontributor friendlyThis issue is limited in scope and/or knowledge of Zig internals.zig ccZig as a drop-in C compiler feature

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions