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