diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2022-02-07 07:59:48 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2022-02-07 07:59:48 +0200 |
commit | e3f077ba7584f65561e21ca195215abd341b9147 (patch) | |
tree | d4965d7e3a15ebed181f1a1c37c433cde80fae2d /libbuild2 | |
parent | 9699e205dc55a9e2de18f56aabad8feb46613b1f (diff) |
Add support for meta-operation wildcard in scope::insert_rule()
Diffstat (limited to 'libbuild2')
-rw-r--r-- | libbuild2/parser.cxx | 6 | ||||
-rw-r--r-- | libbuild2/scope.hxx | 26 |
2 files changed, 31 insertions, 1 deletions
diff --git a/libbuild2/parser.cxx b/libbuild2/parser.cxx index 9f69117..f42666b 100644 --- a/libbuild2/parser.cxx +++ b/libbuild2/parser.cxx @@ -1171,6 +1171,12 @@ namespace build2 skip: ; } + + // @@ TODO: if this rule does dynamic member discovery of a + // see-through target group, then we may also need to + // register update for other meta-operations (see, for + // example, wildcard update registration in the cli + // module). } } } diff --git a/libbuild2/scope.hxx b/libbuild2/scope.hxx index f82db72..e3ebdef 100644 --- a/libbuild2/scope.hxx +++ b/libbuild2/scope.hxx @@ -423,13 +423,37 @@ namespace build2 rules.insert<T> (a, move (hint), r); } + // 0 meta-operation id is treated as an (emulated) wildcard. + // + // Emulated means that we just iterate over all the meta-operations known + // to this project (and they should all be known at this point) and + // register the rule for each of them. + // template <typename T> void insert_rule (meta_operation_id mid, operation_id oid, string hint, const rule& r) { - rules.insert<T> (mid, oid, move (hint), r); + if (mid != 0) + rules.insert<T> (mid, oid, move (hint), r); + else + { + auto& ms (root_scope ()->root_extra->meta_operations); + + for (size_t i (1), n (ms.size ()); i != n; ++i) + { + // Skip a few well-known meta-operations that cannot possibly + // trigger a rule match. + // + if (ms[i] != nullptr && + i != noop_id && + i != info_id && + i != create_id && + i != disfigure_id) + rules.insert<T> (i, oid, hint, r); + } + } } // Operation callbacks. |