164 lines
5.3 KiB
CMake
164 lines
5.3 KiB
CMake
# 最低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/
|
||
) |