aboutsummaryrefslogtreecommitdiff
path: root/build/target-type
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-07-07 09:18:22 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-07-07 09:18:22 +0200
commit49d5628e35593a5300d39596286c768d7aa435b6 (patch)
tree43f20983a381c54aac7536e78e4f9543d8761aac /build/target-type
parent16c19b739a58845af7f807c3dee8021a1c421006 (diff)
Rework module architecture
Now the target type and rule maps are in scopes (builtins -- in global scope). We also now have the map of loaded modules in the root scope of each project.
Diffstat (limited to 'build/target-type')
-rw-r--r--build/target-type70
1 files changed, 70 insertions, 0 deletions
diff --git a/build/target-type b/build/target-type
new file mode 100644
index 0000000..d5e7971
--- /dev/null
+++ b/build/target-type
@@ -0,0 +1,70 @@
+// file : build/target-type -*- C++ -*-
+// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#ifndef BUILD_TARGET_TYPE
+#define BUILD_TARGET_TYPE
+
+#include <map>
+#include <string>
+#include <ostream>
+#include <typeindex>
+#include <functional> // reference_wrapper
+
+#include <butl/utility> // compare_c_string
+
+#include <build/types>
+
+namespace build
+{
+ class scope;
+ class target;
+ class target_key;
+ class prerequisite_key;
+
+ // Target type.
+ //
+ struct target_type
+ {
+ std::type_index id;
+ const char* name;
+ const target_type* base;
+ target* (*const factory) (dir_path, std::string, const std::string*);
+ const std::string& (*const extension) (const target_key&, scope&);
+ target* (*const search) (const prerequisite_key&);
+ bool see_through; // A group with the default "see through" semantics.
+
+ bool
+ is_a (const std::type_index&) const; // Defined in target.cxx
+
+ template <typename T>
+ bool
+ is_a () const {return is_a (typeid (T));}
+ };
+
+ inline std::ostream&
+ operator<< (std::ostream& os, const target_type& tt)
+ {
+ return os << tt.name;
+ }
+
+ // Target type map.
+ //
+ using target_type_map_base = std::map<
+ const char*,
+ std::reference_wrapper<const target_type>,
+ butl::compare_c_string>;
+
+ class target_type_map: public target_type_map_base
+ {
+ public:
+ void
+ insert (const target_type& tt) {emplace (tt.name, tt);}
+
+ template <typename T>
+ void
+ insert () {insert (T::static_type);}
+ };
+}
+
+#endif // BUILD_TARGET_TYPE