diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2015-07-21 09:39:57 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2015-07-21 09:39:57 +0200 |
commit | 10604d850510e46b2ee625548abe5eb9a1172a0d (patch) | |
tree | 0a301d0d69afe2123a406afeeff03f7fe89c4433 | |
parent | cb8399da1f0b1c5f28e443c98bfc3cb4e12b8cbf (diff) |
Add alias{} target type, use as base for dir{}
-rw-r--r-- | build/context.cxx | 9 | ||||
-rw-r--r-- | build/rule | 2 | ||||
-rw-r--r-- | build/rule.cxx | 6 | ||||
-rw-r--r-- | build/target | 21 | ||||
-rw-r--r-- | build/target.cxx | 18 |
5 files changed, 40 insertions, 16 deletions
diff --git a/build/context.cxx b/build/context.cxx index bd6143a..9b22478 100644 --- a/build/context.cxx +++ b/build/context.cxx @@ -30,7 +30,7 @@ namespace build // Builtin rules. // - static dir_rule dir_; + static alias_rule alias_; static fsdir_rule fsdir_; static file_rule file_; @@ -67,6 +67,7 @@ namespace build target_type_map& tts (global_scope->target_types); tts.insert<file> (); + tts.insert<alias> (); tts.insert<dir> (); tts.insert<fsdir> (); } @@ -76,9 +77,9 @@ namespace build { rule_map& rs (global_scope->rules); - rs.insert<dir> (default_id, "dir", dir_); - rs.insert<dir> (update_id, "dir", dir_); - rs.insert<dir> (clean_id, "dir", dir_); + rs.insert<alias> (default_id, "alias", alias_); + rs.insert<alias> (update_id, "alias", alias_); + rs.insert<alias> (clean_id, "alias", alias_); rs.insert<fsdir> (default_id, "fsdir", fsdir_); rs.insert<fsdir> (update_id, "fsdir", fsdir_); @@ -67,7 +67,7 @@ namespace build perform_update (action, target&); }; - class dir_rule: public rule + class alias_rule: public rule { public: virtual match_result diff --git a/build/rule.cxx b/build/rule.cxx index 6db0f4f..03c86c8 100644 --- a/build/rule.cxx +++ b/build/rule.cxx @@ -133,15 +133,15 @@ namespace build return target_state::unchanged; } - // dir_rule + // alias_rule // - match_result dir_rule:: + match_result alias_rule:: match (action, target& t, const string&) const { return t; } - recipe dir_rule:: + recipe alias_rule:: apply (action a, target& t, const match_result&) const { search_and_match_prerequisites (a, t); diff --git a/build/target b/build/target index d164f72..e07f6e0 100644 --- a/build/target +++ b/build/target @@ -889,11 +889,10 @@ namespace build static const target_type static_type; }; - // Directory alias/action target. Note that it is not mtime-based. - // Rather it is meant to represent a group of targets. For actual - // filesystem directory (creation), see fsdir. + // Alias target. It represents a list of targets (its prerequisites) + // as a single "name". // - class dir: public target + class alias: public target { public: using target::target; @@ -903,6 +902,20 @@ namespace build static const target_type static_type; }; + // Directory target. Note that this is not a filesystem directory + // but rather an alias target with the directory name. For actual + // filesystem directory (creation), see fsdir. + // + class dir: public alias + { + public: + using alias::alias; + + public: + virtual const target_type& type () const {return static_type;} + static const target_type static_type; + }; + // While a filesystem directory is mtime-based, the semantics is // not very useful in our case. In particular, if another target // depends on fsdir{}, then all that's desired is the creation of diff --git a/build/target.cxx b/build/target.cxx index 63bb2fe..f9662fa 100644 --- a/build/target.cxx +++ b/build/target.cxx @@ -297,9 +297,8 @@ namespace build static target* search_alias (const prerequisite_key& pk) { - // For an alias/action we don't want to silently create a target - // since it will do nothing and it most likely not what the author - // intended. + // For an alias we don't want to silently create a target since it + // will do nothing and it most likely not what the user intended. // target* t (search_existing_target (pk)); @@ -368,11 +367,22 @@ namespace build false }; + const target_type alias::static_type + { + typeid (alias), + "alias", + &target::static_type, + &target_factory<alias>, + nullptr, // Should never need. + &search_alias, + false + }; + const target_type dir::static_type { typeid (dir), "dir", - &target::static_type, + &alias::static_type, &target_factory<dir>, nullptr, // Should never need. &search_alias, |