1# - try to find JTTK library
2#
3#  JTTK_LIBRARY_DIRS, library search path
4#  JTTK_INCLUDE_DIRS, include search path
5#  JTTK_{component}_LIBRARY, the library to link against
6#  JTTK_ENVIRONMENT, environment variables to set
7#  JTTK_RUNTIME_LIBRARY_DIRS
8#  JTTK_FOUND, If false, do not try to use this library.
9#
10# If you have license issues, you might run this command on each JtTk-using target:
11#  jttk_stamp_binary(<targetname>)
12#
13# Plural versions refer to this library and its dependencies, and
14# are recommended to be used instead, unless you have a good reason.
15#
16# Useful configuration variables you might want to add to your cache:
17#  JTTK_ROOT_DIR - A directory prefix to search
18#                         (a path that contains include/ as a subdirectory)
19#
20# Original Author:
21# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
22# http://academic.cleardefinition.com
23# Iowa State University HCI Graduate Program/VRAC
24#
25# Copyright Iowa State University 2009-2010.
26# Distributed under the Boost Software License, Version 1.0.
27# (See accompanying file LICENSE_1_0.txt or copy at
28# http://www.boost.org/LICENSE_1_0.txt)
29
30include(ListCombinations)
31include(CheckVersion)
32include(GetDirectoryList)
33include(PrefixListGlob)
34include(GetCompilerInfoString)
35if(WIN32)
36	include(ProgramFilesGlob)
37endif()
38
39set(JTTK_ROOT_DIR
40	"${JTTK_ROOT_DIR}"
41	CACHE
42	PATH
43	"Root directory to search for JtTk")
44
45if(NOT JTTK_CUSTOMER_ID)
46	set(JTTK_CUSTOMER_ID "$ENV{JTTK_CUSTOMER_ID}")
47endif()
48
49set(JTTK_CUSTOMER_ID
50	"${JTTK_CUSTOMER_ID}"
51	CACHE
52	STRING
53	"JtTk customer ID, to place in the environment")
54
55
56get_filename_component(_jttk_mod_dir "${CMAKE_CURRENT_LIST_FILE}" PATH)
57
58if(NOT BITS)
59	if(CMAKE_SIZEOF_VOID_P MATCHES "8")
60		set(BITS 64)
61	else()
62		set(BITS 32)
63	endif()
64endif()
65
66set(JTTK_ENVIRONMENT "JTTK_DEV_PLATFORM=${BITS}")
67if(JTTK_CUSTOMER_ID)
68	list(APPEND JTTK_ENVIRONMENT "JTTK_CUSTOMER_ID=${JTTK_CUSTOMER_ID}")
69endif()
70
71if(WIN32 AND MSVC)
72	if(MSVC90)
73		set(VC_VER vc9)
74		set(VC_VER_LONG vc90)
75	elseif(MSVC80)
76		set(VC_VER vc8)
77		set(VC_VER_LONG vc80)
78	elseif(MSVC71)
79		set(VC_VER vc71)
80		set(VC_VER_LONG vc71)
81	endif()
82
83	if(BITS EQUAL 32)
84		set(PLATFORM win32)
85	else()
86		set(PLATFORM win64)
87	endif()
88endif()
89
90if(NOT "${3RDPARTYROOT}")
91	set(3RDPARTYROOT ${CMAKE_SOURCE_DIR}/third-party)
92endif()
93
94set(libsearchdirs)
95set(includesearchdirs)
96set(_jttklibs)
97set(_libsuffixes)
98if(WIN32)
99	program_files_fallback_glob(_dirs "/UGS/JTOpenToolkit/*/dev")
100	program_files_fallback_glob(_dirs2 "/Siemens/JTOpenToolkit/*/dev")
101	list(APPEND _dirs ${_dirs2})
102
103	file(TO_CMAKE_PATH "$ENV{JTTK_DEV_PATH}" _envloc)
104	list(APPEND _dirs "${_envloc}")
105
106	if(MSVC90)
107		prefix_list_glob(_vc9_libdirs
108			"/lib/win_${BITS}vc9/JtTk*.dll"
109			"${JTTK_ROOT_DIR}"
110			${_dirs})
111		list(APPEND _jttklibs ${_vc9_libdirs})
112		prefix_list_glob(_vc9_libdirs
113			"/lib/win_${BITS}_vc9/JtTk*.dll"
114			"${JTTK_ROOT_DIR}"
115			${_dirs})
116		list(APPEND _jttklibs ${_vc9_libdirs})
117		list(APPEND _libsuffixes "/lib/win_${BITS}vc9" "/lib/win_${BITS}_vc9")
118	endif()
119	if(MSVC80)
120		prefix_list_glob(_vc8_libdirs
121			"/lib/win_${BITS}/JtTk*.dll"
122			"${JTTK_ROOT_DIR}"
123			${_dirs})
124		list(APPEND _jttklibs ${_vc8_libdirs})
125		list(APPEND _libsuffixes "/lib/win_${BITS}")
126	endif()
127	if(MSVC71)
128		prefix_list_glob(_vc71_libdirs
129			"/lib/win_${BITS}vs7/JtTk*.dll"
130			"${dirs}")
131		list(APPEND _jttklibs "${_vc71_libdirs}")
132		list(APPEND _libsuffixes "/lib/win_${BITS}vs7")
133	endif()
134
135elseif(UNIX)
136
137	get_gcc_version(_gccver)
138	if("${_gccver}" VERSION_LESS "4.1.0")
139		set(_compiler "")
140	else()
141		set(_compiler "_gcc41")
142	endif()
143
144	string(TOLOWER "${CMAKE_SYSTEM_NAME}" _sysname)
145	file(TO_CMAKE_PATH "$ENV{JTTK_DEV_PATH}" _envloc)
146	prefix_list_glob(_jttklibs
147		"/lib/${_sysname}_${BITS}${_compiler}/libJtTk*"
148		"${JTTK_ROOT_DIR}"
149		"/usr/"
150		"/usr/local/"
151		"/usr/local/siemens/"
152		"/usr/local/ugs/")
153	prefix_list_glob(_jttklibs2
154		"/dev/lib/${_sysname}_${BITS}${_compiler}/libJtTk*"
155		"${JTTK_ROOT_DIR}"
156		"/usr/"
157		"/usr/local/"
158		"/usr/local/siemens/"
159		"/usr/local/ugs/"
160		"${_envloc}/")
161	list(APPEND _jttklibs ${_jttklibs2})
162
163	list(APPEND _libsuffixes "/lib/${_sysname}_${BITS}${_compiler}")
164endif()
165
166foreach(_lib ${_jttklibs})
167	string(REGEX MATCH "JtTk[0-9][0-9]" _jttkver "${_lib}")
168	if(_jttkver)
169		string(REGEX
170			REPLACE
171			"JtTk([0-9])([0-9])"
172			"\\1.\\2"
173			_verstd
174			"${_jttkver}")
175		string(REGEX
176			REPLACE
177			"JtTk([0-9])([0-9])"
178			"\\1\\2"
179			_vernodot
180			"${_jttkver}")
181	endif()
182	check_version(_result JtTk "${_verstd}")
183	if(_result)
184		get_filename_component(_libpath "${_lib}" PATH)
185		list(APPEND JTTK_JTTK_VERSIONS ${_vernodot})
186		list(APPEND JTTK_DEV_PATHS "${_libpath}")
187	else()
188		#message(STATUS "Found JtTk version ${ver}, does not meet requirements")
189	endif()
190endforeach()
191
192if(JTTK_JTTK_VERSIONS)
193	list(SORT JTTK_JTTK_VERSIONS)
194	list(REVERSE JTTK_JTTK_VERSIONS)
195endif()
196
197###
198# Configure JtTk
199###
200
201###
202# Find the link library
203###
204list_combinations(names PREFIXES "JtTk" SUFFIXES ${JTTK_JTTK_VERSIONS})
205find_library(JTTK_JtTk_LIBRARY
206	NAMES
207	${names}
208	HINTS
209	${JTTK_DEV_PATHS}
210	PATH_SUFFIXES
211	${_libsuffixes})
212set(JTTK_LIBRARY "${JTTK_JtTk_LIBRARY}")
213set(JTTK_LIBRARIES "${JTTK_JtTk_LIBRARY}")
214
215###
216# Prepare for the rest of our search based off of where we found the link library
217###
218get_filename_component(JTTK_LIBRARY_DIR "${JTTK_LIBRARY}" PATH)
219get_filename_component(JTTK_DEV_PATH
220	"${JTTK_LIBRARY_DIR}/../.."
221	ABSOLUTE)
222
223# Grab JtTk version
224string(REGEX MATCH "JtTk[0-9]*" _ver "${JTTK_LIBRARY}")
225string(REGEX
226	REPLACE
227	"JtTk([0-9])([0-9])"
228	"\\1.\\2"
229	JTTK_JTTK_VERSION
230	"${_ver}")
231string(REGEX
232	REPLACE
233	"JtTk([0-9])([0-9])"
234	"\\1\\2"
235	JTTK_JTTK_VERNODOT
236	"${_ver}")
237
238# Grab JT version
239file(GLOB _jtdll "${JTTK_LIBRARY_DIR}/*JtBrep*")
240string(REGEX MATCH "JtBrep[0-9]*" _jtver "${_jtdll}")
241string(REGEX
242	REPLACE
243	"JtBrep([0-9])([0-9])"
244	"\\1\\2"
245	JTTK_JT_VERNODOT
246	"${_jtver}")
247
248# Setup dev path
249get_filename_component(JTTK_DEV_PATH
250	"${JTTK_LIBRARY_DIR}/../../"
251	ABSOLUTE)
252
253list(APPEND JTTK_ENVIRONMENT "JTTK_DEV_PATH=${JTTK_DEV_PATH}")
254set(ENV{JTTK_DEV_PLATFORM} ${BITS})
255set(ENV{JTTK_DEV_PATH} "${JTTK_DEV_PATH}")
256
257set(_deps_libs)
258set(_deps_includes)
259set(_deps_check)
260
261###
262# Find the headers
263###
264find_path(JTTK_INCLUDE_DIR
265	JtTk/JtkEntity.h
266	HINTS
267	${JTTK_DEV_PATH}/include)
268
269if(WIN32)
270	###
271	# Find the DLL's
272	###
273
274	# Find the versioned DLL's
275	foreach(dll Jt JtBrep JtLibra JtSimp JtSupt JtXTBrep ParaSupt)
276		find_file(JTTK_${dll}_DLL
277			NAMES
278			"${dll}${JTTK_JT_VERNODOT}.dll"
279			HINTS
280			"${JTTK_LIBRARY_DIR}")
281		list(APPEND JTTK_DLLS ${JTTK_${dll}_DLL})
282		mark_as_advanced(JTTK_${dll}_DLL)
283	endforeach()
284
285	# Find the unversioned DLL's and the matching JtTk dll
286	foreach(dll psbodyshop pskernel psxttoolkit JtTk${JTTK_JTTK_VERNODOT})
287		list_combinations(names PREFIXES "${dll}" SUFFIXES ".dll")
288		find_file(JTTK_${dll}_DLL
289			NAMES
290			${names}
291			HINTS
292			"${JTTK_LIBRARY_DIR}")
293		list(APPEND JTTK_DLLS ${JTTK_${dll}_DLL})
294		mark_as_advanced(JTTK_${dll}_DLL)
295	endforeach()
296
297	get_directory_list(JTTK_RUNTIME_LIBRARY_DIRS ${JTTK_DLLS})
298
299elseif(UNIX)
300
301	foreach(_lib Jt JtBrep JtLibra JtSimp JtSupt JtXTBrep ParaSupt)
302		find_library(JTTK_${_lib}_LIBRARY
303			NAMES
304			"${_lib}${JTTK_JT_VERNODOT}"
305			HINTS
306			"${JTTK_LIBRARY_DIR}")
307		list(APPEND _deps_libs "${JTTK_${_lib}_LIBRARY}")
308		list(APPEND _deps_check JTTK_${_lib}_LIBRARY)
309		mark_as_advanced(JTTK_${_lib}_LIBRARY)
310	endforeach()
311
312	# Find the unversioned libs
313	foreach(_lib psbodyshop pskernel psxttoolkit eaiunicode)
314		find_library(JTTK_${_lib}_LIBRARY
315			NAMES
316			${_lib}
317			HINTS
318			"${JTTK_LIBRARY_DIR}")
319		list(APPEND _deps_libs "${JTTK_${_lib}_LIBRARY}")
320		list(APPEND _deps_check JTTK_${_lib}_LIBRARY)
321		mark_as_advanced(JTTK_${_lib}_LIBRARY)
322	endforeach()
323
324	# Find stamper
325	#list(APPEND _deps_check JTTK_KEYS)
326
327	find_program(JTTK_STAMP_COMMAND
328		stampkey
329		HINTS
330		"${JTTK_DEV_PATH}/../bin")
331	list(APPEND _deps_check JTTK_STAMP_COMMAND)
332
333	find_program(JTTK_STAMP_PLATFORM_COMMAND
334		stampkey
335		HINTS
336		"${JTTK_DEV_PATH}/../bin/${_sysname}")
337	list(APPEND _deps_check JTTK_STAMP_PLATFORM_COMMAND)
338
339
340	if("${JTTK_KEYS}" STREQUAL "${JTTK_KEYS_AUTO}" OR NOT JTTK_KEYS)
341		find_file(JTTK_INSTALL_LOG
342			install.log
343			HINTS
344			"${JTTK_DEV_PATH}/.."
345			NO_DEFAULT_PATH)
346		#list(APPEND _deps_check JTTK_INSTALL_LOG)
347		mark_as_advanced(JTTK_INSTALL_LOG)
348
349		if(JTTK_INSTALL_LOG)
350			file(READ "${JTTK_INSTALL_LOG}" _log)
351			string(REGEX MATCHALL "..key ([0-9A-Z])+" _keylines "${_log}")
352			set(JTTK_KEYS)
353			foreach(_keyline ${_keylines})
354				string(REGEX
355					REPLACE
356					"..key (([0-9A-Z])+)$"
357					"\\1"
358					_key
359					"${_keyline}")
360				list(APPEND JTTK_KEYS "${_key}")
361				message(STATUS "Found JtTk key: ${_key}")
362			endforeach()
363			set(JTTK_KEYS
364				"${JTTK_KEYS}"
365				CACHE
366				STRING
367				"A semi-colon separated list of JtTk keys to stamp on the binaries."
368				FORCE)
369			set(JTTK_KEYS_AUTO
370				"${JTTK_KEYS}"
371				CACHE
372				INTERNAL
373				"The keys we auto-detected"
374				FORCE)
375		endif()
376	else()
377		foreach(_key ${JTTK_KEYS})
378			message(STATUS "Using cached JtTk key: ${_key}")
379		endforeach()
380		set(JTTK_KEYS
381			"${JTTK_KEYS}"
382			CACHE
383			STRING
384			"A semi-colon separated list of JtTk keys to stamp on the binaries.")
385	endif()
386
387	# Find dependencies
388	find_library(JTTK_MATH_LIBRARY m)
389	mark_as_advanced(JTTK_MATH_LIBRARY)
390	list(APPEND _deps_check JTTK_MATH_LIBRARY)
391	list(APPEND _deps_libs ${JTTK_MATH_LIBRARY})
392
393	if(NOT X11_FOUND)
394		find_package(X11)
395	endif()
396	list(APPEND _deps_check X11_FOUND)
397	list(APPEND _deps_libs ${X11_LIBRARIES})
398	list(APPEND _deps_includes ${X11_INCLUDE_DIRS})
399
400	if(NOT OPENGL_FOUND)
401		find_package(OpenGL)
402	endif()
403	list(APPEND _deps_check OPENGL_FOUND)
404	list(APPEND _deps_libs ${OPENGL_LIBRARIES})
405	list(APPEND _deps_includes ${OPENGL_INCLUDE_DIR})
406
407	if(NOT THREADS_FOUND)
408		find_package(Threads)
409	endif()
410	list(APPEND _deps_check THREADS_FOUND)
411	list(APPEND _deps_libs ${CMAKE_THREAD_LIBS_INIT})
412
413	get_directory_list(JTTK_RUNTIME_LIBRARY_DIRS ${_deps_libs})
414endif()
415
416# handle the QUIETLY and REQUIRED arguments and set xxx_FOUND to TRUE if
417# all listed variables are TRUE
418include(FindPackageHandleStandardArgs)
419find_package_handle_standard_args(JtTk
420	DEFAULT_MSG
421	JTTK_JtTk_LIBRARY
422	JTTK_CUSTOMER_ID
423	JTTK_INCLUDE_DIR
424	${_deps_check})
425
426if(JTTK_FOUND)
427	set(JTTK_INCLUDE_DIRS "${JTTK_INCLUDE_DIR}" ${_deps_includes})
428	set(JTTK_LIBRARIES "${JTTK_LIBRARY}" ${_deps_libs})
429	mark_as_advanced(JTTK_CUSTOMER_ID JTTK_ROOT_DIR)
430endif()
431
432function(jttk_stamp_binary _target)
433	if(UNIX)
434		get_target_property(_binary "${_target}" LOCATION)
435		configure_file("${_jttk_mod_dir}/FindJtTk.stampkey.cmake.in"
436			"${CMAKE_CURRENT_BINARY_DIR}/${_target}.stampkey.cmake"
437			@ONLY)
438		add_custom_command(TARGET
439			"${_target}"
440			POST_BUILD
441			COMMAND
442			"${CMAKE_COMMAND}"
443			-P
444			"${CMAKE_CURRENT_BINARY_DIR}/${_target}.stampkey.cmake"
445			COMMENT
446			"Stamping executable ${_binary} with JtTk keys..."
447			VERBATIM)
448	endif()
449endfunction()
450
451mark_as_advanced(JTTK_JtTk_LIBRARY
452	JTTK_INCLUDE_DIR
453	JTTK_KEYS
454	JTTK_STAMP_COMMAND
455	JTTK_STAMP_PLATFORM_COMMAND)
456