--- a/pre-process.c +++ b/pre-process.c @@ -2410,22 +2410,27 @@ static void do_preprocess(struct token **list) void init_include_path(void) { - char path[256]; - char os[32]; - int error; - struct utsname name; - - error = uname(&name); - if (error) - return; - - if (strcmp(name.sysname, "Linux") != 0) - return; - strcpy(os, "linux-gnu"); - - snprintf(path, sizeof(path), "/usr/include/%s-%s/", - name.machine, os); - add_pre_buffer("#add_system \"%s/\"\n", path); + add_pre_buffer("#add_system \"%s/\"\n", "@clang@"); + add_pre_buffer("#add_system \"%s/\"\n", "@libc@"); + + bool collect = false; + char *nix_cflags = getenv("NIX_CFLAGS_COMPILE"); + if (nix_cflags == NULL) + return; + + for ( + char *token = strtok(nix_cflags, " "); + token != NULL; + token = strtok(NULL, " ") + ) { + if (collect && *token == '/') { + add_pre_buffer("#add_system \"%s/\"\n", token); + collect = false; + continue; + } + if (!strcmp(token, "-isystem")) + collect = true; + } } struct token * preprocess(struct token *token)