stk-code_catmod/lib/wiiuse/cmake/FindVRJuggler22.cmake

504 lines
15 KiB
CMake

# - 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 <rpavlik@iastate.edu> <abiryan@ryand.net>
# 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()