From 33deebea99048bd8b4019c0363b21f2c24267490 Mon Sep 17 00:00:00 2001 From: Martin Kinkelin Date: Sat, 29 Jul 2023 20:24:48 +0200 Subject: [PATCH] Symmetry: Make critical-path scheduler opt-in via --cp switch --- src/build.cc | 3 ++- src/build.h | 6 ++++-- src/ninja.cc | 8 +++++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/build.cc b/src/build.cc index 9c0dbc2d7e..b7e93fc845 100644 --- a/src/build.cc +++ b/src/build.cc @@ -795,7 +795,8 @@ bool Builder::AlreadyUpToDate() const { bool Builder::Build(string* err) { assert(!AlreadyUpToDate()); - plan_.PrepareQueue(scan_.build_log()); + plan_.PrepareQueue(config_.enable_critical_path_scheduler ? scan_.build_log() + : NULL); status_->PlanHasTotalEdges(plan_.command_edge_count()); int pending_commands = 0; diff --git a/src/build.h b/src/build.h index 7719d9a9a4..0cee9193b0 100644 --- a/src/build.h +++ b/src/build.h @@ -165,8 +165,9 @@ struct CommandRunner { /// Options (e.g. verbosity, parallelism) passed to a build. struct BuildConfig { - BuildConfig() : verbosity(NORMAL), dry_run(false), parallelism(1), - failures_allowed(1), max_load_average(-0.0f) {} + BuildConfig() + : verbosity(NORMAL), dry_run(false), parallelism(1), failures_allowed(1), + max_load_average(-0.0f), enable_critical_path_scheduler(false) {} enum Verbosity { QUIET, // No output -- used when testing. @@ -182,6 +183,7 @@ struct BuildConfig { /// means that we do not have any limit. double max_load_average; DepfileParserOptions depfile_parser_options; + bool enable_critical_path_scheduler; }; /// Builder wraps the build process: starting commands, updating status. diff --git a/src/ninja.cc b/src/ninja.cc index 2b71eb170f..d8445565ff 100644 --- a/src/ninja.cc +++ b/src/ninja.cc @@ -222,6 +222,8 @@ void Usage(const BuildConfig& config) { " --version print ninja version (\"%s\")\n" " -v, --verbose show all command lines while building\n" " --quiet don't show progress status, just command output\n" +" --cp enable critical-path scheduler based on previous build times\n" +" (schedule slowest targets first; may require huge peak RAM!)\n" "\n" " -C DIR change to DIR before doing anything else\n" " -f FILE specify input build file [default=build.ninja]\n" @@ -1417,12 +1419,13 @@ int ReadFlags(int* argc, char*** argv, Options* options, BuildConfig* config) { DeferGuessParallelism deferGuessParallelism(config); - enum { OPT_VERSION = 1, OPT_QUIET = 2 }; + enum { OPT_VERSION = 1, OPT_QUIET = 2, OPT_ENABLE_CP = 3 }; const option kLongOptions[] = { { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, OPT_VERSION }, { "verbose", no_argument, NULL, 'v' }, { "quiet", no_argument, NULL, OPT_QUIET }, + { "cp", no_argument, NULL, OPT_ENABLE_CP }, { NULL, 0, NULL, 0 } }; @@ -1494,6 +1497,9 @@ int ReadFlags(int* argc, char*** argv, case OPT_VERSION: printf("%s\n", kNinjaVersion); return 0; + case OPT_ENABLE_CP: + config->enable_critical_path_scheduler = true; + break; case 'h': default: deferGuessParallelism.Refresh();