extension of the first input"), pass that through as an extra
variable, like how `cflags` is passed above.
+The Ninja log
+~~~~~~~~~~~~~
+
+For each built file, Ninja keeps a log of the command used to build
+it. Using this log Ninja can know when an existing output was built
+with a different command line than the build files specify (i.e., the
+command line changed) and knows to rebuild the file.
+
+The log file is kept in the build root in a file called `.ninja_log`.
+If you provide a variable named `builddir` in the outermost scope,
+`.ninja_log` will be kept in that directory instead.
+
+
Generating Ninja files
----------------------
build_log.SetConfig(&config);
state.build_log_ = &build_log;
+ const string build_dir = state.bindings_.LookupVariable("builddir");
const char* kLogPath = ".ninja_log";
- if (!build_log.Load(kLogPath, &err)) {
- fprintf(stderr, "error loading build log: %s\n", err.c_str());
+ string log_path = build_dir.empty() ? kLogPath : build_dir + "/" + kLogPath;
+ if (!build_log.Load(log_path.c_str(), &err)) {
+ fprintf(stderr, "error loading build log %s: %s\n",
+ log_path.c_str(), err.c_str());
return 1;
}
- if (!build_log.OpenForWrite(kLogPath, &err)) {
+ if (!build_log.OpenForWrite(log_path.c_str(), &err)) {
fprintf(stderr, "error opening build log: %s\n", err.c_str());
return 1;
}