140 lines
5.1 KiB
CMake
140 lines
5.1 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)
|
|
|
|
# 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)
|
|
|