aboutsummaryrefslogtreecommitdiff
path: root/build2/cc/compile-rule.hxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2018-01-20 13:46:11 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2018-02-03 14:35:45 +0200
commit934f2a9a90c5cad3cdc8a66b50c17827a3ddbcee (patch)
treef35f106e5369e98350327c79080c571195234c0b /build2/cc/compile-rule.hxx
parent280f4a5bf787587227ca193cd59c6bd74091db70 (diff)
Get rid of action rule override semantics
Instead we now have two more or less separate match states for outer and inner parts of an action.
Diffstat (limited to 'build2/cc/compile-rule.hxx')
-rw-r--r--build2/cc/compile-rule.hxx156
1 files changed, 156 insertions, 0 deletions
diff --git a/build2/cc/compile-rule.hxx b/build2/cc/compile-rule.hxx
new file mode 100644
index 0000000..6bf63bf
--- /dev/null
+++ b/build2/cc/compile-rule.hxx
@@ -0,0 +1,156 @@
+// file : build2/cc/compile-rule.hxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#ifndef BUILD2_CC_COMPILE_RULE_HXX
+#define BUILD2_CC_COMPILE_RULE_HXX
+
+#include <libbutl/path-map.mxx>
+
+#include <build2/types.hxx>
+#include <build2/utility.hxx>
+
+#include <build2/rule.hxx>
+#include <build2/filesystem.hxx> // auto_rmfile
+
+#include <build2/cc/types.hxx>
+#include <build2/cc/common.hxx>
+
+namespace build2
+{
+ class depdb;
+
+ namespace cc
+ {
+ // The order is arranged so that their integral values indicate whether
+ // one is a "stronger" than another.
+ //
+ enum class preprocessed: uint8_t {none, includes, modules, all};
+
+ // Positions of the re-exported bmi{}s. See search_modules() for
+ // details.
+ //
+ struct module_positions
+ {
+ size_t start; // First imported bmi*{}, 0 if none.
+ size_t exported; // First re-exported bmi*{}, 0 if none.
+ size_t copied; // First copied-over bmi*{}, 0 if none.
+ };
+
+ class compile_rule: public rule, virtual common
+ {
+ public:
+ compile_rule (data&&);
+
+ virtual bool
+ match (action, target&, const string&) const override;
+
+ virtual recipe
+ apply (action, target&) const override;
+
+ target_state
+ perform_update (action, const target&) const;
+
+ target_state
+ perform_clean (action, const target&) const;
+
+ private:
+ struct match_data;
+ using environment = small_vector<const char*, 2>;
+
+ void
+ append_lib_options (const scope&,
+ cstrings&,
+ action,
+ const target&,
+ linfo) const;
+
+ void
+ hash_lib_options (const scope&,
+ sha256&,
+ action,
+ const target&,
+ linfo) const;
+
+ // Mapping of include prefixes (e.g., foo in <foo/bar>) for auto-
+ // generated headers to directories where they will be generated.
+ //
+ // We are using a prefix map of directories (dir_path_map) instead of
+ // just a map in order to also cover sub-paths (e.g., <foo/more/bar> if
+ // we continue with the example). Specifically, we need to make sure we
+ // don't treat foobar as a sub-directory of foo.
+ //
+ // The priority is used to decide who should override whom. Lesser
+ // values are considered higher priority. See append_prefixes() for
+ // details.
+ //
+ // @@ The keys should be normalized.
+ //
+ struct prefix_value
+ {
+ dir_path directory;
+ size_t priority;
+ };
+ using prefix_map = butl::dir_path_map<prefix_value>;
+
+ void
+ append_prefixes (prefix_map&, const target&, const variable&) const;
+
+ void
+ append_lib_prefixes (const scope&,
+ prefix_map&,
+ action,
+ target&,
+ linfo) const;
+
+ prefix_map
+ build_prefix_map (const scope&, action, target&, linfo) const;
+
+ // Reverse-lookup target type from extension.
+ //
+ const target_type*
+ map_extension (const scope&, const string&, const string&) const;
+
+ pair<auto_rmfile, bool>
+ extract_headers (action, const scope&, file&, linfo,
+ const file&, const match_data&,
+ depdb&, bool&, timestamp) const;
+
+ pair<translation_unit, string>
+ parse_unit (action, file&, linfo,
+ const file&, auto_rmfile&, const match_data&) const;
+
+ void
+ extract_modules (action, const scope&, file&, linfo,
+ const compile_target_types&,
+ const file&, match_data&,
+ module_info&&, depdb&, bool&) const;
+
+ module_positions
+ search_modules (action, const scope&, file&, linfo,
+ const target_type&,
+ const file&, module_imports&, sha256&) const;
+
+ const target&
+ make_module_sidebuild (action, const scope&, const target&,
+ const target&, const string&) const;
+
+ void
+ append_modules (environment&, cstrings&, strings&,
+ action, const file&, const match_data&) const;
+
+ // Language selection option (for VC) or the value for the -x option.
+ //
+ const char*
+ langopt (const match_data&) const;
+
+ void
+ append_symexport_options (cstrings&, const target&) const;
+
+ private:
+ const string rule_id;
+ };
+ }
+}
+
+#endif // BUILD2_CC_COMPILE_RULE_HXX