aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libbuild2/cc/functions.cxx9
-rw-r--r--libbuild2/cc/link-rule.cxx13
-rw-r--r--libbuild2/cc/link-rule.hxx3
3 files changed, 18 insertions, 7 deletions
diff --git a/libbuild2/cc/functions.cxx b/libbuild2/cc/functions.cxx
index 78ee212..98f7f97 100644
--- a/libbuild2/cc/functions.cxx
+++ b/libbuild2/cc/functions.cxx
@@ -175,7 +175,9 @@ namespace build2
//
// The following flags are supported:
//
- // whole - link the specified libraries in the whole archive mode
+ // whole - link the specified libraries in the whole archive mode
+ //
+ // absolute - return absolute paths to the libraries
//
// If the last argument is false, then do not return the specified
// libraries themselves.
@@ -197,6 +199,7 @@ namespace build2
action a, const file& l, bool la, linfo li)
{
lflags lf (0);
+ bool rel (true);
if (vs.size () > 2)
{
for (const name& f: vs[2].as<names> ())
@@ -205,6 +208,8 @@ namespace build2
if (s == "whole")
lf |= lflag_whole;
+ else if (s == "absolute")
+ rel = false;
else
fail << "invalid flag '" << s << "'";
}
@@ -214,7 +219,7 @@ namespace build2
m.append_libraries (*static_cast<appended_libraries*> (ls), r,
bs,
- a, l, la, lf, li, self);
+ a, l, la, lf, li, self, rel);
}});
// $<module>.lib_rpaths(<targets>, <otype> [, <link> [, <self>]])
diff --git a/libbuild2/cc/link-rule.cxx b/libbuild2/cc/link-rule.cxx
index 8175489..dea5879 100644
--- a/libbuild2/cc/link-rule.cxx
+++ b/libbuild2/cc/link-rule.cxx
@@ -1492,7 +1492,7 @@ namespace build2
append_libraries (appended_libraries& ls, strings& args,
const scope& bs, action a,
const file& l, bool la, lflags lf, linfo li,
- bool self) const
+ bool self, bool rel) const
{
struct data
{
@@ -1501,8 +1501,9 @@ namespace build2
const file& l;
action a;
linfo li;
+ bool rel;
compile_target_types tts;
- } d {ls, args, l, a, li, compile_types (li.type)};
+ } d {ls, args, l, a, li, rel, compile_types (li.type)};
auto imp = [] (const file&, bool la)
{
@@ -1637,7 +1638,9 @@ namespace build2
//
if (const file* f = pt->is_a<objx> ())
{
- string p (relative (f->path ()).string ());
+ const string& p (d.rel
+ ? relative (f->path ()).string ()
+ : f->path ().string ());
if (find (d.args.begin (), d.args.end (), p) == d.args.end ())
d.args.push_back (move (p));
}
@@ -1661,7 +1664,9 @@ namespace build2
l = li;
}
- string p (relative (l->path ()).string ());
+ string p (d.rel
+ ? relative (l->path ()).string ()
+ : l->path ().string ());
if (f & lflag_whole)
{
diff --git a/libbuild2/cc/link-rule.hxx b/libbuild2/cc/link-rule.hxx
index b192914..6d0649c 100644
--- a/libbuild2/cc/link-rule.hxx
+++ b/libbuild2/cc/link-rule.hxx
@@ -111,7 +111,8 @@ namespace build2
void
append_libraries (appended_libraries&, strings&,
const scope&, action,
- const file&, bool, lflags, linfo, bool = true) const;
+ const file&, bool, lflags, linfo,
+ bool = true, bool = true) const;
void
append_libraries (sha256&, bool&, timestamp,