aboutsummaryrefslogtreecommitdiff
path: root/build2/target.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2017-04-28 08:23:47 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2017-04-28 08:23:47 +0200
commit44364c0db26a44230cb58c9e106a4f45da94d9b8 (patch)
tree1da7e062771712ea75f1cb3a7a8d259802307272 /build2/target.cxx
parentc2001eb367b9b82e26689cad6f1f74f46c72b904 (diff)
Add in{} target type for .in ("input") file (requires preprocessing)
Diffstat (limited to 'build2/target.cxx')
-rw-r--r--build2/target.cxx43
1 files changed, 43 insertions, 0 deletions
diff --git a/build2/target.cxx b/build2/target.cxx
index e0f4e55..e1712b9 100644
--- a/build2/target.cxx
+++ b/build2/target.cxx
@@ -1008,6 +1008,49 @@ namespace build2
false
};
+ // in
+ //
+ static const target*
+ in_search (const target& xt, const prerequisite_key& cpk)
+ {
+ // If we have no extension then derive it from our target. The delegate
+ // to file_search().
+ //
+ prerequisite_key pk (cpk);
+ optional<string>& e (pk.tk.ext);
+
+ if (!e)
+ {
+ if (const file* t = xt.is_a<file> ())
+ {
+ const string& te (t->derive_extension ());
+ e = te + (te.empty () ? "" : ".") + "in";
+ }
+ else
+ fail << "prerequisite " << pk << " for a non-file target " << xt;
+ }
+
+ return file_search (xt, pk);
+ }
+
+ static bool
+ in_pattern (const target_type&, const scope&, string&, bool)
+ {
+ fail << "pattern in in{} prerequisite" << endf;
+ }
+
+ const target_type in::static_type
+ {
+ "in",
+ &file::static_type,
+ &file_factory<in, file_ext_def>, // No extension by default.
+ &target_extension_assert, // Should be taken care by search.
+ &in_pattern,
+ &target_print_1_ext_verb, // Same as file.
+ &in_search,
+ false
+ };
+
const target_type doc::static_type
{
"doc",