You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
322 lines
11 KiB
322 lines
11 KiB
# - Find the Windows SDK aka Platform SDK
|
|
#
|
|
# Relevant Wikipedia article: http://en.wikipedia.org/wiki/Microsoft_Windows_SDK
|
|
#
|
|
# Variables:
|
|
# WINDOWSSDK_FOUND - if any version of the windows or platform SDK was found that is usable with the current version of visual studio
|
|
# WINDOWSSDK_LATEST_DIR
|
|
# WINDOWSSDK_LATEST_NAME
|
|
# WINDOWSSDK_FOUND_PREFERENCE - if we found an entry indicating a "preferred" SDK listed for this visual studio version
|
|
# WINDOWSSDK_PREFERRED_DIR
|
|
# WINDOWSSDK_PREFERRED_NAME
|
|
#
|
|
# WINDOWSSDK_DIRS - contains no duplicates, ordered most recent first.
|
|
# WINDOWSSDK_PREFERRED_FIRST_DIRS - contains no duplicates, ordered with preferred first, followed by the rest in descending recency
|
|
#
|
|
# Functions:
|
|
# windowssdk_name_lookup(<directory> <output variable>) - Find the name corresponding with the SDK directory you pass in, or
|
|
# NOTFOUND if not recognized. Your directory must be one of WINDOWSSDK_DIRS for this to work.
|
|
#
|
|
# get_windowssdk_from_component(<file or dir> <output variable>) - Given a library or include dir,
|
|
# find the Windows SDK root dir corresponding to it, or NOTFOUND if unrecognized.
|
|
#
|
|
# get_windowssdk_library_dirs(<directory> <output variable>) - Find the architecture-appropriate
|
|
# library directories corresponding to the SDK directory you pass in (or NOTFOUND if none)
|
|
#
|
|
# get_windowssdk_include_dirs(<directory> <output variable>) - Find the
|
|
# include directories corresponding to the SDK directory you pass in (or NOTFOUND if none)
|
|
#
|
|
# Requires these CMake modules:
|
|
# FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
|
|
#
|
|
# Original Author:
|
|
# 2012 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
|
|
# http://academic.cleardefinition.com
|
|
# Iowa State University HCI Graduate Program/VRAC
|
|
#
|
|
# Copyright Iowa State University 2012.
|
|
# Distributed under the Boost Software License, Version 1.0.
|
|
# (See accompanying file LICENSE_1_0.txt or copy at
|
|
# http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
set(_preferred_sdk_dirs)
|
|
set(_win_sdk_dirs)
|
|
set(_win_sdk_versanddirs)
|
|
if(MSVC_VERSION GREATER 1310) # Newer than VS .NET/VS Toolkit 2003
|
|
|
|
# Environment variable for SDK dir
|
|
if(EXISTS "$ENV{WindowsSDKDir}" AND (NOT "$ENV{WindowsSDKDir}" STREQUAL ""))
|
|
message(STATUS "Got $ENV{WindowsSDKDir} - Windows/Platform SDK directories: ${_win_sdk_dirs}")
|
|
list(APPEND _preferred_sdk_dirs "$ENV{WindowsSDKDir}")
|
|
endif()
|
|
|
|
if(MSVC_VERSION LESS 1600)
|
|
# Per-user current Windows SDK for VS2005/2008
|
|
get_filename_component(_sdkdir
|
|
"[HKEY_CURRENT_USER\\Software\\Microsoft\\Microsoft SDKs\\Windows;CurrentInstallFolder]"
|
|
ABSOLUTE)
|
|
if(EXISTS "${_sdkdir}")
|
|
list(APPEND _preferred_sdk_dirs "${_sdkdir}")
|
|
endif()
|
|
|
|
# System-wide current Windows SDK for VS2005/2008
|
|
get_filename_component(_sdkdir
|
|
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows;CurrentInstallFolder]"
|
|
ABSOLUTE)
|
|
if(EXISTS "${_sdkdir}")
|
|
list(APPEND _preferred_sdk_dirs "${_sdkdir}")
|
|
endif()
|
|
endif()
|
|
|
|
if(MSVC_VERSION LESS 1700)
|
|
# VC 10 and older has broad target support
|
|
set(_winsdk_vistaonly)
|
|
else()
|
|
# VC 11 by default targets Vista and later only, so we can add a few more SDKs that (might?) only work on vista+
|
|
if("${CMAKE_VS_PLATFORM_TOOLSET}" MATCHES "_xp")
|
|
# This is the XP-compatible v110 toolset
|
|
elseif("${CMAKE_VS_PLATFORM_TOOLSET}" STREQUAL "v100")
|
|
# This is the VS2010 toolset
|
|
else()
|
|
if(NOT WINDOWSSDK_FOUND AND NOT WindowsSDK_FIND_QUIETLY)
|
|
message(STATUS "FindWindowsSDK: Detected Visual Studio 2012 or newer, not using the _xp toolset variant: including SDK versions that drop XP support in search!")
|
|
endif()
|
|
# These versions have no XP (and possibly Vista pre-SP1) support
|
|
set(_winsdk_vistaonly)
|
|
if(NOT MSVC_VERSION LESS 1800)
|
|
list(APPEND _winsdk_vistaonly
|
|
# Windows Software Development Kit (SDK) for Windows 8.1
|
|
# http://msdn.microsoft.com/en-gb/windows/desktop/bg162891
|
|
v8.1)
|
|
endif()
|
|
list(APPEND _winsdk_vistaonly
|
|
# Included in Visual Studio 2012
|
|
v8.0A
|
|
|
|
# Microsoft Windows SDK for Windows 8 and .NET Framework 4.5
|
|
# This is the first version to also include the DirectX SDK
|
|
# http://msdn.microsoft.com/en-US/windows/desktop/hh852363.aspx
|
|
v8.0
|
|
|
|
# Microsoft Windows SDK for Windows 7 and .NET Framework 4
|
|
# http://www.microsoft.com/downloads/en/details.aspx?FamilyID=6b6c21d2-2006-4afa-9702-529fa782d63b
|
|
v7.1
|
|
)
|
|
endif()
|
|
endif()
|
|
foreach(_winsdkver
|
|
${_winsdk_vistaonly}
|
|
|
|
# Included in Visual Studio 2013
|
|
# Includes the v120_xp toolset
|
|
v8.1A
|
|
|
|
# Included with VS 2012 Update 1 or later
|
|
# Introduces v110_xp toolset
|
|
v7.1A
|
|
|
|
# Included with VS 2010
|
|
v7.0A
|
|
|
|
# Windows SDK for Windows 7 and .NET Framework 3.5 SP1
|
|
# Works with VC9
|
|
#http://www.microsoft.com/en-us/download/details.aspx?id=18950
|
|
v7.0
|
|
|
|
# Two versions call themselves "v6.1":
|
|
# Older:
|
|
# Windows Vista Update & .NET 3.0 SDK
|
|
# http://www.microsoft.com/en-us/download/details.aspx?id=14477
|
|
|
|
# Newer:
|
|
# Windows Server 2008 & .NET 3.5 SDK
|
|
# may have broken VS9SP1? they recommend v7.0 instead, or a KB...
|
|
# http://www.microsoft.com/en-us/download/details.aspx?id=24826
|
|
v6.1
|
|
|
|
# Included in VS 2008
|
|
v6.0A
|
|
|
|
# Microsoft Windows Software Development Kit for Windows Vista and .NET Framework 3.0 Runtime Components
|
|
# http://blogs.msdn.com/b/stanley/archive/2006/11/08/microsoft-windows-software-development-kit-for-windows-vista-and-net-framework-3-0-runtime-components.aspx
|
|
v6.0)
|
|
|
|
get_filename_component(_sdkdir
|
|
"[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Microsoft SDKs\\Windows\\${_winsdkver};InstallationFolder]"
|
|
ABSOLUTE)
|
|
if(EXISTS "${_sdkdir}")
|
|
list(APPEND _win_sdk_dirs "${_sdkdir}")
|
|
list(APPEND
|
|
_win_sdk_versanddirs
|
|
"Windows SDK ${_winsdkver}"
|
|
"${_sdkdir}")
|
|
endif()
|
|
endforeach()
|
|
endif()
|
|
if(MSVC_VERSION GREATER 1200)
|
|
foreach(_platformsdkinfo
|
|
"D2FF9F89-8AA2-4373-8A31-C838BF4DBBE1_Microsoft Platform SDK for Windows Server 2003 R2"
|
|
"8F9E5EF3-A9A5-491B-A889-C58EFFECE8B3_Microsoft Platform SDK for Windows Server 2003 SP1")
|
|
string(SUBSTRING "${_platformsdkinfo}" 0 36 _platformsdkguid)
|
|
string(SUBSTRING "${_platformsdkinfo}" 37 -1 _platformsdkname)
|
|
foreach(HIVE HKEY_LOCAL_MACHINE HKEY_CURRENT_USER)
|
|
get_filename_component(_sdkdir
|
|
"[${HIVE}\\SOFTWARE\\Microsoft\\MicrosoftSDK\\InstalledSDKs\\${_platformsdkguid};Install Dir]"
|
|
ABSOLUTE)
|
|
if(EXISTS "${_sdkdir}")
|
|
list(APPEND _win_sdk_dirs "${_sdkdir}")
|
|
list(APPEND _win_sdk_versanddirs "${_platformsdkname}" "${_sdkdir}")
|
|
endif()
|
|
endforeach()
|
|
endforeach()
|
|
endif()
|
|
|
|
set(_win_sdk_versanddirs
|
|
"${_win_sdk_versanddirs}"
|
|
CACHE
|
|
INTERNAL
|
|
"mapping between windows sdk version locations and names"
|
|
FORCE)
|
|
|
|
function(windowssdk_name_lookup _dir _outvar)
|
|
list(FIND _win_sdk_versanddirs "${_dir}" _diridx)
|
|
math(EXPR _nameidx "${_diridx} - 1")
|
|
if(${_nameidx} GREATER -1)
|
|
list(GET _win_sdk_versanddirs ${_nameidx} _sdkname)
|
|
else()
|
|
set(_sdkname "NOTFOUND")
|
|
endif()
|
|
set(${_outvar} "${_sdkname}" PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
if(_win_sdk_dirs)
|
|
# Remove duplicates
|
|
list(REMOVE_DUPLICATES _win_sdk_dirs)
|
|
list(GET _win_sdk_dirs 0 WINDOWSSDK_LATEST_DIR)
|
|
windowssdk_name_lookup("${WINDOWSSDK_LATEST_DIR}"
|
|
WINDOWSSDK_LATEST_NAME)
|
|
set(WINDOWSSDK_DIRS ${_win_sdk_dirs})
|
|
endif()
|
|
if(_preferred_sdk_dirs)
|
|
list(GET _preferred_sdk_dirs 0 WINDOWSSDK_PREFERRED_DIR)
|
|
windowssdk_name_lookup("${WINDOWSSDK_LATEST_DIR}"
|
|
WINDOWSSDK_PREFERRED_NAME)
|
|
set(WINDOWSSDK_PREFERRED_FIRST_DIRS
|
|
${_preferred_sdk_dirs}
|
|
${_win_sdk_dirs})
|
|
list(REMOVE_DUPLICATES WINDOWSSDK_PREFERRED_FIRST_DIRS)
|
|
set(WINDOWSSDK_FOUND_PREFERENCE ON)
|
|
|
|
# In case a preferred dir was found that isn't found otherwise
|
|
#set(WINDOWSSDK_DIRS ${WINDOWSSDK_DIRS} ${WINDOWSSDK_PREFERRED_FIRST_DIRS})
|
|
#list(REMOVE_DUPLICATES WINDOWSSDK_DIRS)
|
|
else()
|
|
set(WINDOWSSDK_PREFERRED_DIR "${WINDOWSSDK_LATEST_DIR}")
|
|
set(WINDOWSSDK_PREFERRED_NAME "${WINDOWSSDK_LATEST_NAME}")
|
|
set(WINDOWSSDK_PREFERRED_FIRST_DIRS ${WINDOWSSDK_DIRS})
|
|
set(WINDOWSSDK_FOUND_PREFERENCE OFF)
|
|
endif()
|
|
|
|
include(FindPackageHandleStandardArgs)
|
|
find_package_handle_standard_args(WindowsSDK
|
|
"No compatible version of the Windows SDK or Platform SDK found."
|
|
WINDOWSSDK_DIRS)
|
|
|
|
if(WINDOWSSDK_FOUND)
|
|
if(NOT _winsdk_remembered_dirs STREQUAL WINDOWSSDK_DIRS)
|
|
set(_winsdk_remembered_dirs
|
|
"${WINDOWSSDK_DIRS}"
|
|
CACHE
|
|
INTERNAL
|
|
""
|
|
FORCE)
|
|
if(NOT WindowsSDK_FIND_QUIETLY)
|
|
foreach(_sdkdir ${WINDOWSSDK_DIRS})
|
|
windowssdk_name_lookup("${_sdkdir}" _sdkname)
|
|
message(STATUS " - Found ${_sdkname} at ${_sdkdir}")
|
|
endforeach()
|
|
endif()
|
|
endif()
|
|
|
|
# Internal: Architecture-appropriate library directory names.
|
|
if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "ARM")
|
|
set(_winsdk_archbare /arm) # what the architecture used to be called in oldest SDKs
|
|
set(_winsdk_arch arm) # what the architecture used to be called
|
|
set(_winsdk_arch8 arm) # what the WDK for Win8+ calls this architecture
|
|
else()
|
|
if(CMAKE_SIZEOF_VOID_P MATCHES "8")
|
|
set(_winsdk_archbare /x64) # what the architecture used to be called in oldest SDKs
|
|
set(_winsdk_arch amd64) # what the architecture used to be called
|
|
set(_winsdk_arch8 x64) # what the WDK for Win8+ calls this architecture
|
|
else()
|
|
set(_winsdk_archbare ) # what the architecture used to be called in oldest SDKs
|
|
set(_winsdk_arch i386) # what the architecture used to be called
|
|
set(_winsdk_arch8 x86) # what the WDK for Win8+ calls this architecture
|
|
endif()
|
|
endif()
|
|
|
|
function(get_windowssdk_from_component _component _var)
|
|
get_filename_component(_component "${_component}" ABSOLUTE)
|
|
file(TO_CMAKE_PATH "${_component}" _component)
|
|
foreach(_sdkdir ${WINDOWSSDK_DIRS})
|
|
get_filename_component(_sdkdir "${_sdkdir}" ABSOLUTE)
|
|
string(LENGTH "${_sdkdir}" _sdklen)
|
|
file(RELATIVE_PATH _rel "${_sdkdir}" "${_component}")
|
|
# If we don't have any "parent directory" items...
|
|
if(NOT "${_rel}" MATCHES "[.][.]")
|
|
set(${_var} "${_sdkdir}" PARENT_SCOPE)
|
|
return()
|
|
endif()
|
|
endforeach()
|
|
# Fail.
|
|
set(${_var} "NOTFOUND" PARENT_SCOPE)
|
|
endfunction()
|
|
function(get_windowssdk_library_dirs _winsdk_dir _var)
|
|
set(_result)
|
|
foreach(_suffix
|
|
"lib${_winsdk_archbare}" # SDKs like 7.1A
|
|
"lib/w2k/${_winsdk_arch}" # Win2k min requirement
|
|
"lib/wxp/${_winsdk_arch}" # WinXP min requirement
|
|
"lib/wnet/${_winsdk_arch}" # Win Server 2003 min requirement
|
|
"lib/wlh/${_winsdk_arch}" # Win Vista ("Long Horn") min requirement
|
|
"lib/wlh/um/${_winsdk_arch8}" # Win Vista ("Long Horn") min requirement
|
|
"lib/win7/${_winsdk_arch}" # Win 7 min requirement
|
|
"lib/win7/um/${_winsdk_arch8}" # Win 7 min requirement
|
|
"lib/win8/um/${_winsdk_arch8}" # Win 8 min requirement
|
|
"lib/win8/km/${_winsdk_arch8}" # Win 8 min requirement
|
|
"lib/winv6.3/km/${_winsdk_arch8}" # Win 8.1 min requirement
|
|
"lib/winv6.3/um/${_winsdk_arch8}" # Win 8.1 min requirement
|
|
)
|
|
# Check to see if a library actually exists here.
|
|
file(GLOB _libs "${_winsdk_dir}/${_suffix}/*.lib")
|
|
if(_libs)
|
|
list(APPEND _result "${_winsdk_dir}/${_suffix}")
|
|
endif()
|
|
endforeach()
|
|
if(NOT _result)
|
|
set(_result NOTFOUND)
|
|
endif()
|
|
set(${_var} ${_result} PARENT_SCOPE)
|
|
endfunction()
|
|
function(get_windowssdk_include_dirs _winsdk_dir _var)
|
|
set(_result)
|
|
foreach(_suffix
|
|
"Include"
|
|
"Include/shared"
|
|
"Include/um"
|
|
"Include/winrt"
|
|
"Include/km"
|
|
"Include/wdf"
|
|
)
|
|
# Check to see if a header file actually exists here.
|
|
file(GLOB _headers "${_winsdk_dir}/${_suffix}/*.h")
|
|
if(_headers)
|
|
list(APPEND _result "${_winsdk_dir}/${_suffix}")
|
|
endif()
|
|
endforeach()
|
|
if(NOT _result)
|
|
set(_result NOTFOUND)
|
|
endif()
|
|
set(${_var} ${_result} PARENT_SCOPE)
|
|
endfunction()
|
|
endif()
|
|
|