From 2958f39350a067795e4e13080f78b9df394b298c Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 13 Sep 2021 17:00:08 +0200 Subject: Consistently install prerequisites from any scope by default --- libbuild2/cc/install-rule.cxx | 24 ++++++++++++++---------- libbuild2/cc/install-rule.hxx | 6 ++++-- 2 files changed, 18 insertions(+), 12 deletions(-) (limited to 'libbuild2/cc') diff --git a/libbuild2/cc/install-rule.cxx b/libbuild2/cc/install-rule.cxx index dc10543..3e62d59 100644 --- a/libbuild2/cc/install-rule.cxx +++ b/libbuild2/cc/install-rule.cxx @@ -25,14 +25,15 @@ namespace build2 : common (move (d)), link_ (l) {} const target* install_rule:: - filter (action a, const target& t, prerequisite_iterator& i) const + filter (const scope* is, + action a, const target& t, prerequisite_iterator& i) const { // NOTE: see libux_install_rule::filter() if changing anything here. const prerequisite& p (i->prerequisite); - // If this is a shared library prerequisite, install it as long as it - // is in the same amalgamation as we are. + // If this is a shared library prerequisite, install it as long as it is + // in the installation scope. // // Less obvious: we also want to install a static library prerequisite // of a library (since it could be referenced from its .pc file, etc). @@ -61,7 +62,7 @@ namespace build2 // Note: not redundant since we are returning a member. // if ((st && pt->is_a ()) || (at && pt->is_a ())) - return pt->in (t.weak_scope ()) ? pt : nullptr; + return is == nullptr || pt->in (*is) ? pt : nullptr; // See through to libu*{} members. Note that we are always in the same // project (and thus amalgamation). @@ -72,7 +73,7 @@ namespace build2 // The rest of the tests only succeed if the base filter() succeeds. // - const target* pt (file_rule::filter (a, t, p)); + const target* pt (file_rule::filter (is, a, t, p)); if (pt == nullptr) return pt; @@ -137,7 +138,7 @@ namespace build2 { pt = t.is_a () ? nullptr - : file_rule::filter (a, *pt, pm.prerequisite); + : file_rule::filter (is, a, *pt, pm.prerequisite); break; } } @@ -279,8 +280,11 @@ namespace build2 : common (move (d)), link_ (l) {} const target* libux_install_rule:: - filter (action a, const target& t, prerequisite_iterator& i) const + filter (const scope* is, + action a, const target& t, prerequisite_iterator& i) const { + using file_rule = install::file_rule; + const prerequisite& p (i->prerequisite); // The "see through" semantics that should be parallel to install_rule @@ -301,13 +305,13 @@ namespace build2 pt = link_member (*l, a, link_info (t.base_scope (), ot)); if ((st && pt->is_a ()) || (at && pt->is_a ())) - return pt->in (t.weak_scope ()) ? pt : nullptr; + return is == nullptr || pt->in (*is) ? pt : nullptr; if (pt->is_a ()) return pt; } - const target* pt (install::file_rule::instance.filter (a, t, p)); + const target* pt (file_rule::instance.filter (is, a, t, p)); if (pt == nullptr) return pt; @@ -349,7 +353,7 @@ namespace build2 { pt = t.is_a () ? nullptr - : install::file_rule::instance.filter (a, *pt, pm.prerequisite); + : file_rule::instance.filter (is, a, *pt, pm.prerequisite); break; } } diff --git a/libbuild2/cc/install-rule.hxx b/libbuild2/cc/install-rule.hxx index 5856352..acd1bd8 100644 --- a/libbuild2/cc/install-rule.hxx +++ b/libbuild2/cc/install-rule.hxx @@ -35,7 +35,8 @@ namespace build2 install_rule (data&&, const link_rule&); virtual const target* - filter (action, const target&, prerequisite_iterator&) const override; + filter (const scope*, + action, const target&, prerequisite_iterator&) const override; virtual bool match (action, target&, const string&) const override; @@ -67,7 +68,8 @@ namespace build2 libux_install_rule (data&&, const link_rule&); virtual const target* - filter (action, const target&, prerequisite_iterator&) const override; + filter (const scope*, + action, const target&, prerequisite_iterator&) const override; virtual bool match (action, target&, const string&) const override; -- cgit v1.1