aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/in
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2023-07-20 07:44:36 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2023-07-20 07:44:36 +0200
commitb61e0de250d522ec9a8e16146ef979a65c181db1 (patch)
tree93cf8e451a5c605f9d0159c6474e77d47b6f2de4 /libbuild2/in
parent7aabdc2ccfea23c93e3b94290df59708aa179104 (diff)
Change inner rule/prerequisites match order in install::file_rule
The old order messed up the for-install signaling logic. See the long comment in install::file_rule::apply_impl() for background and details.
Diffstat (limited to 'libbuild2/in')
-rw-r--r--libbuild2/in/rule.cxx11
-rw-r--r--libbuild2/in/rule.hxx5
2 files changed, 14 insertions, 2 deletions
diff --git a/libbuild2/in/rule.cxx b/libbuild2/in/rule.cxx
index 74bc2a7..31a9d94 100644
--- a/libbuild2/in/rule.cxx
+++ b/libbuild2/in/rule.cxx
@@ -47,6 +47,13 @@ namespace build2
if (!fi)
l5 ([&]{trace << "no in file prerequisite for target " << t;});
+ // If we match, derive the file name here instead of in apply() to make
+ // it available early for the in{} prerequisite search (see
+ // install::file_rule::apply_impl() for background).
+ //
+ if (fi)
+ t.derive_path ();
+
return fi;
}
@@ -55,9 +62,9 @@ namespace build2
{
file& t (xt.as<file> ());
- // Derive the file name.
+ // Make sure derived rules assign the path in match().
//
- t.derive_path ();
+ assert (!t.path ().empty ());
// Inject dependency on the output directory.
//
diff --git a/libbuild2/in/rule.hxx b/libbuild2/in/rule.hxx
index 369fd93..67c2509 100644
--- a/libbuild2/in/rule.hxx
+++ b/libbuild2/in/rule.hxx
@@ -22,6 +22,11 @@ namespace build2
// cache data (e.g., in match() or apply()) to be used in substitute() and
// lookup() calls.
//
+ // A derived rule is also required to derive the target file name in
+ // match() instead of apply() to make it available early for the in{}
+ // prerequisite search (see install::file_rule::apply_impl() for
+ // background).
+ //
// Note also that currently this rule ignores the dry-run mode (see
// perform_update() for the rationale).
//