summaryrefslogtreecommitdiffstats
path: root/Source/cmGlobalVisualStudio14Generator.cxx
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2023-08-09 15:18:25 (GMT)
committerBrad King <brad.king@kitware.com>2023-08-10 14:00:53 (GMT)
commitd5118ed2e5d386be829869cffb681c38d551deae (patch)
tree489a58beb3f4d8dce853cb8b6d66cc3b2f18e10f /Source/cmGlobalVisualStudio14Generator.cxx
parent6b21d2bc9bbe241252b5ad30b7a8bb850518638c (diff)
parent89b611ab3232cdeb4892458bf9d6c3281a8fda00 (diff)
downloadCMake-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.cxx126
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;
{