From ecfae2da0b23631cee3e723a562f64f8aace6879 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 16 Jun 2020 09:43:27 +0200 Subject: Move common functionality from cc to bin --- libbuild2/bin/utility.hxx | 67 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 19 deletions(-) (limited to 'libbuild2/bin/utility.hxx') 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 #include -#include -#include +#include + +#include +#include 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 (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 + #endif // LIBBUILD2_BIN_UTILITY_HXX -- cgit v1.1