aboutsummaryrefslogtreecommitdiff
path: root/build/target
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/target
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/target')
-rw-r--r--build/target14
1 files changed, 9 insertions, 5 deletions
diff --git a/build/target b/build/target
index e07f6e0..f5a26b4 100644
--- a/build/target
+++ b/build/target
@@ -303,16 +303,21 @@ namespace build
std::size_t dependents;
public:
+ typedef build::action action_type;
+
+ action_type action; // Action this recipe is for.
+
+ public:
typedef build::recipe recipe_type;
const recipe_type&
- recipe (action a) const {return action_ == a ? recipe_ : empty_recipe;}
+ recipe (action_type a) const {return a > action ? empty_recipe : recipe_;}
void
- recipe (action a, recipe_type r)
+ recipe (action_type a, recipe_type r)
{
- assert (action_ != a || !recipe_);
- action_ = a;
+ assert (a > action || !recipe_);
+ action = a;
recipe_ = std::move (r);
// Also reset the target state. If this is a noop recipe, then
@@ -348,7 +353,6 @@ namespace build
static const target_type static_type;
private:
- action action_; // Action this recipe is for.
recipe_type recipe_;
};