summaryrefslogtreecommitdiffstats
path: root/src/ninja.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/ninja.cc')
-rw-r--r--src/ninja.cc19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/ninja.cc b/src/ninja.cc
index 839e9e6..ce1beda 100644
--- a/src/ninja.cc
+++ b/src/ninja.cc
@@ -153,6 +153,10 @@ struct NinjaMain : public BuildLogUser {
/// @return true if the manifest was rebuilt.
bool RebuildManifest(const char* input_file, string* err, Status* status);
+ /// For each edge, lookup in build log how long it took last time,
+ /// and record that in the edge itself. It will be used for ETA predicton.
+ void ParsePreviousElapsedTimes();
+
/// Build the targets listed on the command line.
/// @return an exit code.
int RunBuild(int argc, char** argv, Status* status);
@@ -286,6 +290,19 @@ bool NinjaMain::RebuildManifest(const char* input_file, string* err,
return true;
}
+void NinjaMain::ParsePreviousElapsedTimes() {
+ for (Edge* edge : state_.edges_) {
+ for (Node* out : edge->outputs_) {
+ BuildLog::LogEntry* log_entry = build_log_.LookupByOutput(out->path());
+ if (!log_entry)
+ continue; // Maybe we'll have log entry for next output of this edge?
+ edge->prev_elapsed_time_millis =
+ log_entry->end_time - log_entry->start_time;
+ break; // Onto next edge.
+ }
+ }
+}
+
Node* NinjaMain::CollectTarget(const char* cpath, string* err) {
string path = cpath;
if (path.empty()) {
@@ -1586,6 +1603,8 @@ NORETURN void real_main(int argc, char** argv) {
exit(1);
}
+ ninja.ParsePreviousElapsedTimes();
+
int result = ninja.RunBuild(argc, argv, status);
if (g_metrics)
ninja.DumpMetrics();