# - try to find VRJuggler 2.2-related packages (main finder) # VRJUGGLER22_LIBRARY_DIRS, library search paths # VRJUGGLER22_INCLUDE_DIRS, include search paths # VRJUGGLER22_LIBRARIES, the libraries to link against # VRJUGGLER22_ENVIRONMENT # VRJUGGLER22_RUNTIME_LIBRARY_DIRS # VRJUGGLER22_CXX_FLAGS # VRJUGGLER22_DEFINITIONS # VRJUGGLER22_FOUND, If false, do not try to use VR Juggler 2.2. # # Components available to search for (uses "VRJOGL22" by default): # VRJOGL22 # VRJ22 # Gadgeteer12 # JCCL12 # VPR20 # Sonix12 # Tweek12 # # Additionally, a full setup requires these packages and their Find_.cmake scripts # CPPDOM # GMTL # # Optionally uses Flagpoll (and FindFlagpoll.cmake) # # Notes on components: # - All components automatically include their dependencies. # - You can search for the name above with or without the version suffix. # - If you do not specify a component, VRJOGL22(the OpenGL view manager) # will be used by default. # - Capitalization of component names does not matter, but it's best to # pretend it does and use the above capitalization. # - Since this script calls find_package for your requested components and # their dependencies, you can use any of the variables specified in those # files in addition to the "summary" ones listed here, for more finely # controlled building and linking. # # This CMake script requires all of the Find*.cmake scripts for the # components listed above, as it is only a "meta-script" designed to make # using those scripts more developer-friendly. # # Useful configuration variables you might want to add to your cache: # (CAPS COMPONENT NAME)_ROOT_DIR - A directory prefix to search # (a path that contains include/ as a subdirectory) # # The VJ_BASE_DIR environment variable is also searched (preferentially) # when seeking any of the above components, as well as Flagpoll, CPPDOM, # and Boost (from within VPR20), so most sane build environments should # "just work." # # IMPORTANT: Note that you need to manually re-run CMake if you change # this environment variable, because it cannot auto-detect this change # and trigger an automatic re-run. # # Original Author: # 2009-2010 Ryan Pavlik # http://academic.cleardefinition.com # Iowa State University HCI Graduate Program/VRAC # # Copyright Iowa State University 2009-2010. # 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) include(CleanLibraryList) include(CleanDirectoryList) include(FindPackageMessage) set(VRJUGGLER22_ROOT_DIR "${VRJUGGLER22_ROOT_DIR}" CACHE PATH "Additional root directory to search for VR Juggler and its dependencies.") if(NOT VRJUGGLER22_ROOT_DIR) file(TO_CMAKE_PATH "$ENV{VJ_BASE_DIR}" VRJUGGLER22_ROOT_DIR) endif() # Default required components if(NOT VRJuggler22_FIND_COMPONENTS) set(VRJuggler22_FIND_COMPONENTS vrjogl22) endif() if(VRJuggler22_FIND_QUIETLY) set(_FIND_FLAGS "QUIET") else() set(_FIND_FLAGS "") endif() set(VRJUGGLER22_SUBMODULES VRJ22 VRJOGL22 Gadgeteer12 JCCL12 VPR20 Sonix12 Tweek12) string(TOUPPER "${VRJUGGLER22_SUBMODULES}" VRJUGGLER22_SUBMODULES_UC) string(TOUPPER "${VRJuggler22_FIND_COMPONENTS}" VRJUGGLER22_FIND_COMPONENTS_UC) # Turn a potentially messy components list into a nice one with versions. set(VRJUGGLER22_REQUESTED_COMPONENTS) foreach(VRJUGGLER22_LONG_NAME ${VRJUGGLER22_SUBMODULES_UC}) # Look at requested components foreach(VRJUGGLER22_REQUEST ${VRJUGGLER22_FIND_COMPONENTS_UC}) string(REGEX MATCH "${VRJUGGLER22_REQUEST}" VRJUGGLER22_MATCHING "${VRJUGGLER22_LONG_NAME}") if(VRJUGGLER22_MATCHING) list(APPEND VRJUGGLER22_REQUESTED_COMPONENTS ${VRJUGGLER22_LONG_NAME}) list(APPEND VRJUGGLER22_COMPONENTS_FOUND ${VRJUGGLER22_LONG_NAME}_FOUND) endif() endforeach() endforeach() if(VRJUGGLER22_REQUESTED_COMPONENTS) list(REMOVE_DUPLICATES VRJUGGLER22_REQUESTED_COMPONENTS) endif() if(VRJUGGLER22_COMPONENTS_FOUND) list(REMOVE_DUPLICATES VRJUGGLER22_COMPONENTS_FOUND) endif() if(CMAKE_SIZEOF_VOID_P MATCHES "8") set(_VRJ_LIBSUFFIXES lib64 lib) set(_VRJ_LIBDSUFFIXES debug lib64/x86_64/debug lib64/debug lib64 lib/x86_64/debug lib/debug lib) set(_VRJ_LIBDSUFFIXES_ONLY debug lib64/x86_64/debug lib64/debug lib/x86_64/debug lib/debug) else() set(_VRJ_LIBSUFFIXES lib) set(_VRJ_LIBDSUFFIXES debug lib/i686/debug lib/debug lib) set(_VRJ_LIBDSUFFIXES_ONLY debug lib/i686/debug lib/debug) endif() if(NOT VRJuggler22_FIND_QUIETLY AND NOT VRJUGGLER22_FOUND AND NOT "${_VRJUGGLER22_SEARCH_COMPONENTS}" STREQUAL "${VRJUGGLER22_REQUESTED_COMPONENTS}") message(STATUS "Searching for these requested VR Juggler 2.2 components and their dependencies: ${VRJUGGLER22_REQUESTED_COMPONENTS}") endif() # Find components if("${VRJUGGLER22_REQUESTED_COMPONENTS}" MATCHES "VRJOGL22" AND NOT VRJOGL22_FOUND) find_package(VRJOGL22 ${_FIND_FLAGS}) endif() if("${VRJUGGLER22_REQUESTED_COMPONENTS}" MATCHES "VRJ22" AND NOT VRJ22_FOUND) find_package(VRJ22 ${_FIND_FLAGS}) endif() if("${VRJUGGLER22_REQUESTED_COMPONENTS}" MATCHES "JCCL12" AND NOT JCCL12_FOUND) find_package(JCCL22 ${_FIND_FLAGS}) endif() if("${VRJUGGLER22_REQUESTED_COMPONENTS}" MATCHES "GADGETEER12" AND NOT GADGETEER12_FOUND) find_package(Gadgeteer12 ${_FIND_FLAGS}) endif() if("${VRJUGGLER22_REQUESTED_COMPONENTS}" MATCHES "SONIX12" AND NOT SONIX12_FOUND) find_package(Sonix12 ${_FIND_FLAGS}) endif() if("${VRJUGGLER22_REQUESTED_COMPONENTS}" MATCHES "TWEEK12" AND NOT TWEEK12_FOUND) find_package(Tweek12 ${_FIND_FLAGS}) endif() if("${VRJUGGLER22_REQUESTED_COMPONENTS}" MATCHES "VPR20" AND NOT VPR20_FOUND) find_package(VPR20 ${_FIND_FLAGS}) endif() # handle the QUIETLY and REQUIRED arguments and set xxx_FOUND to TRUE if # all listed variables are TRUE include(FindPackageHandleStandardArgs) find_package_handle_standard_args(VRJuggler22 DEFAULT_MSG ${VRJUGGLER22_COMPONENTS_FOUND}) if(VRJUGGLER22_FOUND) foreach(VRJUGGLER22_REQUEST ${VRJUGGLER22_REQUESTED_COMPONENTS}) list(APPEND VRJUGGLER22_LIBRARIES ${${VRJUGGLER22_REQUEST}_LIBRARIES}) list(APPEND VRJUGGLER22_INCLUDE_DIRS ${${VRJUGGLER22_REQUEST}_INCLUDE_DIRS}) endforeach() clean_library_list(VRJUGGLER22_LIBRARIES) clean_directory_list(VRJUGGLER22_INCLUDE_DIRS) set(_vjbase) set(_vjbaseclean) foreach(_lib ${VPR20_LIBRARY} ${VRJ22_LIBRARY} ${VRJOGL22_LIBRARY} ${JCCL12_LIBRARY} ${GADGETEER12_LIBRARY}) get_filename_component(_libpath "${_lib}" PATH) get_filename_component(_abspath "${_libpath}/.." ABSOLUTE) list(APPEND _vjbase "${_abspath}") endforeach() clean_directory_list(_vjbase) set(_vrj22_have_base_dir NO) list(LENGTH _vjbase _vjbaselen) if("${_vjbaselen}" EQUAL 1 AND NOT VRJUGGLER22_VJ_BASE_DIR) list(GET _vjbase 0 VRJUGGLER22_VJ_BASE_DIR) mark_as_advanced(VRJUGGLER22_VJ_BASE_DIR) if(NOT VRJUGGLER22_VJ_BASE_DIR STREQUAL _vrj22_base_dir) unset(VRJUGGLER22_VJ_CFG_DIR) endif() set(_vrj22_have_base_dir YES) else() list(GET _vjbase 0 _calculated_base_dir) if(NOT "${_calculated_base_dir}" STREQUAL "${VRJUGGLER22_VJ_BASE_DIR}") message("It looks like you might be mixing VR Juggler versions... ${_vjbaselen} ${_vjbase}") message("If you are, fix your libraries then remove the VRJUGGLER22_VJ_BASE_DIR variable in CMake, then configure again") message("If you aren't, set the VRJUGGLER22_VJ_BASE_DIR variable to the desired VJ_BASE_DIR to use when running") else() if(NOT VRJUGGLER22_VJ_BASE_DIR STREQUAL _vrj22_base_dir) unset(VRJUGGLER22_VJ_CFG_DIR) endif() set(_vrj22_have_base_dir YES) endif() endif() set(_vrj22_base_dir "${VRJUGGLER22_VJ_BASE_DIR}") set(_vrj22_base_dir "${_vrj22_base_dir}" CACHE INTERNAL "" FORCE) if(_vrj22_have_base_dir) find_path(VRJUGGLER22_VJ_CFG_DIR standalone.jconf PATHS ${VRJUGGLER22_VJ_BASE_DIR}/share/vrjuggler-2.2/data/configFiles ${VRJUGGLER22_VJ_BASE_DIR}/share/vrjuggler/data/configFiles NO_DEFAULT_PATH) mark_as_advanced(VRJUGGLER22_VJ_CFG_DIR) endif() set(VRJUGGLER22_VJ_BASE_DIR "${VRJUGGLER22_VJ_BASE_DIR}" CACHE PATH "Base directory to use as VJ_BASE_DIR when running your app." FORCE) set(VRJUGGLER22_ENVIRONMENT "VJ_BASE_DIR=${VRJUGGLER22_VJ_BASE_DIR}" "JCCL_BASE_DIR=${VRJUGGLER22_VJ_BASE_DIR}" "SONIX_BASE_DIR=${VRJUGGLER22_VJ_BASE_DIR}" "TWEEK_BASE_DIR=${VRJUGGLER22_VJ_BASE_DIR}" "VJ_CFG_DIR=${VRJUGGLER22_VJ_CFG_DIR}") include(GetDirectoryList) get_directory_list(VRJUGGLER22_RUNTIME_LIBRARY_DIRS ${VRJUGGLER22_LIBRARIES}) if(WIN32) foreach(dir ${VRJUGGLER22_RUNTIME_LIBRARY_DIRS}) list(APPEND VRJUGGLER22_RUNTIME_LIBRARY_DIRS "${dir}/../bin") endforeach() endif() if(MSVC) # Needed to make linking against boost work with 2.2.1 binaries - rp20091022 # BOOST_ALL_DYN_LINK set(VRJUGGLER22_DEFINITIONS "-DBOOST_ALL_DYN_LINK" "-DCPPDOM_DYN_LINK" "-DCPPDOM_AUTO_LINK") # Disable these annoying warnings # 4275: non dll-interface class used as base for dll-interface class # 4251: needs to have dll-interface to be used by clients of class # 4100: unused parameter # 4512: assignment operator could not be generated # 4127: (Not currently disabled) conditional expression in loop evaluates to constant set(VRJUGGLER22_CXX_FLAGS "/wd4275 /wd4251 /wd4100 /wd4512") elseif(CMAKE_COMPILER_IS_GNUCXX) # Silence annoying warnings about deprecated hash_map. set(VRJUGGLER22_CXX_FLAGS "-Wno-deprecated") set(VRJUGGLER22_DEFINITIONS "") endif() set(VRJUGGLER22_CXX_FLAGS "${VRJUGGLER22_CXX_FLAGS} ${CPPDOM_CXX_FLAGS}") set(_VRJUGGLER22_SEARCH_COMPONENTS "${VRJUGGLER22_REQUESTED_COMPONENTS}" CACHE INTERNAL "Requested components, used as a flag.") set(_plugin_dirs) foreach(_libdir ${VRJUGGLER22_RUNTIME_LIBRARY_DIRS}) # Find directories of Gadgeteer plugins and drivers if(EXISTS "${_libdir}/gadgeteer") list(APPEND _plugin_dirs "${_libdir}/gadgeteer/drivers" "${_libdir}/gadgeteer/plugins") elseif(EXISTS "${_libdir}/gadgeteer-1.2") list(APPEND _plugin_dirs "${_libdir}/gadgeteer-1.2/drivers" "${_libdir}/gadgeteer-1.2/plugins") endif() # Find directories of Sonix plugins if(EXISTS "${_libdir}/sonix") list(APPEND _plugin_dirs "${_libdir}/sonix/plugins/dbg") list(APPEND _plugin_dirs "${_libdir}/sonix/plugins/opt") elseif(EXISTS "${_libdir}/sonix-1.2") list(APPEND _plugin_dirs "${_libdir}/sonix-1.2/plugins/dbg") list(APPEND _plugin_dirs "${_libdir}/sonix-1.2/plugins/opt") endif() endforeach() # Grab the actual plugins foreach(_libdir ${_plugin_dirs}) if(EXISTS "${_libdir}") list(APPEND VRJUGGLER22_RUNTIME_LIBRARY_DIRS "${_libdir}") file(GLOB _plugins "${_libdir}/*${CMAKE_SHARED_LIBRARY_SUFFIX}") list(APPEND VRJUGGLER22_BUNDLE_PLUGINS ${_plugins}) endif() endforeach() mark_as_advanced(VRJUGGLER22_ROOT_DIR) endif() mark_as_advanced(VRJUGGLER22_DEFINITIONS) function(install_vrjuggler22_data_files prefix) set(base "${VRJUGGLER22_VJ_CFG_DIR}/..") get_filename_component(base "${base}" ABSOLUTE) file(RELATIVE_PATH reldest "${VRJUGGLER22_VJ_BASE_DIR}" "${base}") if(prefix STREQUAL "" OR prefix STREQUAL "." OR prefix STREQUAL "./") set(DEST "${reldest}") else() set(DEST "${prefix}/${reldest}") endif() # configFiles *.jconf file(GLOB _vj_config_files "${base}/configFiles/*.jconf") install(FILES ${_vj_config_files} DESTINATION "${DEST}/configFiles/") # definitions *.jdef file(GLOB _vj_defs_files "${base}/definitions/*.jdef") install(FILES ${_vj_defs_files} DESTINATION "${DEST}/definitions/") # models *.flt file(GLOB _vj_model_files "${base}/models/*.flt") install(FILES ${_vj_model_files} DESTINATION "${DEST}/models/") # sounds *.wav file(GLOB _vj_sound_files "${base}/sounds/*.wav") install(FILES ${_vj_sound_files} DESTINATION "${DEST}/sounds/") # calibration.table - needed? file(GLOB _vj_config_files "${base}/configFiles/*.jconf") install(FILES "${base}/calibration.table" DESTINATION "${DEST}") endfunction() function(install_vrjuggler22_plugins prefix varForFilenames) set(DEST "${prefix}") set(out) foreach(plugin ${VRJUGGLER22_BUNDLE_PLUGINS}) get_filename_component(full "${plugin}" ABSOLUTE) file(RELATIVE_PATH relloc "${VRJUGGLER22_VJ_BASE_DIR}" "${full}") set(filedest "${DEST}/${relloc}") get_filename_component(path "${filedest}" PATH) list(APPEND out "${filedest}") install(FILES "${full}" DESTINATION "${path}") endforeach() set(${varForFilenames} ${out} PARENT_SCOPE) endfunction() function(get_vrjuggler_bundle_sources _target_sources) if(APPLE) set(_bundledir "${VRJUGGLER22_VJ_CFG_DIR}/../bundle") get_filename_component(_bundledir "${_bundledir}" ABSOLUTE) set(_vj_base_dir .) set(_vj_data_dir ${vj_base_dir}/share/vrjuggler-2.2) # Append Mac-specific sources to source list set(_vj_bundle_src ${_bundledir}/vrjuggler.icns ${_bundledir}/vrjuggler.plist ${_bundledir}/en.lproj/MainMenu.nib/classes.nib ${_bundledir}/MainMenu.nib/info.nib ${_bundledir}/MainMenu.nib/keyedobjects.nib) message(STATUS "vjbundlesrc: ${_vj_bundle_src}") set(${_target_sources} ${${_target_sources}} ${_vj_bundle_src} PARENT_SCOPE) # Set destination of nib files set_source_files_properties(${_bundledir}/MainMenu.nib/classes.nib ${_bundledir}/MainMenu.nib/info.nib ${_bundledir}/MainMenu.nib/keyedobjects.nib PROPERTIES MACOSX_PACKAGE_LOCATION Resources/en.lproj/MainMenu.nib/) # Set destination of Resources set_source_files_properties(${_bundledir}/vrjuggler.icns ${_bundledir}/vrjuggler.plist PROPERTIES MACOSX_PACKAGE_LOCATION Resources/) endif() endfunction() get_filename_component(_vrjuggler22moddir ${CMAKE_CURRENT_LIST_FILE} PATH) function(fixup_vrjuggler_app_bundle _target _targetInstallDest _extralibs _libdirs) if(NOT VRJUGGLER22_FOUND) return() endif() set(PACKAGE_DIR ${_vrjuggler22moddir}/package) set(MACOSX_PACKAGE_DIR ${PACKAGE_DIR}/macosx) set(TARGET_LOCATION "${_targetInstallDest}/${_target}${CMAKE_EXECUTABLE_SUFFIX}") if(APPLE) set(TARGET_LOCATION "${TARGET_LOCATION}.app") endif() set_target_properties(${_target} PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${MACOSX_PACKAGE_DIR}/VRJuggler22BundleInfo.plist.in MACOSX_BUNDLE_ICON_FILE vrjuggler.icns MACOSX_BUNDLE_INFO_STRING "${PROJECT_NAME} (VR Juggler Application) version ${CPACK_PACKAGE_VERSION}, created by ${CPACK_PACKAGE_VENDOR}" MACOSX_BUNDLE_GUI_IDENTIFIER org.vrjuggler.${PROJECT_NAME} MACOSX_BUNDLE_SHORT_VERSION_STRING ${CPACK_PACKAGE_VERSION} MACOSX_BUNDLE_BUNDLE_VERSION ${CPACK_PACKAGE_VERSION}) if(WIN32) list(APPEND _libdirs "${VRJUGGLER22_VJ_BASE_DIR}/bin") endif() set(BUNDLE_LIBS ${_extralibs}) set(BUNDLE_LIB_DIRS "${VRJUGGLER22_VJ_BASE_DIR}" ${_libdirs}) configure_file(${PACKAGE_DIR}/fixupbundle.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/${_target}-fixupbundle-juggler.cmake @ONLY) install(SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/${_target}-fixupbundle-juggler.cmake") endfunction()