diff options
-rw-r--r-- | build2/cli/module.cxx | 17 | ||||
-rw-r--r-- | build2/cxx/module.cxx | 12 | ||||
-rw-r--r-- | build2/file.cxx | 2 | ||||
-rw-r--r-- | build2/module | 6 | ||||
-rw-r--r-- | build2/module.cxx | 6 | ||||
-rw-r--r-- | build2/parser.cxx | 2 | ||||
-rw-r--r-- | build2/variable | 7 | ||||
-rw-r--r-- | build2/variable.ixx | 8 |
8 files changed, 33 insertions, 27 deletions
diff --git a/build2/cli/module.cxx b/build2/cli/module.cxx index 44b36a1..478c8a8 100644 --- a/build2/cli/module.cxx +++ b/build2/cli/module.cxx @@ -36,18 +36,13 @@ namespace build2 tracer trace ("cli::init"); l5 ([&]{trace << "for " << base.out_path ();}); - // Make sure the cxx module has been loaded since we need its - // targets types (?xx{}). Note that we don't try to load it - // ourselves because of the non-trivial variable merging - // semantics. So it is better to let the user load cxx - // explicitly. + // Make sure the cxx module has been loaded since we need its targets + // types (?xx{}). Note that we don't try to load it ourselves because of + // the non-trivial variable merging semantics. So it is better to let + // the user load cxx explicitly. // - { - auto l (base["cxx.loaded"]); - - if (!l || !cast<bool> (l)) - fail (loc) << "cxx module must be loaded before cli"; - } + if (!cast_false<bool> (base["cxx.loaded"])) + fail (loc) << "cxx module must be loaded before cli"; // Enter module variables. // diff --git a/build2/cxx/module.cxx b/build2/cxx/module.cxx index b4ce142..c03763f 100644 --- a/build2/cxx/module.cxx +++ b/build2/cxx/module.cxx @@ -40,15 +40,11 @@ namespace build2 tracer trace ("cxx::init"); l5 ([&]{trace << "for " << b.out_path ();}); - // Initialize the bin module. Only do this if it hasn't already - // been loaded so that we don't overwrite user's bin.* settings. + // Initialize the bin module. Only do this if it hasn't already been + // loaded so that we don't overwrite user's bin.* settings. // - { - auto l (b["bin.loaded"]); - - if (!l || !cast<bool> (l)) - load_module (false, "bin", r, b, loc); - } + if (!cast_false<bool> (b["bin.loaded"])) + load_module ("bin", r, b, loc); // Enter module variables. // diff --git a/build2/file.cxx b/build2/file.cxx index f5ce91c..8b6291a 100644 --- a/build2/file.cxx +++ b/build2/file.cxx @@ -781,7 +781,7 @@ namespace build2 if (s.boot) { - load_module (false, n, root, root, s.loc); + load_module (n, root, root, s.loc); assert (!s.boot); } } diff --git a/build2/module b/build2/module index 25574d1..dcfe5d0 100644 --- a/build2/module +++ b/build2/module @@ -76,11 +76,11 @@ namespace build2 // (false can only be returned if optional). // bool - load_module (bool optional, - const string& name, + load_module (const string& name, scope& root, scope& base, - const location&); + const location&, + bool optional = false); // Builtin modules. // diff --git a/build2/module.cxx b/build2/module.cxx index cfab057..1334689 100644 --- a/build2/module.cxx +++ b/build2/module.cxx @@ -50,11 +50,11 @@ namespace build2 } bool - load_module (bool opt, - const string& name, + load_module (const string& name, scope& rs, scope& bs, - const location& loc) + const location& loc, + bool opt) { // First see if this modules has already been loaded for this project. // diff --git a/build2/parser.cxx b/build2/parser.cxx index 20cb75f..1edc7ba 100644 --- a/build2/parser.cxx +++ b/build2/parser.cxx @@ -1102,7 +1102,7 @@ namespace build2 if (boot_) boot_module (n, *root_, l); else - load_module (optional, n, *root_, *scope_, l); + load_module (n, *root_, *scope_, l, optional); } } diff --git a/build2/variable b/build2/variable index a5f2ea5..c506a3e 100644 --- a/build2/variable +++ b/build2/variable @@ -252,6 +252,13 @@ namespace build2 template <typename T> const T* cast_null (const value&); template <typename T> const T* cast_null (const lookup&); + // As above but returns false if the value is NULL (or not defined, in case + // of lookup). Note that the template argument is only for documentation and + // should be bool (or semantically compatible). + // + template <typename T> T cast_false (const value& v); + template <typename T> T cast_false (const lookup& l); + // Assign value type to the value. In the second version the variable is // optional and is only used for diagnostics. // diff --git a/build2/variable.ixx b/build2/variable.ixx index e01e3d6..da86c39 100644 --- a/build2/variable.ixx +++ b/build2/variable.ixx @@ -158,6 +158,14 @@ namespace build2 } template <typename T> + inline T + cast_false (const value& v) {return v && cast<T> (v);} + + template <typename T> + inline T + cast_false (const lookup& l) {return l && cast<T> (l);} + + template <typename T> inline void typify (value& v, const variable& var) { |