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)

option(
	CVMMAP_BUILD_ZED_SVO_GRID_TO_MP4
	"Build the OpenCV-based zed_svo_grid_to_mp4 tool"
	ON)

find_package(Threads REQUIRED)
find_package(cppzmq QUIET)
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)
else()
	if (NOT EXISTS "${CVMMAP_LOCAL_NATS_STATIC}")
		message(FATAL_ERROR
			"workspace cnats provider requires ${CVMMAP_LOCAL_NATS_STATIC}")
	endif()
	find_package(OpenSSL REQUIRED)
	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)
find_package(PkgConfig REQUIRED)
find_package(rvl CONFIG QUIET)
set(ZED_DIR "/usr/local/zed" CACHE PATH "Path to the local ZED SDK")
find_package(ZED QUIET)
set(CVMMAP_HAS_ZED_SDK OFF)
if (ZED_FOUND)
	find_package(CUDA ${ZED_CUDA_VERSION} REQUIRED)
	find_library(CVMMAP_STREAMER_LIBUSB_LIBRARY NAMES usb-1.0 libusb-1.0)
	if (CVMMAP_STREAMER_LIBUSB_LIBRARY)
		set(_CVMMAP_STREAMER_ZED_LIBRARIES "")
		foreach(_zed_lib IN LISTS ZED_LIBRARIES)
			if (_zed_lib STREQUAL "/usr/lib/x86_64-linux-gnu/libusb-1.0.so")
				list(APPEND _CVMMAP_STREAMER_ZED_LIBRARIES "${CVMMAP_STREAMER_LIBUSB_LIBRARY}")
			else()
				list(APPEND _CVMMAP_STREAMER_ZED_LIBRARIES "${_zed_lib}")
			endif()
		endforeach()
		set(ZED_LIBRARIES "${_CVMMAP_STREAMER_ZED_LIBRARIES}")
	endif()
	set(CVMMAP_HAS_ZED_SDK ON)
	message(STATUS "ZED SDK found: enabling zed_svo_to_mcap and zed_svo_to_mp4")
else()
	message(STATUS "ZED SDK not found: skipping ZED conversion tools")
endif()

if (CVMMAP_BUILD_ZED_SVO_GRID_TO_MP4 AND CVMMAP_HAS_ZED_SDK)
	find_package(OpenCV REQUIRED COMPONENTS core imgproc)
elseif (CVMMAP_BUILD_ZED_SVO_GRID_TO_MP4)
	message(STATUS "CVMMAP_BUILD_ZED_SVO_GRID_TO_MP4=ON but ZED SDK is unavailable; zed_svo_grid_to_mp4 will not be built")
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)

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 (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 (
		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"
	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_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)

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_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)
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_foxglove_proto
		cvmmap_streamer_depth_proto
		cvmmap_streamer_mcap_runtime
		PkgConfig::FFMPEG
		PkgConfig::ZSTD
		PkgConfig::LZ4
		rvl::rvl
		mcap::mcap
		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()

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/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}")

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)

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)
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(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")
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)
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)

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_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)
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)
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)

if (CVMMAP_HAS_ZED_SDK)
	add_library(
		cvmmap_streamer_zed_progress_support
		STATIC
		src/tools/zed_progress_bar.cpp)
	target_include_directories(cvmmap_streamer_zed_progress_support
		PUBLIC
			"${CMAKE_CURRENT_LIST_DIR}/include"
			"${CMAKE_CURRENT_BINARY_DIR}")
	add_executable(
		zed_svo_to_mcap
		src/tools/zed_svo_to_mcap.cpp
		src/config/runtime_config.cpp)
	target_include_directories(zed_svo_to_mcap
		PRIVATE
			"${CMAKE_CURRENT_LIST_DIR}/include"
			"${CMAKE_CURRENT_BINARY_DIR}"
			${ZED_INCLUDE_DIRS}
			${CUDA_INCLUDE_DIRS})
	target_link_directories(zed_svo_to_mcap
		PRIVATE
			${ZED_LIBRARY_DIR}
			${CUDA_LIBRARY_DIRS})
	target_link_libraries(zed_svo_to_mcap
		PRIVATE
			cvmmap_streamer_zed_progress_support
			cvmmap_streamer_record_support
			CLI11::CLI11
			tomlplusplus::tomlplusplus
			${ZED_LIBRARIES}
			${CUDA_CUDA_LIBRARY}
			${CUDA_CUDART_LIBRARY})
	if (TARGET spdlog::spdlog)
		target_link_libraries(zed_svo_to_mcap PRIVATE spdlog::spdlog)
	elseif (TARGET spdlog)
		target_link_libraries(zed_svo_to_mcap PRIVATE spdlog)
	endif()
	set_target_properties(zed_svo_to_mcap PROPERTIES
		OUTPUT_NAME "zed_svo_to_mcap"
		RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")
	list(APPEND CVMMAP_STREAMER_INSTALL_TARGETS zed_svo_to_mcap)

	add_library(
		cvmmap_streamer_zed_svo_mp4_support
		STATIC
			src/tools/zed_svo_mp4_support.cpp)
	target_include_directories(cvmmap_streamer_zed_svo_mp4_support
		PUBLIC
			"${CMAKE_CURRENT_LIST_DIR}/include"
			"${CMAKE_CURRENT_BINARY_DIR}")
	target_link_libraries(cvmmap_streamer_zed_svo_mp4_support
		PUBLIC
			PkgConfig::FFMPEG)
	if (TARGET spdlog::spdlog)
		target_link_libraries(cvmmap_streamer_zed_svo_mp4_support PUBLIC spdlog::spdlog)
	elseif (TARGET spdlog)
		target_link_libraries(cvmmap_streamer_zed_svo_mp4_support PUBLIC spdlog)
	endif()

	add_executable(
		zed_svo_to_mp4
		src/tools/zed_svo_to_mp4.cpp)
	target_include_directories(zed_svo_to_mp4
		PRIVATE
			"${CMAKE_CURRENT_LIST_DIR}/include"
			"${CMAKE_CURRENT_BINARY_DIR}"
			${ZED_INCLUDE_DIRS}
			${CUDA_INCLUDE_DIRS})
	target_link_directories(zed_svo_to_mp4
		PRIVATE
			${ZED_LIBRARY_DIR}
			${CUDA_LIBRARY_DIRS})
	target_link_libraries(zed_svo_to_mp4
		PRIVATE
			CLI11::CLI11
			cvmmap_streamer_zed_progress_support
			cvmmap_streamer_zed_svo_mp4_support
			${ZED_LIBRARIES}
			${CUDA_CUDA_LIBRARY}
			${CUDA_CUDART_LIBRARY})
	if (TARGET spdlog::spdlog)
		target_link_libraries(zed_svo_to_mp4 PRIVATE spdlog::spdlog)
	elseif (TARGET spdlog)
		target_link_libraries(zed_svo_to_mp4 PRIVATE spdlog)
	endif()
	set_target_properties(zed_svo_to_mp4 PROPERTIES
		OUTPUT_NAME "zed_svo_to_mp4"
		RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")
	list(APPEND CVMMAP_STREAMER_INSTALL_TARGETS zed_svo_to_mp4)

	if (CVMMAP_BUILD_ZED_SVO_GRID_TO_MP4)
		add_executable(
			zed_svo_grid_to_mp4
			src/tools/zed_svo_grid_to_mp4.cpp)
		target_include_directories(zed_svo_grid_to_mp4
			PRIVATE
				"${CMAKE_CURRENT_LIST_DIR}/include"
				"${CMAKE_CURRENT_BINARY_DIR}"
				${ZED_INCLUDE_DIRS}
				${CUDA_INCLUDE_DIRS}
				${OpenCV_INCLUDE_DIRS})
		target_link_directories(zed_svo_grid_to_mp4
			PRIVATE
				${ZED_LIBRARY_DIR}
				${CUDA_LIBRARY_DIRS})
		target_link_libraries(zed_svo_grid_to_mp4
			PRIVATE
				CLI11::CLI11
				cvmmap_streamer_zed_progress_support
				cvmmap_streamer_zed_svo_mp4_support
				${ZED_LIBRARIES}
				${CUDA_CUDA_LIBRARY}
				${CUDA_CUDART_LIBRARY}
				${OpenCV_LIBS})
		if (TARGET spdlog::spdlog)
			target_link_libraries(zed_svo_grid_to_mp4 PRIVATE spdlog::spdlog)
		elseif (TARGET spdlog)
			target_link_libraries(zed_svo_grid_to_mp4 PRIVATE spdlog)
		endif()
		set_target_properties(zed_svo_grid_to_mp4 PROPERTIES
			OUTPUT_NAME "zed_svo_grid_to_mp4"
			RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/bin")
		list(APPEND CVMMAP_STREAMER_INSTALL_TARGETS zed_svo_grid_to_mp4)
	endif()
endif()

install(
	TARGETS ${CVMMAP_STREAMER_INSTALL_TARGETS}
	RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
