Browse Source

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

Andy Cedilnik 23 years ago
parent
commit
3d4a2fdc52
3 changed files with 39 additions and 5 deletions
  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);