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