Index: tools/gn/ninja_build_writer.cc |
diff --git a/tools/gn/ninja_build_writer.cc b/tools/gn/ninja_build_writer.cc |
index ff74e77fa33d40a3caa6313789285501b54b8791..2cbb245c0dd5e9e12ffad4867cc3c1a16657ecec 100644 |
--- a/tools/gn/ninja_build_writer.cc |
+++ b/tools/gn/ninja_build_writer.cc |
@@ -167,14 +167,26 @@ bool NinjaBuildWriter::RunAndWriteFile( |
if (!gen.Run(err)) |
return false; |
+ // Unconditionally write the build.ninja. Ninja's build-out-of-date checking |
+ // will re-run GN when any build input is newer than build.ninja, so any time |
+ // the build is updated, build.ninja's timestamp needs to updated also, even |
+ // if the contents haven't been changed. |
base::FilePath ninja_file_name(build_settings->GetFullPath( |
SourceFile(build_settings->build_dir().value() + "build.ninja"))); |
- base::FilePath dep_file_name(build_settings->GetFullPath( |
- SourceFile(build_settings->build_dir().value() + "build.ninja.d"))); |
base::CreateDirectory(ninja_file_name.DirName()); |
+ std::string ninja_contents = file.str(); |
+ if (base::WriteFile(ninja_file_name, ninja_contents.data(), |
+ static_cast<int>(ninja_contents.size())) != |
+ static_cast<int>(ninja_contents.size())) |
+ return false; |
- if (!WriteFileIfChanged(ninja_file_name, file.str(), err) || |
- !WriteFileIfChanged(dep_file_name, depfile.str(), err)) |
+ // Dep file listing build dependencies. |
+ base::FilePath dep_file_name(build_settings->GetFullPath( |
+ SourceFile(build_settings->build_dir().value() + "build.ninja.d"))); |
+ std::string dep_contents = depfile.str(); |
+ if (base::WriteFile(dep_file_name, dep_contents.data(), |
+ static_cast<int>(dep_contents.size())) != |
+ static_cast<int>(dep_contents.size())) |
return false; |
return true; |