Files
SunnyLand/cmake/README.md
T
2025-10-10 07:54:19 +08:00

157 lines
3.9 KiB
Markdown
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 模块说明
本目录包含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. **使用函数封装**,避免全局变量污染