소스 검색

ENH: added better error checking for cases when there is a CMakeCache.txt file but it is not readable

Ken Martin 20 년 전
부모
커밋
039d4b604e
2개의 변경된 파일46개의 추가작업 그리고 14개의 파일을 삭제
  1. 34 13
      Source/MFCDialog/CMakeSetupDialog.cpp
  2. 12 1
      Source/cmake.cxx

+ 34 - 13
Source/MFCDialog/CMakeSetupDialog.cpp

@@ -745,19 +745,30 @@ void CMakeSetupDialog::OnChangeWhereBuild()
 
   cmCacheManager *cachem = this->m_CMakeInstance->GetCacheManager();
   cmCacheManager::CacheIterator it = cachem->NewIterator();
-  if (cmSystemTools::FileExists(cache_file.c_str()) &&
-      cachem->LoadCache(path.c_str()) &&
-      it.Find("CMAKE_HOME_DIRECTORY"))
-    {
-    path = ConvertToWindowsPath(it.GetValue());
-    this->m_WhereSource = path.c_str();
-    this->m_WhereSourceControl.SetWindowText(this->m_WhereSource);
-    this->OnChangeWhereSource();
-    m_GeneratorPicked = true;
-    }
-  else
+
+  m_GeneratorPicked = false;
+
+  // make sure we have a normal cache file, specifically if one exists make
+  // sure it can be read
+  if (cmSystemTools::FileExists(cache_file.c_str()))
     {
-    m_GeneratorPicked = false;
+    if (cachem->LoadCache(path.c_str()))
+      {
+      if (it.Find("CMAKE_HOME_DIRECTORY"))
+        {
+        path = ConvertToWindowsPath(it.GetValue());
+        this->m_WhereSource = path.c_str();
+        this->m_WhereSourceControl.SetWindowText(this->m_WhereSource);
+        this->OnChangeWhereSource();
+        m_GeneratorPicked = true;
+        }
+      }
+    else
+      {
+      //file exists but cqnnot be read
+      cmSystemTools::Error("There is a CMakeCache.txt file for the current binary tree but cmake does not have permission to read it. Please check the permissions of the directory you are trying to run CMake on.");
+      return;
+      }
     }
   
   m_CacheEntriesList.RemoveAll();
@@ -945,7 +956,17 @@ void CMakeSetupDialog::LoadCacheFromDiskToGUI()
   cmCacheManager *cachem = this->m_CMakeInstance->GetCacheManager();
   if(m_WhereBuild != "")
     {
-    cachem->LoadCache(m_WhereBuild);
+    if (!cachem->LoadCache(m_WhereBuild))
+      {
+      // if it does exist, but isn;t readable then warn the user
+      std::string cacheFile = m_WhereBuild;
+      cacheFile += "/CMakeCache.txt";
+      if(cmSystemTools::FileExists(cacheFile.c_str()))
+        {
+        cmSystemTools::Error("There is a CMakeCache.txt file for the current binary tree but cmake does not have permission to read it. Please check the permissions of the directory you are trying to run CMake on.");
+        return;
+        }
+      }
     cmCacheManager::CacheIterator itm = cachem->NewIterator();
     if ( itm.Find("CMAKE_HOME_DIRECTORY"))
       {

+ 12 - 1
Source/cmake.cxx

@@ -1515,7 +1515,18 @@ void cmake::AddDefaultGenerators()
 
 int cmake::LoadCache()
 {
-  m_CacheManager->LoadCache(this->GetHomeOutputDirectory());
+  // could we not read the cache
+  if (!m_CacheManager->LoadCache(this->GetHomeOutputDirectory()))
+    {
+    // if it does exist, but isn;t readable then warn the user
+    std::string cacheFile = this->GetHomeOutputDirectory();
+    cacheFile += "/CMakeCache.txt";
+    if(cmSystemTools::FileExists(cacheFile.c_str()))
+      {
+      cmSystemTools::Error("There is a CMakeCache.txt file for the current binary tree but cmake does not have permission to read it. Please check the permissions of the directory you are trying to run CMake on.");
+      return -1;
+      }
+    }
 
   if (m_CMakeCommand.size() < 2)
     {