Files
Sentinel/CMakeLists.txt
2026-05-26 11:46:24 +08:00

164 lines
5.3 KiB
CMake
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 最低CMake版本要求:3.21 以上才支持 RUNTIME_DEPENDENCIES install 功能(自动部署 vcpkg so
cmake_minimum_required(VERSION 3.21)
# =====================================================
# Toolchain (vcpkg)
# =====================================================
# 告诉CMake使用vcpkg作为依赖管理
# 所有 find_package(... CONFIG) 会优先搜索 vcpkg 提供的库
set(CMAKE_TOOLCHAIN_FILE
$ENV{HOME}/vcpkg/scripts/buildsystems/vcpkg.cmake
CACHE STRING "Vcpkg toolchain file")
# =====================================================
# Project定义
# =====================================================
project(sentinel-app LANGUAGES CXX)
# =====================================================
# 全局构建配置
# =====================================================
# 使用C++17标准
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 对生成的库启用位置无关代码(PIE / PIC)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# =====================================================
# 平台检测 执行命令获取目标机器架构
# =====================================================
execute_process(
COMMAND gcc -dumpmachine
OUTPUT_VARIABLE TARGET_DEVICE
OUTPUT_STRIP_TRAILING_WHITESPACE
)
# 如果是 aarch64 (Jetson / Tegra),定义宏 PLATFORM_TEGRA
if(TARGET_DEVICE MATCHES "aarch64")
add_compile_definitions(PLATFORM_TEGRA)
endif()
# =====================================================
# 依赖库
# =====================================================
# pkg-config 必须,用来查询系统库的编译/链接参数
find_package(PkgConfig REQUIRED)
# vcpkg 管理的库(现代CMake target
find_package(miniocpp CONFIG REQUIRED) # minio C++ SDK
find_package(yaml-cpp CONFIG REQUIRED) # yaml parser
# ========================
# 系统库 / NVIDIA stack
# ========================
pkg_check_modules(GST REQUIRED gstreamer-1.0) # gstreamer 头文件与库
pkg_check_modules(UUID REQUIRED uuid) # uuid 库
# =====================================================
# 主可执行文件
# =====================================================
add_executable(sentinel-app
src/app.cpp
src/service/vehicle_event_service.cpp
src/service/rtsp_grabber.cpp
src/utils/ds_yml_parse.cpp
src/utils/my_utils.cpp
)
# 编译选项
target_compile_options(sentinel-app
PRIVATE
-Wall # 打开所有警告
-Werror # 警告当作错误
-Wno-unused-function # 忽略未使用函数警告
)
# 包含目录
target_include_directories(sentinel-app
PRIVATE
src # 自己的源码目录
src/service
src/utils
${GST_INCLUDE_DIRS} # gstreamer include
/opt/nvidia/deepstream/deepstream/sources/includes # DeepStream SDK
/usr/local/cuda/include # CUDA
)
# 链接目录(仅针对非 target 方式库)
target_link_directories(sentinel-app
PRIVATE
/opt/nvidia/deepstream/deepstream/lib # DeepStream 库
/usr/local/cuda/lib64 # CUDA 库
)
# 链接库
target_link_libraries(sentinel-app
PRIVATE
# vcpkg target,现代CMake可追踪
miniocpp::miniocpp
yaml-cpp
# RabbitMQ
SimpleAmqpClient
rabbitmq
# 系统/DeepStream/GStreamer库
${GST_LIBRARIES}
gstrtspserver-1.0
nvds_batch_jpegenc
nvdsgst_meta
nvdsgst_helper
nvds_meta
nvds_yml_parser
# 系统/第三方库
uuid
cudart
avformat
avcodec
avutil
swscale
avdevice
avfilter
curl
m
z
pthread
)
# =====================================================
# RPATH 设置(运行时库搜索路径)
# =====================================================
# BUILD_RPATH:构建时运行可执行文件的搜索路径
# INSTALL_RPATH:安装后运行可执行文件的搜索路径
# $ORIGIN 表示可执行文件所在目录
set_target_properties(sentinel-app PROPERTIES
BUILD_RPATH "\$ORIGIN/lib" # 优先搜索 dist/lib
INSTALL_RPATH "\$ORIGIN/lib:/opt/nvidia/deepstream/deepstream/lib" # fallback DeepStream
)
# =====================================================
# 安装规则(部署阶段)
# =====================================================
# 安装可执行文件,并自动收集 vcpkg 的运行时 so
install(TARGETS sentinel-app
RUNTIME_DEPENDENCIES
PRE_EXCLUDE_REGEXES
"ld-linux" # 排除系统 loader
"libc.so" # 系统 libc
"libm.so" # 系统 math
"libpthread.so" # 系统线程库
"libdl.so" # 系统动态库
"libcuda" # CUDA 系统库
"libnvidia" # NVIDIA 驱动
"libnv" # NVIDIA 系统库
"libgst" # GStreamer 系统库
"libav" # ffmpeg 系统库
"libcrypto" # 系统加密库
"libssl"
POST_EXCLUDE_REGEXES
".*/opt/nvidia/.*" # 不拷贝 DeepStream 系统库
".*/usr/lib/.*" # 不拷贝系统库
RUNTIME DESTINATION . # 可执行文件放 dist/
LIBRARY DESTINATION lib # 对应 so 库安装到 dist/lib/
)