diff options
Diffstat (limited to 'libbuild2/build/script/script.hxx')
-rw-r--r-- | libbuild2/build/script/script.hxx | 89 |
1 files changed, 72 insertions, 17 deletions
diff --git a/libbuild2/build/script/script.hxx b/libbuild2/build/script/script.hxx index f4d70ac..08f1bf4 100644 --- a/libbuild2/build/script/script.hxx +++ b/libbuild2/build/script/script.hxx @@ -20,12 +20,22 @@ namespace build2 namespace script { using build2::script::line; - using build2::script::lines; using build2::script::line_type; + using build2::script::lines; using build2::script::redirect; using build2::script::redirect_type; + using build2::script::command; using build2::script::expr_term; using build2::script::command_expr; + using build2::script::iteration_index; + using build2::script::deadline; + using build2::script::timeout; + using build2::script::pipe_command; + using build2::script::command_function; + + // Forward declarations. + // + class default_runner; // Notes: // @@ -38,12 +48,11 @@ namespace build2 class script { public: - using lines_type = build::script::lines; - // Note that the variables are not pre-entered into a pool during the // parsing phase, so the line variable pointers are NULL. // - lines_type lines; + lines body; + bool body_temp_dir = false; // True if the body references $~. // Referenced ordinary (non-special) variables. // @@ -57,22 +66,25 @@ namespace build2 // small_vector<string, 2> vars; // 2 for command and options. - // True if script references the $~ special variable. - // - bool temp_dir = false; - // Command name for low-verbosity diagnostics and custom low-verbosity - // diagnostics line. Note: cannot be both (see the script parser for + // diagnostics line, potentially preceded with the variable + // assignments. Note: cannot be both (see the script parser for // details). // optional<string> diag_name; - optional<line> diag_line; + lines diag_preamble; + bool diag_preamble_temp_dir = false; // True if refs $~. // The script's custom dependency change tracking lines (see the // script parser for details). // - bool depdb_clear; - lines_type depdb_lines; + bool depdb_clear; + bool depdb_value; // String or hash. + optional<size_t> depdb_dyndep; // Pos of first dyndep. + bool depdb_dyndep_byproduct = false; // dyndep --byproduct + bool depdb_dyndep_dyn_target = false;// dyndep --dyn-target + lines depdb_preamble; // Note include vars. + bool depdb_preamble_temp_dir = false;// True if refs $~. location start_loc; location end_loc; @@ -81,9 +93,25 @@ namespace build2 class environment: public build2::script::environment { public: + using scope_type = build2::scope; using target_type = build2::target; - environment (action, const target_type&, bool temp_dir); + environment (action, + const target_type&, + const scope_type&, + bool temp_dir, + const optional<timestamp>& deadline = nullopt); + + // (Re)set special $< and $> variables. + // + void + set_special_variables (action); + + // Create the temporary directory (if it doesn't exist yet) and set + // the $~ special variable to its path. + // + void + set_temp_dir_variable (); environment (environment&&) = delete; environment (const environment&) = delete; @@ -91,14 +119,15 @@ namespace build2 environment& operator= (const environment&) = delete; public: - // Primary target this environment is for. + // Primary target this environment is for and its base scope; // const target_type& target; + const scope_type& scope; - // Script-local variable pool and map. + // Script-private variable pool and map. // // Note that it may be tempting to reuse the rule-specific variables - // for this but they should no be modified during execution (i.e., + // for this but they should not be modified during execution (i.e., // they are for intra-rule communication; perhaps we could have a // special builtin that sets such variables during match). // @@ -108,6 +137,9 @@ namespace build2 variable_pool var_pool; variable_map vars; + const variable& var_ts; // $> + const variable& var_ps; // $< + // Temporary directory for the script run. // // Currently this directory is removed regardless of the script @@ -125,12 +157,35 @@ namespace build2 // auto_rmdir temp_dir; + // The whole script and the remaining script fragment execution + // deadlines (the latter is set by the timeout builtin). + // + optional<deadline> script_deadline; + optional<deadline> fragment_deadline; + + // Index of the next script line to be executed. Used and incremented + // by the parser's execute_depdb_preamble() and execute_body() + // function calls to produce special file names, etc. + // + size_t exec_line = 1; + virtual void - set_variable (string&& name, + set_variable (string name, names&&, const string& attrs, const location&) override; + // Parse the specified in seconds timeout and set the remaining script + // fragment execution deadline. Reset it to nullopt on zero. + // + virtual void + set_timeout (const string&, bool success, const location&) override; + + // Return the nearest of the script and fragment execution deadlines. + // + virtual optional<deadline> + effective_deadline () override; + virtual void create_temp_dir () override; |