فهرست منبع

CPack: Try harder to remove temporary dir (#10793)

Windows filesystems sometimes lock files temporarily.  Try removing the
CPack temp install folder multiple times before giving up.
Brad King 15 سال پیش
والد
کامیت
fdb5f78705
3فایلهای تغییر یافته به همراه20 افزوده شده و 2 حذف شده
  1. 2 2
      Source/CPack/cmCPackGenerator.cxx
  2. 15 0
      Source/cmSystemTools.cxx
  3. 3 0
      Source/cmSystemTools.h

+ 2 - 2
Source/CPack/cmCPackGenerator.cxx

@@ -789,7 +789,7 @@ int cmCPackGenerator::DoPackage()
       cmCPackLogger(cmCPackLog::LOG_VERBOSE, 
                     "Remove toplevel directory: "
         << toplevelDirectory << std::endl);
-      if ( !cmSystemTools::RemoveADirectory(toplevelDirectory) )
+      if ( !cmSystemTools::RepeatedRemoveDirectory(toplevelDirectory) )
         {
         cmCPackLogger(cmCPackLog::LOG_ERROR,
           "Problem removing toplevel directory: "
@@ -1084,7 +1084,7 @@ int cmCPackGenerator::CleanTemporaryDirectory()
     cmCPackLogger(cmCPackLog::LOG_OUTPUT,
                   "- Clean temporary : "
                   << tempInstallDirectory << std::endl);
-    if(!cmsys::SystemTools::RemoveADirectory(tempInstallDirectory))
+    if(!cmSystemTools::RepeatedRemoveDirectory(tempInstallDirectory))
       {
       cmCPackLogger(cmCPackLog::LOG_ERROR,
                     "Problem removing temporary directory: " <<

+ 15 - 0
Source/cmSystemTools.cxx

@@ -2938,3 +2938,18 @@ bool cmSystemTools::CheckRPath(std::string const& file,
   return false;
 #endif
 }
+
+//----------------------------------------------------------------------------
+bool cmSystemTools::RepeatedRemoveDirectory(const char* dir)
+{
+  // Windows sometimes locks files temporarily so try a few times.
+  for(int i = 0; i < 10; ++i)
+    {
+    if(cmSystemTools::RemoveADirectory(dir))
+      {
+      return true;
+      }
+    cmSystemTools::Delay(100);
+    }
+  return false;
+}

+ 3 - 0
Source/cmSystemTools.h

@@ -436,6 +436,9 @@ public:
   static bool CheckRPath(std::string const& file,
                          std::string const& newRPath);
 
+  /** Remove a directory; repeat a few times in case of locked files.  */
+  static bool RepeatedRemoveDirectory(const char* dir);
+
 private:
   static bool s_ForceUnixPaths;
   static bool s_RunCommandHideConsole;