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) set(CVMMAP_STREAMER_INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}") 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") set( CVMMAP_STREAMER_ENABLE_JETSON_MM "AUTO" CACHE STRING "Enable Jetson Multimedia API encoder backend: AUTO, ON, or OFF") set_property(CACHE CVMMAP_STREAMER_ENABLE_JETSON_MM PROPERTY STRINGS AUTO ON OFF) set( CVMMAP_STREAMER_JETSON_MMAPI_ROOT "/usr/src/jetson_multimedia_api" CACHE PATH "Path to the Jetson Multimedia API root") 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 REQUIRED PATHS "${CVMMAP_LOCAL_CORE_DIR}" NO_DEFAULT_PATH) 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() set(_CVMMAP_STREAMER_JETSON_MM_INCLUDE_DIR "${CVMMAP_STREAMER_JETSON_MMAPI_ROOT}/include") set(_CVMMAP_STREAMER_JETSON_MM_COMMON_DIR "${CVMMAP_STREAMER_JETSON_MMAPI_ROOT}/samples/common/classes") set(_CVMMAP_STREAMER_JETSON_MM_COMMON_SOURCES "${_CVMMAP_STREAMER_JETSON_MM_COMMON_DIR}/NvBuffer.cpp" "${_CVMMAP_STREAMER_JETSON_MM_COMMON_DIR}/NvElement.cpp" "${_CVMMAP_STREAMER_JETSON_MM_COMMON_DIR}/NvElementProfiler.cpp" "${_CVMMAP_STREAMER_JETSON_MM_COMMON_DIR}/NvLogging.cpp" "${_CVMMAP_STREAMER_JETSON_MM_COMMON_DIR}/NvV4l2Element.cpp" "${_CVMMAP_STREAMER_JETSON_MM_COMMON_DIR}/NvV4l2ElementPlane.cpp" "${_CVMMAP_STREAMER_JETSON_MM_COMMON_DIR}/NvVideoEncoder.cpp") set(_CVMMAP_STREAMER_JETSON_MM_MISSING_DEPS) if (NOT EXISTS "${_CVMMAP_STREAMER_JETSON_MM_INCLUDE_DIR}/NvVideoEncoder.h") list(APPEND _CVMMAP_STREAMER_JETSON_MM_MISSING_DEPS "Jetson Multimedia API headers at ${_CVMMAP_STREAMER_JETSON_MM_INCLUDE_DIR}") endif() foreach(_cvmmap_streamer_jetson_mm_source IN LISTS _CVMMAP_STREAMER_JETSON_MM_COMMON_SOURCES) if (NOT EXISTS "${_cvmmap_streamer_jetson_mm_source}") list(APPEND _CVMMAP_STREAMER_JETSON_MM_MISSING_DEPS "Jetson Multimedia API common source ${_cvmmap_streamer_jetson_mm_source}") endif() endforeach() find_library( CVMMAP_STREAMER_NVBUFSURFACE_LIBRARY NAMES nvbufsurface PATHS /usr/lib/aarch64-linux-gnu/nvidia /usr/lib/aarch64-linux-gnu/tegra /usr/lib/aarch64-linux-gnu PATH_SUFFIXES nvidia tegra) if (NOT CVMMAP_STREAMER_NVBUFSURFACE_LIBRARY) list(APPEND _CVMMAP_STREAMER_JETSON_MM_MISSING_DEPS "libnvbufsurface") endif() find_library(CVMMAP_STREAMER_LIBV4L2_LIBRARY NAMES v4l2) if (NOT CVMMAP_STREAMER_LIBV4L2_LIBRARY) list(APPEND _CVMMAP_STREAMER_JETSON_MM_MISSING_DEPS "libv4l2") endif() if (_CVMMAP_STREAMER_JETSON_MM_MISSING_DEPS) list(JOIN _CVMMAP_STREAMER_JETSON_MM_MISSING_DEPS ", " _CVMMAP_STREAMER_JETSON_MM_UNAVAILABLE_REASON) set(_CVMMAP_STREAMER_JETSON_MM_AVAILABLE FALSE) else() set(_CVMMAP_STREAMER_JETSON_MM_UNAVAILABLE_REASON "Jetson Multimedia API dependencies") set(_CVMMAP_STREAMER_JETSON_MM_AVAILABLE TRUE) endif() cvmmap_streamer_resolve_feature_mode( CVMMAP_STREAMER_HAS_JETSON_MM_BOOL CVMMAP_STREAMER_ENABLE_JETSON_MM "${CVMMAP_STREAMER_ENABLE_JETSON_MM}" ${_CVMMAP_STREAMER_JETSON_MM_AVAILABLE} "${_CVMMAP_STREAMER_JETSON_MM_UNAVAILABLE_REASON}") if (CVMMAP_STREAMER_HAS_JETSON_MM_BOOL) set(CVMMAP_STREAMER_HAS_JETSON_MM 1) add_library(cvmmap_streamer_jetson_mmapi STATIC ${_CVMMAP_STREAMER_JETSON_MM_COMMON_SOURCES}) target_include_directories(cvmmap_streamer_jetson_mmapi PUBLIC "${_CVMMAP_STREAMER_JETSON_MM_INCLUDE_DIR}") target_link_libraries(cvmmap_streamer_jetson_mmapi PUBLIC Threads::Threads ${CVMMAP_STREAMER_LIBV4L2_LIBRARY} ${CVMMAP_STREAMER_NVBUFSURFACE_LIBRARY}) else() set(CVMMAP_STREAMER_HAS_JETSON_MM 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} CVMMAP_STREAMER_HAS_JETSON_MM=${CVMMAP_STREAMER_HAS_JETSON_MM}) 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) if (CVMMAP_STREAMER_HAS_JETSON_MM_BOOL) target_sources(cvmmap_streamer_record_support PRIVATE src/encode/jetson_mm_encoder_backend.cpp) endif() 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_JETSON_MM_BOOL) target_link_libraries(cvmmap_streamer_record_support PUBLIC cvmmap_streamer_jetson_mmapi) 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_runtime_rpath target) set_target_properties(${target} PROPERTIES INSTALL_RPATH "${CVMMAP_STREAMER_INSTALL_RPATH}") 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_runtime_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_runtime_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_runtime_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}")