1# - try to find part of DirectX SDK
2#
3# Cache Variables: (probably not for direct use in your scripts)
4#  DIRECTX_INCLUDE_DIR
5#
6# Variables you should use in your CMakeLists.txt:
7#  DIRECTX_DXGUID_LIBRARY - deprecated, see below
8#  DIRECTX_DXERR_LIBRARY - deprecated, see http://blogs.msdn.com/b/chuckw/archive/2012/04/24/where-s-dxerr-lib.aspx
9#  DIRECTX_DINPUT_LIBRARY
10#  DIRECTX_DINPUT_INCLUDE_DIR
11#  DIRECTX_D3D9_LIBRARY
12#  DIRECTX_D3DXOF_LIBRARY
13#  DIRECTX_D3DX9_LIBRARIES
14#  DIRECTX_INCLUDE_DIRS
15#  DIRECTX_FOUND - if this is not true, do not attempt to use this library
16#
17# Defines these macros:
18#  find_directx_include - wrapper for find_path that provides PATHS, HINTS, and PATH_SUFFIXES.
19#  find_directx_library - wrapper for find_library that provides PATHS, HINTS, and PATH_SUFFIXES.
20# Requires these CMake modules:
21#  FindPackageHandleStandardArgs (known included with CMake >=2.6.2)
22#  SelectLibraryConfigurations
23#
24# Original Author:
25# 2012 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
26# http://academic.cleardefinition.com
27# Iowa State University HCI Graduate Program/VRAC
28#
29# Copyright Iowa State University 2012.
30# Distributed under the Boost Software License, Version 1.0.
31# (See accompanying file LICENSE_1_0.txt or copy at
32# http://www.boost.org/LICENSE_1_0.txt)
33
34
35set(DIRECTX_ROOT_DIR
36	"${DIRECTX_ROOT_DIR}"
37	CACHE
38	PATH
39	"Root directory to search for DirectX")
40
41if(MSVC)
42	file(TO_CMAKE_PATH "$ENV{ProgramFiles}" _PROG_FILES)
43	set(_PF86 "ProgramFiles(x86)")
44	file(TO_CMAKE_PATH "$ENV{${_PF86}}" _PROG_FILES_X86)
45	if(_PROG_FILES_X86)
46		set(_PROG_FILES "${_PROG_FILES_X86}")
47	endif()
48	if(CMAKE_SIZEOF_VOID_P EQUAL 8)
49		set(_dx_lib_suffixes lib/x64 lib)
50	else()
51		set(_dx_lib_suffixes lib/x86 lib)
52	endif()
53	set(DXSDK_DIRS)
54
55	set(_dx_quiet)
56	if(DirectX_FIND_QUIETLY)
57		set(_dx_quiet QUIET)
58	endif()
59	find_package(WindowsSDK ${_dx_quiet})
60	if(WINDOWSSDK_FOUND)
61		foreach(_dir ${WINDOWSSDK_DIRS})
62			get_windowssdk_include_dirs(${_dir} _include_dirs)
63			if(_include_dirs)
64				list(APPEND DXSDK_DIRS ${_include_dirs})
65			endif()
66		endforeach()
67	endif()
68
69	macro(_append_dxsdk_in_inclusive_range _low _high)
70		if((NOT MSVC_VERSION LESS ${_low}) AND (NOT MSVC_VERSION GREATER ${_high}))
71			list(APPEND DXSDK_DIRS ${ARGN})
72		endif()
73	endmacro()
74	_append_dxsdk_in_inclusive_range(1500 1600 "${_PROG_FILES}/Microsoft DirectX SDK (June 2010)")
75	_append_dxsdk_in_inclusive_range(1400 1600
76		"${_PROG_FILES}/Microsoft DirectX SDK (February 2010)"
77		"${_PROG_FILES}/Microsoft DirectX SDK (August 2009)"
78		"${_PROG_FILES}/Microsoft DirectX SDK (March 2009)"
79		"${_PROG_FILES}/Microsoft DirectX SDK (November 2008)"
80		"${_PROG_FILES}/Microsoft DirectX SDK (August 2008)"
81		"${_PROG_FILES}/Microsoft DirectX SDK (June 2008)"
82		"${_PROG_FILES}/Microsoft DirectX SDK (March 2008)")
83	_append_dxsdk_in_inclusive_range(1310 1500
84		"${_PROG_FILES}/Microsoft DirectX SDK (November 2007)"
85		"${_PROG_FILES}/Microsoft DirectX SDK (August 2007)"
86		"${_PROG_FILES}/Microsoft DirectX SDK (June 2007)"
87		"${_PROG_FILES}/Microsoft DirectX SDK (April 2007)"
88		"${_PROG_FILES}/Microsoft DirectX SDK (February 2007)"
89		"${_PROG_FILES}/Microsoft DirectX SDK (December 2006)"
90		"${_PROG_FILES}/Microsoft DirectX SDK (October 2006)"
91		"${_PROG_FILES}/Microsoft DirectX SDK (August 2006)"
92		"${_PROG_FILES}/Microsoft DirectX SDK (June 2006)"
93		"${_PROG_FILES}/Microsoft DirectX SDK (April 2006)"
94		"${_PROG_FILES}/Microsoft DirectX SDK (February 2006)")
95
96	file(TO_CMAKE_PATH "$ENV{DXSDK_DIR}" ENV_DXSDK_DIR)
97	if(ENV_DXSDK_DIR)
98		list(APPEND DXSDK_DIRS ${ENV_DXSDK_DIR})
99	endif()
100else()
101	set(_dx_lib_suffixes lib)
102	set(DXSDK_DIRS /mingw)
103endif()
104
105find_path(DIRECTX_INCLUDE_DIR
106	NAMES
107	dxdiag.h
108	dinput.h
109	dxerr8.h
110	PATHS
111	${DXSDK_DIRS}
112	HINTS
113	"${DIRECTX_ROOT_DIR}"
114	PATH_SUFFIXES
115	include)
116find_path(DIRECTX_DINPUT_INCLUDE_DIR
117	NAMES
118	dinput.h
119	PATHS
120	${DXSDK_DIRS}
121	HINTS
122	"${DIRECTX_ROOT_DIR}"
123	PATH_SUFFIXES
124	include)
125
126set(DXLIB_HINTS)
127if(WINDOWSSDK_FOUND AND DIRECTX_INCLUDE_DIR)
128	get_windowssdk_from_component("${DIRECTX_INCLUDE_DIR}" _winsdk)
129	if(_winsdk)
130		get_windowssdk_library_dirs("${_winsdk}" _libdirs)
131		if(_libdirs)
132			list(APPEND DXLIB_HINTS ${_libdirs})
133		endif()
134	endif()
135endif()
136
137if(WINDOWSSDK_FOUND AND DIRECTX_DINPUT_INCLUDE_DIR)
138	get_windowssdk_from_component("${DIRECTX_DINPUT_INCLUDE_DIR}" _winsdk)
139	if(_winsdk)
140		get_windowssdk_library_dirs("${_winsdk}" _includes)
141		if(_includes)
142			list(APPEND DXLIB_HINTS ${_includes})
143		endif()
144	endif()
145endif()
146
147find_library(DIRECTX_DXGUID_LIBRARY
148	NAMES
149	dxguid
150	PATHS
151	${DXLIB_HINTS}
152	${DXSDK_DIRS}
153	HINTS
154	"${DIRECTX_ROOT_DIR}"
155	PATH_SUFFIXES
156	${_dx_lib_suffixes})
157
158if(DIRECTX_DXGUID_LIBRARY)
159	get_filename_component(_dxsdk_lib_dir ${DIRECTX_DXGUID_LIBRARY} PATH)
160	list(APPEND DXLIB_HINTS "${_dxsdk_lib_dir}")
161endif()
162
163find_library(DIRECTX_DINPUT_LIBRARY
164	NAMES
165	dinput8
166	dinput
167	PATHS
168	${DXSDK_DIRS}
169	HINTS
170	${DXLIB_HINTS}
171	"${DIRECTX_ROOT_DIR}"
172	PATH_SUFFIXES
173	${_dx_lib_suffixes})
174
175find_library(DIRECTX_DXERR_LIBRARY
176	NAMES
177	dxerr
178	dxerr9
179	dxerr8
180	PATHS
181	${DXSDK_DIRS}
182	HINTS
183	${DXLIB_HINTS}
184	"${DIRECTX_ROOT_DIR}"
185	PATH_SUFFIXES
186	${_dx_lib_suffixes})
187
188find_library(DIRECTX_D3D9_LIBRARY
189	NAMES
190	d3d9
191	PATHS
192	${DXSDK_DIRS}
193	HINTS
194	${DXLIB_HINTS}
195	"${DIRECTX_ROOT_DIR}"
196	PATH_SUFFIXES
197	${_dx_lib_suffixes})
198
199find_library(DIRECTX_D3DXOF_LIBRARY
200	NAMES
201	d3dxof
202	PATHS
203	${DXSDK_DIRS}
204	HINTS
205	${DXLIB_HINTS}
206	"${DIRECTX_ROOT_DIR}"
207	PATH_SUFFIXES
208	${_dx_lib_suffixes})
209
210find_library(DIRECTX_D3DX9_LIBRARY_RELEASE
211	NAMES
212	d3dx9
213	PATHS
214	${DXSDK_DIRS}
215	HINTS
216	${DXLIB_HINTS}
217	"${DIRECTX_ROOT_DIR}"
218	PATH_SUFFIXES
219	${_dx_lib_suffixes})
220
221find_library(DIRECTX_D3DX9_LIBRARY_DEBUG
222	NAMES
223	d3dx9d
224	PATHS
225	${DXSDK_DIRS}
226	HINTS
227	${DXLIB_HINTS}
228	"${DIRECTX_ROOT_DIR}"
229	PATH_SUFFIXES
230	${_dx_lib_suffixes})
231
232find_library(DIRECTX_XINPUT_LIBRARY
233	NAMES
234	Xinput9_1_0
235	Xinput
236	PATHS
237	${DXSDK_DIRS}
238	HINTS
239	${DXLIB_HINTS}
240	"${DIRECTX_ROOT_DIR}"
241	PATH_SUFFIXES
242	${_dx_lib_suffixes})
243
244include(SelectLibraryConfigurations)
245select_library_configurations(DIRECTX_D3DX9)
246
247set(DIRECTX_EXTRA_CHECK)
248if(DIRECTX_INCLUDE_DIR)
249	if(MSVC80)
250		set(DXSDK_DEPRECATION_BUILD 1962)
251	endif()
252
253	if(DXSDK_DEPRECATION_BUILD)
254		include(CheckCSourceCompiles)
255		set(_dinput_old_includes ${CMAKE_REQUIRED_INCLUDES})
256		set(CMAKE_REQUIRED_INCLUDES "${DIRECTX_INCLUDE_DIR}")
257		check_c_source_compiles("
258			#include <dxsdkver.h>
259			#if _DXSDK_BUILD_MAJOR >= ${DXSDK_DEPRECATION_BUILD}
260			#error
261			#else
262			int main(int argc, char * argv[]) {
263				return 0;
264			}
265			#endif
266			"
267			DIRECTX_SDK_SUPPORTS_COMPILER)
268		set(DIRECTX_EXTRA_CHECK DIRECTX_SDK_SUPPORTS_COMPILER)
269		set(CMAKE_REQUIRED_INCLUDES "${_dinput_old_includes}")
270	else()
271		# Until proven otherwise.
272		set(DIRECTX_SDK_SUPPORTS_COMPILER TRUE)
273	endif()
274endif()
275
276include(FindPackageHandleStandardArgs)
277find_package_handle_standard_args(DirectX
278	DEFAULT_MSG
279	DIRECTX_DXGUID_LIBRARY
280	DIRECTX_DINPUT_LIBRARY
281	DIRECTX_INCLUDE_DIR
282	${DIRECTX_EXTRA_CHECK})
283
284if(DIRECTX_FOUND)
285	set(DIRECTX_LIBRARIES
286		"${DIRECTX_DXGUID_LIBRARY}"
287		"${DIRECTX_DINPUT_LIBRARY}")
288
289	set(DIRECTX_INCLUDE_DIRS "${DIRECTX_INCLUDE_DIR}")
290
291	mark_as_advanced(DIRECTX_ROOT_DIR)
292endif()
293
294macro(find_directx_library)
295	find_library(${ARGN}
296		PATHS
297		${DXSDK_DIRS}
298		HINTS
299		${DXLIB_HINTS}
300		"${DIRECTX_ROOT_DIR}"
301		PATH_SUFFIXES
302		${_dx_lib_suffixes})
303endmacro()
304macro(find_directx_include)
305	find_path(${ARGN}
306		PATHS
307		${DXSDK_DIRS}
308		HINTS
309		${DIRECTX_INCLUDE_DIR}
310		"${DIRECTX_ROOT_DIR}"
311		PATH_SUFFIXES
312		include)
313endmacro()
314
315mark_as_advanced(DIRECTX_DINPUT_LIBRARY
316	DIRECTX_DXGUID_LIBRARY
317	DIRECTX_DXERR_LIBRARY
318	DIRECTX_D3D9_LIBRARY
319	DIRECTX_D3DXOF_LIBRARY
320	DIRECTX_D3DX9_LIBRARY_RELEASE
321	DIRECTX_D3DX9_LIBRARY_DEBUG
322	DIRECTX_INCLUDE_DIR)
323