aboutsummaryrefslogtreecommitdiff
path: root/build/config
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-12-10 13:54:59 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-12-10 13:54:59 +0200
commit0d0d9a9c56822919e9794658d31db57f8fc3e2bf (patch)
tree6dcb1649706dc7fc3f02cd5646b4611b3309fbd1 /build/config
parent5f29fc16fb85a934280e00e54bc6307685c4e05d (diff)
Implement two-phase initialization of modules loaded from bootstrap.build
Diffstat (limited to 'build/config')
-rw-r--r--build/config/module3
-rw-r--r--build/config/module.cxx46
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;
}
}