# CMake 模块说明 本目录包含MonsterWar项目的模块化CMake配置文件,将原本庞大的CMakeLists.txt拆分为多个功能独立的模块。 ## 📁 模块列表 ### 1. CompilerSettings.cmake **功能**:编译器配置 - 设置C++标准(C++20) - 配置编译选项和警告级别 - 处理不同平台的字符编码(UTF-8) - Windows子系统设置 **主要函数**: - `setup_compiler_options(TARGET_NAME)` - 为指定目标设置编译选项 --- ### 2. RuntimePath.cmake **功能**:运行时动态库搜索路径配置 - 配置macOS的RPATH(@executable_path) - 配置Linux的RPATH($ORIGIN) - 解决运行时找不到动态库的问题 **适用场景**: - 使用动态链接库时 - 需要分发可执行文件时 --- ### 3. Dependencies.cmake **功能**:智能依赖管理 - 自动查找或获取项目依赖 - 支持系统库、本地源码、在线获取三种方式 - 智能选择静态/动态链接 - 自动处理浅克隆优化 **主要宏**: - `find_or_fetch_dependency()` - 智能依赖获取宏 **主要函数**: - `setup_project_dependencies()` - 配置所有项目依赖(SDL3、GLM、spdlog等) **依赖获取优先级**: 1. 系统已安装的包(find_package) 2. 本地external/目录的源码 3. 在线从GitHub获取 --- ### 4. ImGui.cmake **功能**:ImGui库配置 - 定义ImGui源文件列表 - 配置ImGui头文件搜索路径 - 集成SDL3后端 **使用**: - 自动将`IMGUI_SOURCES`变量导出供主CMakeLists.txt使用 --- ### 5. BuildHelpers.cmake **功能**:构建辅助工具 - 资源文件自动复制 - Windows DLL自动检测和复制 - 智能增量更新(仅复制变更内容) **主要函数**: - `setup_asset_copy(TARGET_NAME)` - 配置资源文件复制 - `setup_windows_dll_copy(TARGET_NAME)` - 配置Windows DLL复制 **特点**: - 使用独立的脚本模块(`scripts/`目录) - 基于文件大小/MD5的智能比对 - 避免不必要的文件复制 - 减少编译时间 - 脚本可单独测试和调试 **相关文件**: - `scripts/CopyAssets.cmake` - 资源复制脚本 - `scripts/CopyDLLs.cmake` - DLL复制脚本 --- ### 6. ProjectInfo.cmake **功能**:项目信息打印 - 在配置完成后打印项目配置摘要 - 显示编译选项、输出目录、链接方式等信息 **主要函数**: - `print_project_info(TARGET_NAME)` - 打印项目配置信息 --- ## 🚀 使用方法 在主`CMakeLists.txt`中引入这些模块: ```cmake # 引入编译器设置 include(cmake/CompilerSettings.cmake) # 引入运行时路径配置 include(cmake/RuntimePath.cmake) # 引入依赖管理 include(cmake/Dependencies.cmake) # 引入ImGui配置 include(cmake/ImGui.cmake) # 引入构建辅助函数 include(cmake/BuildHelpers.cmake) # 引入项目信息打印 include(cmake/ProjectInfo.cmake) # 调用函数 setup_project_dependencies() setup_compiler_options(${TARGET}) setup_asset_copy(${TARGET}) setup_windows_dll_copy(${TARGET}) print_project_info(${TARGET}) ``` ## 🔧 自定义依赖 如需添加新的依赖库,编辑`Dependencies.cmake`中的`setup_project_dependencies()`函数: ```cmake # 添加新依赖 find_or_fetch_dependency( 库内部名称 包名称 "Git仓库地址" "版本标签" "本地路径" 链接类型 # STATIC/SHARED/AUTO ) ``` ## 📝 优势 ✅ **模块化**:各功能独立,易于维护 ✅ **可复用**:模块可以在其他项目中复用 ✅ **清晰**:主CMakeLists.txt更简洁,只关注项目本身 ✅ **灵活**:可以根据需要选择性引入模块 ✅ **易扩展**:新增功能只需添加新模块,不影响现有代码 ## 🎯 最佳实践 1. **不要直接修改主CMakeLists.txt的底层逻辑**,而是修改对应模块 2. **新增通用功能**时,考虑创建新模块而非堆砌在主文件中 3. **保持模块单一职责**,一个模块只负责一类功能 4. **使用函数封装**,避免全局变量污染