[C++] Re-generate build.ninja when ckati is updated
diff --git a/fileutil.cc b/fileutil.cc
index eb4fc22..4c87e9c 100644
--- a/fileutil.cc
+++ b/fileutil.cc
@@ -23,6 +23,9 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <unistd.h>
+#if defined(__APPLE__)
+#include <mach-o/dyld.h>
+#endif
 
 #include <unordered_map>
 
@@ -95,6 +98,26 @@
   abort();
 }
 
+void GetExecutablePath(string* path) {
+#if defined(__linux__)
+  char mypath[PATH_MAX + 1];
+  ssize_t l = readlink("/proc/self/exe", mypath, PATH_MAX);
+  if (l < 0) {
+    PERROR("readlink for /proc/self/exe");
+  }
+  mypath[l] = '\0';
+  *path = mypath;
+#elif defined(__APPLE__)
+  char mypath[PATH_MAX + 1];
+  if (_NSGetExecutablePath(mypath, PATH_MAX) != 0) {
+    ERROR("_NSGetExecutablePath failed");
+  }
+  *path = mypath;
+#else
+#error "Unsupported OS"
+#endif
+}
+
 namespace {
 
 class GlobCache {
diff --git a/fileutil.h b/fileutil.h
index 26b8e5e..96659d9 100644
--- a/fileutil.h
+++ b/fileutil.h
@@ -29,6 +29,8 @@
 int RunCommand(const string& shell, const string& cmd, bool redirect_stderr,
                string* out);
 
+void GetExecutablePath(string* path);
+
 void Glob(const char* pat, vector<string>** files);
 
 #endif  // FILEUTIL_H_
diff --git a/ninja.cc b/ninja.cc
index 3363723..df8dbcb 100644
--- a/ninja.cc
+++ b/ninja.cc
@@ -30,6 +30,7 @@
 #include "dep.h"
 #include "eval.h"
 #include "file_cache.h"
+#include "fileutil.h"
 #include "flags.h"
 #include "log.h"
 #include "string_piece.h"
@@ -181,6 +182,9 @@
       shared_ptr<string> val = ev_->EvalVar(e);
       used_envs_.emplace(e.str(), *val);
     }
+
+    if (g_gen_regen_rule)
+      GetExecutablePath(&kati_binary_);
   }
 
   ~NinjaGenerator() {
@@ -528,6 +532,7 @@
     for (const string& makefile : makefiles) {
       fprintf(fp_, " %.*s", SPF(makefile));
     }
+    fprintf(fp_, " %s", kati_binary_.c_str());
     // TODO: Add dependencies to directories read by $(wildcard)
     // or $(shell find).
     if (!used_envs_.empty())
@@ -656,6 +661,7 @@
   unordered_map<Symbol, Symbol> short_names_;
   shared_ptr<string> shell_;
   map<string, string> used_envs_;
+  string kati_binary_;
 };
 
 void GenerateNinja(const char* ninja_suffix,