From 3bf1d4b3f0528157caca622595de53e40b2849a0 Mon Sep 17 00:00:00 2001 From: Thiago Farina Date: Fri, 26 Aug 2011 20:58:28 -0300 Subject: Factor out State struct from ninja_jumble.cc into its header/source files. This was a TODO in src/ninja_jumble.cc. Now this task is completed. Signed-off-by: Thiago Farina --- configure.py | 3 +- src/browse.cc | 2 +- src/build.cc | 3 +- src/build_log.cc | 2 +- src/clean.cc | 2 +- src/graph.cc | 3 +- src/ninja.cc | 5 +-- src/ninja.h | 67 ------------------------------ src/ninja_jumble.cc | 115 ---------------------------------------------------- src/ninja_test.cc | 2 - src/parsers.cc | 2 +- src/parsers_test.cc | 2 +- src/state.cc | 108 ++++++++++++++++++++++++++++++++++++++++++++++++ src/state.h | 68 +++++++++++++++++++++++++++++++ src/test.h | 2 +- 15 files changed, 189 insertions(+), 197 deletions(-) delete mode 100644 src/ninja.h delete mode 100644 src/ninja_jumble.cc create mode 100644 src/state.cc create mode 100644 src/state.h diff --git a/configure.py b/configure.py index c374f6d..8308c6d 100755 --- a/configure.py +++ b/configure.py @@ -131,8 +131,7 @@ if platform not in ('mingw'): n.comment('Core source files all build into ninja library.') for name in ['build', 'build_log', 'clean', 'eval_env', 'graph', 'graphviz', - 'parsers', 'util', 'stat_cache', - 'ninja_jumble', 'disk_interface']: + 'parsers', 'util', 'stat_cache', 'disk_interface', 'state']: objs += cxx(name) if platform == 'mingw': objs += cxx('subprocess-win32') diff --git a/src/browse.cc b/src/browse.cc index d51bb44..bab3f36 100644 --- a/src/browse.cc +++ b/src/browse.cc @@ -15,10 +15,10 @@ #include "browse.h" #include +#include #include #include "../build/browse_py.h" -#include "ninja.h" void RunBrowsePython(State* state, const char* ninja_command, const char* initial_target) { diff --git a/src/build.cc b/src/build.cc index 1c8a4fa..3b7d5b8 100644 --- a/src/build.cc +++ b/src/build.cc @@ -14,6 +14,7 @@ #include "build.h" +#include #include #ifdef _WIN32 @@ -27,7 +28,7 @@ #include "build_log.h" #include "disk_interface.h" #include "graph.h" -#include "ninja.h" +#include "state.h" #include "subprocess.h" #include "util.h" diff --git a/src/build_log.cc b/src/build_log.cc index c3ae1ab..b21a755 100644 --- a/src/build_log.cc +++ b/src/build_log.cc @@ -17,11 +17,11 @@ #include #include #include +#include #include #include "build.h" #include "graph.h" -#include "ninja.h" // Implementation details: // Each run's log appends to the log file. diff --git a/src/clean.cc b/src/clean.cc index 31641d2..16ca5e5 100644 --- a/src/clean.cc +++ b/src/clean.cc @@ -23,7 +23,7 @@ #include "build.h" #include "disk_interface.h" #include "graph.h" -#include "ninja.h" +#include "state.h" #include "util.h" Cleaner::Cleaner(State* state, const BuildConfig& config) diff --git a/src/graph.cc b/src/graph.cc index 5517f17..9b5f10b 100644 --- a/src/graph.cc +++ b/src/graph.cc @@ -14,12 +14,13 @@ #include "graph.h" +#include #include #include "build_log.h" #include "disk_interface.h" -#include "ninja.h" #include "parsers.h" +#include "state.h" #include "util.h" bool FileStat::Stat(DiskInterface* disk_interface) { diff --git a/src/ninja.cc b/src/ninja.cc index 6bf7fbd..8f972f3 100644 --- a/src/ninja.cc +++ b/src/ninja.cc @@ -12,8 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "ninja.h" - #include #include #include @@ -37,11 +35,12 @@ #include "browse.h" #include "build.h" #include "build_log.h" +#include "clean.h" #include "graph.h" #include "graphviz.h" #include "parsers.h" +#include "state.h" #include "util.h" -#include "clean.h" namespace { diff --git a/src/ninja.h b/src/ninja.h deleted file mode 100644 index 448a060..0000000 --- a/src/ninja.h +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2011 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#ifndef NINJA_NINJA_H_ -#define NINJA_NINJA_H_ - -#include - -#include -#include -#include -#include -#include - -#include "eval_env.h" -#include "stat_cache.h" - -using namespace std; - -struct Edge; -struct FileStat; -struct Node; -struct Rule; - -/// Global state (file status, loaded rules) for a single run. -struct State { - State(); - - StatCache* stat_cache() { return &stat_cache_; } - - void AddRule(const Rule* rule); - const Rule* LookupRule(const string& rule_name); - Edge* AddEdge(const Rule* rule); - Node* GetNode(const string& path); - Node* LookupNode(const string& path); - void AddIn(Edge* edge, const string& path); - void AddOut(Edge* edge, const string& path); - bool AddDefault(const string& path, string* error); - /// @return the root node(s) of the graph. (Root nodes have no output edges). - /// @param error where to write the error message if somethings went wrong. - vector RootNodes(string* error); - vector DefaultNodes(string* error); - - StatCache stat_cache_; - /// All the rules used in the graph. - map rules_; - /// All the edges of the graph. - vector edges_; - BindingEnv bindings_; - vector defaults_; - struct BuildLog* build_log_; - - static const Rule kPhonyRule; -}; - -#endif // NINJA_NINJA_H_ diff --git a/src/ninja_jumble.cc b/src/ninja_jumble.cc deleted file mode 100644 index faea156..0000000 --- a/src/ninja_jumble.cc +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright 2011 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// This file is all the code that used to be in one file. -// TODO: split into modules, delete this file. - -#include "ninja.h" - -#include -#include -#include -#include - -#include "build_log.h" -#include "graph.h" -#include "util.h" - -const Rule State::kPhonyRule("phony"); - -State::State() : build_log_(NULL) { - AddRule(&kPhonyRule); -} - -const Rule* State::LookupRule(const string& rule_name) { - map::iterator i = rules_.find(rule_name); - if (i == rules_.end()) - return NULL; - return i->second; -} - -void State::AddRule(const Rule* rule) { - assert(LookupRule(rule->name_) == NULL); - rules_[rule->name_] = rule; -} - -Edge* State::AddEdge(const Rule* rule) { - Edge* edge = new Edge(); - edge->rule_ = rule; - edge->env_ = &bindings_; - edges_.push_back(edge); - return edge; -} - -Node* State::LookupNode(const string& path) { - FileStat* file = stat_cache_.GetFile(path); - if (!file->node_) - return NULL; - return file->node_; -} - -Node* State::GetNode(const string& path) { - FileStat* file = stat_cache_.GetFile(path); - if (!file->node_) - file->node_ = new Node(file); - return file->node_; -} - -void State::AddIn(Edge* edge, const string& path) { - Node* node = GetNode(path); - edge->inputs_.push_back(node); - node->out_edges_.push_back(edge); -} - -void State::AddOut(Edge* edge, const string& path) { - Node* node = GetNode(path); - edge->outputs_.push_back(node); - if (node->in_edge_) { - Warning("multiple rules generate %s. " - "build will not be correct; continuing anyway", path.c_str()); - } - node->in_edge_ = edge; -} - -bool State::AddDefault(const string& path, string* err) { - Node* node = LookupNode(path); - if (!node) { - *err = "unknown target '" + path + "'"; - return false; - } - defaults_.push_back(node); - return true; -} - -vector State::RootNodes(string* err) { - vector root_nodes; - // Search for nodes with no output. - for (vector::iterator e = edges_.begin(); e != edges_.end(); ++e) { - for (vector::iterator out = (*e)->outputs_.begin(); - out != (*e)->outputs_.end(); ++out) { - if ((*out)->out_edges_.empty()) - root_nodes.push_back(*out); - } - } - - if (!edges_.empty() && root_nodes.empty()) - *err = "could not determine root nodes of build graph"; - - assert(edges_.empty() || !root_nodes.empty()); - return root_nodes; -} - -vector State::DefaultNodes(string* err) { - return defaults_.empty() ? RootNodes(err) : defaults_; -} diff --git a/src/ninja_test.cc b/src/ninja_test.cc index a5ef3ab..2bdd08f 100644 --- a/src/ninja_test.cc +++ b/src/ninja_test.cc @@ -12,8 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -#include "ninja.h" - #ifdef _WIN32 #include #include diff --git a/src/parsers.cc b/src/parsers.cc index 420a6cf..7f587a6 100644 --- a/src/parsers.cc +++ b/src/parsers.cc @@ -20,7 +20,7 @@ #include #include "graph.h" -#include "ninja.h" +#include "state.h" #include "util.h" string Token::AsString() const { diff --git a/src/parsers_test.cc b/src/parsers_test.cc index b5d253f..1ac5990 100644 --- a/src/parsers_test.cc +++ b/src/parsers_test.cc @@ -17,7 +17,7 @@ #include #include "graph.h" -#include "ninja.h" +#include "state.h" struct ParserTest : public testing::Test, public ManifestParser::FileReader { diff --git a/src/state.cc b/src/state.cc new file mode 100644 index 0000000..e1fe675 --- /dev/null +++ b/src/state.cc @@ -0,0 +1,108 @@ +// Copyright 2011 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "state.h" + +#include + +#include "graph.h" +#include "util.h" + +const Rule State::kPhonyRule("phony"); + +State::State() : build_log_(NULL) { + AddRule(&kPhonyRule); +} + +void State::AddRule(const Rule* rule) { + assert(LookupRule(rule->name_) == NULL); + rules_[rule->name_] = rule; +} + +const Rule* State::LookupRule(const string& rule_name) { + map::iterator i = rules_.find(rule_name); + if (i == rules_.end()) + return NULL; + return i->second; +} + +Edge* State::AddEdge(const Rule* rule) { + Edge* edge = new Edge(); + edge->rule_ = rule; + edge->env_ = &bindings_; + edges_.push_back(edge); + return edge; +} + +Node* State::GetNode(const string& path) { + FileStat* file = stat_cache_.GetFile(path); + if (!file->node_) + file->node_ = new Node(file); + return file->node_; +} + +Node* State::LookupNode(const string& path) { + FileStat* file = stat_cache_.GetFile(path); + if (!file->node_) + return NULL; + return file->node_; +} + +void State::AddIn(Edge* edge, const string& path) { + Node* node = GetNode(path); + edge->inputs_.push_back(node); + node->out_edges_.push_back(edge); +} + +void State::AddOut(Edge* edge, const string& path) { + Node* node = GetNode(path); + edge->outputs_.push_back(node); + if (node->in_edge_) { + Warning("multiple rules generate %s. " + "build will not be correct; continuing anyway", path.c_str()); + } + node->in_edge_ = edge; +} + +bool State::AddDefault(const string& path, string* err) { + Node* node = LookupNode(path); + if (!node) { + *err = "unknown target '" + path + "'"; + return false; + } + defaults_.push_back(node); + return true; +} + +vector State::RootNodes(string* err) { + vector root_nodes; + // Search for nodes with no output. + for (vector::iterator e = edges_.begin(); e != edges_.end(); ++e) { + for (vector::iterator out = (*e)->outputs_.begin(); + out != (*e)->outputs_.end(); ++out) { + if ((*out)->out_edges_.empty()) + root_nodes.push_back(*out); + } + } + + if (!edges_.empty() && root_nodes.empty()) + *err = "could not determine root nodes of build graph"; + + assert(edges_.empty() || !root_nodes.empty()); + return root_nodes; +} + +vector State::DefaultNodes(string* err) { + return defaults_.empty() ? RootNodes(err) : defaults_; +} diff --git a/src/state.h b/src/state.h new file mode 100644 index 0000000..ceb7c05 --- /dev/null +++ b/src/state.h @@ -0,0 +1,68 @@ +// Copyright 2011 Google Inc. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef NINJA_STATE_H_ +#define NINJA_STATE_H_ +#pragma once + +#include +#include +#include + +#include "eval_env.h" +#include "stat_cache.h" + +using namespace std; + +struct BuildLog; +struct Edge; +struct Node; +struct Rule; + +/// Global state (file status, loaded rules) for a single run. +struct State { + static const Rule kPhonyRule; + + State(); + + void AddRule(const Rule* rule); + const Rule* LookupRule(const string& rule_name); + Edge* AddEdge(const Rule* rule); + Node* GetNode(const string& path); + Node* LookupNode(const string& path); + void AddIn(Edge* edge, const string& path); + void AddOut(Edge* edge, const string& path); + bool AddDefault(const string& path, string* error); + + /// @return the root node(s) of the graph. (Root nodes have no output edges). + /// @param error where to write the error message if somethings went wrong. + vector RootNodes(string* error); + vector DefaultNodes(string* error); + + StatCache* stat_cache() { return &stat_cache_; } + + StatCache stat_cache_; + + /// All the rules used in the graph. + map rules_; + + /// All the edges of the graph. + vector edges_; + + BindingEnv bindings_; + vector defaults_; + struct BuildLog* build_log_; +}; + +#endif // NINJA_STATE_H_ diff --git a/src/test.h b/src/test.h index 3436ef1..c27e051 100644 --- a/src/test.h +++ b/src/test.h @@ -18,7 +18,7 @@ #include #include "disk_interface.h" -#include "ninja.h" +#include "state.h" // Support utilites for tests. -- cgit v0.12