aboutsummaryrefslogtreecommitdiff
path: root/build2
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2019-08-21 12:11:48 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2019-08-21 12:11:48 +0200
commitd64ae97f6865bc25d496485622530e2a090c2eb4 (patch)
treeeef35c80417a9a08c7713368261aa6d1e8632b5d /build2
parentd7b5f03a761714f6ea6c4b1891e8a1f3824d4979 (diff)
Implement dynamic loading of build system modules
Diffstat (limited to 'build2')
-rw-r--r--build2/b.cxx85
1 files changed, 44 insertions, 41 deletions
diff --git a/build2/b.cxx b/build2/b.cxx
index 15844dc..e7f11f2 100644
--- a/build2/b.cxx
+++ b/build2/b.cxx
@@ -484,56 +484,59 @@ main (int argc, char* argv[])
SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
#endif
- // Register builtin modules.
+ // Load builtin modules.
//
{
- using mf = module_functions;
- auto& bm (builtin_modules);
-
- auto reg = [] (module_load_function* lf)
+ auto load = [] (module_load_function* lf)
{
for (const module_functions* i (lf ()); i->name != nullptr; ++i)
- builtin_modules[i->name] = *i;
+ loaded_modules[i->name] = i;
};
- reg (&config::build2_config_load);
- reg (&dist::build2_dist_load);
- reg (&test::build2_test_load);
- reg (&install::build2_install_load);
-
- reg (&version::build2_version_load);
- reg (&in::build2_in_load);
-
- bm["bin.vars"] = mf {"bin.vars", nullptr, &bin::vars_init};
- bm["bin.config"] = mf {"bin.config", nullptr, &bin::config_init};
- bm["bin"] = mf {"bin", nullptr, &bin::init};
- bm["bin.ar.config"] = mf {"bin.ar.config", nullptr, &bin::ar_config_init};
- bm["bin.ar"] = mf {"bin.ar", nullptr, &bin::ar_init};
- bm["bin.ld.config"] = mf {"bin.ld.config", nullptr, &bin::ld_config_init};
- bm["bin.ld"] = mf {"bin.ld", nullptr, &bin::ld_init};
- bm["bin.rc.config"] = mf {"bin.rc.config", nullptr, &bin::rc_config_init};
- bm["bin.rc"] = mf {"bin.rc", nullptr, &bin::rc_init};
-
- bm["cc.core.vars"] = mf {"cc.core.vars", nullptr, &cc::core_vars_init};
- bm["cc.core.guess"] = mf {"cc.core.guess", nullptr, &cc::core_guess_init};
- bm["cc.core.config"] = mf {"cc.core.config", nullptr, &cc::core_config_init};
- bm["cc.core"] = mf {"cc.core", nullptr, &cc::core_init};
- bm["cc.config"] = mf {"cc.config", nullptr, &cc::config_init};
- bm["cc"] = mf {"cc", nullptr, &cc::init};
-
- bm["c.guess"] = mf {"c.guess", nullptr, &c::guess_init};
- bm["c.config"] = mf {"c.config", nullptr, &c::config_init};
- bm["c"] = mf {"c", nullptr, &c::init};
-
- bm["cxx.guess"] = mf {"cxx.guess", nullptr, &cxx::guess_init};
- bm["cxx.config"] = mf {"cxx.config", nullptr, &cxx::config_init};
- bm["cxx"] = mf {"cxx", nullptr, &cxx::init};
+ // @@ TMP
+ //
+#define TMP_LOAD(N, S, I) \
+ static const module_functions N {S, nullptr, &I}; \
+ loaded_modules[S] = &N
+
+ load (&config::build2_config_load);
+ load (&dist::build2_dist_load);
+ load (&test::build2_test_load);
+ load (&install::build2_install_load);
+
+ load (&version::build2_version_load);
+ load (&in::build2_in_load);
+
+ TMP_LOAD (bin_vars, "bin.vars", bin::vars_init);
+ TMP_LOAD (bin_config, "bin.config", bin::config_init);
+ TMP_LOAD (bin, "bin", bin::init);
+ TMP_LOAD (bin_ar_config, "bin.ar.config", bin::ar_config_init);
+ TMP_LOAD (bin_ar, "bin.ar", bin::ar_init);
+ TMP_LOAD (bin_ld_config, "bin.ld.config", bin::ld_config_init);
+ TMP_LOAD (bin_ld, "bin.ld", bin::ld_init);
+ TMP_LOAD (bin_rc_config, "bin.rc.config", bin::rc_config_init);
+ TMP_LOAD (bin_rc, "bin.rc", bin::rc_init);
+
+ TMP_LOAD (cc_core_vars, "cc.core.vars", cc::core_vars_init);
+ TMP_LOAD (cc_core_guess, "cc.core.guess", cc::core_guess_init);
+ TMP_LOAD (cc_core_config, "cc.core.config", cc::core_config_init);
+ TMP_LOAD (cc_core, "cc.core", cc::core_init);
+ TMP_LOAD (cc_config, "cc.config", cc::config_init);
+ TMP_LOAD (cc, "cc", cc::init);
+
+ TMP_LOAD (c_guess, "c.guess", c::guess_init);
+ TMP_LOAD (c_config, "c.config", c::config_init);
+ TMP_LOAD (c, "c", c::init);
+
+ TMP_LOAD (cxx_guess, "cxx.guess", cxx::guess_init);
+ TMP_LOAD (cxx_config, "cxx.config", cxx::config_init);
+ TMP_LOAD (cxx, "cxx", cxx::init);
#ifndef BUILD2_BOOTSTRAP
- bm["cli.config"] = mf {"cli.config", nullptr, &cli::config_init};
- bm["cli"] = mf {"cli", nullptr, &cli::init};
+ TMP_LOAD (cli_config, "cli.config", cli::config_init);
+ TMP_LOAD (cli, "cli", cli::init);
- reg (&bash::build2_bash_load);
+ load (&bash::build2_bash_load);
#endif
}