blob: 6bc21b96f393be8d92c6896957d411d72af4b3c5 [file] [log] [blame]
Shinichiro Hamaji1d545aa2015-06-23 15:29:13 +09001// Copyright 2015 Google Inc. All rights reserved
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090015#ifndef EVAL_H_
16#define EVAL_H_
17
Shinichiro Hamaji0562c302015-06-19 15:30:49 +090018#include <memory>
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090019#include <unordered_map>
Shinichiro Hamaji7e708012015-07-31 13:07:34 +090020#include <unordered_set>
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090021#include <vector>
22
23#include "loc.h"
Shinichiro Hamaji645cca72015-09-24 17:04:21 +090024#include "stmt.h"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090025#include "string_piece.h"
Shinichiro Hamajie7992752015-06-29 18:38:35 +090026#include "symtab.h"
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090027
28using namespace std;
29
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090030class Makefile;
31class Rule;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090032class Var;
33class Vars;
34
35struct EvalResult {
36 ~EvalResult();
Shinichiro Hamaji0562c302015-06-19 15:30:49 +090037 vector<shared_ptr<Rule>> rules;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090038 Vars* vars;
39 unordered_map<StringPiece, Vars*> rule_vars;
40 // TODO: read_mks
41 unordered_map<StringPiece, bool> exports;
42};
43
44class Evaluator {
45 public:
46 Evaluator(const Vars* vars);
47 ~Evaluator();
48
Shinichiro Hamaji645cca72015-09-24 17:04:21 +090049 void EvalAssign(const AssignStmt* stmt);
50 void EvalRule(const RuleStmt* stmt);
51 void EvalCommand(const CommandStmt* stmt);
52 void EvalIf(const IfStmt* stmt);
53 void EvalInclude(const IncludeStmt* stmt);
54 void EvalExport(const ExportStmt* stmt);
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090055
Shinichiro Hamajie7992752015-06-29 18:38:35 +090056 Var* LookupVar(Symbol name);
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090057 // For target specific variables.
Shinichiro Hamajie7992752015-06-29 18:38:35 +090058 Var* LookupVarInCurrentScope(Symbol name);
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090059
Shinichiro Hamajifb415ad2015-08-14 17:19:34 +090060 string EvalVar(Symbol name);
Shinichiro Hamaji94d6f2a2015-07-05 05:32:25 +090061
Shinichiro Hamaji9619b362015-06-16 16:13:25 +090062 const Loc& loc() const { return loc_; }
Shinichiro Hamaji86e11332015-07-28 15:24:17 +090063 void set_loc(const Loc& loc) { loc_ = loc; }
Shinichiro Hamaji9619b362015-06-16 16:13:25 +090064
Shinichiro Hamajiffc52c32015-06-23 16:51:07 +090065 const vector<shared_ptr<Rule>>& rules() const { return rules_; }
Shinichiro Hamajie7992752015-06-29 18:38:35 +090066 const unordered_map<Symbol, Vars*>& rule_vars() const {
Shinichiro Hamajiffc52c32015-06-23 16:51:07 +090067 return rule_vars_;
68 }
Shinichiro Hamajicf0cd682015-06-18 16:18:13 +090069 Vars* mutable_vars() { return vars_; }
Shinichiro Hamajie7992752015-06-29 18:38:35 +090070 const unordered_map<Symbol, bool>& exports() const { return exports_; }
Shinichiro Hamaji776ca302015-06-06 03:52:48 +090071
Shinichiro Hamaji9619b362015-06-16 16:13:25 +090072 void Error(const string& msg);
73
Shinichiro Hamaji0e74c542015-06-22 16:17:08 +090074 void set_is_bootstrap(bool b) { is_bootstrap_ = b; }
75
Shinichiro Hamajiffc52c32015-06-23 16:51:07 +090076 void set_current_scope(Vars* v) { current_scope_ = v; }
77
Shinichiro Hamajidf1fc8b2015-06-29 15:45:21 +090078 bool avoid_io() const { return avoid_io_; }
79 void set_avoid_io(bool a) { avoid_io_ = a; }
80
Shinichiro Hamaji86e11332015-07-28 15:24:17 +090081 const vector<string>& delayed_output_commands() const {
82 return delayed_output_commands_;
83 }
84 void add_delayed_output_command(const string& c) {
85 delayed_output_commands_.push_back(c);
86 }
87 void clear_delayed_output_commands() {
88 delayed_output_commands_.clear();
89 }
90
Shinichiro Hamaji7e708012015-07-31 13:07:34 +090091 static const unordered_set<Symbol>& used_undefined_vars() {
92 return used_undefined_vars_;
93 }
94
Shinichiro Hamaji28da2372015-11-30 19:03:53 +090095 int eval_depth() const { return eval_depth_; }
96 void IncrementEvalDepth() {
97 eval_depth_++;
98 }
99 void DecrementEvalDepth() {
100 eval_depth_--;
101 }
102
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900103 private:
Shinichiro Hamajie7992752015-06-29 18:38:35 +0900104 Var* EvalRHS(Symbol lhs, Value* rhs, StringPiece orig_rhs, AssignOp op,
Shinichiro Hamaji420f7752015-06-26 04:02:02 +0900105 bool is_override = false);
Shinichiro Hamaji0e3873a2015-07-05 15:48:28 +0900106 void DoInclude(const string& fname);
Shinichiro Hamaji6e6de8d2015-06-18 11:12:58 +0900107
Shinichiro Hamaji7e708012015-07-31 13:07:34 +0900108 Var* LookupVarGlobal(Symbol name);
109
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900110 const Vars* in_vars_;
111 Vars* vars_;
Shinichiro Hamajie7992752015-06-29 18:38:35 +0900112 unordered_map<Symbol, Vars*> rule_vars_;
Shinichiro Hamaji0562c302015-06-19 15:30:49 +0900113 vector<shared_ptr<Rule>> rules_;
Shinichiro Hamajie7992752015-06-29 18:38:35 +0900114 unordered_map<Symbol, bool> exports_;
Shinichiro Hamaji45a0c762015-06-26 06:47:10 +0900115
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900116 Rule* last_rule_;
Shinichiro Hamaji784b9952015-06-23 14:29:32 +0900117 Vars* current_scope_;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900118
119 Loc loc_;
Shinichiro Hamaji0e74c542015-06-22 16:17:08 +0900120 bool is_bootstrap_;
Shinichiro Hamaji86e11332015-07-28 15:24:17 +0900121
Shinichiro Hamajidf1fc8b2015-06-29 15:45:21 +0900122 bool avoid_io_;
Shinichiro Hamaji28da2372015-11-30 19:03:53 +0900123 // This value tracks the nest level of make expressions. For
124 // example, $(YYY) in $(XXX $(YYY)) is evaluated with depth==2.
125 // This will be used to disallow $(shell) in other make constructs.
126 int eval_depth_;
Shinichiro Hamaji86e11332015-07-28 15:24:17 +0900127 // Commands which should run at ninja-time (i.e., info, warning, and
128 // error).
129 vector<string> delayed_output_commands_;
Shinichiro Hamaji7e708012015-07-31 13:07:34 +0900130
131 static unordered_set<Symbol> used_undefined_vars_;
Shinichiro Hamaji776ca302015-06-06 03:52:48 +0900132};
133
134#endif // EVAL_H_