aboutsummaryrefslogtreecommitdiff
path: root/build2/cc/utility.cxx
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2019-08-24 17:41:30 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2019-08-28 15:01:48 +0300
commit4bdf53837e010073de802070d4e6087410662d3e (patch)
tree2820d3964877d1a7d498833da325aa3d3a699353 /build2/cc/utility.cxx
parentea24f530048cbce0c5335ca3fd3632c8ce34315a (diff)
Move cc build system module to separate library
Diffstat (limited to 'build2/cc/utility.cxx')
-rw-r--r--build2/cc/utility.cxx114
1 files changed, 0 insertions, 114 deletions
diff --git a/build2/cc/utility.cxx b/build2/cc/utility.cxx
deleted file mode 100644
index f17d1b0..0000000
--- a/build2/cc/utility.cxx
+++ /dev/null
@@ -1,114 +0,0 @@
-// file : build2/cc/utility.cxx -*- C++ -*-
-// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
-// license : MIT; see accompanying LICENSE file
-
-#include <build2/cc/utility.hxx>
-
-#include <libbuild2/file.hxx>
-#include <libbuild2/variable.hxx>
-#include <libbuild2/algorithm.hxx> // search()
-
-#include <libbuild2/bin/rule.hxx>
-#include <libbuild2/bin/target.hxx>
-
-using namespace std;
-
-namespace build2
-{
- namespace cc
- {
- using namespace bin;
-
- const dir_path module_dir ("cc");
- const dir_path modules_sidebuild_dir (dir_path (module_dir) /= "modules");
-
- lorder
- link_order (const scope& bs, otype ot)
- {
- // Initialize to suppress 'may be used uninitialized' warning produced
- // by MinGW GCC 5.4.0.
- //
- const char* var (nullptr);
-
- switch (ot)
- {
- case otype::e: var = "bin.exe.lib"; break;
- case otype::a: var = "bin.liba.lib"; break;
- case otype::s: var = "bin.libs.lib"; break;
- }
-
- const auto& v (cast<strings> (bs[var]));
- return v[0] == "shared"
- ? v.size () > 1 && v[1] == "static" ? lorder::s_a : lorder::s
- : v.size () > 1 && v[1] == "shared" ? lorder::a_s : lorder::a;
- }
-
- const target*
- link_member (const bin::libx& x, action a, linfo li, bool exist)
- {
- if (x.is_a<libul> ())
- {
- // For libul{} that is linked to an executable the member choice
- // should be dictated by the members of lib{} this libul{} is
- // "primarily" for. If both are being built, then it seems natural to
- // prefer static over shared since it could be faster (but I am sure
- // someone will probably want this configurable).
- //
- if (li.type == otype::e)
- {
- // Utility libraries are project-local which means the primarily
- // target should be in the same project as us.
- //
- li.type = lib_rule::build_members (x.root_scope ()).a
- ? otype::a
- : otype::s;
- }
-
- const target_type& tt (li.type == otype::a
- ? libua::static_type
- : libus::static_type);
-
- // Called by the compile rule during execute.
- //
- return x.ctx.phase == run_phase::match && !exist
- ? &search (x, tt, x.dir, x.out, x.name)
- : search_existing (x.ctx, tt, x.dir, x.out, x.name);
- }
- else
- {
- assert (!exist);
-
- const lib& l (x.as<lib> ());
-
- // Make sure group members are resolved.
- //
- group_view gv (resolve_members (a, l));
- assert (gv.members != nullptr);
-
- lorder lo (li.order);
-
- bool ls (true);
- switch (lo)
- {
- case lorder::a:
- case lorder::a_s:
- ls = false; // Fall through.
- case lorder::s:
- case lorder::s_a:
- {
- if (ls ? l.s == nullptr : l.a == nullptr)
- {
- if (lo == lorder::a_s || lo == lorder::s_a)
- ls = !ls;
- else
- fail << (ls ? "shared" : "static") << " variant of " << l
- << " is not available";
- }
- }
- }
-
- return ls ? static_cast<const target*> (l.s) : l.a;
- }
- }
- }
-}