aboutsummaryrefslogtreecommitdiff
path: root/build2/cc/link
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2016-08-24 15:41:54 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2016-08-24 15:41:54 +0200
commit3a8972b42f75e10e9a833bba58d65009e7bed7f3 (patch)
treecb350e533b967b828ece6a59ced5bb2caa932de7 /build2/cc/link
parentfeb55ebfdc536c32de2c173d108df5ee0004da44 (diff)
Handle *.export.libs, distinguish interface and implementation dependencies
A library dependency on another libraries is either "interface" or "implementation". If it is interface, then everyone who links to this library should also link to the interface dependency, explicitly. A good example of an interface dependency is a library API that is called in inline functions. Interface dependencies of a library should be explicitly listed in the *.export.libs (where we can also list target names). So the typical usage will be along these lines: import int_libs = libfoo%lib{foo} import int_libs += ... import imp_libs = libbar%lib{bar} import imp_libs += ... lib{baz}: ... $int_libs $imp_libs lib{baz}: cxx.export.libs = $int_libs
Diffstat (limited to 'build2/cc/link')
-rw-r--r--build2/cc/link26
1 files changed, 23 insertions, 3 deletions
diff --git a/build2/cc/link b/build2/cc/link
index f6a16c0..aaf1cd7 100644
--- a/build2/cc/link
+++ b/build2/cc/link
@@ -39,6 +39,15 @@ namespace build2
private:
friend class compile;
+ void
+ append_libraries (strings&, file&, bool) const;
+
+ void
+ hash_libraries (sha256&, file&, bool) const;
+
+ file&
+ resolve_library (name, scope&, lorder, optional<dir_paths>&) const;
+
// Extract system library search paths from GCC or compatible (Clang,
// Intel) using the -print-search-dirs option.
//
@@ -58,15 +67,26 @@ namespace build2
bin::liba*
msvc_search_static (const process_path&,
const dir_path&,
- prerequisite&) const;
+ const prerequisite_key&) const;
bin::libs*
msvc_search_shared (const process_path&,
const dir_path&,
- prerequisite&) const;
+ const prerequisite_key&) const;
target*
- search_library (optional<dir_paths>&, prerequisite&) const;
+ search_library (optional<dir_paths>& spc, prerequisite& p) const
+ {
+ if (p.target == nullptr) // First check the cache.
+ p.target = search_library (spc, p.key ());
+
+ return p.target;
+ }
+
+ // Note that pk's scope should not be NULL (even if dir is absolute).
+ //
+ target*
+ search_library (optional<dir_paths>&, const prerequisite_key&) const;
// Windows-specific (windows-manifest.cxx).
//