Browse Source

Ninja: Skip cleandead and recompact if build.ninja is missing

In error cases the `build.ninja` file may not exist.  Skip running ninja
tools that require it so that we do not generate additional errors.
Brad King 5 năm trước cách đây
mục cha
commit
5d92e60d81
1 tập tin đã thay đổi với 10 bổ sung2 xóa
  1. 10 2
      Source/cmGlobalNinjaGenerator.cxx

+ 10 - 2
Source/cmGlobalNinjaGenerator.cxx

@@ -553,18 +553,26 @@ void cmGlobalNinjaGenerator::Generate()
   bool const expectBuildManifest =
     !this->IsMultiConfig() && this->OutputPathPrefix.empty();
 
+  // Skip some ninja tools if they need 'build.ninja' but it is missing.
+  bool const missingBuildManifest = expectBuildManifest &&
+    (this->NinjaSupportsCleanDeadTool ||
+     this->NinjaSupportsUnconditionalRecompactTool) &&
+    !cmSystemTools::FileExists("build.ninja");
+
   // The `cleandead` tool needs to know about all outputs in the build we just
   // wrote out. Ninja-Multi doesn't have a single `build.ninja` we can use that
   // is the union of all generated configurations, so we can't run it reliably
   // in that case.
-  if (this->NinjaSupportsCleanDeadTool && expectBuildManifest) {
+  if (this->NinjaSupportsCleanDeadTool && expectBuildManifest &&
+      !missingBuildManifest) {
     run_ninja_tool({ "cleandead" });
   }
   // The `recompact` tool loads the manifest. As above, we don't have a single
   // `build.ninja` to load for this in Ninja-Multi. This may be relaxed in the
   // future pending further investigation into how Ninja works upstream
   // (ninja#1721).
-  if (this->NinjaSupportsUnconditionalRecompactTool && expectBuildManifest) {
+  if (this->NinjaSupportsUnconditionalRecompactTool && expectBuildManifest &&
+      !missingBuildManifest) {
     run_ninja_tool({ "recompact" });
   }
   if (this->NinjaSupportsRestatTool && this->OutputPathPrefix.empty()) {