瀏覽代碼

cmCPackExternalGenerator: ensure JSON is written before running the script

First, use `cmGeneratedFileStream` to avoid touching an existing file
unless its contents change and to get atomic replacement. Also add a
scope to ensure that the file is in place (at `fout`'s destructor)
before doing anything with the packaging scripts.

See: https://discourse.cmake.org/t/1773
Ben Boeckel 1 年之前
父節點
當前提交
ab26d334bf
共有 1 個文件被更改,包括 11 次插入8 次删除
  1. 11 8
      Source/CPack/cmCPackExternalGenerator.cxx

+ 11 - 8
Source/CPack/cmCPackExternalGenerator.cxx

@@ -15,6 +15,7 @@
 
 #include "cmCPackComponentGroup.h"
 #include "cmCPackLog.h"
+#include "cmGeneratedFileStream.h"
 #include "cmList.h"
 #include "cmMakefile.h"
 #include "cmSystemTools.h"
@@ -48,17 +49,19 @@ int cmCPackExternalGenerator::PackageFiles()
     filename = this->packageFileNames[0];
   }
 
-  cmsys::ofstream fout(filename.c_str());
-  std::unique_ptr<Json::StreamWriter> jout(builder.newStreamWriter());
+  {
+    cmGeneratedFileStream fout(filename);
+    std::unique_ptr<Json::StreamWriter> jout(builder.newStreamWriter());
 
-  Json::Value root(Json::objectValue);
+    Json::Value root(Json::objectValue);
 
-  if (!this->Generator->WriteToJSON(root)) {
-    return 0;
-  }
+    if (!this->Generator->WriteToJSON(root)) {
+      return 0;
+    }
 
-  if (jout->write(root, &fout)) {
-    return 0;
+    if (jout->write(root, &fout)) {
+      return 0;
+    }
   }
 
   cmValue packageScript = this->GetOption("CPACK_EXTERNAL_PACKAGE_SCRIPT");