aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/cc/common.txx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2020-05-22 11:34:19 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2020-05-22 11:34:19 +0200
commitf352dbb8308ddeab5fa47a5d18883f854192ec53 (patch)
tree17bf76b6acf13711049cc54aa3948df6b27db3f6 /libbuild2/cc/common.txx
parent630b498533f5a9a1e9d40893f4806ef855f1e03b (diff)
Make template definition available in all translation units where used
We were trying to be clever but GCC 10's IPA-SRA optimization didn't like it.
Diffstat (limited to 'libbuild2/cc/common.txx')
-rw-r--r--libbuild2/cc/common.txx35
1 files changed, 35 insertions, 0 deletions
diff --git a/libbuild2/cc/common.txx b/libbuild2/cc/common.txx
new file mode 100644
index 0000000..bfbc52c
--- /dev/null
+++ b/libbuild2/cc/common.txx
@@ -0,0 +1,35 @@
+// file : libbuild2/cc/common.txx -*- C++ -*-
+// license : MIT; see accompanying LICENSE file
+
+namespace build2
+{
+ namespace cc
+ {
+ // Insert a target "tagging" it with the specified process path and
+ // verifying that it already exists if requested. Return the lock.
+ //
+ template <typename T>
+ ulock common::
+ insert_library (context& ctx,
+ T*& r,
+ string name,
+ dir_path dir,
+ const process_path& out,
+ optional<string> ext,
+ bool exist,
+ tracer& trace)
+ {
+ auto p (ctx.targets.insert_locked (T::static_type,
+ move (dir),
+ path_cast<dir_path> (out.effect),
+ name,
+ move (ext),
+ true, // Implied.
+ trace));
+
+ assert (!exist || !p.second.owns_lock ());
+ r = &p.first.template as<T> ();
+ return move (p.second);
+ }
+ }
+}