From c173e37fa32b9d212cc6305f5e6dc881ba34e140 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 7 Jan 2016 14:54:32 -0500 Subject: [PATCH 1/3] VS: Do not select a partial Windows 10 SDK folder (#15831) Skip SDK candidate folders that do not contain as they are not full SDKs. --- Source/cmGlobalVisualStudio14Generator.cxx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Source/cmGlobalVisualStudio14Generator.cxx b/Source/cmGlobalVisualStudio14Generator.cxx index 41825fb15..803b50083 100644 --- a/Source/cmGlobalVisualStudio14Generator.cxx +++ b/Source/cmGlobalVisualStudio14Generator.cxx @@ -229,6 +229,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() { @@ -252,6 +262,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 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. From ad594de8cc9c4063830df58453b0679c209ff4d8 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 11 Jan 2016 13:42:07 -0500 Subject: [PATCH 2/3] cmSystemTools: Add VersionCompareEqual helper Wrap a call to VersionCompare with OP_EQUAL. --- Source/cmSystemTools.cxx | 8 ++++++++ Source/cmSystemTools.h | 2 ++ 2 files changed, 10 insertions(+) diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 2c5aa8a1a..d8b841509 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -2776,6 +2776,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) diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index b6b09783a..9cafbecfd 100644 --- a/Source/cmSystemTools.h +++ b/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); From a57caf7eecdfe61e4ac5f63b145fc9269610f3f0 Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 11 Jan 2016 13:44:11 -0500 Subject: [PATCH 3/3] VS: Fix Windows 10 SDK version selection (#15831) In commit v3.4.0-rc1~5^2~1 (VS: Add support for selecting the Windows 10 SDK, 2015-09-30) we added Windows 10 SDK selection choosing the most recent SDK that is not newer than the target version. This is backward because it should be up to the application code to not use APIs newer than the target version. It is up to the build system to provide a SDK that has at least the APIs expected to be available for the target version. Furthermore, since the default target version is the host version of Windows, the old approach breaks when the only SDK available is for a newer version of Windows. Fix this by always selecting a Windows 10 SDK if one exists. Use the SDK for the exact version if is available. Otherwise use the latest version of the SDK available because that will have at least the APIs expected for the target version. --- Source/cmGlobalVisualStudio14Generator.cxx | 26 ++++++++-------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/Source/cmGlobalVisualStudio14Generator.cxx b/Source/cmGlobalVisualStudio14Generator.cxx index 803b50083..83499f1a6 100644 --- a/Source/cmGlobalVisualStudio14Generator.cxx +++ b/Source/cmGlobalVisualStudio14Generator.cxx @@ -277,29 +277,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") + // Look for a SDK exactly matching the requested target version. + for (std::vector::iterator i = sdks.begin(); + i != sdks.end(); ++i) { - // Use the latest Windows 10 SDK since no build version was given. - return sdks.at(0); - } - else - { - // Find the SDK less or equal to our specified version - for (std::vector::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