Files
radar_data_process/CMakeLists.txt
T

310 lines
15 KiB
CMake
Raw 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_minimum_required(VERSION 3.21)
# 雷达数据处理动态链接库
# 开发环境已由 Qt/qmake 迁移到 VS Code + CMake。
# 编译器已由 Microsoft Visual C++ Compiler 12.0 (VS2013) 升级为
# Microsoft Visual C++ Compiler 2022(v143 工具集,_MSC_VER 19.4x,x64)。
# 语言标准同步提升为 C++17。
#
# 注意:VS2022 生成器("Visual Studio 17 2022")需要 CMake >= 3.21,
# 因此本工程的最低 CMake 版本随之提高;NMake/Ninja 生成器同样满足。
project(data_process_class_dll LANGUAGES CXX)
# 机扫 / 相扫版本已合并为同一份 DLL:构建不再区分扫描体制,也不再定义
# PHASE_SCANNING / MECHANICAL_SCANNING 编译期宏,也没有 RADAR_SCAN_MODE 缓存变量。
# 扫描模式改由运行期配置项的 `[radar_params] scan_mode` 决定(0 相扫 / 1 机扫),
# 随全部雷达工作参数一起由 TOML 配置文件经 parameters_reload() 载入,详见 README 4.2、10。
# ---------------------------------------------------------------------------
# 数据记录调试功能开关(可选编译,详见 docs/data_record_debug.md)
# AUTO : Debug 构建启用、Release 构建关闭(默认;交付构建不做任何记录)
# ON : 强制启用(可用于 Release 排查,需自行承担性能开销)
# OFF : 强制关闭
# 启用时新增独立静态库 rdp_record:以 C++20 编译(ormpp 要求)、编译内置的 sqlite3
# amalgamation,并链接进 DLL;源码中的 RDP_RECORD 宏由 RDP_RECORD_ENABLE 控制,关闭时
# 展开为空操作(实参不求值),记录模块完全不参与编译。
# 依赖来源与升级方式见 third_party/ormpp/UPSTREAM.md。
# ---------------------------------------------------------------------------
set(RDP_DATA_RECORD "AUTO" CACHE STRING "数据记录调试功能:AUTO(Debug=ON/Release=OFF) / ON / OFF")
set_property(CACHE RDP_DATA_RECORD PROPERTY STRINGS AUTO ON OFF)
if(RDP_DATA_RECORD STREQUAL "AUTO")
if(CMAKE_CONFIGURATION_TYPES)
message(FATAL_ERROR "多配置生成器下 RDP_DATA_RECORD=AUTO 无法判定,请显式传入 ON 或 OFF")
elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(RDP_RECORD_ENABLED TRUE)
else()
set(RDP_RECORD_ENABLED FALSE)
endif()
elseif(RDP_DATA_RECORD STREQUAL "ON")
set(RDP_RECORD_ENABLED TRUE)
elseif(RDP_DATA_RECORD STREQUAL "OFF")
set(RDP_RECORD_ENABLED FALSE)
else()
message(FATAL_ERROR "RDP_DATA_RECORD 必须为 AUTO / ON / OFF,当前值:${RDP_DATA_RECORD}")
endif()
if(RDP_RECORD_ENABLED)
message(STATUS "数据记录调试功能:启用(C++20 静态库 rdp_record + 内置 SQLite)")
else()
message(STATUS "数据记录调试功能:关闭(不编译记录模块,RDP_RECORD 为空操作)")
endif()
# ---------------------------------------------------------------------------
# 日志编译期级别(spdlog)
# 原 parameters.h 的 RDP_LOG_ENABLE 布尔开关已移除:日志级别改由 spdlog 的
# SPDLOG_ACTIVE_LEVEL 在编译期控制(低于该级别的 RDP_LOG_* 日志在编译期被
# 剔除、实参不求值,OFF 即等价于原「关闭日志模块」)。本缓存变量把级别映射
# 到 SPDLOG_ACTIVE_LEVEL,并同时用于 data_process_class_dll 与 rdp_record
# 两个目标(两个目标使用同一份 spdlog 头文件配置,必须保持一致)。
# AUTO : Debug 构建 = TRACE,其余构建 = INFO(默认)
# TRACE / DEBUG / INFO / WARN / ERROR / CRITICAL : 显式指定最低编译级别
# OFF : 编译期关闭全部 RDP_LOG_* 日志(rdp_log::Init() 也不再创建日志文件)
# 修改方式:cmake -DRDP_LOG_LEVEL=WARN ...(或在 CMakeCache 中修改后重新配置)
# ---------------------------------------------------------------------------
set(RDP_LOG_LEVEL "AUTO" CACHE STRING "日志编译期级别:AUTO(Debug=TRACE/其它=INFO) / TRACE / DEBUG / INFO / WARN / ERROR / CRITICAL / OFF")
set_property(CACHE RDP_LOG_LEVEL PROPERTY STRINGS AUTO TRACE DEBUG INFO WARN ERROR CRITICAL OFF)
if(RDP_LOG_LEVEL STREQUAL "AUTO")
if(CMAKE_CONFIGURATION_TYPES)
set(RDP_LOG_ACTIVE_LEVEL_DEFS
"$<$<CONFIG:Debug>:SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_TRACE>"
"$<$<NOT:$<CONFIG:Debug>>:SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_INFO>")
set(RDP_LOG_LEVEL_DESC "AUTO(多配置生成器:Debug=TRACE,其它=INFO)")
elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(RDP_LOG_ACTIVE_LEVEL_DEFS "SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_TRACE")
set(RDP_LOG_LEVEL_DESC "AUTO(Debug 构建 → TRACE)")
else()
set(RDP_LOG_ACTIVE_LEVEL_DEFS "SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_INFO")
if(CMAKE_BUILD_TYPE)
set(RDP_LOG_LEVEL_DESC "AUTO(${CMAKE_BUILD_TYPE} 构建 → INFO)")
else()
set(RDP_LOG_LEVEL_DESC "AUTO(未指定构建类型 → INFO)")
endif()
endif()
elseif(RDP_LOG_LEVEL STREQUAL "OFF")
set(RDP_LOG_ACTIVE_LEVEL_DEFS "SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_OFF")
set(RDP_LOG_LEVEL_DESC "OFF(编译期关闭全部 RDP_LOG_* 日志)")
elseif(RDP_LOG_LEVEL MATCHES "^(TRACE|DEBUG|INFO|WARN|ERROR|CRITICAL)$")
set(RDP_LOG_ACTIVE_LEVEL_DEFS "SPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_${RDP_LOG_LEVEL}")
set(RDP_LOG_LEVEL_DESC "${RDP_LOG_LEVEL}")
else()
message(FATAL_ERROR
"RDP_LOG_LEVEL 必须为 AUTO / TRACE / DEBUG / INFO / WARN / ERROR / CRITICAL / OFF,"
"当前值:${RDP_LOG_LEVEL}")
endif()
message(STATUS "日志编译期级别:${RDP_LOG_LEVEL_DESC}(映射为 SPDLOG_ACTIVE_LEVEL)")
# ---------------------------------------------------------------------------
# 语言标准:C++17
# ---------------------------------------------------------------------------
# CMAKE_CXX_STANDARD 由 CMake 转换为 MSVC 的 /std:c++17(CMake >= 3.10 起支持)。
# CMAKE_CXX_EXTENSIONS OFF 在 MSVC 下没有对应开关(只影响 GCC/Clang 的 -std=gnu++xx),
# 保留它是为了在换用其它编译器时同样不启用语言扩展。
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# ---------------------------------------------------------------------------
# 编译器约束:必须使用 MSVC 2022(v143,_MSC_VER >= 1930)
# ---------------------------------------------------------------------------
if(NOT MSVC)
message(FATAL_ERROR "本工程仅支持 MSVC (cl.exe) 编译器,当前编译器:${CMAKE_CXX_COMPILER_ID}")
endif()
if(MSVC_VERSION LESS 1930)
message(FATAL_ERROR
"本工程要求 MSVC 2022 (v143) 及以上版本(_MSC_VER >= 1930),"
"当前 _MSC_VER=${MSVC_VERSION}(编译器:${CMAKE_CXX_COMPILER})。\n"
"请先运行 VS2022 的 vcvarsall.bat x64(见 .vscode/scripts/msvc_env.bat)后再配置。")
endif()
message(STATUS "编译器:${CMAKE_CXX_COMPILER}(MSVC _MSC_VER=${MSVC_VERSION})")
message(STATUS "C++ 标准:C++${CMAKE_CXX_STANDARD}")
# 导出编译命令,便于 VS Code C/C++ 插件 IntelliSense 使用。
# Visual Studio 生成器不支持该选项,因此仅对 Makefile/Ninja 生成器开启。
if(NOT CMAKE_GENERATOR MATCHES "Visual Studio")
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
endif()
# ---------------------------------------------------------------------------
# 内置第三方库 spdlog(日志,v1.17.0,见 third_party/spdlog/UPSTREAM.md)
# 以静态库方式编译(SPDLOG_COMPILED_LIB),供 data_process_class_dll 与
# rdp_record(C++20 静态库,rdp_record.cpp 内也有日志)链接:
# - PUBLIC 编译定义 SPDLOG_COMPILED_LIB / SPDLOG_ACTIVE_LEVEL 与头文件
# 目录,保证所有使用方(含跨 C++17/C++20 的两目标)配置一致;
# - SPDLOG_ACTIVE_LEVEL 由上方 RDP_LOG_LEVEL 决定;
# - 第三方源码以 /w 编译,维持本项目 /W3 零告警约定(见 README 4.5)。
# ---------------------------------------------------------------------------
set(SPDLOG_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/third_party/spdlog")
add_library(spdlog STATIC
third_party/spdlog/src/spdlog.cpp
third_party/spdlog/src/async.cpp
third_party/spdlog/src/cfg.cpp
third_party/spdlog/src/color_sinks.cpp
third_party/spdlog/src/file_sinks.cpp
third_party/spdlog/src/stdout_sinks.cpp
third_party/spdlog/src/bundled_fmtlib_format.cpp
)
target_include_directories(spdlog PUBLIC ${SPDLOG_ROOT}/include)
target_compile_definitions(spdlog PUBLIC
SPDLOG_COMPILED_LIB
${RDP_LOG_ACTIVE_LEVEL_DEFS}
)
if(MSVC)
target_compile_options(spdlog PRIVATE /w /utf-8 /Zc:__cplusplus /Zc:wchar_t /FS)
endif()
set_target_properties(spdlog PROPERTIES
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
)
message(STATUS "第三方日志库:spdlog v1.17.0(静态库,third_party/spdlog)")
set(SOURCES
data_process_class_dll/rdp_log.cpp
data_process_class_dll/data_process_class_dll.cpp
data_process_class_dll/data_process.cpp
data_process_class_dll/rdp_parameter_loader.cpp
data_process_class_dll/dot_coh.cpp
data_process_class_dll/kalman.cpp
data_process_class_dll/coor_trans.cpp
data_process_class_dll/track_asso.cpp
data_process_class_dll/track_init.cpp
data_process_class_dll/track_index_mangement.cpp
data_process_class_dll/tas_ctrl.cpp
data_process_class_dll/track_die.cpp
data_process_class_dll/dot_coh_tas.cpp
data_process_class_dll/track_asso_tas.cpp
data_process_class_dll/track_init_direct_tracking.cpp
data_process_class_dll/track_die_tas.cpp
)
set(PUBLIC_HEADERS
data_process_class_dll/data_process_class_dll.h
data_process_class_dll/data_process_class_dll_global.h
)
add_library(data_process_class_dll SHARED ${SOURCES})
# 日志库(静态库 spdlog):
# 目标级 PUBLIC 接口提供 spdlog 头文件目录、SPDLOG_COMPILED_LIB 与 SPDLOG_ACTIVE_LEVEL,
# 使 rdp_log.cpp 及各业务模块(RDP_LOG_* 宏)以一致的配置编译。
target_link_libraries(data_process_class_dll PRIVATE spdlog)
# ---------------------------------------------------------------------------
# 数据记录模块(RDP_DATA_RECORD 启用时构建):独立静态库、C++20(ormpp 要求),
# 与雷达处理代码(C++17)通过 rdp_record.h 的「仅声明 + 显式实例化」跨标准边界。
# ---------------------------------------------------------------------------
if(RDP_RECORD_ENABLED)
enable_language(C) # 用于编译 sqlite3 amalgamation
add_library(rdp_record STATIC
data_process_class_dll/rdp_record.cpp
third_party/ormpp/thirdparty/sqlite3/sqlite3.c
)
set_target_properties(rdp_record PROPERTIES
CXX_STANDARD 20
CXX_STANDARD_REQUIRED ON
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
)
# RDP_RECORD_ENABLE 经 PUBLIC 传递给 DLL:data_process.cpp 等源码中的 RDP_RECORD 宏随之生效
target_compile_definitions(rdp_record PUBLIC
RDP_RECORD_ENABLE
ORMPP_ENABLE_SQLITE3
)
target_include_directories(rdp_record
PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/data_process_class_dll
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/third_party/ormpp
${CMAKE_CURRENT_SOURCE_DIR}/third_party/ormpp/iguana
${CMAKE_CURRENT_SOURCE_DIR}/third_party/ormpp/ormpp
${CMAKE_CURRENT_SOURCE_DIR}/third_party/ormpp/thirdparty/sqlite3
)
target_compile_options(rdp_record PRIVATE
# /W3 与 /Zc:__cplusplus 只用于 C++ 源文件:sqlite3.c 由下方源文件级 /w 关闭告警,
# 若 C 文件也带 /W3,cl 会打印 D9025(overriding '/W3' with '/w')命令行提示。
$<$<COMPILE_LANGUAGE:CXX>:/W3>
/utf-8
$<$<COMPILE_LANGUAGE:CXX>:/Zc:__cplusplus>
/FS
)
# 第三方 amalgamation 单独降到 /w(源文件级选项在编译命令行中位于目标级之后,优先生效)
set_source_files_properties(third_party/ormpp/thirdparty/sqlite3/sqlite3.c
PROPERTIES COMPILE_OPTIONS "/w")
# rdp_record.cpp 内的 RDP_LOG_* 日志经 rdp_log.h 使用 spdlog:
# 链接 spdlog 目标以获得其 PUBLIC 头文件目录与 SPDLOG_COMPILED_LIB /
# SPDLOG_ACTIVE_LEVEL 定义(与 DLL 目标保持一致)。
target_link_libraries(rdp_record PRIVATE spdlog)
target_link_libraries(data_process_class_dll PRIVATE rdp_record)
endif()
# 编译 DLL 时定义导出宏;引用 DLL 的工程不应定义该宏。
target_compile_definitions(data_process_class_dll PRIVATE
DATA_PROCESS_CLASS_DLL_LIBRARY
)
# 与 qmake 工程保持一致的 Windows 编译定义
if(WIN32)
target_compile_definitions(data_process_class_dll PRIVATE
WIN32
_WINDOWS
_UNICODE
UNICODE
NOMINMAX
)
endif()
# Eigen 头文件位于源码目录下(<Eigen/Dense>)。
# toml++ 为单头文件第三方库(<toml.hpp>,仅 rdp_parameter_loader.cpp 使用)。
target_include_directories(data_process_class_dll PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/data_process_class_dll
${CMAKE_CURRENT_SOURCE_DIR}/third_party/toml
)
if(MSVC)
target_compile_options(data_process_class_dll PRIVATE
# 显式恢复 /W3 警告级别。
# CMake 3.15(策略 CMP0092)起不再把 /W3 放进 CMAKE_CXX_FLAGS,
# 而本工程此前(cmake_minimum_required 3.10)一直以 /W3 构建,
# README 4.5 记录的全部 C4819/C4018/C4244 告警清理也基于该级别,
# 因此这里显式指定,保持警告级别不变。
/W3
# MSVC 2022 完整支持 /utf-8(VS2015 Update 2 起),
# 源码本身为 UTF-8 with BOM,显式指定后中文字符串/注释不再受系统代码页影响(消除 C4819)。
/utf-8
# 让 __cplusplus 正确报告 201703L(MSVC 默认始终为 199711L)。
# C++17 下依赖 __cplusplus 判断的第三方库(Eigen 3.3.7 等)据此走标准分支。
/Zc:__cplusplus
/Zc:wchar_t
# NMake 生成器下并行/增量编译时统一 PDB 写入。
/FS
)
# 与原 qmake 生成的编译选项保持一致:Release 配置额外开启严格字符串字面量检查。
# (原 MSVC 2013 因 Debug 运行库与 /Zc:strictStrings 冲突而仅限 Release,
# 升级到 MSVC 2022 后该限制已不存在,此处仍沿用“仅 Release”以保持行为不变。)
target_compile_options(data_process_class_dll PRIVATE
$<$<CONFIG:Release>:/Zc:strictStrings>
)
endif()
# 输出目录:build/bin 下为 DLL/PDB,build/lib 下为导入库。
set_target_properties(data_process_class_dll PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
PDB_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
PUBLIC_HEADER "${PUBLIC_HEADERS}"
)
# 安装规则:DLL/导入库 -> bin/lib,公开头文件 -> include。
include(GNUInstallDirs)
install(TARGETS data_process_class_dll
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)