1
0
Эх сурвалжийг харах

Write CMakeCache.txt atomically (#13040)

The write code introduced by commit 0b0d1b1d (add CMakeCache.txt
support, 2001-02-22) uses a temporary file but does not replace the
original atomically.  Use cmGeneratedFileStream to do both
copy-if-different and atomic replacement.
Brad King 13 жил өмнө
parent
commit
9eb8e4b22b

+ 4 - 7
Source/cmCacheManager.cxx

@@ -13,6 +13,7 @@
 #include "cmCacheManager.h"
 #include "cmSystemTools.h"
 #include "cmCacheManager.h"
+#include "cmGeneratedFileStream.h"
 #include "cmMakefile.h"
 #include "cmake.h"
 #include "cmVersion.h"
@@ -431,9 +432,8 @@ bool cmCacheManager::SaveCache(const char* path)
 {
   std::string cacheFile = path;
   cacheFile += "/CMakeCache.txt";
-  std::string tempFile = cacheFile;
-  tempFile += ".tmp";
-  std::ofstream fout(tempFile.c_str());
+  cmGeneratedFileStream fout(cacheFile.c_str());
+  fout.SetCopyIfDifferent(true);
   if(!fout)
     {
     cmSystemTools::Error("Unable to open cache file for save. ",
@@ -561,10 +561,7 @@ bool cmCacheManager::SaveCache(const char* path)
       }
     }
   fout << "\n";
-  fout.close();
-  cmSystemTools::CopyFileIfDifferent(tempFile.c_str(),
-                                     cacheFile.c_str());
-  cmSystemTools::RemoveFile(tempFile.c_str());
+  fout.Close();
   std::string checkCacheFile = path;
   checkCacheFile += cmake::GetCMakeFilesDirectory();
   cmSystemTools::MakeDirectory(checkCacheFile.c_str());