1# RT-Thread Next Generation Build System
2
3## 概述
4
5RT-Thread NG(Next Generation)构建系统是对现有构建系统的面向对象重构,在保持完全向后兼容的同时,提供了更清晰的架构和更强的可扩展性。
6
7## 特性
8
9- ✅ **完全向后兼容**:现有的SConscript无需修改
10- ✅ **面向对象设计**:清晰的类层次结构和职责分离
11- ✅ **SCons最佳实践**:充分利用SCons的Environment对象
12- ✅ **可扩展架构**:易于添加新的工具链和项目生成器
13- ✅ **类型安全**:更好的类型提示和错误处理
14
15## 架构设计
16
17### 核心模块
18
19```
20ng/
21├── __init__.py          # 包初始化
22├── core.py              # 核心类:BuildContext
23├── environment.py       # 环境扩展:RTEnv类,注入到SCons Environment
24├── config.py            # 配置管理:解析rtconfig.h
25├── project.py           # 项目管理:ProjectGroup和Registry
26├── toolchain.py         # 工具链抽象:GCC、Keil、IAR等
27├── generator.py         # 项目生成器:VS Code、CMake等
28├── utils.py             # 工具函数:路径、版本等
29├── adapter.py           # 适配器:与building.py集成
30└── building_ng.py       # 示例:最小化修改的building.py
31```
32
33### 类图
34
35```mermaid
36classDiagram
37    class BuildContext {
38        +root_directory: str
39        +config_manager: ConfigManager
40        +project_registry: ProjectRegistry
41        +toolchain_manager: ToolchainManager
42        +prepare_environment(env)
43        +get_dependency(depend): bool
44    }
45
46    class ConfigManager {
47        +load_from_file(filepath)
48        +get_dependency(depend): bool
49        +get_option(name): ConfigOption
50    }
51
52    class ProjectGroup {
53        +name: str
54        +sources: List[str]
55        +dependencies: List[str]
56        +build(env): List[Object]
57    }
58
59    class Toolchain {
60        <<abstract>>
61        +get_name(): str
62        +detect(): bool
63        +configure_environment(env)
64    }
65
66    class ProjectGenerator {
67        <<abstract>>
68        +generate(context, info): bool
69        +clean(): bool
70    }
71
72    BuildContext --> ConfigManager
73    BuildContext --> ProjectRegistry
74    BuildContext --> ToolchainManager
75    ProjectRegistry --> ProjectGroup
76    ToolchainManager --> Toolchain
77```
78
79## 使用方法
80
81### 1. 最小化集成(推荐)
82
83building.py中添加少量代码即可集成新系统:
84
85```python
86# 在building.py的开头添加
87try:
88    from ng.adapter import (
89        init_build_context,
90        inject_environment_methods,
91        load_rtconfig as ng_load_rtconfig
92    )
93    USE_NG = True
94except ImportError:
95    USE_NG = False
96
97# 在PrepareBuilding函数中添加
98def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components=[]):
99    # ... 原有代码 ...
100
101    # 集成新系统
102    if USE_NG:
103        context = init_build_context(root_directory)
104        inject_environment_methods(env)
105        ng_load_rtconfig('rtconfig.h')
106
107    # ... 继续原有代码 ...
108```
109
110### 2. 使用新的环境方法
111
112集成后,SCons Environment对象会自动获得新方法:
113
114```python
115# 在SConscript中使用新方法
116Import('env')
117
118# 使用环境方法(推荐)
119src = env.GlobFiles('*.c')
120group = env.DefineGroup('MyComponent', src, depend=['RT_USING_XXX'])
121
122# 也可以使用传统方式(保持兼容)
123from building import *
124group = DefineGroup('MyComponent', src, depend=['RT_USING_XXX'])
125```
126
127### 3. 新的项目生成器
128
129新系统提供了改进的项目生成器:
130
131```bash
132# 生成VS Code项目
133scons --target=vscode
134
135# 生成CMake项目
136scons --target=cmake
137```
138
139## API参考
140
141### 环境方法
142
143所有方法都被注入到SCons Environment对象中:
144
145#### env.DefineGroup(name, src, depend, **kwargs)
146定义一个组件组。
147
148**参数:**
149- `name`: 组名称
150- `src`: 源文件列表
151- `depend`: 依赖条件(字符串或列表)
152- `**kwargs`: 额外参数
153  - `CPPPATH`: 头文件路径
154  - `CPPDEFINES`: 宏定义
155  - `CFLAGS`/`CXXFLAGS`: 编译选项
156  - `LOCAL_CFLAGS`/`LOCAL_CPPPATH`: 仅对当前组有效的选项
157  - `LIBS`/`LIBPATH`: 库配置
158
159**返回:** 构建对象列表
160
161**示例:**
162```python
163src = ['driver.c', 'hal.c']
164group = env.DefineGroup('Driver',
165    src,
166    depend=['RT_USING_DEVICE'],
167    CPPPATH=[env.GetCurrentDir()],
168    LOCAL_CFLAGS='-O3'
169)
170```
171
172#### env.GetDepend(depend)
173检查依赖是否满足。
174
175**参数:**
176- `depend`: 依赖名称或列表
177
178**返回:** True如果依赖满足
179
180**示例:**
181```python
182if env.GetDepend('RT_USING_SERIAL'):
183    src += ['serial.c']
184
185if env.GetDepend(['RT_USING_SERIAL', 'RT_SERIAL_USING_DMA']):
186    src += ['serial_dma.c']
187```
188
189#### env.SrcRemove(src, remove)
190从源文件列表中移除文件。
191
192**参数:**
193- `src`: 源文件列表(就地修改)
194- `remove`: 要移除的文件
195
196**示例:**
197```python
198src = env.GlobFiles('*.c')
199env.SrcRemove(src, ['test.c', 'debug.c'])
200```
201
202#### env.BuildPackage(package_path)
203package.json构建软件包。
204
205**参数:**
206- `package_path`: package.json路径
207
208**返回:** 构建对象列表
209
210**示例:**
211```python
212objs = env.BuildPackage('package.json')
213```
214
215#### env.GetContext()
216获取当前构建上下文。
217
218**返回:** BuildContext实例
219
220**示例:**
221```python
222context = env.GetContext()
223if context:
224    context.logger.info("Building component...")
225```
226
227## 高级特性
228
229### 1. 自定义工具链
230
231创建自定义工具链:
232
233```python
234from ng.toolchain import Toolchain
235
236class MyToolchain(Toolchain):
237    def get_name(self):
238        return "mycc"
239
240    def detect(self):
241        # 检测工具链
242        return shutil.which("mycc") is not None
243
244    def configure_environment(self, env):
245        env['CC'] = 'mycc'
246        env['CFLAGS'] = '-O2 -Wall'
247
248# 注册工具链
249context = env.GetContext()
250context.toolchain_manager.register_toolchain('mycc', MyToolchain())
251```
252
253### 2. 自定义项目生成器
254
255创建自定义项目生成器:
256
257```python
258from ng.generator import ProjectGenerator
259
260class MyGenerator(ProjectGenerator):
261    def get_name(self):
262        return "myide"
263
264    def generate(self, context, project_info):
265        # 生成项目文件
266        self._ensure_output_dir()
267        # ... 生成逻辑 ...
268        return True
269
270# 注册生成器
271context.generator_registry.register('myide', MyGenerator)
272```
273
274### 3. 构建钩子
275
276使用构建上下文添加钩子:
277
278```python
279context = env.GetContext()
280
281# 添加日志
282context.logger.info("Starting build...")
283
284# 访问配置
285if context.config_manager.get_option('RT_THREAD_PRIORITY_MAX'):
286    print("Max priority:", context.config_manager.get_value('RT_THREAD_PRIORITY_MAX'))
287
288# 获取项目信息
289info = context.project_registry.get_project_info()
290print(f"Total sources: {len(info['all_sources'])}")
291```
292
293## 迁移指南
294
295### 从旧版本迁移
296
2971. **无需修改**:现有的SConscript文件无需任何修改即可工作
2982. **可选升级**:可以逐步将`DefineGroup`调用改为`env.DefineGroup`
2993. **新功能**:可以开始使用新的特性如`env.BuildPackage`
300
301### 最佳实践
302
3031. **使用环境方法**:优先使用`env.DefineGroup`而不是全局函数
3042. **类型提示**:在Python 3.5+中使用类型提示
3053. **错误处理**:使用context.logger记录错误和警告
3064. **路径处理**:使用PathService处理跨平台路径
307
308## 性能优化
309
310新系统包含多项性能优化:
311
3121. **配置缓存**:依赖检查结果会被缓存
3132. **延迟加载**:工具链和生成器按需加载
3143. **并行支持**:项目生成可以并行执行
315
316## 测试
317
318运行测试套件:
319
320```bash
321cd tools/ng
322python -m pytest tests/
323```
324
325## 贡献
326
327欢迎贡献代码!请遵循以下准则:
328
3291. 保持向后兼容性
3302. 添加类型提示
3313. 编写单元测试
3324. 更新文档
333
334## 路线图
335
336- [ ] 完整的测试覆盖
337- [ ] 性能基准测试
338- [ ] 插件系统
339- [ ] 更多项目生成器(Eclipse、Qt Creator等)
340- [ ] 构建缓存系统
341- [ ] 分布式构建支持
342
343## 许可证
344
345本项目遵循RT-Thread的Apache License 2.0许可证。