Browse Source

Delete entire CMakeFiles directory when deleting CMakeCache.txt (#13756)

Since commit e015df7d (...delete CMakeFiles directory when cache is
deleted, 2006-02-20) we deleted the files in the CMakeFiles directory
when deleting CMakeCache.txt in order to reset the build tree to a fresh
state.  This allowed commit fd33bf93 (fix for bug 6102, allow users to
change the compiler, 2007-12-13) to delete CMakeCache.txt when the user
changes the compiler and CMakeFiles/CMake<lang>Compiler.cmake and other
platform information files would go with it to allow a fresh start.

Then commit 7195aca5 (Make platform information files specific to the
CMake version, 2012-08-24) moved the platform information files to a
subdirectory e.g. CMakeFiles/<version>/CMake<lang>Compiler.cmake where
<version> is the current CMake version.  This causes the compiler change
logic to fail to remove all old compiler information.  Then on the next
configuration CMake<lang>Compiler.cmake would set CMAKE_<lang>_COMPILER
back to the old value and re-trigger the compiler change logic.  This
causes an infinite loop of cache deletion and compiler reset.

Fix this simply by teaching cmCacheManager::DeleteCache to remove the
entire CMakeFiles directory recursively whenever it removes an existing
CMakeCache.txt.  This fully resets the build tree to configure with a
fresh compiler.
Brad King 13 years ago
parent
commit
1df09e5773
1 changed files with 8 additions and 16 deletions
  1. 8 16
      Source/cmCacheManager.cxx

+ 8 - 16
Source/cmCacheManager.cxx

@@ -584,23 +584,15 @@ bool cmCacheManager::DeleteCache(const char* path)
   cmSystemTools::ConvertToUnixSlashes(cacheFile);
   std::string cmakeFiles = cacheFile;
   cacheFile += "/CMakeCache.txt";
-  cmSystemTools::RemoveFile(cacheFile.c_str());
-  // now remove the files in the CMakeFiles directory
-  // this cleans up language cache files
-  cmsys::Directory dir;
-  cmakeFiles += cmake::GetCMakeFilesDirectory();
-  dir.Load(cmakeFiles.c_str());
-  for (unsigned long fileNum = 0;
-    fileNum <  dir.GetNumberOfFiles();
-    ++fileNum)
-    {
-    if(!cmSystemTools::
-       FileIsDirectory(dir.GetFile(fileNum)))
+  if(cmSystemTools::FileExists(cacheFile.c_str()))
+    {
+    cmSystemTools::RemoveFile(cacheFile.c_str());
+    // now remove the files in the CMakeFiles directory
+    // this cleans up language cache files
+    cmakeFiles += cmake::GetCMakeFilesDirectory();
+    if(cmSystemTools::FileIsDirectory(cmakeFiles.c_str()))
       {
-      std::string fullPath = cmakeFiles;
-      fullPath += "/";
-      fullPath += dir.GetFile(fileNum);
-      cmSystemTools::RemoveFile(fullPath.c_str());
+      cmSystemTools::RemoveADirectory(cmakeFiles.c_str());
       }
     }
   return true;