Prevent ninja from rerunning cmake in a new build directory

Just posted this fix on ninja’s github page, but figured I’d share it with a larger audience.

Every time I run cmake && ninja in a new build directory, ninja will rerun cmake because the entry for in .ninja_log is older than the timestamp on CMakeCache.txt, even if the timestamps on the actual file isn’t older.

The following patch fixes the problem, i.e., there’s no need to add to the ninja_log:

diff --git a/src/ b/src/
index a093cd1..810b22d 100644
--- a/src/
+++ b/src/
@@ -249,8 +249,6 @@ bool NinjaMain::RebuildManifest(const char* input_file, string* err) {
     return false;

   Builder builder(&state_, config_, &build_log_, &deps_log_, &disk_interface_);
-  if (!builder.AddTarget(node, err))
-    return false;

   if (builder.AlreadyUpToDate())
     return false;  // Not an error, but we didn't rebuild.


Please find a better fix here:

The ninja developers want to fix this in a more elegant way, which unfortunately will also require a change to cmake. So, if you’d rather not wait, or like me, can’t upgrade cmake, you can use my fork here: