aboutsummaryrefslogtreecommitdiff
path: root/build/target.txx
diff options
context:
space:
mode:
Diffstat (limited to 'build/target.txx')
-rw-r--r--build/target.txx44
1 files changed, 44 insertions, 0 deletions
diff --git a/build/target.txx b/build/target.txx
new file mode 100644
index 0000000..6fe3f33
--- /dev/null
+++ b/build/target.txx
@@ -0,0 +1,44 @@
+// file : build/target.txx -*- C++ -*-
+// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#include <build/scope>
+#include <build/utility> // extension_pool
+#include <build/diagnostics>
+#include <build/prerequisite>
+
+namespace build
+{
+ template <const char* ext>
+ const std::string&
+ target_extension_fix (const target_key&, scope&)
+ {
+ return extension_pool.find (ext);
+ }
+
+ template <const char* var>
+ const std::string&
+ target_extension_var (const target_key& tk, scope& s)
+ {
+ auto val (s[var]);
+
+ if (!val)
+ {
+ diag_record dr;
+ dr << fail << "no default extension in variable " << var
+ << info << "required to derive file name for ";
+
+ // This is a bit hacky: we may be dealing with a target (see
+ // file::derive_path()) or prerequsite (see search_existing_file()).
+ // So we are going to check if dir is absolute. If it is, then
+ // we assume this is a target, otherwise -- prerequsite.
+ //
+ if (tk.dir->absolute ())
+ dr << "target " << tk;
+ else
+ dr << "prerequisite " << prerequisite_key {tk, &s};
+ }
+
+ return extension_pool.find (val.as<const std::string&> ());
+ }
+}