From 75f9434374ec2ed5e0f516ff914e9c2b4c519e33 Mon Sep 17 00:00:00 2001 From: Bill Hoffman Date: Fri, 19 Apr 2002 08:27:50 -0400 Subject: [PATCH] BUG: fix SameFile function for windows, and compare source directories --- Source/cmSystemTools.cxx | 42 ++++++++++++++++++++++++++++++++++++++++ Source/cmake.cxx | 18 +++++++---------- 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 1f68b70de..5accbaae7 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -487,6 +487,47 @@ std::string cmSystemTools::EscapeQuotes(const char* str) bool cmSystemTools::SameFile(const char* file1, const char* file2) { +#ifdef _WIN32 + HANDLE hFile1, hFile2; + + hFile1 = CreateFile( file1, + GENERIC_READ, + FILE_SHARE_READ , + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, + NULL + ); + hFile2 = CreateFile( file2, + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_FLAG_BACKUP_SEMANTICS, + NULL + ); + if( hFile1 == INVALID_HANDLE_VALUE || hFile2 == INVALID_HANDLE_VALUE) + { + if(hFile1 != INVALID_HANDLE_VALUE) + { + CloseHandle(hFile1); + } + if(hFile2 != INVALID_HANDLE_VALUE) + { + CloseHandle(hFile2); + } + return false; + } + + BY_HANDLE_FILE_INFORMATION fiBuf1; + BY_HANDLE_FILE_INFORMATION fiBuf2; + GetFileInformationByHandle( hFile1, &fiBuf1 ); + GetFileInformationByHandle( hFile2, &fiBuf2 ); + CloseHandle(hFile1); + CloseHandle(hFile2); + return (fiBuf1.nFileIndexHigh == fiBuf2.nFileIndexHigh && + fiBuf1.nFileIndexLow == fiBuf2.nFileIndexLow); +#else struct stat fileStat1, fileStat2; if (stat(file1, &fileStat1) == 0 && stat(file2, &fileStat2) == 0) { @@ -501,6 +542,7 @@ bool cmSystemTools::SameFile(const char* file1, const char* file2) } } return false; +#endif } diff --git a/Source/cmake.cxx b/Source/cmake.cxx index cb6cfc1be..097b1befb 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -358,19 +358,15 @@ int cmake::Generate(const std::vector& args, bool buildMakefiles) cmCacheManager::GetInstance()->LoadCache(&mf); if(mf.GetDefinition("CMAKE_HOME_DIRECTORY")) { - std::string cacheStart = - cmSystemTools::CollapseFullPath(mf.GetDefinition("CMAKE_HOME_DIRECTORY")); - std::string currentStart = - cmSystemTools::CollapseFullPath(mf.GetHomeDirectory()); -#ifdef _WIN32 - cacheStart = cmSystemTools::LowerCase(cacheStart); - currentStart = cmSystemTools::LowerCase(currentStart); -#endif - if(cacheStart != currentStart) + std::string cacheStart = mf.GetDefinition("CMAKE_HOME_DIRECTORY"); + cacheStart += "/CMakeLists.txt"; + std::string currentStart = mf.GetHomeDirectory(); + currentStart += "/CMakeLists.txt"; + if(!cmSystemTools::SameFile(cacheStart.c_str(), currentStart.c_str())) { - std::string message = "Error: source directory: "; + std::string message = "Error: source : "; message += currentStart; - message += "\nDoes not match source directory used to generate cache: "; + message += "\nDoes not match source used to generate cache: "; message += cacheStart; message += "\nRe-run cmake with a different source directory."; cmSystemTools::Error(message.c_str());