aboutsummaryrefslogtreecommitdiff
path: root/build/context.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'build/context.cxx')
-rw-r--r--build/context.cxx391
1 files changed, 0 insertions, 391 deletions
diff --git a/build/context.cxx b/build/context.cxx
deleted file mode 100644
index a4815fb..0000000
--- a/build/context.cxx
+++ /dev/null
@@ -1,391 +0,0 @@
-// file : build/context.cxx -*- C++ -*-
-// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd
-// license : MIT; see accompanying LICENSE file
-
-#include <build/context>
-
-#include <ostream>
-#include <sstream>
-#include <cassert>
-#include <system_error>
-
-#include <build/scope>
-#include <build/target>
-#include <build/rule>
-#include <build/diagnostics>
-
-using namespace std;
-using namespace butl;
-
-namespace build
-{
- dir_path work;
- dir_path home;
-
- string_pool path_pool;
- string_pool extension_pool;
- string_pool project_name_pool;
-
- const meta_operation_info* current_mif;
- const operation_info* current_inner_oif;
- const operation_info* current_outer_oif;
- execution_mode current_mode;
- uint64_t dependency_count;
-
- void
- reset ()
- {
- path_pool.clear ();
- extension_pool.clear ();
- project_name_pool.clear ();
-
- targets.clear ();
- scopes.clear ();
- var_pool.clear ();
-
- // Reset meta/operation tables. Note that the order should match
- // the id constants in <build/operation>.
- //
- meta_operation_table.clear ();
- meta_operation_table.insert ("perform");
- meta_operation_table.insert ("configure");
- meta_operation_table.insert ("disfigure");
- meta_operation_table.insert ("dist");
-
- operation_table.clear ();
- operation_table.insert ("default");
- operation_table.insert ("update");
- operation_table.insert ("clean");
- operation_table.insert ("test");
- operation_table.insert ("install");
-
- // Enter builtin variables.
- //
- {
- auto& v (var_pool);
-
- v.find ("work", dir_path_type);
- v.find ("home", dir_path_type);
-
- v.find ("src_root", dir_path_type);
- v.find ("out_root", dir_path_type);
- v.find ("src_base", dir_path_type);
- v.find ("out_base", dir_path_type);
-
- v.find ("project", string_type);
- v.find ("amalgamation", dir_path_type);
-
- // Shouldn't be typed since the value requires pre-processing.
- //
- v.find ("subprojects", nullptr, '=');
-
- v.find ("extension", string_type);
- }
-
- // Create global scope. For Win32 this is not a "real" root path.
- // On POSIX, however, this is a real path. See the comment in
- // <build/path-map> for details.
- //
- global_scope = scopes.insert (
- dir_path ("/"), nullptr, true, false)->second;
-
- global_scope->assign ("work") = work;
- global_scope->assign ("home") = home;
-
- // Register builtin target types.
- //
- {
- target_type_map& t (global_scope->target_types);
-
- t.insert<file> ();
- t.insert<alias> ();
- t.insert<dir> ();
- t.insert<fsdir> ();
- t.insert<doc> ();
- t.insert<man> ();
- t.insert<man1> ();
- }
-
- // Register builtin rules.
- //
- {
- rule_map& r (global_scope->rules);
-
- r.insert<alias> (perform_id, 0, "alias", alias_rule::instance);
-
- r.insert<fsdir> (perform_update_id, "fsdir", fsdir_rule::instance);
- r.insert<fsdir> (perform_clean_id, "fsdir", fsdir_rule::instance);
-
- r.insert<file> (perform_update_id, "file", file_rule::instance);
- r.insert<file> (perform_clean_id, "file", file_rule::instance);
- }
- }
-
- fs_status<mkdir_status>
- mkdir (const dir_path& d)
- {
- // We don't want to print the command if the directory already
- // exists. This makes the below code a bit ugly.
- //
- mkdir_status ms;
-
- try
- {
- ms = try_mkdir (d);
- }
- catch (const system_error& e)
- {
- if (verb)
- text << "mkdir " << d;
-
- fail << "unable to create directory " << d << ": " << e.what ();
- }
-
- if (ms == mkdir_status::success)
- {
- if (verb)
- text << "mkdir " << d;
- }
-
- return ms;
- }
-
- fs_status<mkdir_status>
- mkdir_p (const dir_path& d)
- {
- // We don't want to print the command if the directory already
- // exists. This makes the below code a bit ugly.
- //
- mkdir_status ms;
-
- try
- {
- ms = try_mkdir_p (d);
- }
- catch (const system_error& e)
- {
- if (verb)
- text << "mkdir -p " << d;
-
- fail << "unable to create directory " << d << ": " << e.what ();
- }
-
- if (ms == mkdir_status::success)
- {
- if (verb)
- text << "mkdir -p " << d;
- }
-
- return ms;
- }
-
- fs_status<butl::rmdir_status>
- rmdir_r (const dir_path& d)
- {
- using namespace butl;
-
- if (work.sub (d)) // Don't try to remove working directory.
- return rmdir_status::not_empty;
-
- if (!dir_exists (d))
- return rmdir_status::not_exist;
-
- if (verb)
- text << "rmdir -r " << d;
-
- try
- {
- butl::rmdir_r (d);
- }
- catch (const std::system_error& e)
- {
- fail << "unable to remove directory " << d << ": " << e.what ();
- }
-
- return rmdir_status::success;
- }
-
- dir_path
- src_out (const dir_path& out, scope& s)
- {
- scope& rs (*s.root_scope ());
- return src_out (out, rs.out_path (), rs.src_path ());
- }
-
- dir_path
- out_src (const dir_path& src, scope& s)
- {
- scope& rs (*s.root_scope ());
- return out_src (src, rs.out_path (), rs.src_path ());
- }
-
- dir_path
- src_out (const dir_path& o,
- const dir_path& out_root, const dir_path& src_root)
- {
- assert (o.sub (out_root));
- return src_root / o.leaf (out_root);
- }
-
- dir_path
- out_src (const dir_path& s,
- const dir_path& out_root, const dir_path& src_root)
- {
- assert (s.sub (src_root));
- return out_root / s.leaf (src_root);
- }
-
- // relative()
- //
- const dir_path* relative_base = &work;
-
- string
- diag_relative (const path& p)
- {
- const path& b (*relative_base);
-
- if (p.absolute ())
- {
- if (p == b)
- return ".";
-
-#ifndef _WIN32
- if (p == home)
- return "~";
-#endif
-
- path rb (relative (p));
-
-#ifndef _WIN32
- if (rb.relative ())
- {
- // See if the original path with the ~/ shortcut is better
- // that the relative to base.
- //
- if (p.sub (home))
- {
- path rh (p.leaf (home));
- if (rb.string ().size () > rh.string ().size () + 2) // 2 for '~/'
- return "~/" + rh.string ();
- }
- }
- else if (rb.sub (home))
- return "~/" + rb.leaf (home).string ();
-#endif
-
- return rb.string ();
- }
-
- return p.string ();
- }
-
- string
- diag_relative (const dir_path& d, bool cur)
- {
- string r (diag_relative (static_cast<const path&> (d)));
-
- // Translate "." to empty.
- //
- if (!cur && d.absolute () && r == ".")
- r.clear ();
-
- // Add trailing '/'.
- //
- if (!r.empty () && !dir_path::traits::is_separator (r.back ()))
- r += '/';
-
- return r;
- }
-
- // diag_do(), etc.
- //
- string
- diag_do (const action&, const target& t)
- {
- const meta_operation_info& m (*current_mif);
- const operation_info& io (*current_inner_oif);
- const operation_info* oo (current_outer_oif);
-
- ostringstream os;
-
- // perform(update(x)) -> "update x"
- // configure(update(x)) -> "configure updating x"
- //
- if (m.name_do.empty ())
- os << io.name_do << ' ';
- else
- {
- os << m.name_do << ' ';
-
- if (!io.name_doing.empty ())
- os << io.name_doing << ' ';
- }
-
- if (oo != nullptr)
- os << "(for " << oo->name << ") ";
-
- os << t;
- return os.str ();
- }
-
- string
- diag_doing (const action&, const target& t)
- {
- const meta_operation_info& m (*current_mif);
- const operation_info& io (*current_inner_oif);
- const operation_info* oo (current_outer_oif);
-
- ostringstream os;
-
- // perform(update(x)) -> "updating x"
- // configure(update(x)) -> "configuring updating x"
- //
- if (!m.name_doing.empty ())
- os << m.name_doing << ' ';
-
- if (!io.name_doing.empty ())
- os << io.name_doing << ' ';
-
- if (oo != nullptr)
- os << "(for " << oo->name << ") ";
-
- os << t;
- return os.str ();
- }
-
- string
- diag_done (const action&, const target& t)
- {
- const meta_operation_info& m (*current_mif);
- const operation_info& io (*current_inner_oif);
- const operation_info* oo (current_outer_oif);
-
- ostringstream os;
-
- // perform(update(x)) -> "x is up to date"
- // configure(update(x)) -> "updating x is configured"
- //
- if (m.name_done.empty ())
- {
- os << t;
-
- if (!io.name_done.empty ())
- os << " " << io.name_done;
-
- if (oo != nullptr)
- os << "(for " << oo->name << ") ";
- }
- else
- {
- if (!io.name_doing.empty ())
- os << io.name_doing << ' ';
-
- if (oo != nullptr)
- os << "(for " << oo->name << ") ";
-
- os << t << " " << m.name_done;
- }
-
- return os.str ();
- }
-}