diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2015-12-10 13:54:59 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2015-12-10 13:54:59 +0200 |
commit | 0d0d9a9c56822919e9794658d31db57f8fc3e2bf (patch) | |
tree | 6dcb1649706dc7fc3f02cd5646b4611b3309fbd1 /build/config | |
parent | 5f29fc16fb85a934280e00e54bc6307685c4e05d (diff) |
Implement two-phase initialization of modules loaded from bootstrap.build
Diffstat (limited to 'build/config')
-rw-r--r-- | build/config/module | 3 | ||||
-rw-r--r-- | build/config/module.cxx | 46 |
2 files changed, 31 insertions, 18 deletions
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<module>&); + extern "C" bool config_init ( scope&, scope&, const location&, unique_ptr<module>&, 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<module>&) + { + 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<module>&, 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<alias> (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; } } |