From e1a1d978d364c723935acfc7b56fae8b8253d054 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 4 Oct 2021 10:27:55 +0200 Subject: Add support for treating specific libraries as always internal --- libbuild2/cc/compile-rule.cxx | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'libbuild2/cc/compile-rule.cxx') diff --git a/libbuild2/cc/compile-rule.cxx b/libbuild2/cc/compile-rule.cxx index 7636722..9149f0c 100644 --- a/libbuild2/cc/compile-rule.cxx +++ b/libbuild2/cc/compile-rule.cxx @@ -6,6 +6,8 @@ #include // exit() #include // strlen(), strchr(), strncmp() +#include + #include #include #include @@ -503,14 +505,33 @@ namespace build2 if (const strings* ops = cast_null (l[var])) { + // If enabled, remap -I to -isystem or /external:I for paths that + // are outside of the internal scope provided the library is not + // whitelisted. + // + auto whitelist = [&l] (const strings* pats) + { + return (pats != nullptr && + find_if (pats->begin (), pats->end (), + [&l] (const string& pat) + { + return path_match (l.name, pat); + }) != pats->end ()); + }; + + const scope* is (d.is); + + if (is != nullptr && whitelist (c_internal_libs)) + is = nullptr; + + if (is != nullptr && whitelist (x_internal_libs)) + is = nullptr; + for (auto i (ops->begin ()), e (ops->end ()); i != e; ++i) { const string& o (*i); - // If enabled, remap -I to -isystem or /external:I for paths that - // are outside of the internal scope. - // - if (d.is != nullptr) + if (is != nullptr) { // See if this is -I or -I (or /I... for MSVC). // @@ -587,8 +608,8 @@ namespace build2 // Translate if it's neither in src nor in out of the // internal scope. // - if (!sub (d.is->src_path ()) && - (d.is->out_eq_src () || !sub (d.is->out_path ()))) + if (!sub (is->src_path ()) && + (is->out_eq_src () || !sub (is->out_path ()))) { // Note: must use original value (path is temporary). // -- cgit v1.1