Files
cad-agent/cmakelists.txt
gjm a7eaa8483f add
增加了 plugin 工程
2026-10-02 23:43:18 +08:00

144 lines
5.3 KiB
CMake

# 声明最低版本 (与你的 CMakePresets.json 保持一致)
cmake_minimum_required(VERSION 3.21)
# CMP0091 策略最好放在最前面,确保全局生效
cmake_policy(SET CMP0091 NEW)
# 强制指定 Windows SDK 版本为 Win11 SDK
set(CMAKE_SYSTEM_VERSION "${WIN11_SDK}" CACHE STRING "Specify Windows SDK version" FORCE)
# 定义工程大本营
project(CADProject VERSION 1.0.0 LANGUAGES CXX)
# 开启全局解决方案文件夹支持
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
# 全局设定:强制所有配置使用 Release 版本的 CRT 运行库 (/MD)
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreadedDLL")
# 将我们自定义的 cmake 文件夹加入模块搜索路径
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
include(functions)
IsZWCAD(IS_ZWCAD)
# 如果时中望,取出版本号的后两位,作为宏定义
get_sdk_version(SDK_VERSION)
# 如果时中望,subversion 统一为0,否则取出 subversion
get_sdk_sub_version(SDK_SUBVERSION)
# ThirdPartyDeps里面使用了SDK_VERSION
include(ThirdPartyDeps)
# 对 CMake 生成的默认
if(MSVC)
# 剔除 所有工程内的 _DEBUG 宏, 判断是否是 debug/release 模式时,使用 NDEBUG 来判断
string(REGEX REPLACE "[/-]D_DEBUG" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
string(REGEX REPLACE "[/-]D_DEBUG" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
# 剔除 /RTC 相关的运行时检查参数 (如 /RTC1, /RTCs, /RTCu)
# 这一步是消除 __MSVC_RUNTIME_CHECKS 宏的关键
string(REGEX REPLACE "[/-]RTC[a-zA-Z0-9]+" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
string(REGEX REPLACE "[/-]RTC[a-zA-Z0-9]+" "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
endif()
if (IS_ZWCAD)
if (CAD_SDK_VERSION GREATER 2021)
message(STATUS ">>> 检测到现代 ZRX SDK (${CAD_SDK_VERSION}),自动提权至 C++14 标准")
set(CMAKE_CXX_STANDARD 14)
endif()
else()
if(CAD_SDK_VERSION GREATER 25)
message(STATUS ">>> 检测到现代 ARX SDK (${CAD_SDK_VERSION}),自动提权至 C++20 标准")
set(CMAKE_CXX_STANDARD 20)
elseif (CAD_SDK_VERSION GREATER_EQUAL 20)
message(STATUS ">>> 检测到现代 ARX SDK (${CAD_SDK_VERSION}),自动提权至 C++14 标准")
set(CMAKE_CXX_STANDARD 14)
elseif (CAD_SDK_VERSION GREATER 19)
message(STATUS ">>> 检测到现代 ARX SDK (${CAD_SDK_VERSION}),自动提权至 C++03 标准")
set(CMAKE_CXX_STANDARD 03)
else()
message(STATUS ">>> 检测到传统 ARX SDK (${CAD_SDK_VERSION}),保持 C++98 标准")
set(CMAKE_CXX_STANDARD 98)
endif()
endif()
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 检查presets中是否定义了必要的变量
# 把所有必须存在的变量名写成一个列表 (完美支持换行)
set(REQUIRED_VARS
CAD_SDK_ROOT
DEP_LIB_ROOT
DEP_INC_ROOT
CAD_SDK_VERSION)
if (NOT IS_ZWCAD)
list(APPEND REQUIRED_VARS CAD_SDK_SUBVERSION)
endif()
# 2. 遍历这个列表进行检查
foreach(VAR_NAME IN LISTS REQUIRED_VARS)
# 注意这里使用了 ${VAR_NAME},它会展开成上面的字符串,如 "CAD_SDK_VERSION"
if(NOT DEFINED ${VAR_NAME})
message(FATAL_ERROR "【严重错误】缺少必要的配置变量: ${VAR_NAME}!请在 CMakePresets.json 中提供。")
endif()
endforeach()
# 以下为所有工程都加入相应的宏
if(MSVC)
# 🌟 开启 MSVC 多核并发编译!巨型工程提速的终极神器
add_compile_options(/MP)
# 🌟 统一设置全局 Unicode 宏 (ARX 和 MFC 都强烈需要)
add_compile_definitions(
UNICODE
_UNICODE
# release 模式下,统一设置 NDEBUG 宏
$<$<CONFIG:Release>:NDEBUG>
# 关闭安全警告
_CRT_SECURE_NO_WARNINGS
)
# 判断一下是不是中望cad
if (IS_ZWCAD)
message(STATUS ">>> 编译中望CAD版本")
# 加入 ZWCAD 宏,为代码标记中望版本
add_compile_definitions(ZWCAD)
endif()
# 使用for 循环内声明的变量作用域
add_compile_options(/Zc:forScope-)
# 可选:关闭 MSVC 烦人的极度严格警告 (根据你的团队习惯开启/关闭)
add_compile_options(/wd4819 /wd4996)
endif()
# ==========================================
# 第二部分:全局输出目录重定向 (精准路由)
# ==========================================
# 用 CMake 内置命令把带 ../ 的路径“洗”成干净的绝对路径
get_filename_component(GLOBAL_BIN_DIR "${GENERATE_BIN_DIR}" ABSOLUTE)
get_filename_component(GLOBAL_LIB_DIR "${GENERATE_LIB_DIR}" ABSOLUTE)
# 生成形如 "R243", "R200" 的后缀,中望版本"Z2023","Z2024"
if (IS_ZWCAD)
set(GENERATE_DIR_TAG "Z${CAD_SDK_VERSION}")
else()
set(GENERATE_DIR_TAG "R${CAD_SDK_VERSION}${CAD_SDK_SUBVERSION}")
endif()
message(STATUS ">>> 当前输出版本标签: ${GENERATE_DIR_TAG}")
# 配置输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${GLOBAL_BIN_DIR}/Debug-${GENERATE_DIR_TAG}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${GLOBAL_BIN_DIR}/Release-${GENERATE_DIR_TAG}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${GLOBAL_LIB_DIR}/Debug-${GENERATE_DIR_TAG}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${GLOBAL_LIB_DIR}/Release-${GENERATE_DIR_TAG}")
message(STATUS ">>> 正在构建业务树...")
add_subdirectory(./src/cad_mcp_frame)
add_subdirectory(./src/cad_mcp_plugins)