From 061879137a62cb905f75e35c104cff379fb95134 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 1 Jun 2023 09:56:35 +0200 Subject: Add inner_recipe for expressiveness --- libbuild2/adhoc-rule-buildscript.cxx | 2 +- libbuild2/algorithm.hxx | 6 ++++-- libbuild2/algorithm.ixx | 2 +- libbuild2/install/rule.cxx | 2 +- libbuild2/operation.cxx | 2 +- libbuild2/recipe.cxx | 1 + libbuild2/recipe.hxx | 1 + libbuild2/target.hxx | 2 +- 8 files changed, 11 insertions(+), 7 deletions(-) diff --git a/libbuild2/adhoc-rule-buildscript.cxx b/libbuild2/adhoc-rule-buildscript.cxx index fa5100c..a67b07b 100644 --- a/libbuild2/adhoc-rule-buildscript.cxx +++ b/libbuild2/adhoc-rule-buildscript.cxx @@ -319,7 +319,7 @@ namespace build2 if (a.outer ()) { match_inner (a, t); - return execute_inner; + return inner_recipe; } context& ctx (t.ctx); diff --git a/libbuild2/algorithm.hxx b/libbuild2/algorithm.hxx index 93a609f..216ec4b 100644 --- a/libbuild2/algorithm.hxx +++ b/libbuild2/algorithm.hxx @@ -430,7 +430,8 @@ namespace build2 match_inc_dependents (action, const target&); // Match (synchronously) a rule for the inner operation from withing the - // outer rule's apply() function. See also the companion execute_inner(). + // outer rule's apply() function. See also the companion execute_inner() + // and inner_recipe. // target_state match_inner (action, const target&); @@ -604,7 +605,8 @@ namespace build2 // Note that the returned target state is for the inner operation. The // appropriate usage is to call this function from the outer operation's // recipe and to factor the obtained state into the one returned (similar to - // how we do it for prerequisites). + // how we do it for prerequisites). Or, if factoring is not needed, simply + // return inner_recipe as outer recipe. // // Note: waits for the completion if the target is busy and translates // target_state::failed to the failed exception. diff --git a/libbuild2/algorithm.ixx b/libbuild2/algorithm.ixx index 6fcc1e9..9f1b70f 100644 --- a/libbuild2/algorithm.ixx +++ b/libbuild2/algorithm.ixx @@ -845,7 +845,7 @@ namespace build2 } inline target_state - execute_inner (action a, const target& t) // @@ TMP Why inline (used as recipe)? + execute_inner (action a, const target& t) { assert (a.outer ()); return execute_sync (a.inner_action (), t); diff --git a/libbuild2/install/rule.cxx b/libbuild2/install/rule.cxx index c0fbe0c..7e6121d 100644 --- a/libbuild2/install/rule.cxx +++ b/libbuild2/install/rule.cxx @@ -197,7 +197,7 @@ namespace build2 if (a.operation () == update_id) { match_inner (a, t); - return &execute_inner; + return inner_recipe; } else return noop_recipe; diff --git a/libbuild2/operation.cxx b/libbuild2/operation.cxx index 1c3493c..e9b9211 100644 --- a/libbuild2/operation.cxx +++ b/libbuild2/operation.cxx @@ -803,7 +803,7 @@ namespace build2 // @@ There are special recipes that don't populate prerequisite_targets // like group_recipe! Are we banning any user-defined such recipes? // Need to actually look if we have anything else like this. There - // is also execute_inner, though doesn't apply here (only for outer). + // is also inner_recipe, though doesn't apply here (only for outer). // // @@ TMP: do and enable after the 0.16.0 release. // diff --git a/libbuild2/recipe.cxx b/libbuild2/recipe.cxx index eeafe87..87d37e7 100644 --- a/libbuild2/recipe.cxx +++ b/libbuild2/recipe.cxx @@ -11,4 +11,5 @@ namespace build2 recipe_function* const noop_recipe = &noop_action; recipe_function* const default_recipe = &default_action; recipe_function* const group_recipe = &group_action; + recipe_function* const inner_recipe = &execute_inner; } diff --git a/libbuild2/recipe.hxx b/libbuild2/recipe.hxx index 5a6e38d..97261f5 100644 --- a/libbuild2/recipe.hxx +++ b/libbuild2/recipe.hxx @@ -49,6 +49,7 @@ namespace build2 LIBBUILD2_SYMEXPORT extern recipe_function* const noop_recipe; LIBBUILD2_SYMEXPORT extern recipe_function* const default_recipe; LIBBUILD2_SYMEXPORT extern recipe_function* const group_recipe; + LIBBUILD2_SYMEXPORT extern recipe_function* const inner_recipe; } #endif // LIBBUILD2_RECIPE_HXX diff --git a/libbuild2/target.hxx b/libbuild2/target.hxx index c33893f..d01e8b7 100644 --- a/libbuild2/target.hxx +++ b/libbuild2/target.hxx @@ -938,7 +938,7 @@ namespace build2 // resolve_members_impl() for background). Note that a rule should not // store targets that are semantically prerequisites in an ad hoc manner // (e.g., in match data) with a few well-known execeptions (see - // group_action and execute_inner). + // group_recipe and inner_recipe). // // Note that the recipe may modify this list. @@ TMP TSAN issue // -- cgit v1.1