# Finds various DirectX components:
#
# DINPUT
# D3D9
# D3DX9
# DSOUND
# XINPUT
#
# For each component, this will fill out the following variables
#
# ${COMPONENT}_INCLUDE_DIR - Where to find the component header.
# ${COMPONENT}_LIBRARIES - List of libraries when using the component.
# ${COMPONENT}_FOUND - True if the component is found.
macro(check_winsdk_root_dir key)
get_filename_component(CANDIDATE ${key} ABSOLUTE)
if (EXISTS ${CANDIDATE})
set(WINSDK_ROOT_DIR ${CANDIDATE})
endif()
endmacro()
check_winsdk_root_dir("[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Microsoft SDKs\\\\Windows\\\\v7.0;InstallationFolder]")
check_winsdk_root_dir("[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Microsoft SDKs\\\\Windows\\\\v7.0A;InstallationFolder]")
check_winsdk_root_dir("[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Microsoft SDKs\\\\Windows\\\\v7.1;InstallationFolder]")
check_winsdk_root_dir("[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Microsoft SDKs\\\\Windows\\\\v7.1A;InstallationFolder]")
check_winsdk_root_dir("[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Windows Kits\\\\Installed Roots;KitsRoot]")
check_winsdk_root_dir("[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\Windows Kits\\\\Installed Roots;KitsRoot81]")
# The Win10 SDK doesn't have many DX libraries (such as D3DX9), but it has some.
# Find the Win10 SDK path.
# https://github.com/microsoft/DirectXShaderCompiler/blob/main/cmake/modules/FindD3D12.cmake
if ("$ENV{WIN10_SDK_PATH}$ENV{WIN10_SDK_VERSION}" STREQUAL "" )
get_filename_component(WIN10_SDK_PATH "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows Kits\\Installed Roots;KitsRoot10]" ABSOLUTE CACHE)
set (WIN10_SDK_VERSION ${CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION})
elseif(TRUE)
set (WIN10_SDK_PATH $ENV{WIN10_SDK_PATH})
set (WIN10_SDK_VERSION $ENV{WIN10_SDK_VERSION})
endif ("$ENV{WIN10_SDK_PATH}$ENV{WIN10_SDK_VERSION}" STREQUAL "" )
# WIN10_SDK_PATH will be something like C:\Program Files (x86)\Windows Kits\10
# WIN10_SDK_VERSION will be something like 10.0.14393 or 10.0.14393.0; we need the
# one that matches the directory name.
if (IS_DIRECTORY "${WIN10_SDK_PATH}/Include/${WIN10_SDK_VERSION}.0")
set(WIN10_SDK_VERSION "${WIN10_SDK_VERSION}.0")
endif (IS_DIRECTORY "${WIN10_SDK_PATH}/Include/${WIN10_SDK_VERSION}.0")
if(CMAKE_CL_64 OR CMAKE_SIZEOF_VOID_P EQUAL 8)
set(MINGW_W64_HINT "x86_64-w64-mingw32")
set(PROCESSOR_SUFFIX "x64")
else()
set(MINGW_W64_HINT "i686-w64-mingw32")
set(PROCESSOR_SUFFIX "x86")
endif()
macro(find_component name header library)
if(${name}_INCLUDE_DIR)
# Already in cache, be silent
set(${name}_FIND_QUIETLY TRUE)
endif(${name}_INCLUDE_DIR)
if(MSVC)
find_path(${name}_INCLUDE_DIR ${header}
PATH_SUFFIXES
Include
Include/um
Include/shared
um
shared
PATHS
"$ENV{DXSDK_DIR}"
${WINSDK_ROOT_DIR}
${WIN10_SDK_PATH}/Include/${WIN10_SDK_VERSION}
)
find_library(${name}_LIBRARY
NAMES lib${library} ${library}
PATH_SUFFIXES
Lib
Lib/${PROCESSOR_SUFFIX}
Lib/winv6.3/um/${PROCESSOR_SUFFIX}
Lib/Win8/um/${PROCESSOR_SUFFIX}
um/${PROCESSOR_SUFFIX}
PATHS
"$ENV{DXSDK_DIR}"
${WINSDK_ROOT_DIR}
${WIN10_SDK_PATH}/Lib/${WIN10_SDK_VERSION}
)
else()
find_path(${name}_INCLUDE_DIR ${header}
PATH_SUFFIXES
Include
${MINGW_W64_HINT}/include
PATHS
"$ENV{DXSDK_DIR}"
)
find_library(${name}_LIBRARY
NAMES lib${library} ${library}
PATH_SUFFIXES
${MINGW_W64_HINT}/lib
Lib
Lib/${PROCESSOR_SUFFIX}
PATHS
"$ENV{DXSDK_DIR}"
)
endif()
# Handle the QUIETLY and REQUIRED arguments and set ${name}_FOUND to TRUE if
# all listed variables are TRUE.
set(FPHSA_NAME_MISMATCHED TRUE)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(${name} DEFAULT_MSG
${name}_INCLUDE_DIR ${name}_LIBRARY)
if(${name}_FOUND)
set(${name}_LIBRARIES ${${name}_LIBRARY})
else()
set(${name}_LIBRARIES)
endif()
mark_as_advanced(${name}_INCLUDE_DIR ${name}_LIBRARY)
endmacro()
find_component(DINPUT dinput.h dinput8)
find_component(D3D9 d3d9.h d3d9)
find_component(D3DX9 d3dx9.h d3dx9)
find_component(DSOUND dsound.h dsound)
find_component(XINPUT xinput.h xinput)