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
This commit is contained in:
Ben Boeckel
2024-07-18 07:50:46 -04:00
parent 3b2ef9b54c
commit ab26d334bf

View File

@@ -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");