aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/cc/init.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'libbuild2/cc/init.cxx')
-rw-r--r--libbuild2/cc/init.cxx103
1 files changed, 87 insertions, 16 deletions
diff --git a/libbuild2/cc/init.cxx b/libbuild2/cc/init.cxx
index bb50d07..e124450 100644
--- a/libbuild2/cc/init.cxx
+++ b/libbuild2/cc/init.cxx
@@ -86,7 +86,10 @@ namespace build2
// Enter variables.
//
- auto& vp (rs.var_pool ());
+ // All the variables we enter are qualified so go straight for the
+ // public variable pool.
+ //
+ auto& vp (rs.var_pool (true /* public */));
auto v_t (variable_visibility::target);
@@ -98,17 +101,33 @@ namespace build2
vp.insert<strings> ("config.cc.aoptions");
vp.insert<strings> ("config.cc.libs");
+ vp.insert<string> ("config.cc.internal.scope");
+
+ vp.insert<bool> ("config.cc.reprocess"); // See cc.preprocess below.
+
+ vp.insert<abs_dir_path> ("config.cc.pkgconfig.sysroot");
+
vp.insert<strings> ("cc.poptions");
vp.insert<strings> ("cc.coptions");
vp.insert<strings> ("cc.loptions");
vp.insert<strings> ("cc.aoptions");
vp.insert<strings> ("cc.libs");
+ vp.insert<string> ("cc.internal.scope");
+ vp.insert<strings> ("cc.internal.libs");
+
vp.insert<strings> ("cc.export.poptions");
vp.insert<strings> ("cc.export.coptions");
vp.insert<strings> ("cc.export.loptions");
vp.insert<vector<name>> ("cc.export.libs");
- vp.insert<vector<name>> ("cc.export.imp_libs");
+ vp.insert<vector<name>> ("cc.export.impl_libs");
+
+ // Header (-I) and library (-L) search paths to use in the generated .pc
+ // files instead of the default install.{include,lib}. Relative paths
+ // are resolved as install paths.
+ //
+ vp.insert<dir_paths> ("cc.pkgconfig.include");
+ vp.insert<dir_paths> ("cc.pkgconfig.lib");
// Hint variables (not overridable).
//
@@ -123,15 +142,23 @@ namespace build2
vp.insert<string> ("cc.runtime");
vp.insert<string> ("cc.stdlib");
- // Target type, for example, "C library" or "C++ library". Should be set
- // on the target as a rule-specific variable by the matching rule to the
- // name of the module (e.g., "c", "cxx"). Currenly only set for
- // libraries and is used to decide which *.libs to use during static
- // linking.
+ // Library target type in the <lang>[,<type>...] form where <lang> is
+ // "c" (C library), "cxx" (C++ library), or "cc" (C-common library but
+ // the specific language is not known). Currently recognized <type>
+ // values are "binless" (library is binless) and "recursively-binless"
+ // (library and all its prerequisite libraries are binless). Note that
+ // another indication of a binless library is an empty path, which could
+ // be easier/faster to check. Note also that there should be no
+ // whitespaces of any kind and <lang> is always first.
//
- // It can also be the special "cc" value which means a C-common library
- // but specific language is not known. Used in the import installed
- // logic.
+ // This value should be set on the library target as a rule-specific
+ // variable by the matching rule. It is also saved in the generated
+ // pkg-config files. Currently <lang> is used to decide which *.libs to
+ // use during static linking. The "cc" language is used in the import
+ // installed logic.
+ //
+ // Note that this variable cannot be set via the target type/pattern-
+ // specific mechanism (see process_libraries()).
//
vp.insert<string> ("cc.type", v_t);
@@ -146,11 +173,25 @@ namespace build2
//
vp.insert<string> ("cc.module_name", v_t);
+ // Importable header marker (normally set via the x.importable alias).
+ //
+ // Note that while at first it might seem like a good idea to allow
+ // setting it on a scope, that will cause translation of inline/template
+ // includes which is something we definitely don't want.
+ //
+ vp.insert<bool> ("cc.importable", v_t);
+
// Ability to disable using preprocessed output for compilation.
//
- vp.insert<bool> ("config.cc.reprocess");
vp.insert<bool> ("cc.reprocess");
+ // Execute serially with regards to any other recipe. This is primarily
+ // useful when compiling large translation units or linking large
+ // binaries that require so much memory that doing that in parallel with
+ // other compilation/linking jobs is likely to summon the OOM killer.
+ //
+ vp.insert<bool> ("cc.serialize");
+
// Register scope operation callback.
//
// It feels natural to clean up sidebuilds as a post operation but that
@@ -287,17 +328,45 @@ namespace build2
rs.assign ("cc.libs") += cast_null<strings> (
lookup_config (rs, "config.cc.libs", nullptr));
+ // config.cc.internal.scope
+ //
+ // Note: save omitted.
+ //
+ if (lookup l = lookup_config (rs, "config.cc.internal.scope"))
+ {
+ if (cast<string> (l) == "current")
+ fail << "'current' value in config.cc.internal.scope";
+
+ // This is necessary in case we are acting as bundle amalgamation.
+ //
+ rs.assign ("cc.internal.scope") = *l;
+ }
+
+ // config.cc.reprocess
+ //
+ // Note: save omitted.
+ //
if (lookup l = lookup_config (rs, "config.cc.reprocess"))
rs.assign ("cc.reprocess") = *l;
+ // config.cc.pkgconfig.sysroot
+ //
+ // Let's look it up instead of just marking for saving to make sure the
+ // path is valid.
+ //
+ // Note: save omitted.
+ //
+ lookup_config (rs, "config.cc.pkgconfig.sysroot");
+
// Load the bin.config module.
//
if (!cast_false<bool> (rs["bin.config.loaded"]))
{
- // Prepare configuration hints. They are only used on the first load
- // of bin.config so we only populate them on our first load.
+ // Prepare configuration hints (pretend it belongs to root scope).
+ // They are only used on the first load of bin.config so we only
+ // populate them on our first load.
//
- variable_map h (rs.ctx);
+ variable_map h (rs);
if (first)
{
@@ -332,15 +401,17 @@ namespace build2
}
}
- // Load bin.*.config for bin.* modules we may need (see core_init()
- // below).
+ // Load bin.* modules we may need (see core_init() below).
//
const string& tsys (cast<string> (rs["cc.target.system"]));
load_module (rs, rs, "bin.ar.config", loc);
if (tsys == "win32-msvc")
+ {
load_module (rs, rs, "bin.ld.config", loc);
+ load_module (rs, rs, "bin.def", loc);
+ }
if (tsys == "mingw32")
load_module (rs, rs, "bin.rc.config", loc);