diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2020-06-16 09:43:27 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2020-06-16 09:43:27 +0200 |
commit | ecfae2da0b23631cee3e723a562f64f8aace6879 (patch) | |
tree | 6f7bae1bec966bcc456b71fbaabf8556f031d61b /libbuild2/bin/utility.hxx | |
parent | bd9ca1e55dc1396da73c4699ccc021dc1f604fe6 (diff) |
Move common functionality from cc to bin
Diffstat (limited to 'libbuild2/bin/utility.hxx')
-rw-r--r-- | libbuild2/bin/utility.hxx | 67 |
1 files changed, 48 insertions, 19 deletions
diff --git a/libbuild2/bin/utility.hxx b/libbuild2/bin/utility.hxx index 8fe0037..91b51f8 100644 --- a/libbuild2/bin/utility.hxx +++ b/libbuild2/bin/utility.hxx @@ -7,13 +7,55 @@ #include <libbuild2/types.hxx> #include <libbuild2/utility.hxx> -#include <libbuild2/scope.hxx> -#include <libbuild2/variable.hxx> +#include <libbuild2/action.hxx> + +#include <libbuild2/bin/types.hxx> +#include <libbuild2/bin/target.hxx> namespace build2 { namespace bin { + // @@ Here we conflate the term "link" to mean both linker output and + // linking of a library. + + // Linker output type from binary (exe{}, lib*{}) target. + // + ltype + link_type (const target&); + + // Library group (lib{}) members to build according to the bin.lib value. + // + LIBBUILD2_BIN_SYMEXPORT lmembers + link_members (const scope& rs); + + // Library link order. + // + // 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 + // metadata 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. + // + LIBBUILD2_BIN_SYMEXPORT lorder + link_order (const scope& base, otype); + + inline linfo + link_info (const scope& base, otype ot) + { + return linfo {ot, link_order (base, ot)}; + } + + // Given the link order return the library member to link. That is, liba{} + // or libs{} for lib{} and libua{} or libus{} for libul{}. + // + // If existing is true, then only return the member target if it exists + // (currently only used and supported for utility libraries). + // + LIBBUILD2_BIN_SYMEXPORT const target* + link_member (const libx&, action, linfo, bool existing = false); + // Lookup the bin.pattern value and split it into the pattern and the // search paths. // @@ -23,24 +65,11 @@ namespace build2 const char* paths = nullptr; }; - inline pattern_paths - lookup_pattern (const scope& rs) - { - pattern_paths r; - - // Theoretically, we could have both the pattern and the search paths, - // for example, the pattern can come first followed by the paths. - // - if (const string* v = cast_null<string> (rs["bin.pattern"])) - { - (path::traits_type::is_separator (v->back ()) - ? r.paths - : r.pattern) = v->c_str (); - } - - return r; - } + LIBBUILD2_BIN_SYMEXPORT pattern_paths + lookup_pattern (const scope& rs); } } +#include <libbuild2/bin/utility.ixx> + #endif // LIBBUILD2_BIN_UTILITY_HXX |