Skip to content

构建系统文档

CFDesktop CMake 构建系统完整指南

目录


概述

CFDesktop 使用基于 CMake 的模块化构建系统,专为跨平台开发和嵌入式部署而设计。该构建系统支持:

  • 多平台:Windows(MinGW/LLVM)、Linux(GCC/Clang)
  • 多架构:x86_64、ARM64、ARMhf
  • 构建类型:Debug、Release、RelWithDebInfo
  • 容器化构建:Docker 多架构支持

构建系统示意图

text
CFDesktop Build System
├── Configuration Files (.ini)
│   ├── build_develop_config.ini    (Debug builds)
│   ├── build_deploy_config.ini     (Release builds)
│   └── build_ci_config.ini         (CI builds)

├── Build Scripts
│   ├── windows_*.ps1               (PowerShell scripts)
│   ├── linux_*.sh                  (Bash scripts)
│   └── docker_start.sh             (Docker wrapper)

├── CMake Modules
│   ├── check_toolchain.cmake       (Toolchain selection)
│   ├── OutputDirectoryConfig.cmake (Output directory management)
│   └── generate_develop_helpers.cmake (IDE config generation)

└── Toolchains
    ├── windows/llvm-toolchain.cmake
    ├── windows/gcc-toolchain.cmake
    ├── linux/ci-x86_64-toolchain.cmake
    └── linux/ci-aarch64-toolchain.cmake
```yaml

---

## CMake 架构

### 根 CMakeLists.txt

根 `CMakeLists.txt` 是构建系统的入口点:

```cmake
cmake_minimum_required(VERSION 3.16)
project(CFDesktop VERSION 0.9.0 LANGUAGES CXX)

# Toolchain configuration (supports shorthand: -DUSE_TOOLCHAIN=windows/llvm)
include(cmake/check_toolchain.cmake)

# Build type validation
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "RelWithDebInfo")

# Compiler flags per build type
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG" CACHE STRING "" FORCE)
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g -DNDEBUG" CACHE STRING "" FORCE)

# Output directories
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")

# Qt6 dependency
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets)

# Subdirectories
add_subdirectory(base)
add_subdirectory(ui)
add_subdirectory(example)
add_subdirectory(test)
```text

### CMake 模块结构

```text
cmake/
├── build_log_helper.cmake         # Logging utilities
├── check_toolchain.cmake          # Toolchain selection
├── custom_target_helper.cmake     # Custom target helpers
├── OutputDirectoryConfig.cmake    # Output directory management
├── ExampleLauncher.cmake          # Windows launcher generation
├── QtDeployUtils.cmake            # Qt deployment utilities
└── generate_develop_helpers.cmake # IDE configuration generation
```bash

---

## 项目模块

### 模块概览

| 模块 | 描述 | 输出 | 依赖 |
|:-----|:-----|:-----|:-----|
| **base/** | 基础工具和平台抽象 | `cfbase.dll` / `libcfbase.so` | Qt6::Core |
| **ui/** | UI 框架和组件 | `cfui.dll` / `libcfui.so` | base、Qt6::Core、Qt6::Gui |
| **example/** | 示例程序 | `examples/{category}/` | base、ui |
| **test/** | 单元测试 | `test/` | base、ui、GoogleTest |

### Base 模块

Base 模块提供基础工具:

```text
base/
├── include/                    # Header-only utilities
│   ├── cfbase/
│   │   ├── expected.hpp       # std::expected-like type
│   │   ├── scope_guard.hpp    # RAII resource management
│   │   └── weak_ptr.hpp       # Weak pointer utilities
│   └── CFDesktop/
│       └── Base/
│           └── system/
│               ├── cpu/        # CPU detection
│               └── memory/     # Memory detection
└── system/
    ├── cpu/CMakeLists.txt      # CPU module
    └── memory/CMakeLists.txt   # Memory module
```text

**统一 Base 库:**
所有 base 组件链接为一个单独的共享库(Windows 上为 `cfbase.dll`,Linux 上为 `libcfbase.so`)。

```cmake
# base/CMakeLists.txt
add_library(cfbase SHARED)
target_sources(cfbase PRIVATE
    $<TARGET_OBJECTS:cfbase_cpu>
    $<TARGET_OBJECTS:cfbase_memory>
)
target_link_libraries(cfbase PUBLIC Qt6::Core)
```text

### UI 模块

UI 模块提供 Material Design 框架:

```text
ui/
├── base/                       # Math utilities
│   ├── math_helper.hpp
│   ├── color_helper.hpp
│   ├── geometry_helper.hpp
│   └── easing.hpp
├── core/                       # Theme engine
│   ├── theme/
│   ├── color_scheme/
│   ├── motion_spec/
│   └── typography/
├── components/                 # Animation system
│   ├── animation/
│   ├── timing_animation/
│   └── spring_animation/
└── widget/                     # Widget adapters
    └── material/
        ├── button/
        ├── label/
        ├── textfield/
        └── ...
```text

**统一 UI 库:**
所有 UI 组件链接为一个单独的共享库(Windows 上为 `cfui.dll`,Linux 上为 `libcfui.so`)。

```cmake
# ui/CMakeLists.txt
add_library(cfui SHARED)
target_link_libraries(cfui PUBLIC
    cf_ui_core
    cf_ui_base
    cf_ui_components
    cf_ui_widget
    CFDesktop::base
    Qt6::Core
    Qt6::Gui
)
```bash

---

## 构建类型

### 可用的构建类型

| 构建类型 | 优化级别 | 调试信息 | 使用场景 |
|:---------|:---------|:--------:|:---------|
| **Debug** | `-O0` | 完整(`-g`) | 开发与调试 |
| **Release** | `-O3` | 无 | 生产部署 |
| **RelWithDebInfo** | `-O2` | 完整(`-g`) | 性能分析和测试 |

### 构建类型选择

构建类型通过 `.ini` 文件进行配置:

```ini
[cmake]
build_type=Debug    # or Release, RelWithDebInfo
```bash

**配置文件:**

| 文件 | 构建类型 | 使用场景 |
|:-----|:---------|:---------|
| `build_develop_config.ini` | Debug | 日常开发 |
| `build_deploy_config.ini` | Release | 生产构建 |
| `build_ci_config.ini` | Release | CI/CD 流水线 |

---

## 工具链配置

### 工具链简写

CFDesktop 支持工具链选择的简写表示法:

```bash
cmake -DUSE_TOOLCHAIN=windows/llvm -S . -B build
cmake -DUSE_TOOLCHAIN=windows/gcc -S . -B build
cmake -DUSE_TOOLCHAIN=linux/ci-x86_64 -S . -B build
```bash

### 可用工具链

| 平台 | 工具链 | 简写 | 编译器 |
|:-----|:-------|:-----|:-------|
| **Windows** | LLVM-MinGW | `windows/llvm` | clang/LLVM |
| **Windows** | MinGW-GCC | `windows/gcc` | gcc/MinGW |
| **Linux** | CI x86_64 | `linux/ci-x86_64` | gcc (Docker) |
| **Linux** | CI ARM64 | `linux/ci-aarch64` | aarch64 gcc (Docker) |

### 工具链文件结构

工具链文件位于 `cmake/cmake_toolchain/{platform}/`:

```text
cmake/cmake_toolchain/
├── windows/
│   ├── llvm-toolchain.cmake
│   └── gcc-toolchain.cmake
└── linux/
    ├── ci-x86_64-toolchain.cmake
    └── ci-aarch64-toolchain.cmake
```text

### Windows LLVM-MinGW 工具链

```cmake
# cmake/cmake_toolchain/windows/llvm-toolchain.cmake
set(CMAKE_PREFIX_PATH "D:/QT/Qt6.6.0/6.8.3/llvm-mingw_64")
set(CMAKE_C_COMPILER "D:/QT/Qt6.6.0/Tools/llvm-mingw1706_64/bin/gcc.exe")
set(CMAKE_CXX_COMPILER "D:/QT/Qt6.6.0/Tools/llvm-mingw1706_64/bin/g++.exe")
```text

### Linux CI 工具链

```cmake
# cmake/cmake_toolchain/linux/ci-x86_64-toolchain.cmake
set(CMAKE_SYSTEM_NAME Linux)
set(QT6_BASE_DIR "/opt/Qt/6.8.1/gcc_64")
set(Qt6_DIR "${QT6_BASE_DIR}/lib/cmake/Qt6")
set(CMAKE_PREFIX_PATH "${QT6_BASE_DIR}")
```yaml

---

## 构建脚本

### 脚本概览

构建脚本按平台和用途组织:

```text
scripts/build_helpers/
├── windows_*.ps1              # Windows PowerShell scripts
│   ├── windows_configure.ps1
│   ├── windows_fast_develop_build.ps1
│   ├── windows_develop_build.ps1
│   └── windows_run_tests.ps1
├── linux_*.sh                 # Linux Bash scripts
│   ├── linux_configure.sh
│   ├── linux_fast_develop_build.sh
│   ├── linux_develop_build.sh
│   └── linux_run_tests.sh
└── docker_start.sh            # Docker wrapper script
```text

### Windows 构建脚本

#### 配置脚本

```powershell
# Configure only (no build)
.\scripts\build_helpers\windows_configure.ps1 [-Config <develop|deploy>]
```text

**该脚本执行以下操作:**
1. 从 `.ini` 文件加载配置
2. 验证构建类型
3. 运行 CMake 配置
4. 生成构建文件

#### 快速构建脚本

```powershell
# Fast incremental build
.\scripts\build_helpers\windows_fast_develop_build.ps1
```text

**该脚本执行以下操作:**
1. 调用配置脚本
2. 使用 CMake 构建(不清理)
3. 使用并行任务

#### 完整构建脚本

```powershell
# Full clean build
.\scripts\build_helpers\windows_develop_build.ps1
```text

**该脚本执行以下操作:**
1. 清理构建目录
2. 调用快速构建脚本
3. 运行测试

### Linux 构建脚本

#### 配置脚本

```bash
# Configure only
bash scripts/build_helpers/linux_configure.sh [develop|deploy|ci] [-c <config_file>]
```text

#### 快速构建脚本

```bash
# Fast incremental build
bash scripts/build_helpers/linux_fast_develop_build.sh [develop|deploy|ci]
```text

#### 完整构建脚本

```bash
# Full clean build
bash scripts/build_helpers/linux_develop_build.sh [develop|deploy|ci]
```text

### Docker 构建脚本

```bash
# Interactive shell
bash scripts/build_helpers/docker_start.sh

# Fast build
bash scripts/build_helpers/docker_start.sh --fast-build --build-project-fast

# Full build
bash scripts/build_helpers/docker_start.sh --build-project

# Run tests
bash scripts/build_helpers/docker_start.sh --run-project-test

# CI verification
bash scripts/build_helpers/docker_start.sh --verify

# ARM64 build
bash scripts/build_helpers/docker_start.sh --arch arm64 --verify
```bash

**Docker 选项:**

| 选项 | 描述 |
|:-----|:-----|
| `--arch amd64\|arm64` | 目标架构 |
| `--fast-build` | 复用已有镜像 |
| `--verify` | 运行 CI 验证 |
| `--build-project` | 完整清理构建 |
| `--build-project-fast` | 快速增量构建 |
| `--run-project-test` | 运行测试 |
| `--stay-on-error` | 出错时保留容器 |
| `--no-log` | 禁用文件日志 |
| `--no-deps` | 跳过依赖安装 |

---

## 输出目录

### 输出目录结构

```text
out/build_{config}/
├── bin/                        # Executables and shared libraries
│   ├── cfbase.dll              # Base library (Windows)
│   ├── cfui.dll                # UI library (Windows)
│   └── ...
├── lib/                        # Static libraries
│   ├── libcfbase.a
│   └── ...
├── examples/                   # Example programs
│   ├── base/                   # Base examples
│   │   ├── cpu_info
│   │   └── memory_info
│   ├── ui/                     # UI widget examples
│   │   ├── button
│   │   ├── label
│   │   └── ...
│   └── gui/                    # GUI examples
│       ├── material_gallery
│       └── theme
├── plugins/                    # Qt plugins
├── resources/                  # Resource files
├── runtimes/                   # Qt runtime DLLs (Windows)
└── test/                       # Test executables
    ├── base_test
    ├── ui_test
    └── ...
```text

### 输出目录配置

输出目录在 `cmake/OutputDirectoryConfig.cmake` 中配置:

```cmake
# Global output directories
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib")

# Example-specific outputs
function(cf_set_example_output_dir TARGET_NAME CATEGORY)
    set_target_properties(${TARGET_NAME} PROPERTIES
        RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/examples/${CATEGORY}"
    )
endfunction()
```yaml

---

## 常用构建选项

### 配置文件选项

配置文件使用 INI 格式:

```ini
[cmake]
# CMake generator
generator=MinGW Makefiles        # or "Unix Makefiles", "Ninja"

# Toolchain selection
toolchain=windows/llvm          # or windows/gcc, linux/ci-x86_64

# Build type
build_type=Debug                # or Release, RelWithDebInfo

[paths]
# Source directory (relative to project root)
source=.

# Build output directory (relative to project root)
build_dir=out/build_develop

[options]
# Parallel jobs for compilation
jobs=16
```bash

### CMake 选项

| 选项 | 描述 | 默认值 |
|:-----|:-----|:-------|
| `CMAKE_BUILD_TYPE` | 构建类型(Debug/Release/RelWithDebInfo) | 必填 |
| `CMAKE_PREFIX_PATH` | Qt 安装路径 | 由工具链提供 |
| `USE_TOOLCHAIN` | 工具链简写 | 必填 |
| `CMAKE_EXPORT_COMPILE_COMMANDS` | 生成 compile_commands.json | ON |
| `BUILD_TESTING` | 构建测试 | ON |

---

## 高级用法

### 自定义工具链配置

要使用自定义工具链:

1. 在 `cmake/cmake_toolchain/{platform}/` 中创建工具链文件
2. 使用简写表示法:

```bash
cmake -DUSE_TOOLCHAIN=windows/mytoolchain -S . -B build
```text

或使用完整路径:

```bash
cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain.cmake -S . -B build
```text

### 增量构建

为了加速开发,可使用增量构建:

**Linux:**
```bash
bash scripts/build_helpers/linux_fast_develop_build.sh
```text

**Windows:**
```powershell
.\scripts\build_helpers\windows_fast_develop_build.ps1
```text

### 并行构建

通过配置文件控制并行任务数:

```ini
[options]
jobs=8                          # Use 8 parallel jobs
```text

或通过 CMake:

```bash
cmake --build build --parallel 8
```text

### 构建特定目标

要构建特定目标:

```bash
cmake --build build --target cfbase
cmake --build build --target cfui
cmake --build build --target material_gallery
```text

### 清理构建

要执行完全清理构建:

**Linux:**
```bash
bash scripts/build_helpers/linux_develop_build.sh
```text

**Windows:**
```powershell
.\scripts\build_helpers\windows_develop_build.ps1
```text

或手动执行:

```bash
rm -rf out/build_develop
cmake -DUSE_TOOLCHAIN=windows/llvm -DCMAKE_BUILD_TYPE=Debug -S . -B out/build_develop
cmake --build out/build_develop
```cpp

---

## 跨平台构建矩阵

### 支持的平台

| 平台 | 架构 | 工具链 | 状态 |
|:-----|:----:|:-------|:----:|
| Windows 10+ | x86_64 | LLVM-MinGW | 已支持 |
| Windows 10+ | x86_64 | MinGW-GCC | 已支持 |
| Linux | x86_64 | GCC | 已支持 |
| Linux | x86_64 | Clang | 已支持 |
| Linux (Docker) | x86_64 | GCC | 已支持 |
| Linux (Docker) | ARM64 | aarch64 gcc | 已支持 |

### 构建命令参考

| 平台 | 命令 |
|:-----|:-----|
| **Windows (LLVM)** | `.\scripts\build_helpers\windows_fast_develop_build.ps1` |
| **Windows (GCC)** | 编辑 `build_develop_config.ini`:`toolchain=windows/gcc` |
| **Linux(原生)** | `bash scripts/build_helpers/linux_fast_develop_build.sh` |
| **Linux (Docker)** | `bash scripts/build_helpers/docker_start.sh --build-project-fast` |
| **ARM64 (Docker)** | `bash scripts/build_helpers/docker_start.sh --arch arm64 --build-project-fast` |

---

## IDE 集成

### VSCode 配置

构建系统会自动生成 VSCode 配置文件:

- `.vscode/launch.json` - 调试配置
- `.clangd` - Clangd 语言服务器配置
- `compile_commands.json` - 编译数据库

这些文件由 `cmake/generate_develop_helpers.cmake` 在 CMake 配置阶段生成。

### QtCreator

QtCreator 可以直接打开项目:

1. 文件 -> 打开文件或项目
2. 选择 `CMakeLists.txt`
3. 配置构建目录
4. 选择工具链
5. 点击"运行 CMake"

---

## 常见问题排查

### 常见问题

| 问题 | 解决方案 |
|:-----|:---------|
| 找不到 CMake | 安装 CMake 3.16+ 或将其添加到 PATH |
| 找不到 Qt | 设置 `Qt6_DIR` 或使用正确的工具链 |
| 找不到编译器 | 安装编译器或使用 Docker 构建 |
| 权限被拒绝 | 在 Linux 上使用 `sudo`,或在 Windows 上以管理员身份运行 |
| 构建时内存不足 | 在 `.ini` 文件中减少并行任务数 |

### Debug 模式构建

用于调试时,请确保使用 Debug 构建类型:

```ini
[cmake]
build_type=Debug
```text

这将:
- 禁用优化(`-O0`)
- 包含完整的调试符号(`-g`)
- 启用断言

### Release 构建

用于生产部署:

```ini
[cmake]
build_type=Release
```yaml

这将:
- 启用最大优化(`-O3`)
- 禁用调试信息
- 定义 `NDEBUG`

---

## 相关文档

- [快速入门指南](02_quick_start.md) - 30 分钟上手
- [项目骨架设计](../design_stage/00_phase0_project_skeleton.md) - 详细的项目架构
- [Base 库设计](../design_stage/02_phase2_base_library.md) - Base 模块文档
- [UI 框架设计](../todo/base/99_ui_material_framework.md) - UI 模块文档

---

**Last Updated**: 2026-03-07

Built with VitePress