geopro/CMakeLists.txt

146 lines
7.2 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)
# 读取vcpkg工具链自动兼容带空格路径
if(DEFINED ENV{VCPKG_ROOT} AND NOT DEFINED CMAKE_TOOLCHAIN_FILE)
set(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "")
endif()
project(geopro_desktop LANGUAGES CXX)
# ---- Global C++ settings (规约 §3.2: C++17, 可渐进 C++20) ----
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Qt 自动工具(仅 view/app 层需要 moc/uic/rcc
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
if(MSVC)
# 显式钉死 MSVC 运行时库Release=/MDDebug=/MDd杜绝静默漂移ABI 一致性,见 ENV_SETUP §9.2)。
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
add_compile_options(/utf-8 /MP /W4 /permissive-)
# 生成 PDB——即使 Release 优化构建也产出调试符号,使 minidump / 运行期崩溃栈可符号化分析
# (生产桌面端排障必需)。/Zi 编译期调试信息;/DEBUG 链接产 PDB/OPT:REF,ICF 抵消 /DEBUG
# 默认关掉的优化,保持二进制优化+精简。仅非 Debug 配置启用。
add_compile_options($<$<NOT:$<CONFIG:Debug>>:/Zi>)
add_link_options($<$<NOT:$<CONFIG:Debug>>:/DEBUG>
$<$<NOT:$<CONFIG:Debug>>:/OPT:REF>
$<$<NOT:$<CONFIG:Debug>>:/OPT:ICF>)
endif()
# =====================================================================
# 构建方案②-修订(设计 §11 / K-8 / docs/ENV_SETUP_Windows.md
# - 单一 Qt = 官方 MSVC 预编译 QtCMAKE_PREFIX_PATH 指向 D:/Qt/6.11.1/msvc2022_64
# - VTK: 预先用官方 Qt 源码编并 install 到 VTK_DIR见 ENV_SETUP / Phase 0
# - ADS / QtKeychain: 经 FetchContent 对接同一份官方 Qt绝不走 vcpkg避免双 Qt
# - 仅非 Qt 依赖GDAL/PROJ/OpenSSL/Eigen/...)走 vcpkg
# =====================================================================
# =====================================================================
# 构建环境护栏(把「配置错→运行时随机崩溃」变成「配置期一眼可查」)
# 校准基准:本机 Qt 6.11.1 msvc2022_64 + VTK 9.6.x + VS2026-preview 工具集。
# 工具集只 WARN 不 FATAL本机 VS2026-preview 与预编译 Qt v143 ABI 兼容、可正常构建)。
# 详见 docs/ENV_SETUP_Windows.md §4/§5/§9。
# =====================================================================
if(WIN32)
# QT_ROOT 环境变量必须已设且指向有效的官方 MSVC Qt kit预设的 CMAKE_PREFIX_PATH 读它)。
if(NOT DEFINED ENV{QT_ROOT} OR "$ENV{QT_ROOT}" STREQUAL ""
OR NOT EXISTS "$ENV{QT_ROOT}/lib/cmake/Qt6")
message(FATAL_ERROR
"QT_ROOT 未设置或无效。请 setx QT_ROOT \"<你的Qt>\\6.11.1\\msvc2022_64\" 后重开终端。见 docs/ENV_SETUP_Windows.md §4。")
endif()
endif()
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Network Sql Concurrent)
# Qt 版本护栏major.minor 必须是 6.11(任意补丁号可)。换大小版本会与源码编的 VTK/ADS ABI/兼容性错位。
if(NOT Qt6_VERSION VERSION_LESS 6.11 AND Qt6_VERSION VERSION_LESS 6.12)
# 6.11.x —— 合规。
else()
message(FATAL_ERROR
"Qt 版本不匹配:找到 ${Qt6_VERSION},需要 6.11.x与源码编的 VTK/ADS 兼容)。请安装 6.11.1 msvc2022_64 并把 QT_ROOT 指向它。见 docs/ENV_SETUP_Windows.md §4。")
endif()
# VTK 就位护栏friendlyfind_package REQUIRED 也会失败,但这里给出可操作的原因。
if(NOT EXISTS "${CMAKE_SOURCE_DIR}/external/vtk-install/lib/cmake/vtk-9.6")
message(FATAL_ERROR
"VTK 未就位。请按 docs/ENV_SETUP_Windows.md §5.1 源码 Release 编 VTK 9.6.x 到 external/vtk-install。")
endif()
# VTK 9 必须指定 COMPONENTS否则 VTK_LIBRARIES 为空、链接不到任何 VTK。
# 来自 VTK_DIRexternal/vtk-install。随渲染层增补模块Volume/Filters 等)。
find_package(VTK REQUIRED COMPONENTS
GUISupportQt
RenderingOpenGL2
RenderingFreeType # 导航 gizmo 轴标签(vtkBillboardTextActor3D)运行时字形渲染:注册 FreeType 工厂
InteractionStyle
FiltersSources
)
# VTK 版本护栏major.minor 须为 9.6VTK_DIR 路径已带 vtk-9.6,越界基本是误装/误指)。
if(VTK_VERSION VERSION_LESS 9.6 OR NOT VTK_VERSION VERSION_LESS 9.7)
message(FATAL_ERROR
"VTK 版本不匹配:找到 ${VTK_VERSION},需要 9.6.x。请按 docs/ENV_SETUP_Windows.md §5.1 用同一 Qt/工具集重编到 external/vtk-install。")
endif()
# 工具集护栏(仅 WARN绝不 FATAL预编译 Qt 是 msvc2022(v143)VTK 必须与 app 用同一工具集编,
# 否则 std::map/std::string 跨界 ABI 崩溃(见 §10。本机 VS2026-preview 与 v143 兼容、可正常构建。
if(MSVC AND NOT MSVC_TOOLSET_VERSION STREQUAL "143")
message(WARNING
"MSVC 工具集为 v${MSVC_TOOLSET_VERSION}(非 v143。预编译 Qt 为 msvc2022(v143);请确保 external/vtk-install 的 VTK 与本 app 用【同一工具集】编,避免 ABI 不匹配崩溃。见 docs/ENV_SETUP_Windows.md §9.2。")
endif()
# 非 Qt 依赖vcpkg随分层逐步启用
# find_package(GDAL CONFIG REQUIRED)
# find_package(PROJ CONFIG REQUIRED)
# find_package(Eigen3 CONFIG REQUIRED)
# find_package(spdlog CONFIG REQUIRED)
# find_package(nlohmann_json CONFIG REQUIRED)
# find_package(OpenSSL REQUIRED)
# ADS停靠FetchContent 对接官方 Qtspike S2。QtKeychain 待登录层再加。
include(FetchContent)
set(ADS_VERSION 4.3.1 CACHE STRING "" FORCE)
set(BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(BUILD_STATIC OFF CACHE BOOL "" FORCE)
FetchContent_Declare(ads
GIT_REPOSITORY https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System.git
GIT_TAG 4.3.1)
FetchContent_MakeAvailable(ads)
# QtKeychain凭证安全存取规约 §7.4:登录"记住一个月"免登录FetchContent 对接官方 Qt。
# 必须指定 Qt6默认走 Qt5 会找不到包);静态链接避免额外 DLL关测试程序与翻译省依赖。
set(BUILD_WITH_QT6 ON CACHE BOOL "" FORCE)
set(BUILD_TEST_APPLICATION OFF CACHE BOOL "" FORCE)
set(BUILD_TRANSLATIONS OFF CACHE BOOL "" FORCE)
set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
FetchContent_Declare(qtkeychain
GIT_REPOSITORY https://github.com/frankosterfeld/qtkeychain.git
GIT_TAG v0.14.0)
FetchContent_MakeAvailable(qtkeychain)
# Qwt 6.2(二维科学图表:数据集详情散点/等值线图)。见 cmake/qwt.cmake 说明。
# 源码 external/qwt-src 已 gitignore需按 docs/ENV_SETUP 拉取。
if(EXISTS "${CMAKE_SOURCE_DIR}/external/qwt-src/src")
include("${CMAKE_SOURCE_DIR}/cmake/qwt.cmake")
endif()
# vendored 3DGPRViewer 数据生成链原样拷贝算法零改动geopro_gpr3dv 静态库。
# 链:多通道 .iprh/.iprb → GPRDataModel 立方体 → RadarProcessor 处理。生产管线 A 地基。
add_subdirectory(external/gpr3dviewer)
add_subdirectory(src)
# POC-B headless 度量 CLIgpr_poc。链 io_gpr/core/store/render在真实数据上跑端到端度量。
add_subdirectory(tools/gpr_poc)
# gpr3dv 冒烟 CLI走 vendored 原版 APIloadImpulseMultiChannel → buildVolumeData → runPipeline
add_subdirectory(tools/gpr3dv_smoke)
enable_testing()
add_subdirectory(tests)