Browse Source

Merge topic 'vs2015-no-sdk'

f54d28a838 VS: Avoid crash with VS 2015 when all SDKs are higher than 10.0.14393.0

Acked-by: Kitware Robot <[email protected]>
Merge-request: !2656
Brad King 7 years ago
parent
commit
43deb8e004
1 changed files with 21 additions and 17 deletions
  1. 21 17
      Source/cmGlobalVisualStudio14Generator.cxx

+ 21 - 17
Source/cmGlobalVisualStudio14Generator.cxx

@@ -215,6 +215,10 @@ bool cmGlobalVisualStudio14Generator::IsWindowsStoreToolsetInstalled() const
 std::string cmGlobalVisualStudio14Generator::GetWindows10SDKMaxVersion() const
 {
   // The last Windows 10 SDK version that VS 2015 can target is 10.0.14393.0.
+  //
+  // "VS 2015 Users: The Windows 10 SDK (15063, 16299, 17134, 17763) is
+  // officially only supported for VS 2017." From:
+  // https://blogs.msdn.microsoft.com/chuckw/2018/10/02/windows-10-october-2018-update/
   return "10.0.14393.0";
 }
 
@@ -287,28 +291,28 @@ std::string cmGlobalVisualStudio14Generator::GetWindows10SDKVersion()
   // only the UCRT MSIs were installed for them.
   cmEraseIf(sdks, NoWindowsH());
 
-  if (!sdks.empty()) {
-    // Only use the filename, which will be the SDK version.
-    for (std::string& i : sdks) {
-      i = cmSystemTools::GetFilenameName(i);
-    }
+  // Only use the filename, which will be the SDK version.
+  for (std::string& i : sdks) {
+    i = cmSystemTools::GetFilenameName(i);
+  }
 
-    // Sort the results to make sure we select the most recent one.
-    std::sort(sdks.begin(), sdks.end(), cmSystemTools::VersionCompareGreater);
+  // Skip SDKs that cannot be used with our toolset.
+  std::string maxVersion = this->GetWindows10SDKMaxVersion();
+  if (!maxVersion.empty()) {
+    cmEraseIf(sdks, WindowsSDKTooRecent(maxVersion));
+  }
 
-    // Skip SDKs that cannot be used with our toolset.
-    std::string maxVersion = this->GetWindows10SDKMaxVersion();
-    if (!maxVersion.empty()) {
-      cmEraseIf(sdks, WindowsSDKTooRecent(maxVersion));
-    }
+  // Sort the results to make sure we select the most recent one.
+  std::sort(sdks.begin(), sdks.end(), cmSystemTools::VersionCompareGreater);
 
-    // Look for a SDK exactly matching the requested target version.
-    for (std::string const& i : sdks) {
-      if (cmSystemTools::VersionCompareEqual(i, this->SystemVersion)) {
-        return i;
-      }
+  // Look for a SDK exactly matching the requested target version.
+  for (std::string const& i : sdks) {
+    if (cmSystemTools::VersionCompareEqual(i, this->SystemVersion)) {
+      return i;
     }
+  }
 
+  if (!sdks.empty()) {
     // Use the latest Windows 10 SDK since the exact version is not available.
     return sdks.at(0);
   }