diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 22f0d1f2a616f377c0e9907259830934b4ab775b..ef26a990367d4b4de75c0f797e3386a709b5feed 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -1422,7 +1422,7 @@ bool cmFileCommand::HandleRemove(std::vector const& args, if (cmSystemTools::FileIsDirectory(fileName) && !cmSystemTools::FileIsSymlink(fileName) && recurse) { - cmSystemTools::RemoveADirectory(fileName); + cmSystemTools::RepeatedRemoveDirectory(fileName); } else { cmSystemTools::RemoveFile(fileName); } diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 7baf5ed4974b0e9de7568f33ecd1a21022b0d8d5..a168b33720c6496d166499e0da315e8521ce1c7d 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -2838,14 +2838,20 @@ bool cmSystemTools::CheckRPath(std::string const& file, bool cmSystemTools::RepeatedRemoveDirectory(const std::string& dir) { +#ifdef _WIN32 // Windows sometimes locks files temporarily so try a few times. - for (int i = 0; i < 10; ++i) { + WindowsFileRetry retry = cmSystemTools::GetWindowsFileRetry(); + + for (unsigned int i = 0; i < retry.Count; ++i) { if (cmSystemTools::RemoveADirectory(dir)) { return true; } - cmSystemTools::Delay(100); + cmSystemTools::Delay(retry.Delay); } return false; +#else + return cmSystemTools::RemoveADirectory(dir); +#endif } bool cmSystemTools::StringToLong(const char* str, long* value)