# 声明最低版本 (与你的 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) # 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 宏 $<$: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)