Factor out State struct from ninja_jumble.cc into its header/source files.
authorThiago Farina <tfarina@chromium.org>
Fri, 26 Aug 2011 23:58:28 +0000 (20:58 -0300)
committerThiago Farina <tfarina@chromium.org>
Sat, 3 Sep 2011 18:16:08 +0000 (15:16 -0300)
This was a TODO in src/ninja_jumble.cc. Now this task is completed.

Signed-off-by: Thiago Farina <tfarina@chromium.org>
15 files changed:
configure.py
src/browse.cc
src/build.cc
src/build_log.cc
src/clean.cc
src/graph.cc
src/ninja.cc
src/ninja.h [deleted file]
src/ninja_jumble.cc [deleted file]
src/ninja_test.cc
src/parsers.cc
src/parsers_test.cc
src/state.cc [new file with mode: 0644]
src/state.h [new file with mode: 0644]
src/test.h

index c374f6d1530de00dcc231f74cc18a4a2fe37dc61..8308c6d9fc4df4a12db16fd009384f20f0c3486e 100755 (executable)
@@ -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')
index d51bb44789bf61e70af566188a44aa967564d6c1..bab3f3648e1d563c6364f4c5a717cc3227dd57a9 100644 (file)
 #include "browse.h"
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <unistd.h>
 
 #include "../build/browse_py.h"
-#include "ninja.h"
 
 void RunBrowsePython(State* state, const char* ninja_command,
                      const char* initial_target) {
index 1c8a4fa40d50dd87cb2a29b84bdc1da03f77953d..3b7d5b8fc9765ec14fcce1a69ee1b801e38c5e59 100644 (file)
@@ -14,6 +14,7 @@
 
 #include "build.h"
 
+#include <assert.h>
 #include <stdio.h>
 
 #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"
 
index c3ae1abe55d7a3787c12bf4b67304573cf949e59..b21a755c47abed17ea40917a5c5deb90ed52688b 100644 (file)
 #include <errno.h>
 #include <fcntl.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 
 #include "build.h"
 #include "graph.h"
-#include "ninja.h"
 
 // Implementation details:
 // Each run's log appends to the log file.
index 31641d279a11e58d9cc7c267642a71ed804d0322..16ca5e55b50293fcf8211b9289642570ffb07be6 100644 (file)
@@ -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)
index 5517f17c00258af3956c67753fd560b8698eb566..9b5f10b4837cc16bb4800e648feae0892e274d41 100644 (file)
 
 #include "graph.h"
 
+#include <assert.h>
 #include <stdio.h>
 
 #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) {
index 6bf7fbd93586dca4bf539171792d24bd48de49bc..8f972f3c31f154fbd4381a090fb5111c3f04740e 100644 (file)
@@ -12,8 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "ninja.h"
-
 #include <errno.h>
 #include <stdio.h>
 #include <string.h>
 #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 (file)
index 448a060..0000000
+++ /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 <assert.h>
-
-#include <algorithm>
-#include <queue>
-#include <set>
-#include <string>
-#include <vector>
-
-#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<Node*> RootNodes(string* error);
-  vector<Node*> DefaultNodes(string* error);
-
-  StatCache stat_cache_;
-  /// All the rules used in the graph.
-  map<string, const Rule*> rules_;
-  /// All the edges of the graph.
-  vector<Edge*> edges_;
-  BindingEnv bindings_;
-  vector<Node*> 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 (file)
index faea156..0000000
+++ /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 <errno.h>
-#include <sys/stat.h>
-#include <stdio.h>
-#include <string.h>
-
-#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<string, const Rule*>::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<Node*> State::RootNodes(string* err) {
-  vector<Node*> root_nodes;
-  // Search for nodes with no output.
-  for (vector<Edge*>::iterator e = edges_.begin(); e != edges_.end(); ++e) {
-    for (vector<Node*>::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<Node*> State::DefaultNodes(string* err) {
-  return defaults_.empty() ? RootNodes(err) : defaults_;
-}
index a5ef3ab7510cc3150f76442224994fe33c19dd8d..2bdd08ffe05a97cccf9a8b1fcbb36690ece54cf7 100644 (file)
@@ -12,8 +12,6 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-#include "ninja.h"
-
 #ifdef _WIN32
 #include <io.h>
 #include <windows.h>
index 420a6cfd1ce985c509e8fe7453911d1468d0dcf6..7f587a6043f69e4f812f23337d270fce2351becb 100644 (file)
@@ -20,7 +20,7 @@
 #include <string.h>
 
 #include "graph.h"
-#include "ninja.h"
+#include "state.h"
 #include "util.h"
 
 string Token::AsString() const {
index b5d253f2249fb99021ff7266334860b917a2c6bc..1ac5990498da2cbccefe44e18455baea8e0acce2 100644 (file)
@@ -17,7 +17,7 @@
 #include <gtest/gtest.h>
 
 #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 (file)
index 0000000..e1fe675
--- /dev/null
@@ -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 <assert.h>
+
+#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<string, const Rule*>::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<Node*> State::RootNodes(string* err) {
+  vector<Node*> root_nodes;
+  // Search for nodes with no output.
+  for (vector<Edge*>::iterator e = edges_.begin(); e != edges_.end(); ++e) {
+    for (vector<Node*>::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<Node*> State::DefaultNodes(string* err) {
+  return defaults_.empty() ? RootNodes(err) : defaults_;
+}
diff --git a/src/state.h b/src/state.h
new file mode 100644 (file)
index 0000000..ceb7c05
--- /dev/null
@@ -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 <map>
+#include <string>
+#include <vector>
+
+#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<Node*> RootNodes(string* error);
+  vector<Node*> DefaultNodes(string* error);
+
+  StatCache* stat_cache() { return &stat_cache_; }
+
+  StatCache stat_cache_;
+
+  /// All the rules used in the graph.
+  map<string, const Rule*> rules_;
+
+  /// All the edges of the graph.
+  vector<Edge*> edges_;
+
+  BindingEnv bindings_;
+  vector<Node*> defaults_;
+  struct BuildLog* build_log_;
+};
+
+#endif  // NINJA_STATE_H_
index 3436ef1fbeda7d6f410837e67aa04b0e210c8629..c27e051a547c954c2f1fcb63bca6a0a29bc003f4 100644 (file)
@@ -18,7 +18,7 @@
 #include <gtest/gtest.h>
 
 #include "disk_interface.h"
-#include "ninja.h"
+#include "state.h"
 
 // Support utilites for tests.