aboutsummaryrefslogtreecommitdiff
path: root/build/bin/rule.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'build/bin/rule.cxx')
-rw-r--r--build/bin/rule.cxx145
1 files changed, 0 insertions, 145 deletions
diff --git a/build/bin/rule.cxx b/build/bin/rule.cxx
deleted file mode 100644
index 21db183..0000000
--- a/build/bin/rule.cxx
+++ /dev/null
@@ -1,145 +0,0 @@
-// file : build/bin/rule.cxx -*- C++ -*-
-// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd
-// license : MIT; see accompanying LICENSE file
-
-#include <build/bin/rule>
-
-#include <build/scope>
-#include <build/target>
-#include <build/algorithm>
-#include <build/diagnostics>
-
-#include <build/bin/target>
-
-using namespace std;
-
-namespace build
-{
- namespace bin
- {
- // obj
- //
- match_result obj_rule::
- match (action a, target& t, const std::string&) const
- {
- fail << diag_doing (a, t) << " target group" <<
- info << "explicitly select either obja{} or objso{} member";
-
- return nullptr;
- }
-
- recipe obj_rule::
- apply (action, target&, const match_result&) const {return empty_recipe;}
-
- // lib
- //
- // The whole logic is pretty much as if we had our two group
- // members as our prerequisites.
- //
- match_result lib_rule::
- match (action a, target& xt, const std::string&) const
- {
- lib& t (static_cast<lib&> (xt));
-
- // @@ We have to re-query it on each match_only()!
-
- // Get the library type to build. If not set for a target, this
- // should be configured at the project scope by init_lib().
- //
- const string& type (as<string> (*t["bin.lib"]));
-
- bool ar (type == "static" || type == "both");
- bool so (type == "shared" || type == "both");
-
- if (!ar && !so)
- fail << "unknown library type: " << type <<
- info << "'static', 'shared', or 'both' expected";
-
- // Search and pre-match the members. The pre-match here is part
- // of the "library meta-information protocol" that could be used
- // by the module that actually builds the members. The idea is
- // that pre-matching members may populate our prerequisite_targets
- // with prerequisite libraries from which others can extract the
- // meta-information about the library, such as the options to use
- // when linking it, etc.
- //
- if (ar)
- {
- if (t.a == nullptr)
- t.a = &search<liba> (t.dir, t.name, t.ext, nullptr);
-
- match_only (a, *t.a);
- }
-
- if (so)
- {
- if (t.so == nullptr)
- t.so = &search<libso> (t.dir, t.name, t.ext, nullptr);
-
- match_only (a, *t.so);
- }
-
- match_result mr (t, &type);
-
- // If there is an outer operation, indicate that we match
- // unconditionally so that we don't override ourselves.
- //
- if (a.outer_operation () != 0)
- mr.recipe_action = action (a.meta_operation (), a.operation ());
-
- return mr;
- }
-
- recipe lib_rule::
- apply (action a, target& xt, const match_result& mr) const
- {
- lib& t (static_cast<lib&> (xt));
-
- const string& type (*static_cast<const string*> (mr.cpvalue));
-
- bool ar (type == "static" || type == "both");
- bool so (type == "shared" || type == "both");
-
- // Now we do full match.
- //
- if (ar)
- build::match (a, *t.a);
-
- if (so)
- build::match (a, *t.so);
-
- return &perform;
- }
-
- target_state lib_rule::
- perform (action a, target& xt)
- {
- lib& t (static_cast<lib&> (xt));
-
- //@@ Not cool we have to do this again. Looks like we need
- // some kind of a cache vs resolved pointer, like in
- // prerequisite vs prerequisite_target.
- //
- //
- const string& type (as<string> (*t["bin.lib"]));
- bool ar (type == "static" || type == "both");
- bool so (type == "shared" || type == "both");
-
- target* m1 (ar ? t.a : nullptr);
- target* m2 (so ? t.so : nullptr);
-
- if (current_mode == execution_mode::last)
- swap (m1, m2);
-
- target_state r (target_state::unchanged);
-
- if (m1 != nullptr)
- r |= execute (a, *m1);
-
- if (m2 != nullptr)
- r |= execute (a, *m2);
-
- return r;
- }
- }
-}