Browse Source

Merge topic 'vs-win10-sdk'

a57caf7e VS: Fix Windows 10 SDK version selection (#15831)
ad594de8 cmSystemTools: Add VersionCompareEqual helper
c173e37f VS: Do not select a partial Windows 10 SDK folder (#15831)
Brad King 9 years ago
parent
commit
ae7398c0a7
3 changed files with 35 additions and 17 deletions
  1. 25 17
      Source/cmGlobalVisualStudio14Generator.cxx
  2. 8 0
      Source/cmSystemTools.cxx
  3. 2 0
      Source/cmSystemTools.h

+ 25 - 17
Source/cmGlobalVisualStudio14Generator.cxx

@@ -231,6 +231,16 @@ cmGlobalVisualStudio14Generator::IsWindowsStoreToolsetInstalled() const
     win10SDK, cmSystemTools::KeyWOW64_32);
 }
 
+#if defined(_WIN32) && !defined(__CYGWIN__)
+struct NoWindowsH
+{
+  bool operator()(std::string const& p)
+    {
+    return !cmSystemTools::FileExists(p + "/um/windows.h", true);
+    }
+};
+#endif
+
 //----------------------------------------------------------------------------
 std::string cmGlobalVisualStudio14Generator::GetWindows10SDKVersion()
 {
@@ -254,6 +264,12 @@ std::string cmGlobalVisualStudio14Generator::GetWindows10SDKVersion()
   std::string path = win10Root + "Include/*";
   // Grab the paths of the different SDKs that are installed
   cmSystemTools::GlobDirs(path, sdks);
+
+  // Skip SDKs that do not contain <um/windows.h> because that indicates that
+  // only the UCRT MSIs were installed for them.
+  sdks.erase(std::remove_if(sdks.begin(), sdks.end(), NoWindowsH()),
+             sdks.end());
+
   if (!sdks.empty())
     {
     // Only use the filename, which will be the SDK version.
@@ -263,29 +279,21 @@ std::string cmGlobalVisualStudio14Generator::GetWindows10SDKVersion()
       *i = cmSystemTools::GetFilenameName(*i);
       }
 
-    // Sort the results to make sure we select the most recent one that
-    // has a version less or equal to our version of the operating system
+    // Sort the results to make sure we select the most recent one.
     std::sort(sdks.begin(), sdks.end(), cmSystemTools::VersionCompareGreater);
 
-    // Select a suitable SDK version.
-    if (this->SystemVersion == "10.0")
-      {
-      // Use the latest Windows 10 SDK since no build version was given.
-      return sdks.at(0);
-      }
-    else
+    // Look for a SDK exactly matching the requested target version.
+    for (std::vector<std::string>::iterator i = sdks.begin();
+         i != sdks.end(); ++i)
       {
-      // Find the SDK less or equal to our specified version
-      for (std::vector<std::string>::iterator i = sdks.begin();
-           i != sdks.end(); ++i)
+      if (cmSystemTools::VersionCompareEqual(*i, this->SystemVersion))
         {
-        if (!cmSystemTools::VersionCompareGreater(*i, this->SystemVersion))
-          {
-          // This is the most recent SDK that we can run safely
-          return *i;
-          }
+        return *i;
         }
       }
+
+    // Use the latest Windows 10 SDK since the exact version is not available.
+    return sdks.at(0);
     }
 #endif
   // Return an empty string

+ 8 - 0
Source/cmSystemTools.cxx

@@ -2779,6 +2779,14 @@ bool cmSystemTools::VersionCompare(cmSystemTools::CompareOp op,
   return op == cmSystemTools::OP_EQUAL;
 }
 
+//----------------------------------------------------------------------------
+bool cmSystemTools::VersionCompareEqual(std::string const& lhs,
+                                        std::string const& rhs)
+{
+  return cmSystemTools::VersionCompare(
+    cmSystemTools::OP_EQUAL, lhs.c_str(), rhs.c_str());
+}
+
 //----------------------------------------------------------------------------
 bool cmSystemTools::VersionCompareGreater(std::string const& lhs,
                                           std::string const& rhs)

+ 2 - 0
Source/cmSystemTools.h

@@ -294,6 +294,8 @@ public:
    * Compare versions
    */
   static bool VersionCompare(CompareOp op, const char* lhs, const char* rhs);
+  static bool VersionCompareEqual(std::string const& lhs,
+                                  std::string const& rhs);
   static bool VersionCompareGreater(std::string const& lhs,
                                     std::string const& rhs);