diff --git a/Source/cmGlobalUnixMakefileGenerator.cxx b/Source/cmGlobalUnixMakefileGenerator.cxx index 4fc0f60bf..2619f6918 100644 --- a/Source/cmGlobalUnixMakefileGenerator.cxx +++ b/Source/cmGlobalUnixMakefileGenerator.cxx @@ -24,21 +24,6 @@ void cmGlobalUnixMakefileGenerator::EnableLanguage(const char* lang, cmMakefile *mf) { bool isLocal = m_CMakeInstance->GetLocal(); - const char* majv = mf->GetDefinition("CMAKE_CACHE_MAJOR_VERSION"); - const char* minv = mf->GetDefinition("CMAKE_CACHE_MINOR_VERSION"); - const char* relv = mf->GetDefinition("CMAKE_CACHE_RELEASE_VERSION"); - bool cacheSameCMake = false; - if(majv && atoi(majv) == cmMakefile::GetMajorVersion() - && minv && atoi(minv) == cmMakefile::GetMinorVersion() - && relv && (strcmp(relv, cmMakefile::GetReleaseVersion()) == 0)) - { - cacheSameCMake = true; - } - if(!cacheSameCMake) - { - isLocal = false; - } - // if no lang specified use CXX if(!lang ) { diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 340ee32dd..7807927cb 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -805,6 +805,21 @@ int cmake::Configure() return 0; } +bool cmake::CacheVersionMatches() +{ + const char* majv = m_CacheManager->GetCacheValue("CMAKE_CACHE_MAJOR_VERSION"); + const char* minv = m_CacheManager->GetCacheValue("CMAKE_CACHE_MINOR_VERSION"); + const char* relv = m_CacheManager->GetCacheValue("CMAKE_CACHE_RELEASE_VERSION"); + bool cacheSameCMake = false; + if(majv && atoi(majv) == cmMakefile::GetMajorVersion() + && minv && atoi(minv) == cmMakefile::GetMinorVersion() + && relv && (strcmp(relv, cmMakefile::GetReleaseVersion()) == 0)) + { + cacheSameCMake = true; + } + return cacheSameCMake; +} + // handle a command line invocation int cmake::Run(const std::vector& args) { @@ -840,20 +855,32 @@ int cmake::Run(const std::vector& args) // Add any cache args this->SetCacheArgs(args); - - // if we are local do the local thing, otherwise do global + + int ret = 0; + // if not local or the cmake version has changed + // since the last run of cmake, run a global generate + if(!m_Local || !this->CacheVersionMatches()) + { + bool saveLocalFlag = m_Local; + m_Local = false; + ret = this->Configure(); + if (ret) + { + return ret; + } + ret = this->Generate(); + if(ret) + { + return ret; + } + m_Local = saveLocalFlag; + } + // if we are local do the local thing if (m_Local) { - return this->LocalGenerate(); + ret = this->LocalGenerate(); } - - // otherwise global - int ret = this->Configure(); - if (ret) - { - return ret; - } - return this->Generate(); + return ret; } int cmake::Generate() diff --git a/Source/cmake.h b/Source/cmake.h index 749e44805..cf0d7bf6c 100644 --- a/Source/cmake.h +++ b/Source/cmake.h @@ -236,6 +236,8 @@ protected: std::string m_cmStartDirectory; std::string m_StartOutputDirectory; + ///! return true if the same cmake was used to make the cache. + bool CacheVersionMatches(); ///! read in a cmake list file to initialize the cache void ReadListFile(const char *path);