From 0d0d9a9c56822919e9794658d31db57f8fc3e2bf Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 10 Dec 2015 13:54:59 +0200 Subject: Implement two-phase initialization of modules loaded from bootstrap.build --- build/config/module | 3 +++ build/config/module.cxx | 46 ++++++++++++++++++++++++++++------------------ 2 files changed, 31 insertions(+), 18 deletions(-) (limited to 'build/config') diff --git a/build/config/module b/build/config/module index 530fa7b..3e43c7b 100644 --- a/build/config/module +++ b/build/config/module @@ -14,6 +14,9 @@ namespace build { namespace config { + extern "C" void + config_boot (scope&, const location&, unique_ptr&); + extern "C" bool config_init ( scope&, scope&, const location&, unique_ptr&, bool, bool); diff --git a/build/config/module.cxx b/build/config/module.cxx index 77a786b..c9139ed 100644 --- a/build/config/module.cxx +++ b/build/config/module.cxx @@ -24,9 +24,35 @@ namespace build // static const path config_file ("build/config.build"); + extern "C" void + config_boot (scope& root, const location&, unique_ptr&) + { + tracer trace ("config::boot"); + + const dir_path& out_root (root.out_path ()); + level5 ([&]{trace << "for " << out_root;}); + + // Register meta-operations. + // + root.meta_operations.insert (configure_id, configure); + root.meta_operations.insert (disfigure_id, disfigure); + + // Load config.build if one exists. + // + // Note that we have to do this during bootstrap since the order in + // which the modules will be initialized is unspecified. So it is + // possible that some module which needs the configuration will get + // called first. + // + path f (out_root / config_file); + + if (file_exists (f)) + source (f, root, root); + } + extern "C" bool config_init (scope& root, - scope& base, + scope&, const location& l, std::unique_ptr&, bool first, @@ -34,22 +60,13 @@ namespace build { tracer trace ("config::init"); - if (&root != &base) - fail (l) << "config module must be initialized in bootstrap.build"; - if (!first) { warn (l) << "multiple config module initializations"; return true; } - const dir_path& out_root (root.out_path ()); - level5 ([&]{trace << "for " << out_root;}); - - // Register meta-operations. - // - root.meta_operations.insert (configure_id, configure); - root.meta_operations.insert (disfigure_id, disfigure); + level5 ([&]{trace << "for " << root.out_path ();}); // Register alias and fallback rule for the configure meta-operation. // @@ -67,13 +84,6 @@ namespace build r.insert (configure_id, 0, "config.alias", alias_rule::instance); } - // Load config.build if one exists. - // - path f (out_root / config_file); - - if (file_exists (f)) - source (f, root, root); - return true; } } -- cgit v1.1