aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build/b.cxx2
-rw-r--r--build/bin/module6
-rw-r--r--build/bin/module.cxx46
-rw-r--r--build/bin/target.cxx7
-rw-r--r--build/cxx/module.cxx6
-rw-r--r--build/cxx/rule.cxx47
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;