diff options
author | Brad King <brad.king@kitware.com> | 2023-08-09 15:18:25 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2023-08-10 14:00:53 (GMT) |
commit | d5118ed2e5d386be829869cffb681c38d551deae (patch) | |
tree | 489a58beb3f4d8dce853cb8b6d66cc3b2f18e10f /Source/cmGlobalVisualStudio14Generator.cxx | |
parent | 6b21d2bc9bbe241252b5ad30b7a8bb850518638c (diff) | |
parent | 89b611ab3232cdeb4892458bf9d6c3281a8fda00 (diff) | |
download | CMake-d5118ed2e5d386be829869cffb681c38d551deae.zip CMake-d5118ed2e5d386be829869cffb681c38d551deae.tar.gz CMake-d5118ed2e5d386be829869cffb681c38d551deae.tar.bz2 |
Merge branch 'backport-vs-sdk-selection' into vs-sdk-selection
Diffstat (limited to 'Source/cmGlobalVisualStudio14Generator.cxx')
-rw-r--r-- | Source/cmGlobalVisualStudio14Generator.cxx | 126 |
1 files changed, 99 insertions, 27 deletions
diff --git a/Source/cmGlobalVisualStudio14Generator.cxx b/Source/cmGlobalVisualStudio14Generator.cxx index 9f1926d..68b4d1a 100644 --- a/Source/cmGlobalVisualStudio14Generator.cxx +++ b/Source/cmGlobalVisualStudio14Generator.cxx @@ -141,14 +141,103 @@ bool cmGlobalVisualStudio14Generator::MatchesGeneratorName( bool cmGlobalVisualStudio14Generator::InitializePlatformWindows(cmMakefile* mf) { - if (cmHasLiteralPrefix(this->SystemVersion, "10.0")) { + // If a Windows SDK version is explicitly requested, search for it. + if (this->GeneratorPlatformVersion) { + std::string const& version = *this->GeneratorPlatformVersion; + + // VS 2019 and above support specifying plain "10.0". + if (version == "10.0"_s) { + if (this->Version >= VSVersion::VS16) { + this->SetWindowsTargetPlatformVersion("10.0", mf); + return true; + } + /* clang-format off */ + mf->IssueMessage(MessageType::FATAL_ERROR, cmStrCat( + "Generator\n" + " ", this->GetName(), "\n" + "given platform specification containing a\n" + " version=10.0\n" + "field. The value 10.0 is only supported by VS 2019 and above.\n" + )); + /* clang-format on */ + return false; + } + + if (cmHasLiteralPrefix(version, "10.0.")) { + return this->SelectWindows10SDK(mf); + } + + if (version == "8.1"_s) { + if (this->IsWin81SDKInstalled()) { + this->SetWindowsTargetPlatformVersion("8.1", mf); + return true; + } + /* clang-format off */ + mf->IssueMessage(MessageType::FATAL_ERROR, cmStrCat( + "Generator\n" + " ", this->GetName(), "\n" + "given platform specification containing a\n" + " version=8.1\n" + "field, but the Windows 8.1 SDK is not installed.\n" + )); + /* clang-format on */ + return false; + } + + if (version.empty()) { + /* clang-format off */ + mf->IssueMessage(MessageType::FATAL_ERROR, cmStrCat( + "Generator\n" + " ", this->GetName(), "\n" + "given platform specification with empty\n" + " version=\n" + "field.\n" + )); + /* clang-format on */ + return false; + } + + /* clang-format off */ + mf->IssueMessage(MessageType::FATAL_ERROR, cmStrCat( + "Generator\n" + " ", this->GetName(), "\n" + "given platform specification containing a\n" + " version=", version, "\n" + "field with unsupported value.\n" + )); + /* clang-format on */ + return false; + } + + // If we are targeting Windows 10+, we select a Windows 10 SDK. + // If no Windows 8.1 SDK is installed, which is possible with VS 2017 and + // higher, then we must choose a Windows 10 SDK anyway. + if (cmHasLiteralPrefix(this->SystemVersion, "10.0") || + !this->IsWin81SDKInstalled()) { return this->SelectWindows10SDK(mf); } - return this->VerifyNoGeneratorPlatformVersion(mf); + + // Under CMP0149 NEW behavior, we search for a Windows 10 SDK even + // when targeting older Windows versions, but it is not required. + if (mf->GetPolicyStatus(cmPolicies::CMP0149) == cmPolicies::NEW) { + std::string const version = this->GetWindows10SDKVersion(mf); + if (!version.empty()) { + this->SetWindowsTargetPlatformVersion(version, mf); + return true; + } + } + + // We are not targeting Windows 10+, so fall back to the Windows 8.1 SDK. + // For VS 2019 and above we must explicitly specify it. + if (this->Version >= cmGlobalVisualStudioGenerator::VSVersion::VS16 && + !cmSystemTools::VersionCompareGreater(this->SystemVersion, "8.1")) { + this->SetWindowsTargetPlatformVersion("8.1", mf); + } + return true; } bool cmGlobalVisualStudio14Generator::VerifyNoGeneratorPlatformVersion( - cmMakefile* mf, cm::optional<std::string> reason) const + cmMakefile* mf) const { if (!this->GeneratorPlatformVersion) { return true; @@ -164,9 +253,6 @@ bool cmGlobalVisualStudio14Generator::VerifyNoGeneratorPlatformVersion( " " << this->SystemName << ' ' << this->SystemVersion << '\n' ; /* clang-format on */ - if (reason) { - e << *reason << '.'; - } mf->IssueMessage(MessageType::FATAL_ERROR, e.str()); return false; } @@ -210,16 +296,6 @@ bool cmGlobalVisualStudio14Generator::ProcessGeneratorPlatformField( bool cmGlobalVisualStudio14Generator::SelectWindows10SDK(cmMakefile* mf) { - if (this->GeneratorPlatformVersion && - this->GeneratorPlatformVersion->empty()) { - mf->IssueMessage( - MessageType::FATAL_ERROR, - cmStrCat("Generator\n ", this->GetName(), - "\ngiven platform specification with empty\n version=\n" - "field.")); - return false; - } - // Find the default version of the Windows 10 SDK. std::string const version = this->GetWindows10SDKVersion(mf); @@ -251,7 +327,8 @@ void cmGlobalVisualStudio14Generator::SetWindowsTargetPlatformVersion( std::string const& version, cmMakefile* mf) { this->WindowsTargetPlatformVersion = version; - if (!cmSystemTools::VersionCompareEqual(this->WindowsTargetPlatformVersion, + if (!this->WindowsTargetPlatformVersion.empty() && + !cmSystemTools::VersionCompareEqual(this->WindowsTargetPlatformVersion, this->SystemVersion)) { mf->DisplayStatus(cmStrCat("Selecting Windows SDK version ", this->WindowsTargetPlatformVersion, @@ -299,6 +376,11 @@ bool cmGlobalVisualStudio14Generator::IsWindowsStoreToolsetInstalled() const cmSystemTools::KeyWOW64_32); } +bool cmGlobalVisualStudio14Generator::IsWin81SDKInstalled() const +{ + return true; +} + std::string cmGlobalVisualStudio14Generator::GetWindows10SDKMaxVersion( cmMakefile* mf) const { @@ -360,16 +442,6 @@ std::string cmGlobalVisualStudio14Generator::GetWindows10SDKVersion( cmMakefile* mf) { #if defined(_WIN32) && !defined(__CYGWIN__) - // Accept specific version requests as-is. - if (this->GeneratorPlatformVersion) { - std::string const& ver = *this->GeneratorPlatformVersion; - - // VS 2019 and above support specifying plain "10.0". - if (this->Version >= VSVersion::VS16 && ver == "10.0"_s) { - return ver; - } - } - std::vector<std::string> win10Roots; { |