215 lines
5.5 KiB
CMake
215 lines
5.5 KiB
CMake
cmake_minimum_required(VERSION 3.1)
|
|
project(libuvc
|
|
VERSION 0.0.6
|
|
LANGUAGES C
|
|
)
|
|
|
|
# Additional search scripts path for libusb-1.0, libjpeg, OpenCV
|
|
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake)
|
|
|
|
# Xcode and Visual Studio do not using CMAKE_BUILD_TYPE cache variable
|
|
# so we use Release build type only with single configuration generators.
|
|
if (NOT CMAKE_CONFIGURATION_TYPES)
|
|
if(NOT CMAKE_BUILD_TYPE)
|
|
message(STATUS "No build type selected, default to Release")
|
|
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE)
|
|
endif()
|
|
endif()
|
|
|
|
if(NOT CMAKE_BUILD_TARGET)
|
|
message(STATUS "No target type selected, default to both shared and static library")
|
|
set(CMAKE_BUILD_TARGET "Both" CACHE STRING "" FORCE)
|
|
endif()
|
|
|
|
option(BUILD_EXAMPLE "Build example program" ON)
|
|
option(BUILD_TEST "Build test program" OFF)
|
|
option(ENABLE_UVC_DEBUGGING "Enable UVC debugging" OFF)
|
|
|
|
set(libuvc_DESCRIPTION "A cross-platform library for USB video devices")
|
|
set(libuvc_URL "https://github.com/libuvc/libuvc")
|
|
|
|
set(SOURCES
|
|
src/ctrl.c
|
|
src/ctrl-gen.c
|
|
src/device.c
|
|
src/diag.c
|
|
src/frame.c
|
|
src/init.c
|
|
src/stream.c
|
|
src/misc.c
|
|
)
|
|
|
|
find_package(LibUSB)
|
|
|
|
# JpegPkg name to differ from shipped with CMake
|
|
find_package(JpegPkg QUIET)
|
|
if(JPEG_FOUND)
|
|
message(STATUS "Building libuvc with JPEG support.")
|
|
set(LIBUVC_HAS_JPEG TRUE)
|
|
list(APPEND SOURCES src/frame-mjpeg.c)
|
|
else()
|
|
message(WARNING "JPEG not found. libuvc will not support JPEG decoding.")
|
|
endif()
|
|
|
|
if(${CMAKE_BUILD_TARGET} MATCHES "Shared")
|
|
set(BUILD_UVC_SHARED TRUE)
|
|
elseif(${CMAKE_BUILD_TARGET} MATCHES "Static")
|
|
set(BUILD_UVC_STATIC TRUE)
|
|
elseif(${CMAKE_BUILD_TARGET} MATCHES "Both")
|
|
set(BUILD_UVC_SHARED TRUE)
|
|
set(BUILD_UVC_STATIC TRUE)
|
|
else()
|
|
message(FATAL_ERROR "Invalid build type ${CMAKE_BUILD_TARGET}" )
|
|
endif()
|
|
|
|
if(BUILD_UVC_SHARED)
|
|
add_library(uvc SHARED ${SOURCES})
|
|
set_target_properties(uvc PROPERTIES
|
|
VERSION ${libuvc_VERSION}
|
|
SOVERSION ${libuvc_VERSION_MAJOR}
|
|
# Exported name of target within namespace LibUVC
|
|
EXPORT_NAME UVCShared
|
|
)
|
|
list(APPEND UVC_TARGETS uvc)
|
|
if(NOT LibUVC_STATIC)
|
|
add_library(LibUVC::UVC ALIAS uvc)
|
|
endif()
|
|
# Aliases defined here available only if project included
|
|
# via addsubdirectory
|
|
add_library(LibUVC::UVCShared ALIAS uvc)
|
|
endif()
|
|
|
|
if(BUILD_UVC_STATIC)
|
|
add_library(uvc_static STATIC ${SOURCES})
|
|
set_target_properties(uvc_static PROPERTIES
|
|
OUTPUT_NAME uvc
|
|
# Exported name of target within namespace LibUVC
|
|
EXPORT_NAME UVCStatic
|
|
)
|
|
list(APPEND UVC_TARGETS uvc_static)
|
|
add_library(LibUVC::UVCStatic ALIAS uvc_static)
|
|
if(LibUVC_STATIC)
|
|
add_library(LibUVC::UVC ALIAS uvc_static)
|
|
endif()
|
|
endif()
|
|
|
|
configure_file(include/libuvc/libuvc_config.h.in
|
|
include/libuvc/libuvc_config.h
|
|
@ONLY
|
|
)
|
|
|
|
foreach(target_name IN LISTS UVC_TARGETS)
|
|
target_include_directories(${target_name}
|
|
PUBLIC
|
|
# Different paths for includes for build and install phase supported
|
|
# via INSTALL_INTERFACE and BUILD_INTERFACE generator expressions.
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
|
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>
|
|
$<INSTALL_INTERFACE:include>
|
|
)
|
|
target_link_libraries(${target_name}
|
|
# libusb-1.0 used internally so we link to it privately.
|
|
PRIVATE LibUSB::LibUSB
|
|
)
|
|
if(JPEG_FOUND)
|
|
target_link_libraries(${target_name}
|
|
PRIVATE JPEG::JPEG
|
|
)
|
|
endif()
|
|
set_target_properties(${target_name} PROPERTIES
|
|
PUBLIC_HEADER "include/libuvc/libuvc.h;${CMAKE_CURRENT_BINARY_DIR}/include/libuvc/libuvc_config.h"
|
|
)
|
|
if(ENABLE_UVC_DEBUGGING)
|
|
target_compile_definitions(${target_name}
|
|
PRIVATE
|
|
UVC_DEBUGGING
|
|
)
|
|
endif()
|
|
endforeach()
|
|
|
|
if(BUILD_EXAMPLE)
|
|
add_executable(example src/example.c)
|
|
find_package(Threads)
|
|
target_link_libraries(example
|
|
PRIVATE
|
|
LibUVC::UVC
|
|
Threads::Threads
|
|
)
|
|
endif()
|
|
|
|
if(BUILD_TEST)
|
|
# OpenCV defines targets with transitive dependencies not with namespaces but using opencv_ prefix.
|
|
# This targets provide necessary include directories and linked flags.
|
|
find_package(OpenCVPkg REQUIRED
|
|
COMPONENTS
|
|
opencv_core
|
|
opencv_highgui
|
|
)
|
|
|
|
add_executable(uvc_test src/test.c)
|
|
target_link_libraries(uvc_test
|
|
PRIVATE
|
|
LibUVC::UVC
|
|
opencv_core
|
|
opencv_highgui
|
|
)
|
|
endif()
|
|
|
|
|
|
include(GNUInstallDirs)
|
|
set(CMAKE_INSTALL_CMAKEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/libuvc)
|
|
|
|
install(
|
|
TARGETS ${UVC_TARGETS}
|
|
EXPORT libuvcTargets
|
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
|
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
|
|
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/libuvc
|
|
)
|
|
|
|
install(EXPORT libuvcTargets
|
|
FILE libuvcTargets.cmake
|
|
NAMESPACE LibUVC::
|
|
DESTINATION ${CMAKE_INSTALL_CMAKEDIR}
|
|
)
|
|
|
|
install(FILES
|
|
cmake/FindLibUSB.cmake
|
|
cmake/FindJpegPkg.cmake
|
|
DESTINATION ${CMAKE_INSTALL_CMAKEDIR}
|
|
)
|
|
|
|
include(CMakePackageConfigHelpers)
|
|
write_basic_package_version_file(libuvcConfigVersion.cmake
|
|
COMPATIBILITY AnyNewerVersion
|
|
)
|
|
|
|
install(FILES
|
|
${CMAKE_CURRENT_BINARY_DIR}/libuvcConfigVersion.cmake
|
|
DESTINATION ${CMAKE_INSTALL_CMAKEDIR}
|
|
)
|
|
|
|
if(JPEG_FOUND)
|
|
# If we have used JPEG library we need to
|
|
# add linker flag for it in config file for pkgconfig
|
|
set(PKGCONFIG_JPEG_LDFLAG "-ljpeg")
|
|
endif()
|
|
|
|
configure_file(libuvc.pc.in
|
|
${PROJECT_BINARY_DIR}/libuvc.pc
|
|
@ONLY
|
|
)
|
|
|
|
install(FILES
|
|
${CMAKE_CURRENT_BINARY_DIR}/libuvc.pc
|
|
DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
|
|
)
|
|
|
|
install(FILES libuvcConfig.cmake
|
|
DESTINATION ${CMAKE_INSTALL_CMAKEDIR}
|
|
)
|
|
|
|
|