aboutsummaryrefslogtreecommitdiff
path: root/build/algorithm.ixx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-07-21 15:51:54 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-07-21 15:51:54 +0200
commit4be404cd8b7f4c7b450364defea92cd02e9b7a62 (patch)
treef8f0aac622dfd9d30d1900b958ecea9505265502 /build/algorithm.ixx
parent10604d850510e46b2ee625548abe5eb9a1172a0d (diff)
Improve nested operations support
The idea is this: we need to be able to override "conditional, inner for outer" recipes with the "unconditional inner" ones. Here is the concrete scenario: we have {update, test} action and the lib{} target that is both mentioned as a prerequisite of ./ and exe{}, which is a test. At first, we want to ignore lib{} when reached as a prerequisite of ./. But then we get to it via exe{} (which is a test and thus should be updated). At this point we should override the recipe for lib{} with the one that would update it rather than ignore.
Diffstat (limited to 'build/algorithm.ixx')
-rw-r--r--build/algorithm.ixx12
1 files changed, 9 insertions, 3 deletions
diff --git a/build/algorithm.ixx b/build/algorithm.ixx
index a1e2129..4581d5b 100644
--- a/build/algorithm.ixx
+++ b/build/algorithm.ixx
@@ -2,8 +2,6 @@
// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd
// license : MIT; see accompanying LICENSE file
-#include <utility> // pair
-
#include <build/rule>
#include <build/prerequisite>
#include <build/context>
@@ -50,7 +48,15 @@ namespace build
return static_cast<T&> (search (T::static_type, dir, name, ext, scope));
}
- std::pair<const rule*, match_result>
+
+ struct match_result_impl
+ {
+ action ra; // Action to set recipe, not to pass to apply().
+ const rule* ru;
+ match_result mr;
+ };
+
+ match_result_impl
match_impl (action, target&, bool apply);
inline void