|
|
@@ -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;
|
|
|
|
|
|
{
|