From db8336a686a85f0e458acb2d5f1ad442585bfc9a Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 1 Oct 2021 11:05:49 +0200 Subject: Add notion of internal scope, translate external -I to -isystem or equivalent --- libbuild2/cxx/init.cxx | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) (limited to 'libbuild2/cxx') diff --git a/libbuild2/cxx/init.cxx b/libbuild2/cxx/init.cxx index cc2a135..a10fc5c 100644 --- a/libbuild2/cxx/init.cxx +++ b/libbuild2/cxx/init.cxx @@ -497,6 +497,71 @@ namespace build2 vp.insert ("config.cxx.aoptions"), vp.insert ("config.cxx.libs"), + // Project's internal scope. + // + // A header search path (-I) exported by a library that is outside of + // the internal scope is considered external and, if supported by the + // compiler, the corresponding -I option is translated to an + // appropriate "external header search path" option (-isystem for + // GCC/Clang, /external:I for MSVC 16.10 and later or clang-cl 13 and + // later). In particular, this suppresses compiler warnings in such + // external headers (/external:W0 is automatically added unless a + // custom /external:Wn is specified). + // + // The internal scope can be specified by the project with the + // cxx.internal.scope variable and overridden by the user with the + // config.cxx.internal.scope variable. Note that cxx.internal.scope + // must be specified before loading the cxx module (cxx.config, more + // precisely) and after which it contains the effective value (see + // below). For example: + // + // # root.build + // + // cxx.internal.scope = current + // + // using cxx + // + // Valid values for cxx.internal.scope are: + // + // current -- current root scope (where variable is assigned) + // base -- target's base scope + // root -- target's root scope + // bundle -- target's bundle amalgamation (see scope::bundle_root()) + // strong -- target's strong amalgamation (see scope::strong_root()) + // weak -- target's weak amalgamation (see scope::weak_root()) + // global -- global scope (everything is internal) + // + // Valid values for config.cxx.internal.scope are the same except for + // `current`. + // + // Note also that there are [config.]cc.internal.scope variables that + // can be used to specify the internal scope for all the cc-based + // modules. + // + // The project's effective internal scope is chosen based on the + // following priority list: + // + // 1. config.cxx.internal.scope + // + // 2. config.cc.internal.scope + // + // 3. effective scope from bundle amalgamation + // + // 4. cxx.internal.scope + // + // 5. cc.internal.scope + // + // In particular, item #3 allows an amalgamation that bundles a + // project to override its internal scope. + // + // The recommended value for a typical project is `current`, meaning + // that only headers inside the project will be considered internal. + // The tests subproject, if present, will inherit its value from the + // project (which acts as a bundle amalgamation), unless it is being + // built out of source (for example, to test an installed library). + // + vp.insert ("config.cxx.internal.scope"), + // Headers and header groups whose inclusion should or should not be // translated to the corresponding header unit imports. // @@ -549,6 +614,8 @@ namespace build2 vp.insert ("cxx.aoptions"), vp.insert ("cxx.libs"), + vp.insert ("cxx.internal.scope"), + &vp.insert ("cxx.translate_include"), vp["cc.poptions"], @@ -731,6 +798,8 @@ namespace build2 cm.x_info->class_, cm.x_info->version.major, cm.x_info->version.minor, + cm.x_info->variant_version ? cm.x_info->variant_version->major : 0, + cm.x_info->variant_version ? cm.x_info->variant_version->minor : 0, cast (rs[cm.x_path]), cast (rs[cm.x_mode]), cast (rs[cm.x_target]), @@ -739,6 +808,9 @@ namespace build2 modules, symexport, + cm.internal_scope, + cm.internal_scope_current, + cast (rs[cm.x_sys_lib_dirs]), cast (rs[cm.x_sys_hdr_dirs]), cm.x_info->sys_mod_dirs ? &cm.x_info->sys_mod_dirs->first : nullptr, -- cgit v1.1