From 9fb791e9fad6c63fc1dac49f4d05ae63b8a3db9b Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 5 Jan 2016 11:55:15 +0200 Subject: Rename build directory/namespace to build2 --- build2/context | 165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 build2/context (limited to 'build2/context') diff --git a/build2/context b/build2/context new file mode 100644 index 0000000..22d4b52 --- /dev/null +++ b/build2/context @@ -0,0 +1,165 @@ +// file : build2/context -*- C++ -*- +// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#ifndef BUILD2_CONTEXT +#define BUILD2_CONTEXT + +#include +#include +#include // uint64_t + +#include + +#include +#include +#include + +namespace build2 +{ + class scope; + class file; + + extern dir_path work; + extern dir_path home; + + extern string_pool path_pool; + extern string_pool extension_pool; + extern string_pool project_name_pool; + + // Current action (meta/operation). + // + extern const meta_operation_info* current_mif; + extern const operation_info* current_inner_oif; + extern const operation_info* current_outer_oif; + + extern execution_mode current_mode; + + // Total number of dependency relationships in the current action. + // Together with the target::dependents count it is incremented + // during the rule search & match phase and is decremented during + // execution with the expectation of it reaching 0. Used as a sanity + // check. + // + extern std::uint64_t dependency_count; + + // Reset the dependency state. In particular, this removes all the + // targets, scopes, and variable names. + // + void + reset (); + + // The dual interface wrapper for the {mk,rm}{file,dir}() functions + // below that allows you to use it as a true/false return or a more + // detailed enum from + // + template + struct fs_status + { + T v; + fs_status (T v): v (v) {}; + operator T () const {return v;} + explicit operator bool () const {return v == T::success;} + }; + + // Create the directory and print the standard diagnostics. Note that + // this implementation is not suitable if it is expected that the + // directory will exist in the majority of case and performance is + // important. See the fsdir{} rule for details. + // + fs_status + mkdir (const dir_path&); + + fs_status + mkdir_p (const dir_path&); + + // Remove the file and print the standard diagnostics. The second + // argument is only used in diagnostics, to print the target name. + // Passing the path for target will result in the relative path + // being printed. + // + template + fs_status + rmfile (const path&, const T& target); + + inline fs_status + rmfile (const path& f) {return rmfile (f, f);} + + // Similar to rmfile() but for directories. + // + template + fs_status + rmdir (const dir_path&, const T& target); + + inline fs_status + rmdir (const dir_path& d) {return rmdir (d, d);} + + // Note that this function returns not_empty if we try to remove + // a working directory. + // + fs_status + rmdir_r (const dir_path&); + + // Return the src/out directory corresponding to the given out/src. The + // passed directory should be a sub-directory of out/src_root. + // + dir_path + src_out (const dir_path& out, scope&); + + dir_path + src_out (const dir_path& out, + const dir_path& out_root, const dir_path& src_root); + + dir_path + out_src (const dir_path& src, scope&); + + dir_path + out_src (const dir_path& src, + const dir_path& out_root, const dir_path& src_root); + + // If possible and beneficial, translate an absolute, normalized path + // into relative to the relative_base directory, which is normally + // work. Note that if the passed path is the same as relative_base, + // then this function returns empty path. + // + template + basic_path + relative (const basic_path&); + + // By default this points to work. Setting this to something else + // should only be done in tightly controlled, non-parallel + // situations (see dump). If base is empty, then relative() + // returns the original path. + // + extern const dir_path* relative_base; + + // In addition to calling relative(), this function also uses shorter + // notations such as '~/'. + // + std::string + diag_relative (const path&); + + // As above but also adds trailing '/'. If the path is the same as + // base, returns "./" if current is true and empty string otherwise. + // + std::string + diag_relative (const dir_path&, bool current = true); + + // Action phrases, e.g., "configure update exe{foo}", "updating exe{foo}", + // and "updating exe{foo} is configured". + // + class target; + + std::string + diag_do (const action&, const target&); + + std::string + diag_doing (const action&, const target&); + + std::string + diag_done (const action&, const target&); +} + +#include + +#endif // BUILD2_CONTEXT -- cgit v1.1