From 3d4a2fdc52fa01353653afc8835653559f14e10b Mon Sep 17 00:00:00 2001 From: Andy Cedilnik Date: Wed, 6 Nov 2002 12:04:24 -0500 Subject: [PATCH] In certain cases, try to guess the source directory, so that you can run cmake or ccmake without specifying source dir --- Source/CursesDialog/cmCursesMainForm.cxx | 2 +- Source/cmake.cxx | 40 ++++++++++++++++++++++-- Source/cmake.h | 2 +- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/Source/CursesDialog/cmCursesMainForm.cxx b/Source/CursesDialog/cmCursesMainForm.cxx index 38202fd0e..e090cf909 100644 --- a/Source/CursesDialog/cmCursesMainForm.cxx +++ b/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); } diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 340ee32dd..e61308d78 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -809,7 +809,9 @@ int cmake::Configure() int cmake::Run(const std::vector& 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& 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; } diff --git a/Source/cmake.h b/Source/cmake.h index 749e44805..2f30e4f81 100644 --- a/Source/cmake.h +++ b/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);