From 9891b20350021ce41a950645dd76df20a45c92cc Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 2 Dec 2015 11:37:15 +0200 Subject: Implement optional module loading The syntax is: using? cli Now each module use results in two bool variables: .loaded and .configured. Also implement variable visibility (the above two variables are limited to project). --- build/cli/module.cxx | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) (limited to 'build/cli/module.cxx') diff --git a/build/cli/module.cxx b/build/cli/module.cxx index 64e95a8..081980b 100644 --- a/build/cli/module.cxx +++ b/build/cli/module.cxx @@ -28,12 +28,13 @@ namespace build { static compile compile_; - extern "C" void + extern "C" bool cli_init (scope& root, scope& base, - const location& l, + const location& loc, std::unique_ptr&, - bool first) + bool first, + bool) { tracer trace ("cli::init"); level5 ([&]{trace << "for " << base.out_path ();}); @@ -44,8 +45,12 @@ namespace build // semantics. So it is better to let the user load cxx // explicitly. // - if (base.find_target_type ("cxx") == nullptr) - fail (l) << "cxx module must be initialized before cli"; + { + auto l (base["cxx.loaded"]); + + if (!l || !as (*l)) + fail (loc) << "cxx module must be loaded before cli"; + } // Register target types. // @@ -84,10 +89,10 @@ namespace build // if (first) { - variable_pool.find ("config.cli", string_type); //@@ VAR type + var_pool.find ("config.cli", string_type); //@@ VAR type - variable_pool.find ("config.cli.options", strings_type); - variable_pool.find ("cli.options", strings_type); + var_pool.find ("config.cli.options", strings_type); + var_pool.find ("cli.options", strings_type); } // Configure. @@ -156,6 +161,8 @@ namespace build // if (const value& v = config::optional (root, "config.cli.options")) base.assign ("cli.options") += as (v); + + return true; } } } -- cgit v1.1