aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/bin/utility.hxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2020-06-16 09:43:27 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2020-06-16 09:43:27 +0200
commitecfae2da0b23631cee3e723a562f64f8aace6879 (patch)
tree6f7bae1bec966bcc456b71fbaabf8556f031d61b /libbuild2/bin/utility.hxx
parentbd9ca1e55dc1396da73c4699ccc021dc1f604fe6 (diff)
Move common functionality from cc to bin
Diffstat (limited to 'libbuild2/bin/utility.hxx')
-rw-r--r--libbuild2/bin/utility.hxx67
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