ソースを参照

In certain cases, try to guess the source directory, so that you can run cmake or ccmake without specifying source dir

Andy Cedilnik 23 年 前
コミット
3d4a2fdc52
3 ファイル変更39 行追加5 行削除
  1. 1 1
      Source/CursesDialog/cmCursesMainForm.cxx
  2. 37 3
      Source/cmake.cxx
  3. 1 1
      Source/cmake.h

+ 1 - 1
Source/CursesDialog/cmCursesMainForm.cxx

@@ -992,7 +992,7 @@ void cmCursesMainForm::HandleInput()
 void cmCursesMainForm::LoadCache(const char *)
 
 {
-  m_CMakeInstance->LoadCache(); 
+  m_CMakeInstance->LoadCache(true); 
   m_CMakeInstance->SetCacheArgs(m_Args);
 }
   

+ 37 - 3
Source/cmake.cxx

@@ -809,7 +809,9 @@ int cmake::Configure()
 int cmake::Run(const std::vector<std::string>& args)
 {
   // a quick check for args
-  if(args.size() == 1 && !cmSystemTools::FileExists("CMakeLists.txt"))
+  if(args.size() == 1 && 
+     !cmSystemTools::FileExists("CMakeLists.txt") &&
+     !cmSystemTools::FileExists("CMakeCache.txt"))
     {
     this->Usage(args[0].c_str());
     return -1;
@@ -836,7 +838,7 @@ int cmake::Run(const std::vector<std::string>& args)
   m_CMakeCommand = args[0];
   
   // load the cache
-  this->LoadCache();
+  this->LoadCache(true);
   
   // Add any cache args
   this->SetCacheArgs(args);
@@ -948,7 +950,7 @@ void cmake::AddDefaultCommands()
     }
 }
 
-int cmake::LoadCache()
+int cmake::LoadCache(bool fix_paths)
 {
   m_CacheManager->LoadCache(this->GetHomeOutputDirectory());
 
@@ -963,6 +965,38 @@ int cmake::LoadCache()
     {
     return -3;
     }
+
+  if ( fix_paths && cmSystemTools::FileExists("CMakeCache.txt") )
+    {
+    // If we are in directory that has CMakeCache inside and we are
+    // fixing paths then we might have to modify home directory and
+    // start directory.
+    const char* home = this->GetHomeDirectory();
+    const char* startdirectory = this->GetStartDirectory();
+    const char* cachehome = this->GetCacheDefinition("CMAKE_HOME_DIRECTORY");
+    if ( cachehome && strcmp(home, cachehome) != 0 )
+      {
+      // If cachehome exists (it was in the cache), and the current
+      // home is not the same as the one from cache (which means we
+      // are not doing in source build), then fix home and start
+      // directory.
+      home = cachehome;
+      startdirectory = cachehome;
+      }
+    // If cachehome is not set and cmakelists.txt does not exists,
+    // that means we are doing out of source build and the
+    // cmakecache.txt was edited manually and we cannot find the right
+    // source directory.
+    if ( !cachehome && !cmSystemTools::FileExists("CMakeLists.txt") )
+      {
+      cmSystemTools::Error("Source directory not specified");
+      return -4;
+      }
+    // Ok, let's set the home and start directory.
+    this->SetHomeDirectory(home);
+    this->SetStartDirectory(startdirectory);
+    }
+  
   return 0;
 }
 

+ 1 - 1
Source/cmake.h

@@ -146,7 +146,7 @@ class cmake
    * GlobalGenerator. This in turn will read in an process all the CMakeList
    * files for the tree. It will not produce any actual Makefiles, or
    * workspaces. Generate does that.  */
-  int LoadCache();
+  int LoadCache(bool fix_paths = false);
 
   ///! Create a GlobalGenerator
   cmGlobalGenerator* CreateGlobalGenerator(const char* name);