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 | |
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')
-rw-r--r-- | build2/cxx/common | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/build2/cxx/common b/build2/cxx/common new file mode 100644 index 0000000..77f1149 --- /dev/null +++ b/build2/cxx/common @@ -0,0 +1,60 @@ +// file : build2/cxx/common -*- C++ -*- +// copyright : Copyright (c) 2014-2016 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#ifndef BUILD2_CXX_COMMON +#define BUILD2_CXX_COMMON + +#include <build2/types> +#include <build2/utility> + +#include <build2/bin/target> + +namespace build2 +{ + namespace cxx + { + // Compile/link output type (executable, static, or shared). + // + enum class otype {e, a, s}; + + inline otype + compile_type (target& t) + { + return + t.is_a<bin::obje> () ? otype::e : + t.is_a<bin::obja> () ? otype::a : + otype::s; + } + + inline otype + link_type (target& t) + { + return + t.is_a<bin::exe> () ? otype::e : + t.is_a<bin::liba> () ? otype::a : + otype::s; + } + + // Library link order. + // + enum class lorder {a, s, a_s, s_a}; + + // The reason we pass scope and not the target is because this function is + // called not only for exe/lib but also for obj as part of the library + // meta-information protocol implementation. Normally the bin.*.lib values + // will be project-wide. With this scheme they can be customized on the + // per-directory basis but not per-target which means all exe/lib in the + // same directory have to have the same link order. + // + lorder + link_order (scope& base, otype); + + // Given the link order return the library member (liba or libs) to link. + // + target& + link_member (bin::lib&, lorder); + } +} + +#endif // BUILD2_CXX_COMMON |