777 lines
28 KiB
CMake
777 lines
28 KiB
CMake
#######################################################
|
|
## Library sources
|
|
|
|
macro( append_glob list glob )
|
|
file(GLOB files ${glob})
|
|
set(${list} "${${list}};${files}")
|
|
endmacro()
|
|
|
|
## Header only includes / core headers
|
|
set( INCDIR "../include/pangolin" )
|
|
set( HEADERS
|
|
${INCDIR}/pangolin.h
|
|
${INCDIR}/platform.h
|
|
)
|
|
append_glob(HEADERS ${INCDIR}/utils/*.h*)
|
|
append_glob(HEADERS ${INCDIR}/image/*.h*)
|
|
append_glob(HEADERS ${INCDIR}/log/*.h*)
|
|
append_glob(HEADERS ${INCDIR}/geometry/*.h*)
|
|
|
|
### Store list of source files
|
|
append_glob(SOURCES utils/*.cpp)
|
|
append_glob(SOURCES image/*.cpp)
|
|
append_glob(SOURCES log/*.cpp)
|
|
append_glob(SOURCES geometry/*.cpp)
|
|
|
|
### Store list of Video factory registery methods to call for init.
|
|
include(CreateMethodCallFile)
|
|
set( VIDEO_FACTORY_REG "" )
|
|
set( WINDOW_FACTORY_REG "" )
|
|
|
|
#######################################################
|
|
## User build options
|
|
|
|
option(BUILD_PANGOLIN_GUI "Build support for Pangolin GUI" ON)
|
|
if(BUILD_PANGOLIN_GUI)
|
|
append_glob(HEADERS ${INCDIR}/gl/*.h*)
|
|
append_glob(HEADERS ${INCDIR}/display/*.h*)
|
|
append_glob(HEADERS ${INCDIR}/handler/*.h*)
|
|
|
|
append_glob(SOURCES gl/*.cpp)
|
|
append_glob(SOURCES display/*.cpp)
|
|
append_glob(SOURCES handler/*.cpp)
|
|
|
|
if(NOT HAVE_GLES OR HAVE_GLES_2)
|
|
append_glob(HEADERS ${INCDIR}/plot/*.h*)
|
|
append_glob(SOURCES plot/*.cpp)
|
|
endif()
|
|
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_VARS "Build support for Pangolin Vars" ON)
|
|
if(BUILD_PANGOLIN_VARS)
|
|
append_glob(HEADERS ${INCDIR}/var/*.h*)
|
|
append_glob(SOURCES var/*.cpp)
|
|
|
|
if(BUILD_PANGOLIN_GUI)
|
|
list(APPEND HEADERS ${INCDIR}/display/widgets/widgets.h )
|
|
list(APPEND SOURCES display/widgets/widgets.cpp )
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_VIDEO "Build support for Pangolin Video Utilities" ON)
|
|
if(BUILD_PANGOLIN_VIDEO)
|
|
# Generic video includes
|
|
append_glob(HEADERS ${INCDIR}/video/*.h*)
|
|
append_glob(SOURCES video/*.cpp)
|
|
|
|
# Generic video drivers
|
|
list(APPEND HEADERS
|
|
${INCDIR}/video/drivers/test.h
|
|
${INCDIR}/video/drivers/images.h
|
|
${INCDIR}/video/drivers/images_out.h
|
|
${INCDIR}/video/drivers/split.h
|
|
${INCDIR}/video/drivers/truncate.h
|
|
${INCDIR}/video/drivers/pvn.h
|
|
${INCDIR}/video/drivers/pango.h
|
|
${INCDIR}/video/drivers/pango_video_output.h
|
|
${INCDIR}/video/drivers/debayer.h
|
|
${INCDIR}/video/drivers/shift.h
|
|
${INCDIR}/video/drivers/mirror.h
|
|
${INCDIR}/video/drivers/unpack.h
|
|
${INCDIR}/video/drivers/pack.h
|
|
${INCDIR}/video/drivers/join.h
|
|
${INCDIR}/video/drivers/merge.h
|
|
${INCDIR}/video/drivers/thread.h
|
|
)
|
|
list(APPEND SOURCES
|
|
video/drivers/test.cpp
|
|
video/drivers/images.cpp
|
|
video/drivers/images_out.cpp
|
|
video/drivers/split.cpp
|
|
video/drivers/truncate.cpp
|
|
video/drivers/pvn.cpp
|
|
video/drivers/pango.cpp
|
|
video/drivers/pango_video_output.cpp
|
|
video/drivers/debayer.cpp
|
|
video/drivers/shift.cpp
|
|
video/drivers/mirror.cpp
|
|
video/drivers/unpack.cpp
|
|
video/drivers/pack.cpp
|
|
video/drivers/join.cpp
|
|
video/drivers/merge.cpp
|
|
video/drivers/json.cpp
|
|
video/drivers/thread.cpp
|
|
)
|
|
|
|
list(APPEND VIDEO_FACTORY_REG
|
|
RegisterTestVideoFactory
|
|
RegisterImagesVideoFactory
|
|
RegisterImagesVideoOutputFactory
|
|
RegisterSplitVideoFactory
|
|
RegisterTruncateVideoFactory
|
|
RegisterPvnVideoFactory
|
|
RegisterPangoVideoFactory
|
|
RegisterPangoVideoOutputFactory
|
|
RegisterDebayerVideoFactory
|
|
RegisterShiftVideoFactory
|
|
RegisterMirrorVideoFactory
|
|
RegisterUnpackVideoFactory
|
|
RegisterPackVideoFactory
|
|
RegisterJoinVideoFactory
|
|
RegisterMergeVideoFactory
|
|
RegisterJsonVideoFactory
|
|
RegisterThreadVideoFactory
|
|
)
|
|
|
|
if(_LINUX_)
|
|
list(APPEND HEADERS ${INCDIR}/video/drivers/shared_memory.h)
|
|
list(APPEND SOURCES video/drivers/shared_memory.cpp)
|
|
# Required for shared memory API using some versions of glibc
|
|
list(APPEND LINK_LIBS rt pthread)
|
|
endif()
|
|
|
|
endif()
|
|
|
|
if(BUILD_PANGOLIN_GUI AND BUILD_PANGOLIN_VARS AND BUILD_PANGOLIN_VIDEO )
|
|
list(APPEND HEADERS ${INCDIR}/tools/video_viewer.h)
|
|
list(APPEND SOURCES tools/video_viewer.cpp)
|
|
endif()
|
|
|
|
if(_LINUX_)
|
|
set(OpenGL_GL_PREFERENCE "GLVND")
|
|
endif()
|
|
|
|
#######################################################
|
|
## Setup required includes / link info
|
|
|
|
option(DISPLAY_X11 "X11 Window Interface" ON)
|
|
option(DISPLAY_WAYLAND "Wayland Window Interface" OFF)
|
|
|
|
if(BUILD_PANGOLIN_GUI)
|
|
if( ANDROID )
|
|
# Android specific display code
|
|
list(APPEND HEADERS ${INCDIR}/display/device/display_android.h )
|
|
list(APPEND SOURCES display/device/display_android.cpp )
|
|
list(APPEND WINDOW_FACTORY_REG RegisterAndroidWindowFactory)
|
|
|
|
if(HAVE_GLES_2)
|
|
list(APPEND LINK_LIBS "-lEGL;-lGLESv2" )
|
|
else()
|
|
list(APPEND LINK_LIBS "-lEGL;-lGLESv1_CM" )
|
|
endif()
|
|
elseif( IOS )
|
|
list(APPEND LINK_LIBS "-framework OpenGLES" )
|
|
list(APPEND HEADERS "${INCDIR}/ios/PangolinAppDelegate.h" "${INCDIR}/ios/PangolinViewController.h" )
|
|
list(APPEND SOURCES "ios/PangolinAppDelegate.mm" "ios/PangolinViewController.mm" )
|
|
list(APPEND WINDOW_FACTORY_REG RegisterIosWindowFactory)
|
|
else()
|
|
find_package(OpenGL REQUIRED)
|
|
list(APPEND USER_INC ${OPENGL_INCLUDE_DIR})
|
|
list(APPEND LINK_LIBS ${OPENGL_LIBRARIES})
|
|
|
|
if(NOT BUILD_EXTERN_GLEW)
|
|
find_package(GLEW REQUIRED)
|
|
endif()
|
|
list(APPEND USER_INC ${GLEW_INCLUDE_DIR})
|
|
list(APPEND LINK_LIBS ${GLEW_LIBRARY})
|
|
endif()
|
|
|
|
if( HAVE_GLES_2 )
|
|
# Add Pangolins backwards compat layer.
|
|
list(APPEND HEADERS ${INCDIR}/gl2engine.h )
|
|
list(APPEND SOURCES gl2engine.cpp)
|
|
endif()
|
|
|
|
# headless offscreen rendering via EGL
|
|
find_package(OpenGL QUIET COMPONENTS EGL)
|
|
if(OpenGL_EGL_FOUND)
|
|
list(APPEND WINDOW_FACTORY_REG RegisterNoneWindowFactory)
|
|
list(APPEND SOURCES display/device/display_headless.cpp)
|
|
list(APPEND LINK_LIBS ${OPENGL_egl_LIBRARY} )
|
|
endif()
|
|
endif()
|
|
|
|
#######################################################
|
|
## Find optional dependencies
|
|
|
|
if(ANDROID)
|
|
# Fix issue with thread local storage on android.
|
|
add_definitions(-fno-data-sections)
|
|
list(APPEND LINK_LIBS android log)
|
|
elseif(IOS)
|
|
# Nothing specific in here yet.
|
|
else()
|
|
if(BUILD_PANGOLIN_GUI)
|
|
if(_WIN_)
|
|
list(APPEND WINDOW_FACTORY_REG RegisterWinWindowFactory)
|
|
list(APPEND SOURCES display/device/display_win.cpp )
|
|
elseif(_OSX_)
|
|
list(APPEND WINDOW_FACTORY_REG RegisterOsxWindowFactory)
|
|
list(APPEND SOURCES display/device/display_osx.mm display/device/PangolinNSApplication.mm display/device/PangolinNSGLView.mm )
|
|
list(APPEND LINK_LIBS "-framework Cocoa" )
|
|
elseif(_LINUX_)
|
|
# Wayland
|
|
if(DISPLAY_WAYLAND)
|
|
find_package(Wayland QUIET)
|
|
if(WAYLAND_CLIENT_FOUND)
|
|
find_package(Wayland REQUIRED)
|
|
find_package(PkgConfig)
|
|
pkg_check_modules(xkbcommon REQUIRED xkbcommon)
|
|
pkg_check_modules(egl QUIET egl)
|
|
|
|
# find Wayland protocols
|
|
pkg_get_variable(WAYLAND_PROTOCOLS_DIR wayland-protocols pkgdatadir)
|
|
|
|
# generate header for protocol 'xdg_shell'
|
|
set(XDG_PROT_DEF "${WAYLAND_PROTOCOLS_DIR}/stable/xdg-shell/xdg-shell.xml")
|
|
if(EXISTS ${XDG_PROT_DEF})
|
|
# use the 'xdg_shell' protocol
|
|
add_definitions(-DUSE_WL_XDG=1)
|
|
|
|
# find 'wayland-scanner' executable
|
|
pkg_get_variable(WAYLAND_SCANNER wayland-scanner wayland_scanner)
|
|
|
|
# generate protocol implementation
|
|
add_custom_command(
|
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/xdg-shell-client-protocol.h
|
|
COMMAND ${WAYLAND_SCANNER} client-header ${XDG_PROT_DEF} xdg-shell-client-protocol.h)
|
|
add_custom_command(
|
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/xdg-shell-protocol.c
|
|
COMMAND ${WAYLAND_SCANNER} private-code ${XDG_PROT_DEF} xdg-shell-protocol.c
|
|
DEPENDS xdg-shell-client-protocol.h)
|
|
include_directories(${CMAKE_CURRENT_BINARY_DIR})
|
|
list(APPEND SOURCES xdg-shell-protocol.c)
|
|
|
|
else()
|
|
# use deprecated 'wl_shell' interface
|
|
add_definitions(-DUSE_WL_XDG=0)
|
|
endif()
|
|
|
|
list(APPEND WINDOW_FACTORY_REG RegisterWaylandWindowFactory)
|
|
list(APPEND SOURCES display/device/display_wayland.cpp)
|
|
list(APPEND LINK_LIBS
|
|
${WAYLAND_CLIENT_LIBRARIES}
|
|
${WAYLAND_EGL_LIBRARIES}
|
|
${WAYLAND_CURSOR_LIBRARIES}
|
|
${egl_LIBRARIES}
|
|
${xkbcommon_LIBRARIES}
|
|
)
|
|
list(APPEND INTERNAL_INC
|
|
${WAYLAND_CLIENT_INCLUDE_DIR}
|
|
${WAYLAND_EGL_INCLUDE_DIR}
|
|
${WAYLAND_CURSOR_INCLUDE_DIR}
|
|
${egl_INCLUDE_DIRS}
|
|
${xkbcommon_INCLUDE_DIRS}
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
# X11
|
|
find_package(X11 QUIET)
|
|
if(DISPLAY_X11 AND X11_FOUND)
|
|
list(APPEND WINDOW_FACTORY_REG RegisterX11WindowFactory)
|
|
list(APPEND USER_INC ${X11_INCLUDE_DIR})
|
|
list(APPEND SOURCES display/device/display_x11.cpp )
|
|
list(APPEND LINK_LIBS ${X11_LIBRARIES} )
|
|
endif()
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
if(UNIX)
|
|
append_glob(HEADERS ${INCDIR}/utils/posix/*.h*)
|
|
append_glob(SOURCES utils/posix/*.cpp)
|
|
if(_LINUX_)
|
|
# Required for shared memory API using some versions of glibc
|
|
list(APPEND LINK_LIBS rt pthread)
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_PYTHON "Build support for Pangolin Interactive Console" ON)
|
|
if(BUILD_PANGOLIN_PYTHON AND BUILD_PANGOLIN_GUI AND BUILD_PANGOLIN_VARS AND NOT _WIN_)
|
|
if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../external/pybind11/CMakeLists.txt")
|
|
add_subdirectory("../external/pybind11" "${CMAKE_CURRENT_BINARY_DIR}/external/pybind11")
|
|
set( pybind11_FOUND true)
|
|
else()
|
|
find_package(pybind11 QUIET)
|
|
endif()
|
|
|
|
if(pybind11_FOUND)
|
|
set(HAVE_PYTHON 1)
|
|
|
|
file(GLOB pypangolin_SRC "python/pypangolin/*.cpp" )
|
|
file(GLOB pypangolin_HDR "python/pypangolin/*.hpp" )
|
|
list(APPEND HEADERS
|
|
${INCDIR}/console/ConsoleInterpreter.h
|
|
${INCDIR}/console/ConsoleView.h
|
|
${INCDIR}/python/pyinterpreter.h
|
|
${INCDIR}/python/pypangolin_init.h
|
|
${INCDIR}/python/pyuniqueobj.h
|
|
${INCDIR}/python/pyvar.h
|
|
${INCDIR}/python/pypangoio.h
|
|
${pypangolin_HDR}
|
|
)
|
|
list(APPEND SOURCES
|
|
console/ConsoleView.cpp
|
|
python/pyinterpreter.cpp
|
|
python/pypangolin_init.cpp
|
|
${pypangolin_SRC}
|
|
)
|
|
|
|
# pybind11 stuff
|
|
list(APPEND INTERNAL_INC ${PYBIND11_INCLUDE_DIR})
|
|
list(APPEND LINK_LIBS PRIVATE ${pybind11_LIBRARIES})
|
|
|
|
if(_GCC_)
|
|
set_source_files_properties(python/PyInterpreter.cpp PROPERTIES COMPILE_FLAGS "-Wno-missing-field-initializers")
|
|
set_source_files_properties(python/PyModulePangolin.cpp PROPERTIES COMPILE_FLAGS "-fno-strict-aliasing -Wno-missing-field-initializers")
|
|
endif()
|
|
list(APPEND INTERNAL_INC ${PYTHON_INCLUDE_DIRS})
|
|
list(APPEND LINK_LIBS ${PYTHON_LIBRARIES})
|
|
message(STATUS "Python Found and Enabled (with pybind11)")
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_EIGEN "Build support for Eigen matrix types" ON)
|
|
if(BUILD_PANGOLIN_EIGEN)
|
|
find_package(Eigen QUIET)
|
|
if(EIGEN_FOUND)
|
|
set(HAVE_EIGEN 1)
|
|
list(APPEND USER_INC ${EIGEN_INCLUDE_DIR} )
|
|
if(_CLANG_)
|
|
# Eigen causes many of these errors. Suppress.
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-register")
|
|
endif()
|
|
message(STATUS "Eigen Found and Enabled")
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_TOON "Build support for TooN matrix types" ON)
|
|
if(BUILD_PANGOLIN_TOON)
|
|
find_package(TooN QUIET)
|
|
if(TooN_FOUND)
|
|
set(HAVE_TOON 1)
|
|
list(APPEND USER_INC ${TooN_INCLUDE_DIR} )
|
|
message(STATUS "TooN Found and Enabled")
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_LIBDC1394 "Build support for libdc1394 video input" ON)
|
|
if(BUILD_PANGOLIN_LIBDC1394 AND BUILD_PANGOLIN_VIDEO)
|
|
find_package(DC1394 QUIET)
|
|
if(DC1394_FOUND)
|
|
set(HAVE_DC1394 1)
|
|
list(APPEND INTERNAL_INC ${DC1394_INCLUDE_DIR} )
|
|
list(APPEND LINK_LIBS ${DC1394_LIBRARY} )
|
|
list(APPEND HEADERS ${INCDIR}/video/drivers/firewire.h ${INCDIR}/video/drivers/deinterlace.h )
|
|
list(APPEND SOURCES video/drivers/firewire.cpp video/drivers/deinterlace.cpp)
|
|
list(APPEND VIDEO_FACTORY_REG RegisterFirewireVideoFactory )
|
|
message(STATUS "libdc1394 Found and Enabled")
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_V4L "Build support for V4L video input" ON)
|
|
if(BUILD_PANGOLIN_V4L AND BUILD_PANGOLIN_VIDEO AND _LINUX_)
|
|
set(HAVE_V4L 1)
|
|
list(APPEND HEADERS ${INCDIR}/video/drivers/v4l.h)
|
|
list(APPEND SOURCES video/drivers/v4l.cpp)
|
|
list(APPEND VIDEO_FACTORY_REG RegisterV4lVideoFactory )
|
|
message(STATUS "V4L Found and Enabled")
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_FFMPEG "Build support for ffmpeg video input" ON)
|
|
if(BUILD_PANGOLIN_FFMPEG AND BUILD_PANGOLIN_VIDEO)
|
|
find_package(FFMPEG QUIET)
|
|
if(FFMPEG_FOUND)
|
|
set(HAVE_FFMPEG 1)
|
|
list(APPEND INTERNAL_INC ${FFMPEG_INCLUDE_DIRS} )
|
|
list(APPEND LINK_LIBS ${FFMPEG_LIBRARIES} )
|
|
list(APPEND HEADERS ${INCDIR}/video/drivers/ffmpeg.h)
|
|
list(APPEND SOURCES video/drivers/ffmpeg.cpp)
|
|
list(APPEND VIDEO_FACTORY_REG RegisterFfmpegVideoFactory )
|
|
list(APPEND VIDEO_FACTORY_REG RegisterFfmpegVideoOutputFactory )
|
|
|
|
if(_GCC_)
|
|
# FFMPEG is a real pain for deprecating the API.
|
|
set_source_files_properties(video/drivers/ffmpeg.cpp PROPERTIES COMPILE_FLAGS "-Wno-deprecated-declarations")
|
|
endif()
|
|
message(STATUS "ffmpeg Found and Enabled")
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_LIBREALSENSE "Build support for LibRealSense video input" ON)
|
|
if(BUILD_PANGOLIN_LIBREALSENSE AND BUILD_PANGOLIN_VIDEO)
|
|
find_package(LibRealSense QUIET)
|
|
if(LIBREALSENSE_FOUND)
|
|
set(HAVE_LIBREALSENSE 1)
|
|
list(APPEND INTERNAL_INC ${LIBREALSENSE_INCLUDE_DIRS} )
|
|
list(APPEND LINK_LIBS ${LIBREALSENSE_LIBRARIES} )
|
|
list(APPEND HEADERS ${INCDIR}/video/drivers/realsense.h )
|
|
list(APPEND SOURCES video/drivers/realsense.cpp)
|
|
list(APPEND VIDEO_FACTORY_REG RegisterRealSenseVideoFactory )
|
|
message(STATUS "LibRealSense Found and Enabled")
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_LIBREALSENSE2 "Build support for LibRealSense2 video input" ON)
|
|
if(BUILD_PANGOLIN_LIBREALSENSE2 AND BUILD_PANGOLIN_VIDEO)
|
|
find_package(LibRealSense2 QUIET)
|
|
if(LIBREALSENSE2_FOUND)
|
|
set(HAVE_LIBREALSENSE2 1)
|
|
list(APPEND INTERNAL_INC ${LIBREALSENSE2_INCLUDE_DIRS} )
|
|
list(APPEND LINK_LIBS ${LIBREALSENSE2_LIBRARIES} )
|
|
list(APPEND HEADERS ${INCDIR}/video/drivers/realsense2.h )
|
|
list(APPEND SOURCES video/drivers/realsense2.cpp)
|
|
list(APPEND VIDEO_FACTORY_REG RegisterRealSense2VideoFactory )
|
|
message(STATUS "LibRealSense2 Found and Enabled")
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_OPENNI "Build support for OpenNI video input" ON)
|
|
if(BUILD_PANGOLIN_OPENNI AND BUILD_PANGOLIN_VIDEO)
|
|
find_package(OpenNI QUIET)
|
|
if(OPENNI_FOUND)
|
|
set(HAVE_OPENNI 1)
|
|
if(_LINUX_)
|
|
add_definitions(-Dlinux=1)
|
|
endif()
|
|
list(APPEND INTERNAL_INC ${OPENNI_INCLUDE_DIRS} )
|
|
list(APPEND LINK_LIBS ${OPENNI_LIBRARIES} )
|
|
list(APPEND HEADERS ${INCDIR}/video/drivers/openni.h )
|
|
list(APPEND SOURCES video/drivers/openni.cpp)
|
|
list(APPEND VIDEO_FACTORY_REG RegisterOpenNiVideoFactory )
|
|
message(STATUS "OpenNI Found and Enabled")
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_OPENNI2 "Build support for OpenNI2 video input" ON)
|
|
if(BUILD_PANGOLIN_OPENNI2 AND BUILD_PANGOLIN_VIDEO)
|
|
find_package(OpenNI2 QUIET)
|
|
if(OPENNI2_FOUND)
|
|
set(HAVE_OPENNI2 1)
|
|
if(_LINUX_)
|
|
add_definitions(-Dlinux=1)
|
|
endif()
|
|
list(APPEND INTERNAL_INC ${OPENNI2_INCLUDE_DIRS} )
|
|
list(APPEND LINK_LIBS ${OPENNI2_LIBRARIES} )
|
|
list(APPEND HEADERS ${INCDIR}/video/drivers/openni2.h )
|
|
list(APPEND SOURCES video/drivers/openni2.cpp)
|
|
list(APPEND VIDEO_FACTORY_REG RegisterOpenNi2VideoFactory )
|
|
message(STATUS "OpenNI2 Found and Enabled")
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_LIBUVC "Build support for libuvc video input" ON)
|
|
if(BUILD_PANGOLIN_LIBUVC AND BUILD_PANGOLIN_VIDEO)
|
|
find_package(uvc QUIET)
|
|
if(uvc_FOUND)
|
|
set(HAVE_UVC 1)
|
|
list(APPEND INTERNAL_INC ${uvc_INCLUDE_DIRS} )
|
|
list(APPEND LINK_LIBS ${uvc_LIBRARIES} )
|
|
list(APPEND HEADERS ${INCDIR}/video/drivers/uvc.h )
|
|
list(APPEND SOURCES video/drivers/uvc.cpp)
|
|
list(APPEND VIDEO_FACTORY_REG RegisterUvcVideoFactory )
|
|
if(_WIN_)
|
|
find_package(pthread REQUIRED QUIET)
|
|
list(APPEND LINK_LIBS ${pthread_LIBRARIES} )
|
|
|
|
find_package(libusb1 REQUIRED QUIET)
|
|
list(APPEND LINK_LIBS ${libusb1_LIBRARIES} )
|
|
endif()
|
|
message(STATUS "libuvc Found and Enabled")
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_UVC_MEDIAFOUNDATION "Build support for MediaFoundation UVC input" ON)
|
|
if (BUILD_PANGOLIN_UVC_MEDIAFOUNDATION AND BUILD_PANGOLIN_VIDEO)
|
|
find_package(MediaFoundation QUIET)
|
|
if (MediaFoundation_FOUND)
|
|
list(APPEND LINK_LIBS ${MediaFoundation_LIBRARIES} )
|
|
list(APPEND HEADERS ${INCDIR}/video/drivers/uvc_mediafoundation.h )
|
|
list(APPEND SOURCES video/drivers/uvc_mediafoundation.cpp )
|
|
list(APPEND VIDEO_FACTORY_REG RegisterUvcMediaFoundationVideoFactory )
|
|
message(STATUS "MediaFoundation Found and Enabled")
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_DEPTHSENSE "Build support for DepthSense video input" ON)
|
|
if(BUILD_PANGOLIN_DEPTHSENSE AND BUILD_PANGOLIN_VIDEO)
|
|
find_package(DepthSense QUIET)
|
|
if(DepthSense_FOUND)
|
|
set(HAVE_DEPTHSENSE 1)
|
|
list(APPEND INTERNAL_INC ${DepthSense_INCLUDE_DIRS} )
|
|
list(APPEND LINK_LIBS ${DepthSense_LIBRARIES} )
|
|
list(APPEND HEADERS ${INCDIR}/video/drivers/depthsense.h )
|
|
list(APPEND SOURCES video/drivers/depthsense.cpp)
|
|
list(APPEND VIDEO_FACTORY_REG RegisterDepthSenseVideoFactory )
|
|
message(STATUS "DepthSense Found and Enabled")
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_TELICAM "Build support for TeliCam video input" ON)
|
|
if(BUILD_PANGOLIN_TELICAM AND BUILD_PANGOLIN_VIDEO)
|
|
find_package(TeliCam QUIET)
|
|
if(TeliCam_FOUND)
|
|
set(HAVE_TELICAM 1)
|
|
list(APPEND INTERNAL_INC ${TeliCam_INCLUDE_DIRS} )
|
|
list(APPEND LINK_LIBS ${TeliCam_LIBRARIES} )
|
|
list(APPEND HEADERS ${INCDIR}/video/drivers/teli.h )
|
|
list(APPEND SOURCES video/drivers/teli.cpp )
|
|
list(APPEND VIDEO_FACTORY_REG RegisterTeliVideoFactory )
|
|
|
|
message(STATUS "TeliCam Found and Enabled" )
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_PLEORA "Build support for Pleora video input" ON)
|
|
if(BUILD_PANGOLIN_PLEORA AND BUILD_PANGOLIN_VIDEO)
|
|
find_package(Pleora QUIET)
|
|
if(Pleora_FOUND)
|
|
set(HAVE_PLEORA 1)
|
|
list(APPEND INTERNAL_INC ${Pleora_INCLUDE_DIRS} )
|
|
list(APPEND LINK_LIBS ${Pleora_LIBRARIES} )
|
|
list(APPEND HEADERS ${INCDIR}/video/drivers/pleora.h )
|
|
list(APPEND SOURCES video/drivers/pleora.cpp )
|
|
list(APPEND VIDEO_FACTORY_REG RegisterPleoraVideoFactory )
|
|
|
|
if(_GCC_)
|
|
# Suppress warnings generated from Pleora SDK.
|
|
set_source_files_properties(video/drivers/pleora.cpp PROPERTIES COMPILE_FLAGS -Wno-unknown-pragmas)
|
|
set_source_files_properties(video/video.cpp PROPERTIES COMPILE_FLAGS -Wno-unknown-pragmas)
|
|
endif()
|
|
message(STATUS "Pleora Found and Enabled" )
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_LIBPNG "Build support for libpng image input" ON)
|
|
if(BUILD_PANGOLIN_LIBPNG)
|
|
if(NOT BUILD_EXTERN_LIBPNG)
|
|
find_package(PNG QUIET)
|
|
endif()
|
|
if(PNG_FOUND)
|
|
# (ZLIB is also found by FindPNG.cmake as its dependency)
|
|
set(HAVE_PNG 1)
|
|
list(APPEND INTERNAL_INC ${PNG_INCLUDE_DIR} )
|
|
list(APPEND LINK_LIBS ${PNG_LIBRARY} ${ZLIB_LIBRARY} )
|
|
message(STATUS "libpng Found and Enabled")
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_LIBJPEG "Build support for libjpeg image input" ON)
|
|
if(BUILD_PANGOLIN_LIBJPEG)
|
|
if(NOT BUILD_EXTERN_LIBJPEG)
|
|
find_package(JPEG QUIET)
|
|
endif()
|
|
if(JPEG_FOUND)
|
|
set(HAVE_JPEG 1)
|
|
list(APPEND INTERNAL_INC ${JPEG_INCLUDE_DIR} )
|
|
list(APPEND LINK_LIBS ${JPEG_LIBRARY} )
|
|
message(STATUS "libjpeg Found and Enabled")
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_LIBTIFF "Build support for libtiff image input" ON)
|
|
if(BUILD_PANGOLIN_LIBTIFF)
|
|
find_package(TIFF QUIET)
|
|
if(TIFF_FOUND)
|
|
set(HAVE_TIFF 1)
|
|
list(APPEND INTERNAL_INC ${TIFF_INCLUDE_DIR} )
|
|
list(APPEND LINK_LIBS ${TIFF_LIBRARY} )
|
|
message(STATUS "libtiff Found and Enabled")
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_LIBOPENEXR "Build support for libopenexr image input" ON)
|
|
if(BUILD_PANGOLIN_LIBOPENEXR)
|
|
find_package(OpenEXR QUIET)
|
|
if(OpenEXR_FOUND)
|
|
set(HAVE_OPENEXR 1)
|
|
list(APPEND INTERNAL_INC ${OpenEXR_INCLUDE_DIR} )
|
|
list(APPEND LINK_LIBS ${OpenEXR_LIBRARY} )
|
|
message(STATUS "libopenexr Found and Enabled")
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_ZSTD "Build support for libzstd compression" ON)
|
|
if(BUILD_PANGOLIN_ZSTD)
|
|
find_package(zstd QUIET)
|
|
if(zstd_FOUND)
|
|
set(HAVE_ZSTD 1)
|
|
list(APPEND INTERNAL_INC ${zstd_INCLUDE_DIR} )
|
|
list(APPEND LINK_LIBS ${zstd_LIBRARY} )
|
|
message(STATUS "libzstd Found and Enabled")
|
|
endif()
|
|
endif()
|
|
|
|
option(BUILD_PANGOLIN_LZ4 "Build support for liblz4 compression" ON)
|
|
if(BUILD_PANGOLIN_LZ4)
|
|
find_package(Lz4 QUIET)
|
|
if(Lz4_FOUND)
|
|
set(HAVE_LZ4 1)
|
|
list(APPEND INTERNAL_INC ${Lz4_INCLUDE_DIRS} )
|
|
list(APPEND LINK_LIBS ${Lz4_LIBRARIES} )
|
|
message(STATUS "liblz4 Found and Enabled")
|
|
endif()
|
|
endif()
|
|
|
|
#######################################################
|
|
## Embed resource binary files
|
|
|
|
include(EmbedBinaryFiles)
|
|
|
|
if(BUILD_PANGOLIN_GUI)
|
|
embed_binary_files( "_embed_/fonts/*.ttf" "${CMAKE_CURRENT_BINARY_DIR}/fonts.cpp" )
|
|
list(APPEND SOURCES "${CMAKE_CURRENT_BINARY_DIR}/fonts.cpp" )
|
|
endif()
|
|
|
|
#######################################################
|
|
## Add Libraries / Include Directories / Link directories
|
|
|
|
set(INSTALL_INCLUDE_DIR "include")
|
|
|
|
add_library(${LIBRARY_NAME} ${SOURCES} ${HEADERS})
|
|
# 'System' includes shield us from warnings in those includes.
|
|
target_include_directories(${LIBRARY_NAME} SYSTEM PUBLIC ${USER_INC} PRIVATE ${INTERNAL_INC})
|
|
target_include_directories(${LIBRARY_NAME} PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
|
|
$<INSTALL_INTERFACE:${INSTALL_INCLUDE_DIR}>)
|
|
target_link_libraries(${LIBRARY_NAME} PUBLIC ${LINK_LIBS})
|
|
|
|
## Generate symbol export helper header on MSVC
|
|
IF(MSVC)
|
|
string(TOUPPER ${LIBRARY_NAME} LIBRARY_NAME_CAPS)
|
|
include(GenerateExportHeader)
|
|
GENERATE_EXPORT_HEADER( ${LIBRARY_NAME}
|
|
BASE_NAME ${LIBRARY_NAME_CAPS}
|
|
EXPORT_MACRO_NAME ${LIBRARY_NAME_CAPS}_EXPORT
|
|
EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/include/${LIBRARY_NAME}/${LIBRARY_NAME}_export.h"
|
|
STATIC_DEFINE ${LIBRARY_NAME_CAPS}_BUILT_AS_STATIC
|
|
)
|
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/include/${LIBRARY_NAME}/${LIBRARY_NAME}_export.h"
|
|
DESTINATION ${CMAKE_INSTALL_PREFIX}/${INSTALL_INCLUDE_DIR}/${LIBRARY_NAME}
|
|
)
|
|
ENDIF()
|
|
|
|
## Set Special Compiler flags
|
|
if(MSVC)
|
|
set(CMAKE_CXX_FLAGS "/EHs ${CMAKE_CXX_FLAGS}")
|
|
elseif(CMAKE_COMPILER_IS_GNUCXX)
|
|
set(CMAKE_CXX_FLAGS "-Wall -Wno-error=deprecated-declarations ${CMAKE_CXX_FLAGS}")
|
|
endif()
|
|
|
|
#######################################################
|
|
## Create config.h file for inclusion in library
|
|
|
|
configure_file(
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/config.h.in"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/include/${LIBRARY_NAME}/config.h"
|
|
)
|
|
|
|
#######################################################
|
|
## Create video_drivers.h file for inclusion in library
|
|
## This loads video driver factories based on cmake configuration
|
|
|
|
CreateMethodCallFile(
|
|
"${CMAKE_CURRENT_BINARY_DIR}/include/${LIBRARY_NAME}/video_drivers.h"
|
|
"pangolin" "LoadBuiltInVideoDrivers" "${VIDEO_FACTORY_REG}"
|
|
)
|
|
|
|
#######################################################
|
|
## Create window_frameworks.h file for inclusion in library
|
|
## This loads windowing framwork factories based on cmake configuration
|
|
|
|
CreateMethodCallFile(
|
|
"${CMAKE_CURRENT_BINARY_DIR}/include/${LIBRARY_NAME}/window_frameworks.h"
|
|
"pangolin" "LoadBuiltInWindowFrameworks" "${WINDOW_FACTORY_REG}"
|
|
)
|
|
|
|
#######################################################
|
|
## Python wrapper
|
|
|
|
option(BUILD_PYPANGOLIN_MODULE "Python wrapper for Pangolin" ON)
|
|
if(BUILD_PYPANGOLIN_MODULE AND HAVE_PYTHON )
|
|
file(GLOB pypangolin_SRC "python/pypangolin/*.hpp" "python/pypangolin/*.cpp" "python/pypangolin_module.cpp")
|
|
pybind11_add_module(pypangolin ${pypangolin_SRC})
|
|
target_link_libraries(pypangolin PRIVATE ${LIBRARY_NAME})
|
|
target_include_directories(pypangolin PRIVATE "${USER_INC}")
|
|
endif()
|
|
|
|
#######################################################
|
|
## Generate Doxygen documentation target (make pangolin_doc)
|
|
find_package(Doxygen)
|
|
if(DOXYGEN_FOUND)
|
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)
|
|
file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../doc )
|
|
add_custom_target(pangolin_doc
|
|
${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../doc
|
|
COMMENT "Generating API documentation with Doxygen" VERBATIM
|
|
)
|
|
endif()
|
|
|
|
#######################################################
|
|
|
|
# This relative path allows installed files to be relocatable.
|
|
set( CMAKECONFIG_INSTALL_DIR lib/cmake/${PROJECT_NAME} )
|
|
file( RELATIVE_PATH REL_INCLUDE_DIR
|
|
"${CMAKE_INSTALL_PREFIX}/${CMAKECONFIG_INSTALL_DIR}"
|
|
"${CMAKE_INSTALL_PREFIX}/${INSTALL_INCLUDE_DIR}"
|
|
)
|
|
|
|
# Export library for easy inclusion from other cmake projects. APPEND allows
|
|
# call to function even as subdirectory of larger project.
|
|
FILE(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake")
|
|
export( TARGETS ${LIBRARY_NAME}
|
|
APPEND FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake" )
|
|
|
|
# Version information
|
|
configure_file(${PROJECT_NAME}ConfigVersion.cmake.in
|
|
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake" @ONLY)
|
|
|
|
# Build tree config
|
|
set( EXPORT_LIB_INC_DIR "${PROJECT_SOURCE_DIR}/include;${CMAKE_CURRENT_BINARY_DIR}/include" )
|
|
configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in
|
|
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake @ONLY IMMEDIATE )
|
|
|
|
# Install tree config
|
|
set( EXPORT_LIB_INC_DIR "\${PROJECT_CMAKE_DIR}/${REL_INCLUDE_DIR}" )
|
|
configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}Config.cmake.in
|
|
${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}Config.cmake @ONLY )
|
|
|
|
# Add package to CMake package registery for use from the build tree
|
|
option( EXPORT_${PROJECT_NAME}
|
|
"Should the ${PROJECT_NAME} package be exported for use by other software" ON )
|
|
|
|
if( EXPORT_${PROJECT_NAME} )
|
|
export( PACKAGE ${PROJECT_NAME} )
|
|
endif()
|
|
|
|
#######################################################
|
|
## Install headers / targets
|
|
|
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/include/${LIBRARY_NAME}/config.h"
|
|
DESTINATION ${CMAKE_INSTALL_PREFIX}/${INSTALL_INCLUDE_DIR}/${LIBRARY_NAME}
|
|
)
|
|
install(DIRECTORY ${INCDIR}
|
|
DESTINATION ${CMAKE_INSTALL_PREFIX}/${INSTALL_INCLUDE_DIR}
|
|
)
|
|
install(TARGETS ${LIBRARY_NAME}
|
|
EXPORT ${PROJECT_NAME}Targets
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin
|
|
LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
|
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib
|
|
)
|
|
|
|
#######################################################
|
|
## Install CMake config
|
|
|
|
install(
|
|
FILES "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/${PROJECT_NAME}Config.cmake"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
|
|
DESTINATION ${CMAKECONFIG_INSTALL_DIR}
|
|
)
|
|
install(
|
|
EXPORT ${PROJECT_NAME}Targets DESTINATION ${CMAKECONFIG_INSTALL_DIR}
|
|
)
|