diff options
author | Brad King <brad.king@kitware.com> | 2019-05-22 14:30:43 +0000 |
---|---|---|
committer | Kitware Robot <kwrobot@kitware.com> | 2019-05-22 10:32:43 -0400 |
commit | 8ed6efbbd377c0941ba018200282fc961aa7d20e (patch) | |
tree | cf5f8c2f55359033068eb3206b8f1887c4b43bdd /Source/cmake.cxx | |
parent | fc4cbbc2a5f9f7d38e77c991a88400b29c39f182 (diff) | |
parent | d0f0ba0f7a39e70fbed197e717292b74150cf84f (diff) | |
download | cmake-8ed6efbbd377c0941ba018200282fc961aa7d20e.tar.gz |
Merge topic 'default-generator-env'
d0f0ba0f7a Tests: Add environment generator tests
a48ce8f4bf Help: Add documentation for default generator environment variables
083cf7e8a2 cmake: Allow default generator to be set by environment variables
Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !3218
Diffstat (limited to 'Source/cmake.cxx')
-rw-r--r-- | Source/cmake.cxx | 67 |
1 files changed, 61 insertions, 6 deletions
diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 031123aa33..0762ae1a7c 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -159,6 +159,9 @@ cmake::cmake(Role role, cmState::Mode mode) #endif this->GlobalGenerator = nullptr; + this->GeneratorInstanceSet = false; + this->GeneratorPlatformSet = false; + this->GeneratorToolsetSet = false; this->CurrentWorkingMode = NORMAL_MODE; #ifdef CMAKE_BUILD_WITH_CMAKE @@ -174,6 +177,10 @@ cmake::cmake(Role role, cmState::Mode mode) this->AddProjectCommands(); } + if (mode == cmState::Project) { + this->LoadEnvironmentPresets(); + } + // Make sure we can capture the build tool output. cmSystemTools::EnableVSConsoleOutput(); @@ -612,6 +619,35 @@ bool cmake::FindPackage(const std::vector<std::string>& args) return packageFound; } +void cmake::LoadEnvironmentPresets() +{ + std::string envGenVar; + bool hasEnvironmentGenerator = false; + if (cmSystemTools::GetEnv("CMAKE_GENERATOR", envGenVar)) { + hasEnvironmentGenerator = true; + this->EnvironmentGenerator = envGenVar; + } + + auto readGeneratorVar = [&](std::string name, std::string& key) { + std::string varValue; + if (cmSystemTools::GetEnv(name, varValue)) { + if (hasEnvironmentGenerator) { + key = varValue; + } else if (!this->GetIsInTryCompile()) { + std::string message = "Warning: Environment variable "; + message += name; + message += " will be ignored, because CMAKE_GENERATOR "; + message += "is not set."; + cmSystemTools::Message(message, "Warning"); + } + } + }; + + readGeneratorVar("CMAKE_GENERATOR_INSTANCE", this->GeneratorInstance); + readGeneratorVar("CMAKE_GENERATOR_PLATFORM", this->GeneratorPlatform); + readGeneratorVar("CMAKE_GENERATOR_TOOLSET", this->GeneratorToolset); +} + // Parse the args void cmake::SetArgs(const std::vector<std::string>& args) { @@ -767,7 +803,7 @@ void cmake::SetArgs(const std::vector<std::string>& args) cmSystemTools::Error("Multiple -A options not allowed"); return; } - this->GeneratorPlatform = value; + this->SetGeneratorPlatform(value); havePlatform = true; } else if (arg.find("-T", 0) == 0) { std::string value = arg.substr(2); @@ -783,7 +819,7 @@ void cmake::SetArgs(const std::vector<std::string>& args) cmSystemTools::Error("Multiple -T options not allowed"); return; } - this->GeneratorToolset = value; + this->SetGeneratorToolset(value); haveToolset = true; } else if (arg.find("-G", 0) == 0) { std::string value = arg.substr(2); @@ -814,6 +850,16 @@ void cmake::SetArgs(const std::vector<std::string>& args) else { this->SetDirectoriesFromFile(arg); } + // Empty instance, platform and toolset if only a generator is specified + if (this->GlobalGenerator) { + this->GeneratorInstance = ""; + if (!this->GeneratorPlatformSet) { + this->GeneratorPlatform = ""; + } + if (!this->GeneratorToolsetSet) { + this->GeneratorToolset = ""; + } + } } const bool haveSourceDir = !this->GetHomeDirectory().empty(); @@ -1446,8 +1492,7 @@ int cmake::ActualConfigure() if (const std::string* instance = this->State->GetInitializedCacheValue("CMAKE_GENERATOR_INSTANCE")) { - if (!this->GeneratorInstance.empty() && - this->GeneratorInstance != *instance) { + if (this->GeneratorInstanceSet && this->GeneratorInstance != *instance) { std::string message = "Error: generator instance: "; message += this->GeneratorInstance; message += "\nDoes not match the instance used previously: "; @@ -1465,7 +1510,7 @@ int cmake::ActualConfigure() if (const std::string* platformName = this->State->GetInitializedCacheValue("CMAKE_GENERATOR_PLATFORM")) { - if (!this->GeneratorPlatform.empty() && + if (this->GeneratorPlatformSet && this->GeneratorPlatform != *platformName) { std::string message = "Error: generator platform: "; message += this->GeneratorPlatform; @@ -1484,7 +1529,7 @@ int cmake::ActualConfigure() if (const std::string* tsName = this->State->GetInitializedCacheValue("CMAKE_GENERATOR_TOOLSET")) { - if (!this->GeneratorToolset.empty() && this->GeneratorToolset != *tsName) { + if (this->GeneratorToolsetSet && this->GeneratorToolset != *tsName) { std::string message = "Error: generator toolset: "; message += this->GeneratorToolset; message += "\nDoes not match the toolset used previously: "; @@ -1562,6 +1607,16 @@ int cmake::ActualConfigure() std::unique_ptr<cmGlobalGenerator> cmake::EvaluateDefaultGlobalGenerator() { + if (!this->EnvironmentGenerator.empty()) { + cmGlobalGenerator* gen = + this->CreateGlobalGenerator(this->EnvironmentGenerator); + if (!gen) { + cmSystemTools::Error("CMAKE_GENERATOR was set but the specified " + "generator doesn't exist. Using CMake default."); + } else { + return std::unique_ptr<cmGlobalGenerator>(gen); + } + } #if defined(_WIN32) && !defined(__CYGWIN__) && !defined(CMAKE_BOOT_MINGW) std::string found; // Try to find the newest VS installed on the computer and |