// file : build2/context -*- C++ -*- // copyright : Copyright (c) 2014-2016 Code Synthesis Ltd // license : MIT; see accompanying LICENSE file #ifndef BUILD2_CONTEXT #define BUILD2_CONTEXT #include #include #include #include #include namespace build2 { class file; extern string_pool extension_pool; extern string_pool project_name_pool; // Current action (meta/operation). // // The names unlike info are available during boot but may not yet be // lifted. The name is always for an outer operation (or meta operation // that hasn't been recognized as such yet). // extern const string* current_mname; extern const string* current_oname; 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; inline void set_current_mif (const meta_operation_info& mif) { current_mif = &mif; current_mname = &mif.name; } inline void set_current_oif (const operation_info& inner_oif, const operation_info* outer_oif = nullptr) { current_inner_oif = &inner_oif; current_outer_oif = outer_oif; current_oname = &(outer_oif == nullptr ? inner_oif : *outer_oif).name; current_mode = inner_oif.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 uint64_t dependency_count; // Project-wide (as opposed to global) variable overrides. Returned by // reset(). // struct variable_override { const variable& var; // Original variable. const variable& ovr; // Override variable. value val; }; using variable_overrides = vector; // Variable override value cache. // extern variable_override_cache var_override_cache; // Reset the build state. In particular, this removes all the targets, // scopes, and variables. // variable_overrides reset (const strings& cmd_vars); // Return the project name or empty string if unnamed. // inline const string& project (scope& root) { auto l (root["project"]); return l ? cast (l) : empty_string; } // 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& root); 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& root); dir_path out_src (const dir_path& src, const dir_path& out_root, const dir_path& src_root); // Action phrases, e.g., "configure update exe{foo}", "updating exe{foo}", // and "updating exe{foo} is configured". Use like this: // // info << "while " << diag_doing (a, t); // class target; struct diag_phrase { const action& a; const target& t; void (*f) (ostream&, const action&, const target&); }; inline ostream& operator<< (ostream& os, const diag_phrase& p) { p.f (os, p.a, p.t); return os; } void diag_do (ostream&, const action&, const target&); inline diag_phrase diag_do (const action& a, const target& t) { return diag_phrase {a, t, &diag_do}; } void diag_doing (ostream&, const action&, const target&); inline diag_phrase diag_doing (const action& a, const target& t) { return diag_phrase {a, t, &diag_doing}; } void diag_done (ostream&, const action&, const target&); inline diag_phrase diag_done (const action& a, const target& t) { return diag_phrase {a, t, &diag_done}; } } #endif // BUILD2_CONTEXT