Do not remove build.ninja.d during `gn clean`
Calling `gn clean` would remove the `build.ninja.d` file
unexpectedly, which resulted in the nexty `gn clean` call
to fail with a "This does not look like a build directory" error.
The reason for this is a recent change [1] which modified how
the dummy `build.ninja` and `build.ninja.d` files generated
by `gn clean` (to force a regeneration on the next Ninja invocation)
are written:
- Before the CL, the code removed everything except `args.gn`, then
wrote the dummy `build.ninja` and `build.ninja.d`.
- After the CL, the code wrote `build.ninja` and `build.ninja.d`,
then removed everything except `args.gn` and `build.ninja`
(this removing the just-written `build.ninja.d` file).
This fixes the issue by ensuring that `build.ninja.d` is not
removed. Moreover, this relaxes the build directory check logic
a little, by accepting a directory that only contains an `args.gn`
file, without a `build.ninja.d` file in it.
[1] https://gn-review.googlesource.com/c/gn/+/14200
Bug: None
Change-Id: Ie06ab751bed5a749a63bf200b50424abdcf0fdcf
Reviewed-on: https://gn-review.googlesource.com/c/gn/+/14500
Reviewed-by: Takuto Ikuta <tikuta@google.com>
Commit-Queue: David Turner <digit@google.com>
Reviewed-by: Petr Hosek <phosek@google.com>
diff --git a/src/gn/command_clean.cc b/src/gn/command_clean.cc
index e6c52fc..6dcc163 100644
--- a/src/gn/command_clean.cc
+++ b/src/gn/command_clean.cc
@@ -24,10 +24,12 @@
base::FilePath build_dir(setup->build_settings().GetFullPath(
SourceDir(setup->build_settings().build_dir().value())));
- // NOTE: Not all GN builds have args.gn file hence we check here
+ // NOTE: Not all GN builds have args.gn file hence we also check here
// if a build.ninja.d files exists instead.
+ base::FilePath args_gn_file = build_dir.AppendASCII("args.gn");
base::FilePath build_ninja_d_file = build_dir.AppendASCII("build.ninja.d");
- if (!base::PathExists(build_ninja_d_file)) {
+ if (!base::PathExists(args_gn_file) &&
+ !base::PathExists(build_ninja_d_file)) {
Err(Location(),
base::StringPrintf(
"%s does not look like a build directory.\n",
@@ -42,10 +44,13 @@
return false;
}
- // Erase everything but (user-created) args.gn and the build.ninja we just
- // wrote.
- const base::FilePath::CharType* remaining[]{FILE_PATH_LITERAL("args.gn"),
- FILE_PATH_LITERAL("build.ninja")};
+ // Erase everything but (user-created) args.gn and the build.ninja files we
+ // just wrote.
+ const base::FilePath::CharType* remaining[]{
+ FILE_PATH_LITERAL("args.gn"),
+ FILE_PATH_LITERAL("build.ninja"),
+ FILE_PATH_LITERAL("build.ninja.d"),
+ };
base::FileEnumerator traversal(
build_dir, false,
base::FileEnumerator::FILES | base::FileEnumerator::DIRECTORIES);