summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Source/cmSystemTools.cxx42
-rw-r--r--Source/cmake.cxx18
2 files changed, 49 insertions, 11 deletions
diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx
index 1f68b70..5accbaa 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 cb6cfc1..097b1be 100644
--- a/Source/cmake.cxx
+++ b/Source/cmake.cxx
@@ -358,19 +358,15 @@ int cmake::Generate(const std::vector<std::string>& 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());