diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2016-07-17 08:18:45 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2016-07-17 08:18:45 +0200 |
commit | db3534da1bcbf286df7ac4c8736f5c5157399ced (patch) | |
tree | 9e65d9fe9806e794364db0cc8fe0d062b1f1cdc4 /build2/cxx/common.cxx | |
parent | b439803cc5e09188c7b523333f6b71de3ba57dbf (diff) |
Redesign obj to exe/lib mapping
Specifically:
* objso{} and libso{} target types have been renamed to objs{} and libs{}
* obje{} has been added (so now we have obje{}, obja{}, and objs{})
* obje{} is now used for building exe{}
* object file extensions have been changed to use "hierarchical extensions"
that reflect the extension of the corresponding exe/lib target (instead of
the -so suffix we used), specifically:
obje{}: foo.o, (UNIX), foo.exe.o (MinGW), foo.exe.obj (Windows)
obja{}: foo.a.o (UNIX, MinGW), foo.lib.obj (Windows)
objs{}: foo.so.o (UNIX), foo.dylib.o (Darwin), foo.dll.o (MinGW),
foo.dll.obj (Windows)
Diffstat (limited to 'build2/cxx/common.cxx')
-rw-r--r-- | build2/cxx/common.cxx | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/build2/cxx/common.cxx b/build2/cxx/common.cxx new file mode 100644 index 0000000..0b66eb5 --- /dev/null +++ b/build2/cxx/common.cxx @@ -0,0 +1,70 @@ +// file : build2/cxx/common.cxx -*- C++ -*- +// copyright : Copyright (c) 2014-2016 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#include <build2/cxx/common> + +#include <build2/variable> +#include <build2/algorithm> + +using namespace std; + +namespace build2 +{ + namespace cxx + { + using namespace bin; + + lorder + link_order (scope& bs, otype ot) + { + const char* var; + + switch (ot) + { + case otype::e: var = "bin.exe.lib"; break; + case otype::a: var = "bin.liba.lib"; break; + case otype::s: var = "bin.libs.lib"; break; + } + + const auto& v (cast<strings> (bs[var])); + return v[0] == "shared" + ? v.size () > 1 && v[1] == "static" ? lorder::s_a : lorder::s + : v.size () > 1 && v[1] == "shared" ? lorder::a_s : lorder::a; + } + + target& + link_member (bin::lib& l, lorder lo) + { + bool ls (true); + const string& at (cast<string> (l["bin.lib"])); // Available members. + + switch (lo) + { + case lorder::a: + case lorder::a_s: + ls = false; // Fall through. + case lorder::s: + case lorder::s_a: + { + if (ls ? at == "static" : at == "shared") + { + if (lo == lorder::a_s || lo == lorder::s_a) + ls = !ls; + else + fail << (ls ? "shared" : "static") << " variant of " << l + << " is not available"; + } + } + } + + target* r (ls ? static_cast<target*> (l.s) : l.a); + + if (r == nullptr) + r = &search (ls ? libs::static_type : liba::static_type, + prerequisite_key {nullptr, l.key (), nullptr}); + + return *r; + } + } +} |