diff options
-rw-r--r-- | build/b.cxx | 2 | ||||
-rw-r--r-- | build/bin/module | 6 | ||||
-rw-r--r-- | build/bin/module.cxx | 46 | ||||
-rw-r--r-- | build/bin/target.cxx | 7 | ||||
-rw-r--r-- | build/cxx/module.cxx | 6 | ||||
-rw-r--r-- | build/cxx/rule.cxx | 47 |
6 files changed, 48 insertions, 66 deletions
diff --git a/build/b.cxx b/build/b.cxx index eac0768..13f7991 100644 --- a/build/b.cxx +++ b/build/b.cxx @@ -81,6 +81,7 @@ namespace build #include <build/bin/target> #include <build/bin/rule> +#include <build/bin/module> #include <build/cxx/target> #include <build/cxx/rule> @@ -132,6 +133,7 @@ main (int argc, char* argv[]) // Register modules. // modules["config"] = &config::init; + modules["bin"] = &bin::init; modules["cxx"] = &cxx::init; // Register target types. diff --git a/build/bin/module b/build/bin/module index f2d9502..7e80085 100644 --- a/build/bin/module +++ b/build/bin/module @@ -14,12 +14,6 @@ namespace build { void init (scope&, scope&, const location&); - - // Init the 'lib' part of the module because a lib{} target - // has been created in the specified directory. - // - void - init_lib (const dir_path&); } } diff --git a/build/bin/module.cxx b/build/bin/module.cxx index 89ea9fe..f27ea68 100644 --- a/build/bin/module.cxx +++ b/build/bin/module.cxx @@ -16,6 +16,12 @@ namespace build { namespace bin { + // Default config.bin.*.lib values. + // + static const list_value exe_lib (names {name ("shared"), name ("static")}); + static const list_value liba_lib ("static"); + static const list_value libso_lib ("shared"); + void init (scope& root, scope& base, const location& l) { @@ -35,23 +41,43 @@ namespace build // Configure. // - } - - void - init_lib (const dir_path& d) - { - scope* root (scopes.find (d).root_scope ()); + using config::required; - if (root == nullptr) - return; + //@@ Need to validate the values. Would be more efficient + // to do it once on assignment than every time on query. + // Custom var type? + // // config.bin.lib // { - auto v (root->vars.assign ("bin.lib")); + auto v (root.vars.assign ("bin.lib")); + if (!v) + v = required (root, "config.bin.lib", "shared").first; + } + + // config.bin.exe.lib + // + { + auto v (root.vars.assign ("bin.exe.lib")); + if (!v) + v = required (root, "config.bin.exe.lib", exe_lib).first; + } + + // config.bin.liba.lib + // + { + auto v (root.vars.assign ("bin.liba.lib")); + if (!v) + v = required (root, "config.bin.liba.lib", liba_lib).first; + } + // config.bin.libso.lib + // + { + auto v (root.vars.assign ("bin.libso.lib")); if (!v) - v = config::required (*root, "config.bin.lib", "shared").first; + v = required (root, "config.bin.libso.lib", libso_lib).first; } } } diff --git a/build/bin/target.cxx b/build/bin/target.cxx index ca198d7d..1849533 100644 --- a/build/bin/target.cxx +++ b/build/bin/target.cxx @@ -4,8 +4,6 @@ #include <build/bin/target> -#include <build/bin/module> - using namespace std; namespace build @@ -133,11 +131,6 @@ namespace build static target* lib_factory (dir_path d, string n, const string* e) { - // If there is a target of type lib{} in this project, then - // initialized the lib part of the module. - // - init_lib (d); - liba* a (targets.find<liba> (d, n)); libso* so (targets.find<libso> (d, n)); lib* l (new lib (move (d), move (n), e)); diff --git a/build/cxx/module.cxx b/build/cxx/module.cxx index 45f8271..b26a7fa 100644 --- a/build/cxx/module.cxx +++ b/build/cxx/module.cxx @@ -12,6 +12,8 @@ #include <build/process> #include <build/diagnostics> +#include <build/bin/module> + #include <build/config/utility> using namespace std; @@ -33,6 +35,10 @@ namespace build if (&root != &base) fail (l) << "cxx module must be initialized in project root scope"; + // Initialize the bin module. + // + bin::init (root, base, l); + //@@ TODO: need to register target types, rules here instead of main(). const dir_path& out_root (root.path ()); diff --git a/build/cxx/rule.cxx b/build/cxx/rule.cxx index a23e81e..c942de9 100644 --- a/build/cxx/rule.cxx +++ b/build/cxx/rule.cxx @@ -25,8 +25,6 @@ #include <build/cxx/target> -#include <build/config/utility> - using namespace std; namespace build @@ -478,56 +476,19 @@ namespace build return t.is_a<exe> () ? type::e : (t.is_a<liba> () ? type::a : type::so); } - static const list_value default_exe_order (names {name ("shared"), - name ("static")}); - static const list_value default_liba_order ("static"); - static const list_value default_libso_order ("shared"); - link::order link:: link_order (target& t) { const char* var; - const char* cvar; - const list_value* plv; - //@@ This should be in the bin module, not cxx! @@ remove config include. - // Maybe this should be triggered via the variable access? The same - // for bin.lib? After all, it can be queried in the buildfile. - // switch (link_type (t)) { - case type::e: - var = "bin.exe.lib"; - cvar = "config.bin.exe.lib"; - plv = &default_exe_order; - break; - case type::a: - var = "bin.liba.lib"; - cvar = "config.bin.liba.lib"; - plv = &default_liba_order; - break; - case type::so: - var = "bin.libso.lib"; - cvar = "config.bin.libso.lib"; - plv = &default_libso_order; - break; - } - - if (auto tv = t[var]) - plv = &tv.as<const list_value&> (); - else - { - scope& root (*t.root_scope ()); - auto rv (root.vars.assign (var)); - rv = config::required (root, cvar, *plv).first; - plv = &rv.as<const list_value&> (); + case type::e: var = "bin.exe.lib"; break; + case type::a: var = "bin.liba.lib"; break; + case type::so: var = "bin.libso.lib"; break; } - //@@ Need to validate the value. Would be more efficient - // to do it once on assignment than every time on query. - // Custom var type? - // - const list_value& lv (*plv); + const list_value& lv (t[var].as<const list_value&> ()); return lv[0].value == "shared" ? lv.size () > 1 && lv[1].value == "static" ? order::so_a : order::so : lv.size () > 1 && lv[1].value == "shared" ? order::a_so : order::a; |