diff --git a/libpkgconf/fragment.c b/libpkgconf/fragment.c index f41d304..03b2709 100644 --- a/libpkgconf/fragment.c +++ b/libpkgconf/fragment.c @@ -55,17 +55,28 @@ pkgconf_fragment_copy_munged(const char *source, unsigned int flags) { char mungebuf[PKGCONF_BUFSIZE]; char *sysroot_dir; + bool isystem = false; if (!(flags & PKGCONF_PKG_PKGF_MUNGE_SYSROOT_PREFIX)) return strdup(source); + if (strncmp(source, "-isystem ", 9) == 0) { + isystem = true; + source+=9; + } + sysroot_dir = pkgconf_tuple_find_global("pc_sysrootdir"); if (*source != '/' || (sysroot_dir != NULL && !strncmp(sysroot_dir, source, strlen(sysroot_dir)))) return strdup(source); - strlcpy(mungebuf, sysroot_dir, sizeof mungebuf); + if (isystem) { + strlcpy(mungebuf, "-isystem ", sizeof mungebuf); + } else { + strlcpy(mungebuf, "", sizeof mungebuf); + } + strlcat(mungebuf, sysroot_dir, sizeof mungebuf); strlcat(mungebuf, source, sizeof mungebuf); return strdup(mungebuf); @@ -109,7 +120,11 @@ pkgconf_fragment_add(pkgconf_list_t *list, const char *string, unsigned int flag frag = calloc(sizeof(pkgconf_fragment_t), 1); frag->type = 0; - frag->data = strdup(string); + if (strncmp(string, "-isystem ", 9) == 0) { + frag->data = pkgconf_fragment_copy_munged(string, flags); + } else { + frag->data = strdup(string); + } } pkgconf_node_insert_tail(&frag->iter, frag, list); @@ -226,12 +241,24 @@ pkgconf_fragment_parse(pkgconf_list_t *list, pkgconf_list_t *vars, const char *v { int i, argc; char **argv; + char modified_arg[PKGCONF_BUFSIZE]; char *repstr = pkgconf_tuple_parse(vars, value); pkgconf_argv_split(repstr, &argc, &argv); - for (i = 0; i < argc; i++) - pkgconf_fragment_add(list, argv[i], flags); + for (i = 0; i < argc; i++) { + if (strcmp(argv[i], "-I") == 0 || strcmp(argv[i], "-L") == 0) { + snprintf(modified_arg, sizeof(modified_arg), "%s%s", argv[i], argv[i+1]); + pkgconf_fragment_add(list, modified_arg, flags); + i++; + } else if (strcmp(argv[i], "-isystem") == 0) { + snprintf(modified_arg, sizeof(modified_arg), "%s %s", argv[i], argv[i+1]); + pkgconf_fragment_add(list, modified_arg, flags); + i++; + } else { + pkgconf_fragment_add(list, argv[i], flags); + } + } pkgconf_argv_free(argv); free(repstr);