Make MCAP and depth support optional

This commit is contained in:
2026-04-14 17:13:29 +08:00
parent ddea6b0e3d
commit 16a1a38645
12 changed files with 836 additions and 328 deletions
+273 -80
View File
@@ -8,6 +8,68 @@ 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)
@@ -73,15 +135,110 @@ 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 REQUIRED IMPORTED_TARGET libzstd)
pkg_check_modules(LZ4 REQUIRED IMPORTED_TARGET liblz4)
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 (
@@ -104,9 +261,7 @@ if (NOT TARGET cvmmap::client)
endif()
endif()
if (NOT TARGET rvl::rvl)
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")
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")
@@ -185,21 +340,16 @@ target_link_libraries(cvmmap_streamer_foxglove_proto PUBLIC cvmmap_streamer_prot
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_mcap_runtime STATIC
src/record/mcap_runtime.cpp)
target_include_directories(cvmmap_streamer_mcap_runtime
PUBLIC)
target_link_libraries(cvmmap_streamer_mcap_runtime
PUBLIC
mcap::mcap
PkgConfig::ZSTD
PkgConfig::LZ4)
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/mcap_record_sink.cpp
src/record/mp4_record_writer.cpp)
target_include_directories(cvmmap_streamer_record_support
PUBLIC
@@ -207,14 +357,8 @@ target_include_directories(cvmmap_streamer_record_support
"${CMAKE_CURRENT_BINARY_DIR}")
target_link_libraries(cvmmap_streamer_record_support
PUBLIC
cvmmap_streamer_foxglove_proto
cvmmap_streamer_depth_proto
cvmmap_streamer_mcap_runtime
cvmmap_streamer_feature_flags
PkgConfig::FFMPEG
PkgConfig::ZSTD
PkgConfig::LZ4
rvl::rvl
mcap::mcap
msft_proxy4::proxy
cvmmap_streamer_protobuf)
if (TARGET spdlog::spdlog)
@@ -226,6 +370,43 @@ 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
@@ -249,13 +430,14 @@ set(CVMMAP_STREAMER_LINK_DEPS
Threads::Threads
cvmmap_streamer_record_support
PkgConfig::FFMPEG
PkgConfig::ZSTD
PkgConfig::LZ4
cvmmap::client
cvmmap::nats
CLI11::CLI11
tomlplusplus::tomlplusplus
mcap::mcap)
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)
@@ -283,6 +465,13 @@ 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}
@@ -295,6 +484,7 @@ function(add_cvmmap_binary target source)
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)
@@ -303,65 +493,68 @@ 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)
add_cvmmap_binary(mcap_depth_record_tester src/testers/mcap_depth_record_tester.cpp)
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_cvmmap_binary(mcap_multi_record_tester src/testers/mcap_multi_record_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_foxglove_proto
cvmmap_streamer_depth_proto
cvmmap_streamer_mcap_runtime
mcap::mcap
PkgConfig::ZSTD
PkgConfig::LZ4)
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()
target_link_libraries(mcap_reader_tester PRIVATE cvmmap_streamer_protobuf)
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")
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_foxglove_proto
cvmmap_streamer_mcap_runtime
mcap::mcap
PkgConfig::ZSTD
PkgConfig::LZ4)
if (TARGET spdlog::spdlog)
target_link_libraries(mcap_replay_tester PRIVATE spdlog::spdlog)
elseif (TARGET spdlog)
target_link_libraries(mcap_replay_tester PRIVATE spdlog)
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()
target_link_libraries(mcap_replay_tester PRIVATE cvmmap_streamer_protobuf)
if (TARGET PkgConfig::PROTOBUF_PKG)
target_link_libraries(mcap_replay_tester PRIVATE PkgConfig::PROTOBUF_PKG)
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_target_properties(mcap_replay_tester PROPERTIES
OUTPUT_NAME "mcap_replay_tester"
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")
set(CVMMAP_STREAMER_INSTALL_TARGETS cvmmap_streamer)