Delete entire CMakeFiles directory when deleting CMakeCache.txt (#13756)
Since commite015df7d
(...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 commitfd33bf93
(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 commit7195aca5
(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:
parent
a7742140ad
commit
1df09e5773
|
@ -584,23 +584,15 @@ bool cmCacheManager::DeleteCache(const char* path)
|
|||
cmSystemTools::ConvertToUnixSlashes(cacheFile);
|
||||
std::string cmakeFiles = cacheFile;
|
||||
cacheFile += "/CMakeCache.txt";
|
||||
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
|
||||
cmsys::Directory dir;
|
||||
cmakeFiles += cmake::GetCMakeFilesDirectory();
|
||||
dir.Load(cmakeFiles.c_str());
|
||||
for (unsigned long fileNum = 0;
|
||||
fileNum < dir.GetNumberOfFiles();
|
||||
++fileNum)
|
||||
if(cmSystemTools::FileIsDirectory(cmakeFiles.c_str()))
|
||||
{
|
||||
if(!cmSystemTools::
|
||||
FileIsDirectory(dir.GetFile(fileNum)))
|
||||
{
|
||||
std::string fullPath = cmakeFiles;
|
||||
fullPath += "/";
|
||||
fullPath += dir.GetFile(fileNum);
|
||||
cmSystemTools::RemoveFile(fullPath.c_str());
|
||||
cmSystemTools::RemoveADirectory(cmakeFiles.c_str());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
|
|
Loading…
Reference in New Issue