564 lines
21 KiB
CMake
564 lines
21 KiB
CMake
cmake_minimum_required(VERSION 3.20)
|
|
|
|
project(cvmmap-streamer LANGUAGES CXX)
|
|
|
|
set(CMAKE_CXX_STANDARD 23)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
|
|
include(GNUInstallDirs)
|
|
|
|
function(cvmmap_streamer_append_runtime_dir out_var runtime_library)
|
|
execute_process(
|
|
COMMAND "${CMAKE_CXX_COMPILER}" -print-file-name=${runtime_library}
|
|
OUTPUT_VARIABLE runtime_library_path
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
if (IS_ABSOLUTE "${runtime_library_path}")
|
|
get_filename_component(runtime_library_dir "${runtime_library_path}" DIRECTORY)
|
|
set(${out_var} "${${out_var}};${runtime_library_dir}" PARENT_SCOPE)
|
|
endif()
|
|
endfunction()
|
|
|
|
function(cvmmap_streamer_resolve_feature_mode out_var option_name requested_mode available unavailable_reason)
|
|
set(_valid_modes AUTO ON OFF)
|
|
list(FIND _valid_modes "${requested_mode}" _requested_mode_index)
|
|
if (_requested_mode_index EQUAL -1)
|
|
message(FATAL_ERROR
|
|
"Invalid ${option_name}='${requested_mode}' (expected: AUTO|ON|OFF)")
|
|
endif()
|
|
|
|
if (requested_mode STREQUAL "OFF")
|
|
set(${out_var} FALSE PARENT_SCOPE)
|
|
return()
|
|
endif()
|
|
|
|
if (requested_mode STREQUAL "ON")
|
|
if (NOT available)
|
|
message(FATAL_ERROR
|
|
"${option_name}=ON requires ${unavailable_reason}")
|
|
endif()
|
|
|
|
set(${out_var} TRUE PARENT_SCOPE)
|
|
return()
|
|
endif()
|
|
|
|
set(${out_var} ${available} PARENT_SCOPE)
|
|
endfunction()
|
|
|
|
set(CVMMAP_STREAMER_BUILD_RPATH "")
|
|
# Build-tree binaries compiled with a non-system GCC need that toolchain's
|
|
# C++ runtime on the dynamic loader search path.
|
|
cvmmap_streamer_append_runtime_dir(CVMMAP_STREAMER_BUILD_RPATH libstdc++.so.6)
|
|
cvmmap_streamer_append_runtime_dir(CVMMAP_STREAMER_BUILD_RPATH libgcc_s.so.1)
|
|
list(REMOVE_DUPLICATES CVMMAP_STREAMER_BUILD_RPATH)
|
|
|
|
set(
|
|
CVMMAP_STREAMER_ENABLE_MCAP
|
|
"AUTO"
|
|
CACHE STRING
|
|
"Enable MCAP recording support: AUTO, ON, or OFF")
|
|
set_property(CACHE CVMMAP_STREAMER_ENABLE_MCAP PROPERTY STRINGS AUTO ON OFF)
|
|
set(
|
|
CVMMAP_STREAMER_ENABLE_MCAP_DEPTH
|
|
"AUTO"
|
|
CACHE STRING
|
|
"Enable MCAP depth recording support: AUTO, ON, or OFF")
|
|
set_property(CACHE CVMMAP_STREAMER_ENABLE_MCAP_DEPTH PROPERTY STRINGS AUTO ON OFF)
|
|
set(
|
|
CVMMAP_STREAMER_MCAP_INCLUDE_DIR
|
|
"${CMAKE_CURRENT_LIST_DIR}/third_party/mcap/include"
|
|
CACHE PATH
|
|
"Path to MCAP headers")
|
|
|
|
find_package(Threads REQUIRED)
|
|
find_package(OpenSSL REQUIRED)
|
|
if (NOT TARGET OpenSSL::SSL AND DEFINED OPENSSL_SSL_LIBRARY)
|
|
add_library(OpenSSL::SSL UNKNOWN IMPORTED)
|
|
set_target_properties(OpenSSL::SSL PROPERTIES
|
|
IMPORTED_LOCATION "${OPENSSL_SSL_LIBRARY}"
|
|
INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")
|
|
endif()
|
|
if (NOT TARGET OpenSSL::Crypto AND DEFINED OPENSSL_CRYPTO_LIBRARY)
|
|
add_library(OpenSSL::Crypto UNKNOWN IMPORTED)
|
|
set_target_properties(OpenSSL::Crypto PROPERTIES
|
|
IMPORTED_LOCATION "${OPENSSL_CRYPTO_LIBRARY}"
|
|
INTERFACE_INCLUDE_DIRECTORIES "${OPENSSL_INCLUDE_DIR}")
|
|
endif()
|
|
find_package(cppzmq QUIET)
|
|
set(CPPZMQ_LOCAL_ROOT "${CMAKE_CURRENT_LIST_DIR}/../cppzmq" CACHE PATH "Path to a local cppzmq checkout")
|
|
if (NOT TARGET cppzmq::cppzmq AND NOT TARGET cppzmq)
|
|
if (EXISTS "${CPPZMQ_LOCAL_ROOT}/zmq.hpp")
|
|
add_library(cppzmq::cppzmq INTERFACE IMPORTED GLOBAL)
|
|
set_target_properties(cppzmq::cppzmq PROPERTIES
|
|
INTERFACE_INCLUDE_DIRECTORIES "${CPPZMQ_LOCAL_ROOT}")
|
|
endif()
|
|
endif()
|
|
if (DEFINED CVMMAP_STREAMER_USE_SYSTEM_CNATS)
|
|
message(FATAL_ERROR
|
|
"CVMMAP_STREAMER_USE_SYSTEM_CNATS was removed; use CVMMAP_CNATS_PROVIDER=system")
|
|
endif()
|
|
set(
|
|
CVMMAP_CNATS_PROVIDER
|
|
"system"
|
|
CACHE STRING
|
|
"How to resolve cnats: system or workspace")
|
|
set_property(CACHE CVMMAP_CNATS_PROVIDER PROPERTY STRINGS system workspace)
|
|
set(_CVMMAP_STREAMER_CNATS_PROVIDER_VALUES system workspace)
|
|
list(FIND _CVMMAP_STREAMER_CNATS_PROVIDER_VALUES "${CVMMAP_CNATS_PROVIDER}" _CVMMAP_STREAMER_CNATS_PROVIDER_INDEX)
|
|
if (_CVMMAP_STREAMER_CNATS_PROVIDER_INDEX EQUAL -1)
|
|
message(FATAL_ERROR
|
|
"Invalid CVMMAP_CNATS_PROVIDER='${CVMMAP_CNATS_PROVIDER}' (expected: system|workspace)")
|
|
endif()
|
|
set(CVMMAP_LOCAL_ROOT "${CMAKE_CURRENT_LIST_DIR}/../cv-mmap" CACHE PATH "Path to a local cv-mmap checkout")
|
|
set(CVMMAP_LOCAL_BUILD "${CVMMAP_LOCAL_ROOT}/build/core" CACHE PATH "Path to local cv-mmap build artifacts")
|
|
set(CVMMAP_LOCAL_CORE_DIR "${CVMMAP_LOCAL_ROOT}/build/core" CACHE PATH "Path to local cvmmap-core package config")
|
|
set(CVMMAP_LOCAL_NATS_STATIC "${CVMMAP_LOCAL_ROOT}/build/lib/libnats_static.a" CACHE PATH "Path to local cnats static library")
|
|
if (CVMMAP_CNATS_PROVIDER STREQUAL "system")
|
|
find_package(cnats CONFIG REQUIRED)
|
|
find_package(cvmmap-core CONFIG QUIET PATHS "${CVMMAP_LOCAL_CORE_DIR}" NO_DEFAULT_PATH)
|
|
if (NOT TARGET cvmmap::client)
|
|
find_package(cvmmap-core CONFIG QUIET)
|
|
endif()
|
|
else()
|
|
if (NOT EXISTS "${CVMMAP_LOCAL_NATS_STATIC}")
|
|
message(FATAL_ERROR
|
|
"workspace cnats provider requires ${CVMMAP_LOCAL_NATS_STATIC}")
|
|
endif()
|
|
if (NOT TARGET cnats::nats_static)
|
|
add_library(cnats::nats_static STATIC IMPORTED GLOBAL)
|
|
set_target_properties(cnats::nats_static PROPERTIES
|
|
IMPORTED_LOCATION "${CVMMAP_LOCAL_NATS_STATIC}"
|
|
INTERFACE_INCLUDE_DIRECTORIES "${CVMMAP_LOCAL_ROOT}/third_party/nats.c/src"
|
|
INTERFACE_LINK_LIBRARIES "OpenSSL::SSL;OpenSSL::Crypto;Threads::Threads")
|
|
endif()
|
|
endif()
|
|
find_package(ZeroMQ QUIET)
|
|
find_package(spdlog REQUIRED)
|
|
find_package(Protobuf REQUIRED)
|
|
if (Protobuf_VERSION VERSION_LESS 3.13)
|
|
set(_cvmmap_streamer_protoc_wrapper "${CMAKE_BINARY_DIR}/cvmmap-streamer-protoc-wrapper.sh")
|
|
file(WRITE "${_cvmmap_streamer_protoc_wrapper}"
|
|
"#!/bin/sh\nexec \"${Protobuf_PROTOC_EXECUTABLE}\" --experimental_allow_proto3_optional \"$@\"\n")
|
|
file(CHMOD
|
|
"${_cvmmap_streamer_protoc_wrapper}"
|
|
PERMISSIONS
|
|
OWNER_READ OWNER_WRITE OWNER_EXECUTE
|
|
GROUP_READ GROUP_EXECUTE
|
|
WORLD_READ WORLD_EXECUTE)
|
|
if (TARGET protobuf::protoc)
|
|
set_target_properties(protobuf::protoc PROPERTIES IMPORTED_LOCATION "${_cvmmap_streamer_protoc_wrapper}")
|
|
endif()
|
|
set(Protobuf_PROTOC_EXECUTABLE "${_cvmmap_streamer_protoc_wrapper}")
|
|
endif()
|
|
|
|
find_package(PkgConfig REQUIRED)
|
|
find_package(rvl CONFIG QUIET)
|
|
|
|
set(_CVMMAP_STREAMER_MCAP_HEADERS_AVAILABLE FALSE)
|
|
if (EXISTS "${CVMMAP_STREAMER_MCAP_INCLUDE_DIR}/mcap/mcap.hpp")
|
|
set(_CVMMAP_STREAMER_MCAP_HEADERS_AVAILABLE TRUE)
|
|
if (NOT TARGET mcap::mcap)
|
|
add_library(cvmmap_streamer_mcap_headers INTERFACE)
|
|
target_include_directories(cvmmap_streamer_mcap_headers INTERFACE "${CVMMAP_STREAMER_MCAP_INCLUDE_DIR}")
|
|
add_library(mcap::mcap ALIAS cvmmap_streamer_mcap_headers)
|
|
endif()
|
|
elseif (NOT TARGET mcap::mcap)
|
|
add_library(mcap::mcap INTERFACE IMPORTED GLOBAL)
|
|
endif()
|
|
|
|
add_subdirectory(third_party)
|
|
|
|
pkg_check_modules(FFMPEG REQUIRED IMPORTED_TARGET libavcodec libavformat libavutil libswscale)
|
|
pkg_check_modules(PROTOBUF_PKG QUIET IMPORTED_TARGET protobuf)
|
|
pkg_check_modules(ZSTD QUIET IMPORTED_TARGET libzstd)
|
|
pkg_check_modules(LZ4 QUIET IMPORTED_TARGET liblz4)
|
|
|
|
set(_CVMMAP_STREAMER_MCAP_MISSING_DEPS)
|
|
if (NOT _CVMMAP_STREAMER_MCAP_HEADERS_AVAILABLE)
|
|
list(APPEND _CVMMAP_STREAMER_MCAP_MISSING_DEPS "MCAP headers at ${CVMMAP_STREAMER_MCAP_INCLUDE_DIR}")
|
|
endif()
|
|
if (NOT ZSTD_FOUND)
|
|
list(APPEND _CVMMAP_STREAMER_MCAP_MISSING_DEPS "pkg-config package libzstd")
|
|
endif()
|
|
if (NOT LZ4_FOUND)
|
|
list(APPEND _CVMMAP_STREAMER_MCAP_MISSING_DEPS "pkg-config package liblz4")
|
|
endif()
|
|
if (_CVMMAP_STREAMER_MCAP_MISSING_DEPS)
|
|
list(JOIN _CVMMAP_STREAMER_MCAP_MISSING_DEPS ", " _CVMMAP_STREAMER_MCAP_UNAVAILABLE_REASON)
|
|
set(_CVMMAP_STREAMER_MCAP_AVAILABLE FALSE)
|
|
else()
|
|
set(_CVMMAP_STREAMER_MCAP_UNAVAILABLE_REASON "MCAP dependencies")
|
|
set(_CVMMAP_STREAMER_MCAP_AVAILABLE TRUE)
|
|
endif()
|
|
cvmmap_streamer_resolve_feature_mode(
|
|
CVMMAP_STREAMER_HAS_MCAP_BOOL
|
|
CVMMAP_STREAMER_ENABLE_MCAP
|
|
"${CVMMAP_STREAMER_ENABLE_MCAP}"
|
|
${_CVMMAP_STREAMER_MCAP_AVAILABLE}
|
|
"${_CVMMAP_STREAMER_MCAP_UNAVAILABLE_REASON}")
|
|
|
|
set(RVL_LOCAL_ROOT "${CMAKE_CURRENT_LIST_DIR}/../rvl_impl" CACHE PATH "Path to a local rvl_impl checkout")
|
|
set(RVL_LOCAL_BUILD "${RVL_LOCAL_ROOT}/build/core" CACHE PATH "Path to local rvl_impl build artifacts")
|
|
|
|
set(_CVMMAP_STREAMER_RVL_AVAILABLE FALSE)
|
|
set(_CVMMAP_STREAMER_RVL_UNAVAILABLE_REASON "rvl::rvl target or local rvl_impl build artifacts")
|
|
if (TARGET rvl::rvl)
|
|
set(_CVMMAP_STREAMER_RVL_AVAILABLE TRUE)
|
|
elseif (
|
|
EXISTS "${RVL_LOCAL_ROOT}/core/include/rvl/rvl.hpp"
|
|
AND EXISTS "${RVL_LOCAL_BUILD}/librvl_core.a")
|
|
set(_CVMMAP_STREAMER_RVL_AVAILABLE TRUE)
|
|
endif()
|
|
|
|
if (CVMMAP_STREAMER_ENABLE_MCAP STREQUAL "OFF" AND CVMMAP_STREAMER_ENABLE_MCAP_DEPTH STREQUAL "ON")
|
|
message(FATAL_ERROR
|
|
"CVMMAP_STREAMER_ENABLE_MCAP_DEPTH=ON requires CVMMAP_STREAMER_ENABLE_MCAP to be AUTO or ON")
|
|
endif()
|
|
if (CVMMAP_STREAMER_ENABLE_MCAP_DEPTH STREQUAL "ON" AND NOT CVMMAP_STREAMER_HAS_MCAP_BOOL)
|
|
message(FATAL_ERROR
|
|
"CVMMAP_STREAMER_ENABLE_MCAP_DEPTH=ON requires MCAP support, but ${_CVMMAP_STREAMER_MCAP_UNAVAILABLE_REASON} is unavailable")
|
|
endif()
|
|
if (NOT CVMMAP_STREAMER_HAS_MCAP_BOOL AND CVMMAP_STREAMER_ENABLE_MCAP_DEPTH STREQUAL "AUTO")
|
|
set(CVMMAP_STREAMER_HAS_MCAP_DEPTH_BOOL FALSE)
|
|
else()
|
|
cvmmap_streamer_resolve_feature_mode(
|
|
CVMMAP_STREAMER_HAS_MCAP_DEPTH_BOOL
|
|
CVMMAP_STREAMER_ENABLE_MCAP_DEPTH
|
|
"${CVMMAP_STREAMER_ENABLE_MCAP_DEPTH}"
|
|
${_CVMMAP_STREAMER_RVL_AVAILABLE}
|
|
"${_CVMMAP_STREAMER_RVL_UNAVAILABLE_REASON}")
|
|
endif()
|
|
|
|
if (CVMMAP_STREAMER_HAS_MCAP_BOOL)
|
|
set(CVMMAP_STREAMER_HAS_MCAP 1)
|
|
else()
|
|
set(CVMMAP_STREAMER_HAS_MCAP 0)
|
|
endif()
|
|
if (CVMMAP_STREAMER_HAS_MCAP_DEPTH_BOOL)
|
|
set(CVMMAP_STREAMER_HAS_MCAP_DEPTH 1)
|
|
else()
|
|
set(CVMMAP_STREAMER_HAS_MCAP_DEPTH 0)
|
|
endif()
|
|
|
|
if (NOT TARGET cvmmap::client)
|
|
if (
|
|
EXISTS "${CVMMAP_LOCAL_ROOT}/core/include/cvmmap/client.hpp"
|
|
AND EXISTS "${CVMMAP_LOCAL_BUILD}/libcvmmap_client.a"
|
|
AND EXISTS "${CVMMAP_LOCAL_BUILD}/libcvmmap_nats.a"
|
|
AND EXISTS "${CVMMAP_LOCAL_BUILD}/libcvmmap_proto.a"
|
|
AND EXISTS "${CVMMAP_LOCAL_BUILD}/libcvmmap_ipc.a"
|
|
AND EXISTS "${CVMMAP_LOCAL_BUILD}/libcvmmap_target.a")
|
|
add_library(cvmmap::nats INTERFACE IMPORTED)
|
|
add_library(cvmmap::client INTERFACE IMPORTED)
|
|
set_target_properties(cvmmap::nats PROPERTIES
|
|
INTERFACE_INCLUDE_DIRECTORIES "${CVMMAP_LOCAL_ROOT}/core/include"
|
|
INTERFACE_LINK_LIBRARIES "${CVMMAP_LOCAL_BUILD}/libcvmmap_nats.a;${CVMMAP_LOCAL_BUILD}/libcvmmap_proto.a;${CVMMAP_LOCAL_BUILD}/libcvmmap_ipc.a;${CVMMAP_LOCAL_BUILD}/libcvmmap_target.a;cnats::nats_static")
|
|
set_target_properties(cvmmap::client PROPERTIES
|
|
INTERFACE_INCLUDE_DIRECTORIES "${CVMMAP_LOCAL_ROOT}/core/include"
|
|
INTERFACE_LINK_LIBRARIES "${CVMMAP_LOCAL_BUILD}/libcvmmap_client.a;${CVMMAP_LOCAL_BUILD}/libcvmmap_nats.a;${CVMMAP_LOCAL_BUILD}/libcvmmap_proto.a;${CVMMAP_LOCAL_BUILD}/libcvmmap_ipc.a;${CVMMAP_LOCAL_BUILD}/libcvmmap_target.a;cnats::nats_static")
|
|
else()
|
|
message(FATAL_ERROR "cvmmap::client target is unavailable and local cv-mmap build artifacts were not found")
|
|
endif()
|
|
endif()
|
|
|
|
if (CVMMAP_STREAMER_HAS_MCAP_DEPTH AND NOT TARGET rvl::rvl)
|
|
if (
|
|
EXISTS "${RVL_LOCAL_ROOT}/core/include/rvl/rvl.hpp"
|
|
AND EXISTS "${RVL_LOCAL_BUILD}/librvl_core.a")
|
|
add_library(rvl::rvl INTERFACE IMPORTED)
|
|
set_target_properties(rvl::rvl PROPERTIES
|
|
INTERFACE_INCLUDE_DIRECTORIES "${RVL_LOCAL_ROOT}/core/include"
|
|
INTERFACE_LINK_LIBRARIES "${RVL_LOCAL_BUILD}/librvl_core.a")
|
|
else()
|
|
message(FATAL_ERROR "rvl::rvl target is unavailable and local rvl_impl build artifacts were not found")
|
|
endif()
|
|
endif()
|
|
|
|
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/proto")
|
|
|
|
add_library(cvmmap_streamer_foxglove_proto STATIC)
|
|
protobuf_generate(
|
|
TARGET cvmmap_streamer_foxglove_proto
|
|
LANGUAGE cpp
|
|
PROTOC_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}"
|
|
PROTOS
|
|
"${CMAKE_CURRENT_LIST_DIR}/proto/foxglove/CompressedVideo.proto"
|
|
"${CMAKE_CURRENT_LIST_DIR}/proto/foxglove/CameraCalibration.proto"
|
|
"${CMAKE_CURRENT_LIST_DIR}/proto/foxglove/PoseInFrame.proto"
|
|
"${CMAKE_CURRENT_LIST_DIR}/proto/foxglove/Pose.proto"
|
|
"${CMAKE_CURRENT_LIST_DIR}/proto/foxglove/Quaternion.proto"
|
|
"${CMAKE_CURRENT_LIST_DIR}/proto/foxglove/Vector3.proto"
|
|
IMPORT_DIRS "${CMAKE_CURRENT_LIST_DIR}")
|
|
add_library(cvmmap_streamer_depth_proto STATIC)
|
|
protobuf_generate(
|
|
TARGET cvmmap_streamer_depth_proto
|
|
LANGUAGE cpp
|
|
PROTOC_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}"
|
|
PROTOS
|
|
"${CMAKE_CURRENT_LIST_DIR}/proto/cvmmap_streamer/DepthMap.proto"
|
|
"${CMAKE_CURRENT_LIST_DIR}/proto/cvmmap_streamer/BundleManifest.proto"
|
|
IMPORT_DIRS "${CMAKE_CURRENT_LIST_DIR}")
|
|
add_library(cvmmap_streamer_control_proto STATIC)
|
|
protobuf_generate(
|
|
TARGET cvmmap_streamer_control_proto
|
|
LANGUAGE cpp
|
|
PROTOC_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}"
|
|
PROTOS
|
|
"${CMAKE_CURRENT_LIST_DIR}/proto/cvmmap_streamer/recorder_control.proto"
|
|
IMPORT_DIRS "${CMAKE_CURRENT_LIST_DIR}")
|
|
add_library(cvmmap_streamer_protobuf INTERFACE)
|
|
target_include_directories(cvmmap_streamer_foxglove_proto
|
|
PUBLIC
|
|
"${CMAKE_CURRENT_BINARY_DIR}"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/proto"
|
|
${Protobuf_INCLUDE_DIRS})
|
|
target_include_directories(cvmmap_streamer_depth_proto
|
|
PUBLIC
|
|
"${CMAKE_CURRENT_BINARY_DIR}"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/proto"
|
|
${Protobuf_INCLUDE_DIRS})
|
|
target_include_directories(cvmmap_streamer_control_proto
|
|
PUBLIC
|
|
"${CMAKE_CURRENT_BINARY_DIR}"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/proto"
|
|
${Protobuf_INCLUDE_DIRS})
|
|
target_include_directories(cvmmap_streamer_protobuf
|
|
INTERFACE
|
|
"${CMAKE_CURRENT_BINARY_DIR}/proto"
|
|
${Protobuf_INCLUDE_DIRS})
|
|
if (TARGET protobuf::libprotobuf)
|
|
target_link_libraries(cvmmap_streamer_protobuf INTERFACE protobuf::libprotobuf)
|
|
elseif (TARGET Protobuf::libprotobuf)
|
|
target_link_libraries(cvmmap_streamer_protobuf INTERFACE Protobuf::libprotobuf)
|
|
else()
|
|
target_link_libraries(cvmmap_streamer_protobuf INTERFACE ${Protobuf_LIBRARIES})
|
|
endif()
|
|
if (TARGET PkgConfig::PROTOBUF_PKG)
|
|
target_link_libraries(cvmmap_streamer_protobuf INTERFACE PkgConfig::PROTOBUF_PKG)
|
|
endif()
|
|
target_link_libraries(cvmmap_streamer_foxglove_proto PUBLIC cvmmap_streamer_protobuf)
|
|
target_link_libraries(cvmmap_streamer_depth_proto PUBLIC cvmmap_streamer_protobuf)
|
|
target_link_libraries(cvmmap_streamer_control_proto PUBLIC cvmmap_streamer_protobuf)
|
|
|
|
add_library(cvmmap_streamer_feature_flags INTERFACE)
|
|
target_compile_definitions(cvmmap_streamer_feature_flags
|
|
INTERFACE
|
|
CVMMAP_STREAMER_HAS_MCAP=${CVMMAP_STREAMER_HAS_MCAP}
|
|
CVMMAP_STREAMER_HAS_MCAP_DEPTH=${CVMMAP_STREAMER_HAS_MCAP_DEPTH})
|
|
|
|
add_library(cvmmap_streamer_record_support STATIC
|
|
src/encode/encoder_backend.cpp
|
|
src/encode/ffmpeg_encoder_backend.cpp
|
|
src/record/protobuf_descriptor.cpp
|
|
src/record/mp4_record_writer.cpp)
|
|
target_include_directories(cvmmap_streamer_record_support
|
|
PUBLIC
|
|
"${CMAKE_CURRENT_LIST_DIR}/include"
|
|
"${CMAKE_CURRENT_BINARY_DIR}")
|
|
target_link_libraries(cvmmap_streamer_record_support
|
|
PUBLIC
|
|
cvmmap_streamer_feature_flags
|
|
PkgConfig::FFMPEG
|
|
msft_proxy4::proxy
|
|
cvmmap_streamer_protobuf)
|
|
if (TARGET spdlog::spdlog)
|
|
target_link_libraries(cvmmap_streamer_record_support PUBLIC spdlog::spdlog)
|
|
elseif (TARGET spdlog)
|
|
target_link_libraries(cvmmap_streamer_record_support PUBLIC spdlog)
|
|
endif()
|
|
if (TARGET PkgConfig::PROTOBUF_PKG)
|
|
target_link_libraries(cvmmap_streamer_record_support PUBLIC PkgConfig::PROTOBUF_PKG)
|
|
endif()
|
|
|
|
if (CVMMAP_STREAMER_HAS_MCAP)
|
|
add_library(cvmmap_streamer_mcap_runtime STATIC
|
|
src/record/mcap_runtime.cpp)
|
|
target_link_libraries(cvmmap_streamer_mcap_runtime
|
|
PUBLIC
|
|
cvmmap_streamer_feature_flags
|
|
mcap::mcap
|
|
PkgConfig::ZSTD
|
|
PkgConfig::LZ4)
|
|
|
|
add_library(cvmmap_streamer_mcap_record_support STATIC
|
|
src/record/mcap_record_sink.cpp)
|
|
target_include_directories(cvmmap_streamer_mcap_record_support
|
|
PUBLIC
|
|
"${CMAKE_CURRENT_LIST_DIR}/include"
|
|
"${CMAKE_CURRENT_BINARY_DIR}")
|
|
target_link_libraries(cvmmap_streamer_mcap_record_support
|
|
PUBLIC
|
|
cvmmap_streamer_feature_flags
|
|
cvmmap_streamer_record_support
|
|
cvmmap_streamer_foxglove_proto
|
|
cvmmap_streamer_depth_proto
|
|
cvmmap_streamer_mcap_runtime
|
|
mcap::mcap)
|
|
if (CVMMAP_STREAMER_HAS_MCAP_DEPTH)
|
|
target_link_libraries(cvmmap_streamer_mcap_record_support PUBLIC rvl::rvl)
|
|
endif()
|
|
if (TARGET spdlog::spdlog)
|
|
target_link_libraries(cvmmap_streamer_mcap_record_support PUBLIC spdlog::spdlog)
|
|
elseif (TARGET spdlog)
|
|
target_link_libraries(cvmmap_streamer_mcap_record_support PUBLIC spdlog)
|
|
endif()
|
|
if (TARGET PkgConfig::PROTOBUF_PKG)
|
|
target_link_libraries(cvmmap_streamer_mcap_record_support PUBLIC PkgConfig::PROTOBUF_PKG)
|
|
endif()
|
|
endif()
|
|
|
|
add_library(cvmmap_streamer_common STATIC
|
|
src/ipc/help.cpp
|
|
src/config/runtime_config.cpp
|
|
src/core/frame_source.cpp
|
|
src/core/ingest_runtime.cpp
|
|
src/ipc/contracts.cpp
|
|
src/protocol/nats_request_reply_server.cpp
|
|
src/protocol/wire_codec.cpp
|
|
src/metrics/latency_tracker.cpp
|
|
src/pipeline/pipeline_runtime.cpp
|
|
src/protocol/rtmp_output.cpp
|
|
src/protocol/rtp_publisher.cpp)
|
|
|
|
target_include_directories(cvmmap_streamer_common
|
|
PUBLIC
|
|
"${CMAKE_CURRENT_LIST_DIR}/include"
|
|
"${CMAKE_CURRENT_BINARY_DIR}"
|
|
"${CVMMAP_LOCAL_ROOT}/core/include")
|
|
|
|
set(CVMMAP_STREAMER_LINK_DEPS
|
|
Threads::Threads
|
|
cvmmap_streamer_record_support
|
|
PkgConfig::FFMPEG
|
|
cvmmap::client
|
|
cvmmap::nats
|
|
CLI11::CLI11
|
|
tomlplusplus::tomlplusplus
|
|
cvmmap_streamer_feature_flags)
|
|
if (CVMMAP_STREAMER_HAS_MCAP)
|
|
list(APPEND CVMMAP_STREAMER_LINK_DEPS cvmmap_streamer_mcap_record_support)
|
|
endif()
|
|
|
|
if (TARGET cppzmq::cppzmq)
|
|
list(APPEND CVMMAP_STREAMER_LINK_DEPS cppzmq::cppzmq)
|
|
elseif (TARGET cppzmq)
|
|
list(APPEND CVMMAP_STREAMER_LINK_DEPS cppzmq)
|
|
endif()
|
|
|
|
if (TARGET ZeroMQ::libzmq)
|
|
list(APPEND CVMMAP_STREAMER_LINK_DEPS ZeroMQ::libzmq)
|
|
elseif (TARGET ZeroMQ::ZeroMQ)
|
|
list(APPEND CVMMAP_STREAMER_LINK_DEPS ZeroMQ::ZeroMQ)
|
|
endif()
|
|
|
|
if (TARGET spdlog::spdlog)
|
|
list(APPEND CVMMAP_STREAMER_LINK_DEPS spdlog::spdlog)
|
|
elseif (TARGET spdlog)
|
|
list(APPEND CVMMAP_STREAMER_LINK_DEPS spdlog)
|
|
endif()
|
|
|
|
list(APPEND CVMMAP_STREAMER_LINK_DEPS cvmmap_streamer_protobuf)
|
|
list(APPEND CVMMAP_STREAMER_LINK_DEPS cvmmap_streamer_control_proto)
|
|
if (TARGET PkgConfig::PROTOBUF_PKG)
|
|
list(APPEND CVMMAP_STREAMER_LINK_DEPS PkgConfig::PROTOBUF_PKG)
|
|
endif()
|
|
|
|
target_link_libraries(cvmmap_streamer_common PUBLIC ${CVMMAP_STREAMER_LINK_DEPS})
|
|
|
|
function(cvmmap_streamer_apply_build_rpath target)
|
|
if (CVMMAP_STREAMER_BUILD_RPATH)
|
|
set_target_properties(${target} PROPERTIES
|
|
BUILD_RPATH "${CVMMAP_STREAMER_BUILD_RPATH}")
|
|
endif()
|
|
endfunction()
|
|
|
|
function(add_cvmmap_binary target source)
|
|
add_executable(${target} ${source} ${ARGN})
|
|
target_include_directories(${target}
|
|
PRIVATE
|
|
"${CMAKE_CURRENT_LIST_DIR}/include"
|
|
"${CMAKE_CURRENT_BINARY_DIR}")
|
|
target_link_libraries(${target}
|
|
PRIVATE
|
|
cvmmap_streamer_common)
|
|
set_target_properties(${target} PROPERTIES
|
|
OUTPUT_NAME "${target}"
|
|
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")
|
|
cvmmap_streamer_apply_build_rpath(${target})
|
|
endfunction()
|
|
|
|
add_cvmmap_binary(cvmmap_streamer src/main_streamer.cpp)
|
|
add_cvmmap_binary(rtp_receiver_tester src/testers/rtp_receiver_tester.cpp)
|
|
add_cvmmap_binary(rtp_output_tester src/testers/rtp_output_tester.cpp)
|
|
add_cvmmap_binary(rtmp_stub_tester src/testers/rtmp_stub_tester.cpp)
|
|
add_cvmmap_binary(rtmp_output_tester src/testers/rtmp_output_tester.cpp)
|
|
add_cvmmap_binary(ipc_snapshot_tester src/testers/ipc_snapshot_tester.cpp)
|
|
if (CVMMAP_STREAMER_HAS_MCAP)
|
|
add_cvmmap_binary(mcap_body_record_tester src/testers/mcap_body_record_tester.cpp)
|
|
add_cvmmap_binary(mcap_body_inspector src/testers/mcap_body_inspector.cpp)
|
|
add_cvmmap_binary(mcap_pose_record_tester src/testers/mcap_pose_record_tester.cpp)
|
|
|
|
add_executable(mcap_reader_tester src/testers/mcap_reader_tester.cpp)
|
|
target_include_directories(mcap_reader_tester
|
|
PRIVATE
|
|
"${CMAKE_CURRENT_LIST_DIR}/include"
|
|
"${CMAKE_CURRENT_BINARY_DIR}")
|
|
target_link_libraries(mcap_reader_tester
|
|
PRIVATE
|
|
CLI11::CLI11
|
|
cvmmap_streamer_feature_flags
|
|
cvmmap_streamer_foxglove_proto
|
|
cvmmap_streamer_depth_proto
|
|
cvmmap_streamer_mcap_runtime
|
|
cvmmap_streamer_protobuf)
|
|
if (TARGET spdlog::spdlog)
|
|
target_link_libraries(mcap_reader_tester PRIVATE spdlog::spdlog)
|
|
elseif (TARGET spdlog)
|
|
target_link_libraries(mcap_reader_tester PRIVATE spdlog)
|
|
endif()
|
|
if (TARGET PkgConfig::PROTOBUF_PKG)
|
|
target_link_libraries(mcap_reader_tester PRIVATE PkgConfig::PROTOBUF_PKG)
|
|
endif()
|
|
set_target_properties(mcap_reader_tester PROPERTIES
|
|
OUTPUT_NAME "mcap_reader_tester"
|
|
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")
|
|
cvmmap_streamer_apply_build_rpath(mcap_reader_tester)
|
|
|
|
add_executable(mcap_replay_tester src/testers/mcap_replay_tester.cpp)
|
|
target_include_directories(mcap_replay_tester
|
|
PRIVATE
|
|
"${CMAKE_CURRENT_LIST_DIR}/include"
|
|
"${CMAKE_CURRENT_BINARY_DIR}")
|
|
target_link_libraries(mcap_replay_tester
|
|
PRIVATE
|
|
Threads::Threads
|
|
CLI11::CLI11
|
|
cvmmap_streamer_feature_flags
|
|
cvmmap_streamer_foxglove_proto
|
|
cvmmap_streamer_mcap_runtime
|
|
cvmmap_streamer_protobuf)
|
|
if (TARGET spdlog::spdlog)
|
|
target_link_libraries(mcap_replay_tester PRIVATE spdlog::spdlog)
|
|
elseif (TARGET spdlog)
|
|
target_link_libraries(mcap_replay_tester PRIVATE spdlog)
|
|
endif()
|
|
if (TARGET PkgConfig::PROTOBUF_PKG)
|
|
target_link_libraries(mcap_replay_tester PRIVATE PkgConfig::PROTOBUF_PKG)
|
|
endif()
|
|
set_target_properties(mcap_replay_tester PROPERTIES
|
|
OUTPUT_NAME "mcap_replay_tester"
|
|
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")
|
|
cvmmap_streamer_apply_build_rpath(mcap_replay_tester)
|
|
endif()
|
|
|
|
if (CVMMAP_STREAMER_HAS_MCAP_DEPTH)
|
|
add_cvmmap_binary(mcap_depth_record_tester src/testers/mcap_depth_record_tester.cpp)
|
|
add_cvmmap_binary(mcap_multi_record_tester src/testers/mcap_multi_record_tester.cpp)
|
|
endif()
|
|
|
|
set(CVMMAP_STREAMER_INSTALL_TARGETS cvmmap_streamer)
|
|
|
|
install(
|
|
TARGETS ${CVMMAP_STREAMER_INSTALL_TARGETS}
|
|
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
|