diff --git a/CMake/FindLibNifalcon.cmake b/CMake/FindLibNifalcon.cmake new file mode 100644 index 0000000000000000000000000000000000000000..b32bf5cecd64007de2e76587fbc95e2bceb2663e --- /dev/null +++ b/CMake/FindLibNifalcon.cmake @@ -0,0 +1,95 @@ +# - try to find Libnifalcon library +# +# +# Cache Variables: (probably not for direct use in your scripts) +# LIBNIFALCON_ROOT_DIR - where to start searching +# LIBNIFALCON_INCLUDE_DIR +# LIBNIFALCON_LIBRARY +# LIBNIFALCON_LIBUSB1_LIBRARY - Unix only +# LIBNIFALCON_LIBUSB1_INCLUDE_DIR - Unix only +# LIBNIFALCON_rt_LIBRARY - Unix only +# +# Non-cache variables you might use in your CMakeLists.txt: +# LIBNIFALCON_FOUND +# LIBNIFALCON_INCLUDE_DIRS +# LIBNIFALCON_LIBRARIES +# +# Requires these CMake modules: +# FindPackageHandleStandardArgs (known to be included with CMake >=2.6.2) +# +# 2010 Axel Kohlmeyer, <akohlmey@gmail.com> + +set(LIBNIFALCON_ROOT_DIR + "${LIBNIFALCON_ROOT_DIR}" + CACHE + PATH + "Where to start searching") + +find_library(LIBNIFALCON_LIBRARY + NAMES + libnifalcon + nifalcon + HINTS + "${LIBNIFALCON_ROOT_DIR}" + PATH_SUFFIXES + include) + +get_filename_component(_libdir "${LIBNIFALCON_LIBRARY}" PATH) + +find_path(LIBNIFALCON_INCLUDE_DIR + NAMES + falcon/core/FalconDevice.h + HINTS + "${_libdir}") + +set(_deps_check) +if(NOT WIN32) + find_library(LIBNIFALCON_LIBUSB1_LIBRARY NAMES libusb-1.0 usb-1.0) + get_filename_component(_libdir "${LIBNIFALCON_LIBUSB1_LIBRARY}" PATH) + + find_path(LIBNIFALCON_LIBUSB1_INCLUDE_DIR + NAMES + libusb-1.0/libusb.h + HINTS + "${_libdir}") + + find_library(LIBNIFALCON_rt_LIBRARY NAMES rt) + set(_deps_check + LIBNIFALCON_LIBUSB1_LIBRARY + LIBNIFALCON_LIBUSB1_INCLUDE_DIR + LIBNIFALCON_rt_LIBRARY) +endif() + +find_package(Boost QUIET) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(LibNiFalcon + DEFAULT_MSG + LIBNIFALCON_LIBRARY + LIBNIFALCON_INCLUDE_DIR + Boost_INCLUDE_DIR + ${_deps_check}) + +if(LIBNIFALCON_FOUND) + set(LIBNIFALCON_LIBRARIES "${LIBNIFALCON_LIBRARY}") + set(LIBNIFALCON_LIBRARY_DIRS "${_libdir}") + set(LIBNIFALCON_INCLUDE_DIRS "${LIBNIFALCON_INCLUDE_DIR}" "${Boost_INCLUDE_DIR}") + + if(NOT WIN32) + list(APPEND + LIBNIFALCON_LIBRARIES + "${LIBNIFALCON_LIBUSB1_LIBRARY}" + "${LIBNIFALCON_rt_LIBRARY}") + list(APPEND + LIBNIFALCON_INCLUDE_DIRS + "${LIBNIFALCON_LIBUSB1_INCLUDE_DIR}") + endif() + + mark_as_advanced(LIBNIFALCON_ROOT_DIR) +endif() + +mark_as_advanced(LIBNIFALCON_INCLUDE_DIR + LIBNIFALCON_LIBRARY + LIBNIFALCON_LIBUSB1_LIBRARY + LIBNIFALCON_LIBUSB1_INCLUDE_DIR + LIBNIFALCON_rt_LIBRARY) diff --git a/CMake/FindVRPN.cmake b/CMake/FindVRPN.cmake index 64b4b1c43074a2b9fabddc036c319160b77536e9..45617d219e76fd6d7a120d58c95456e84f29be38 100644 --- a/CMake/FindVRPN.cmake +++ b/CMake/FindVRPN.cmake @@ -27,12 +27,19 @@ set(VRPN_INCLUDE_DIRS "${VRPN_INCLUDE_DIR}") set(VRPN_LIBRARIES "${VRPN_LIBRARY} ${VRPN_QUAT_LIBRARY} ${VRPN_SERVER_LIBRARY} ${VRPN_PHANTOM_LIBRARY}") # Try to find libusb dependency -find_package(Libusb1 REQUIRED) +find_package(Libusb1 QUIET) if(LIBUSB1_FOUND) list(APPEND VRPN_LIBRARIES ${LIBUSB1_LIBRARIES}) list(APPEND VRPN_INCLUDE_DIRS ${LIBUSB1_INCLUDE_DIRS}) endif() +# Try to find falcon dependency +find_package(LibNifalcon QUIET) +if(LIBUSB1_FOUND) + list(APPEND VRPN_LIBRARIES ${LIBNIFALCON_LIBRARIES}) + list(APPEND VRPN_INCLUDE_DIRS ${LIBNIFALCON_INCLUDE_DIRS}) +endif() + include(FindPackageHandleStandardArgs) find_package_handle_standard_args(VRPN @@ -57,12 +64,22 @@ if(VRPN_FOUND) INTERFACE_LINK_LIBRARIES "${VRPN_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${VRPN_INCLUDE_DIR}") endif() - if(NOT TARGET vrpn::libusb) - add_library(vrpn::libusb INTERFACE IMPORTED) - set_target_properties(vrpn::libusb PROPERTIES - INTERFACE_LINK_LIBRARIES "${LIBUSB1_LIBRARIES}" - INTERFACE_INCLUDE_DIRECTORIES "${LIBUSB1_INCLUDE_DIRS}") - endif() + if(LIBUSB1_FOUND) + if(NOT TARGET vrpn::libusb) + add_library(vrpn::libusb INTERFACE IMPORTED) + set_target_properties(vrpn::libusb PROPERTIES + INTERFACE_LINK_LIBRARIES "${LIBUSB1_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${LIBUSB1_INCLUDE_DIRS}") + endif() + endif(LIBUSB1_FOUND) + if(LIBNIFALCON_FOUND) + if(NOT TARGET vrpn::libfalcon) + add_library(vrpn::libfalcon INTERFACE IMPORTED) + set_target_properties(vrpn::libfalcon PROPERTIES + INTERFACE_LINK_LIBRARIES "${LIBNIFALCON_LIBRARIES}" + INTERFACE_INCLUDE_DIRECTORIES "${LIBNIFALCON_INCLUDE_DIRS}") + endif() + endif(LIBNIFALCON_FOUND) if(NOT TARGET vrpn::quat) add_library(vrpn::quat INTERFACE IMPORTED) set_target_properties(vrpn::quat PROPERTIES diff --git a/CMake/SuperBuild/External_LibNifalcon.cmake b/CMake/SuperBuild/External_LibNifalcon.cmake new file mode 100644 index 0000000000000000000000000000000000000000..b60d07763c7577919c3d2890cf1f15397fe1df8c --- /dev/null +++ b/CMake/SuperBuild/External_LibNifalcon.cmake @@ -0,0 +1,79 @@ +########################################################################### +# Copyright 2015 by Kitware and RPI. See toplevel LICENSE.txt for details. +########################################################################### + +set(LibNifalcon_TAG 7e98c9f2bdf936d236260176921c865f8fd1b108) +set(LibNifalcon_REPOSITORY git@github.com:qdot/libnifalcon.git) + +# Make sure this file is included only once +get_filename_component(CMAKE_CURRENT_LIST_FILENAME ${CMAKE_CURRENT_LIST_FILE} NAME_WE) +if(${CMAKE_CURRENT_LIST_FILENAME}_FILE_INCLUDED) + return() +endif() +set(${CMAKE_CURRENT_LIST_FILENAME}_FILE_INCLUDED 1) + +# Sanity checks +if(DEFINED LibNifalcon_DIR AND NOT EXISTS ${LibNifalcon_DIR}) + message(FATAL_ERROR "LibNifalcon_DIR variable is defined but corresponds to non-existing directory") +endif() + +set(LibNifalcon_DEPENDENCIES "") + +# Include dependent projects if any +SimMedTKCheckDependencies(LibNifalcon) + +set(proj LibNifalcon) + +if(NOT DEFINED ${proj}_DIR) + + # Set CMake OSX variable to pass down the external project + set(CMAKE_OSX_EXTERNAL_PROJECT_ARGS) + if(APPLE) + list(APPEND CMAKE_OSX_EXTERNAL_PROJECT_ARGS + -DCMAKE_OSX_ARCHITECTURES:STRING=${CMAKE_OSX_ARCHITECTURES} + -DCMAKE_OSX_SYSROOT:PATH=${CMAKE_OSX_SYSROOT} + -DCMAKE_OSX_DEPLOYMENT_TARGET:STRING=${CMAKE_OSX_DEPLOYMENT_TARGET} + -DCMAKE_MACOSX_RPATH:BOOL=ON + ) + endif() + +# message(STATUS "Adding project:${proj}") + ExternalProject_Add(${proj} + SOURCE_DIR ${CMAKE_BINARY_DIR}/SuperBuild/${proj} + BINARY_DIR ${CMAKE_BINARY_DIR}/SuperBuild/${proj}-build + PREFIX ${CMAKE_BINARY_DIR}/SuperBuild/${proj}${ep_suffix} + GIT_REPOSITORY ${${proj}_REPOSITORY} + GIT_TAG ${${proj}_TAG} + GIT_SUBMODULES cmake_modules + UPDATE_COMMAND "" + INSTALL_COMMAND "" + CMAKE_GENERATOR ${gen} + CMAKE_ARGS + -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + -DCMAKE_CXX_FLAGS:STRING=${ep_common_cxx_flags} + -DCMAKE_C_FLAGS:STRING=${ep_common_c_flags} + -DBUILD_SHARED:BOOL=${SimMedTK_BUILD_SHARED_LIBS} + -DCMAKE_INCLUDE_PATH:STRING=${SimMedTK_CMAKE_INCLUDE_PATH} + -DCMAKE_LIBRARY_PATH:STRING=${SimMedTK_CMAKE_LIBRARY_PATH} + -DBUILD_TESTING:BOOL=OFF + -DBUILD_EXAMPLES:BOOL=OFF + -DBUILD_SWIG_BINDINGS:BOOL=OFF + ${CMAKE_OSX_EXTERNAL_PROJECT_ARGS} + ${OUTPUT_DIRECTORIES} + DEPENDS + ${${proj}_DEPENDENCIES} + LOG_DOWNLOAD 1 # Wrap download in script to log output +# LOG_UPDATE 1 # Wrap update in script to log output +# LOG_CONFIGURE 1 # Wrap configure in script to log output +# LOG_BUILD 1 # Wrap build in script to log output +# LOG_TEST 1 # Wrap test in script to log output +# LOG_INSTALL 1 # Wrap install in script to log output + ) + set(${proj}_DIR ${CMAKE_BINARY_DIR}/SimMedTK-build/lib) + +else() + SimMedTKEmptyExternalProject(${proj} "${${proj}_DEPENDENCIES}") +endif() + +set(SimMedTK_CMAKE_INCLUDE_PATH ${CMAKE_BINARY_DIR}/SuperBuild/${proj}/${sep}${SimMedTK_CMAKE_INCLUDE_PATH}) +list(APPEND SimMedTK_SUPERBUILD_EP_ARGS -DLibNifalcon_DIR:PATH=${${proj}_DIR}) diff --git a/CMake/SuperBuild/External_VRPN.cmake b/CMake/SuperBuild/External_VRPN.cmake index 69ec6b29551f77796b88cc9053d081bd17655c23..70063603f678b5a0e7883075af00e8c83dfc6220 100644 --- a/CMake/SuperBuild/External_VRPN.cmake +++ b/CMake/SuperBuild/External_VRPN.cmake @@ -18,6 +18,9 @@ if(DEFINED VRPN_DIR AND NOT EXISTS ${VRPN_DIR}) endif() set(VRPN_DEPENDENCIES "") +if(SimMedTK_USE_FALCON) + set(VRPN_DEPENDENCIES "LibNifalcon;${VRPN_DEPENDENCIES}") +endif() # Include dependent projects if any SimMedTKCheckDependencies(VRPN) @@ -25,6 +28,15 @@ SimMedTKCheckDependencies(VRPN) set(proj VRPN) if(NOT DEFINED ${proj}_DIR) + set(VRPN_EP_ARGS) + if(SimMedTK_USE_FALCON) + list(APPEND VRPN_EP_ARGS + -DVRPN_USE_LIBNIFALCON:BOOL=ON + -DLibNifalcon_DIR=${LibNifalcon_DIR} + -DCMAKE_INCLUDE_PATH=${SimMedTK_CMAKE_INCLUDE_PATH} + ) + message("SimMedTK_CMAKE_INCLUDE_PATH=${SimMedTK_CMAKE_INCLUDE_PATH}") + endif() # Set CMake OSX variable to pass down the external project set(CMAKE_OSX_EXTERNAL_PROJECT_ARGS) @@ -66,8 +78,8 @@ if(NOT DEFINED ${proj}_DIR) -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} -DCMAKE_CXX_FLAGS:STRING=${ep_common_cxx_flags} -DCMAKE_C_FLAGS:STRING=${ep_common_c_flags} - -DBUILD_SHARED_LIBS:BOOL=OFF - -DVRPN_USE_SHARED_LIBRARY:BOOL=OFF + -DBUILD_SHARED_LIBS:BOOL=${SimMedTK_BUILD_SHARED_LIBS} + -DVRPN_USE_SHARED_LIBRARY:BOOL=${SimMedTK_BUILD_SHARED_LIBS} -DCMAKE_INCLUDE_PATH:STRING=${SimMedTK_CMAKE_INCLUDE_PATH} -DCMAKE_LIBRARY_PATH:STRING=${SimMedTK_CMAKE_LIBRARY_PATH} -DVRPN_SUBPROJECT_BUILD:BOOL=ON @@ -76,11 +88,11 @@ if(NOT DEFINED ${proj}_DIR) -DVRPN_INSTALL:BOOL=OFF -DVRPN_BUILD_PYTHON:BOOL=OFF -DVRPN_USE_GPM_MOUSE:BOOL=OFF - -DVRPN_USE_LIBNIFALCON:BOOL=OFF -DBUILD_TESTING:BOOL=OFF ${CMAKE_OSX_EXTERNAL_PROJECT_ARGS} ${OUTPUT_DIRECTORIES} ${SERVER_ARGS} + ${VRPN_EP_ARGS} DEPENDS ${${proj}_DEPENDENCIES} LOG_DOWNLOAD 1 # Wrap download in script to log output diff --git a/CMakeLists.txt b/CMakeLists.txt index ac2c3d2053f00ca83183a1919ebc6829c456ef8d..77fe7e18bf756cd36e92f0e05e26e40643eb2142 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,7 @@ mark_as_advanced(SimMedTK_SUPERBUILD) option(SimMedTK_USE_PHANTOM_OMNI "Use the phantom omni device." OFF) option(SimMedTK_USE_ADU "Use the adu device." OFF) option(SimMedTK_USE_NIUSB6008 "Use the NIUSB6008 device." OFF) +option(SimMedTK_USE_FALCON "Use the Falcon device." OFF) #----------------------------------------------------------------------------- # VRPN options