Windows: Fix CMAKE_HOST_SYSTEM_VERSION on Windows >= 8.1 (#15674)

The GetVersionEx API is deprecated, so try RtlGetVersion first.

Co-Author: Christian Maaser
This commit is contained in:
Brad King 2015-07-30 13:44:31 -04:00
parent 3a0db0223b
commit d4736d53cd
1 changed files with 46 additions and 10 deletions

View File

@ -14,6 +14,20 @@
#if defined(_MSC_VER) && _MSC_VER >= 1800 #if defined(_MSC_VER) && _MSC_VER >= 1800
# define KWSYS_WINDOWS_DEPRECATED_GetVersionEx # define KWSYS_WINDOWS_DEPRECATED_GetVersionEx
#endif #endif
typedef struct {
ULONG dwOSVersionInfoSize;
ULONG dwMajorVersion;
ULONG dwMinorVersion;
ULONG dwBuildNumber;
ULONG dwPlatformId;
WCHAR szCSDVersion[128];
USHORT wServicePackMajor;
USHORT wServicePackMinor;
USHORT wSuiteMask;
UCHAR wProductType;
UCHAR wReserved;
} CMRTL_OSVERSIONINFOEXW;
#endif #endif
#include "cmGlobalGenerator.h" #include "cmGlobalGenerator.h"
@ -437,6 +451,26 @@ cmGlobalGenerator::EnableLanguage(std::vector<std::string>const& languages,
if (!mf->GetDefinition("CMAKE_SYSTEM")) if (!mf->GetDefinition("CMAKE_SYSTEM"))
{ {
#if defined(_WIN32) && !defined(__CYGWIN__) #if defined(_WIN32) && !defined(__CYGWIN__)
CMRTL_OSVERSIONINFOEXW osviex;
ZeroMemory(&osviex, sizeof(osviex));
osviex.dwOSVersionInfoSize = sizeof(osviex);
typedef LONG (FAR WINAPI *cmRtlGetVersion)(CMRTL_OSVERSIONINFOEXW*);
cmRtlGetVersion rtlGetVersion = reinterpret_cast<cmRtlGetVersion>(
GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlGetVersion"));
if (rtlGetVersion && rtlGetVersion(&osviex) == 0)
{
std::ostringstream windowsVersionString;
windowsVersionString << osviex.dwMajorVersion << "."
<< osviex.dwMinorVersion << "."
<< osviex.dwBuildNumber;
windowsVersionString.str();
mf->AddDefinition("CMAKE_HOST_SYSTEM_VERSION",
windowsVersionString.str().c_str());
}
else
{
// RtlGetVersion failed, so use the deprecated GetVersionEx function.
/* Windows version number data. */ /* Windows version number data. */
OSVERSIONINFO osvi; OSVERSIONINFO osvi;
ZeroMemory(&osvi, sizeof(osvi)); ZeroMemory(&osvi, sizeof(osvi));
@ -450,10 +484,12 @@ cmGlobalGenerator::EnableLanguage(std::vector<std::string>const& languages,
# pragma warning (pop) # pragma warning (pop)
#endif #endif
std::ostringstream windowsVersionString; std::ostringstream windowsVersionString;
windowsVersionString << osvi.dwMajorVersion << "." << osvi.dwMinorVersion; windowsVersionString << osvi.dwMajorVersion << "."
<< osvi.dwMinorVersion;
windowsVersionString.str(); windowsVersionString.str();
mf->AddDefinition("CMAKE_HOST_SYSTEM_VERSION", mf->AddDefinition("CMAKE_HOST_SYSTEM_VERSION",
windowsVersionString.str().c_str()); windowsVersionString.str().c_str());
}
#endif #endif
// Read the DetermineSystem file // Read the DetermineSystem file
std::string systemFile = mf->GetModulesFile("CMakeDetermineSystem.cmake"); std::string systemFile = mf->GetModulesFile("CMakeDetermineSystem.cmake");