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.
This commit is contained in:
Brad King 2013-02-18 09:51:40 -05:00
parent a7742140ad
commit 1df09e5773
1 changed files with 7 additions and 15 deletions

View File

@ -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::FileExists(cacheFile.c_str()))
{
if(!cmSystemTools::
FileIsDirectory(dir.GetFile(fileNum)))
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;