Skip to content

Commit 563a7af

Browse files
committed
Add non-GCC toolchain configs and flexible flag handling
1 parent 8675ba2 commit 563a7af

6 files changed

Lines changed: 261 additions & 37 deletions

File tree

ebuild/README.md

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,13 @@ TOOLCHAIN_CONFIG = {
140140
POST_ACTION = "$OBJCOPY -O binary $TARGET build/stm32f103.bin"
141141
```
142142

143+
非 GCC 工具链可通过以下配置项定制命令行参数:
144+
145+
- DEVICE_FLAGS:编译器的设备参数(支持 `{cpu}` 占位符)
146+
- AS_DEVICE_FLAGS:汇编器的设备参数(支持 `{cpu}` 占位符)
147+
- LINK_DEVICE_FLAGS:链接器的设备参数(支持 `{cpu}` 占位符)
148+
- LINK_SCRIPT_FLAG:链接脚本参数前缀(如 `-T``--scatter`
149+
143150
## 命令行选项
144151

145152
| 选项 | 说明 |
@@ -149,32 +156,29 @@ POST_ACTION = "$OBJCOPY -O binary $TARGET build/stm32f103.bin"
149156
| `--attach=NAME` | 应用 attachconfig 方案(`?` 查看列表,`default` 恢复) |
150157
| `--verbose` | 显示完整编译命令 |
151158
| `--cross-compile=PREFIX` | 交叉编译器前缀 |
152-
| `--cpu=CPU` | 目标 CPU 类型 |
153-
| `--fpu=FPU` | FPU 类型 |
154-
| `--float-abi=ABI` | 浮点 ABI |
155159

156160
## 支持的工具链
157161

158162
| 架构 | 配置模块 |
159163
|------|----------|
160164
| ARM | `ebuild.configs.arm_gcc` |
165+
| ARM (Keil MDK, ARMCC) | `ebuild.configs.armcc` |
166+
| ARM (Keil MDK, ARMCLANG) | `ebuild.configs.armclang` |
161167
| AArch64 | `ebuild.configs.aarch64_gcc` |
162168
| RISC-V | `ebuild.configs.riscv_gcc` |
163169
| Linux | `ebuild.configs.linux_gcc` |
170+
| Windows MSVC | `ebuild.configs.msvc` |
164171

165172
## 项目结构
166173

167174
```
168175
project/
169-
├── SConstruct # 主构建脚本
176+
├── .config # menuconfig 配置输出
170177
├── proj_config.py # 项目配置
171-
├── Kconfig # 配置菜单定义
172178
├── proj_config.h # 生成的配置头文件
173-
├── .config # menuconfig 配置输出
174-
├── SConscript # 组件注册脚本
175-
├── .vscode/ # VS Code 配置(导出后)
176-
├── CMakeLists.txt # CMake 配置(导出后)
177-
└── *.uvprojx # Keil 工程(导出后)
179+
├── Kconfig # 配置菜单定义
180+
├── SConstruct # 主构建脚本
181+
└── SConscript # 组件注册脚本
178182
```
179183

180184
## 高级功能

ebuild/configs/armcc.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# -*- coding: utf-8 -*-
2+
"""Default config template for Keil MDK ARMCC (data only)."""
3+
4+
CROSS_TOOL = "armcc"
5+
PLATFORM = "armcc"
6+
EXEC_PATH = ""
7+
CC_PREFIX = ""
8+
9+
TOOLCHAIN_COMMANDS = {
10+
"CC": "armcc",
11+
"CXX": "armcc",
12+
"AS": "armasm",
13+
"AR": "armar",
14+
"LINK": "armlink",
15+
"SIZE": "fromelf",
16+
"OBJDUMP": "fromelf",
17+
"OBJCOPY": "fromelf",
18+
}
19+
20+
BASE_CFLAGS = ["--c99"]
21+
BASE_CXXFLAGS = ["--cpp"]
22+
BASE_ASFLAGS = []
23+
BASE_LINKFLAGS = []
24+
BASE_DEFINES = ["armcc"]
25+
26+
CPU_FLAG_FORMAT = "--cpu={cpu}"
27+
THUMB_FLAG = "--thumb"
28+
LINK_SCRIPT_FLAG = "--scatter"
29+
SECTION_FLAGS = []
30+
31+
LINK_DEVICE_FLAGS = ["--cpu={cpu}"]

ebuild/configs/armclang.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# -*- coding: utf-8 -*-
2+
"""Default config template for Keil MDK ARMCLANG (data only)."""
3+
4+
CROSS_TOOL = "armclang"
5+
PLATFORM = "armclang"
6+
EXEC_PATH = ""
7+
CC_PREFIX = ""
8+
9+
TOOLCHAIN_COMMANDS = {
10+
"CC": "armclang",
11+
"CXX": "armclang",
12+
"AS": "armasm",
13+
"AR": "armar",
14+
"LINK": "armlink",
15+
"SIZE": "fromelf",
16+
"OBJDUMP": "fromelf",
17+
"OBJCOPY": "fromelf",
18+
}
19+
20+
BASE_CFLAGS = ["-std=c99"]
21+
BASE_CXXFLAGS = ["-std=c++11"]
22+
BASE_ASFLAGS = []
23+
BASE_LINKFLAGS = []
24+
BASE_DEFINES = ["armclang"]
25+
26+
DEVICE_FLAGS = ["-mcpu={cpu}", "-mthumb", "-ffunction-sections", "-fdata-sections"]
27+
AS_DEVICE_FLAGS = ["--cpu={cpu}", "--thumb"]
28+
LINK_DEVICE_FLAGS = ["--cpu={cpu}"]
29+
LINK_SCRIPT_FLAG = "--scatter"

ebuild/configs/msvc.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# -*- coding: utf-8 -*-
2+
"""Default config template for Windows MSVC (data only)."""
3+
4+
CROSS_TOOL = "msvc"
5+
EXEC_PATH = ""
6+
CC_PREFIX = ""
7+
8+
TOOLCHAIN_COMMANDS = {
9+
"CC": "cl",
10+
"CXX": "cl",
11+
"AS": "ml",
12+
"AR": "lib",
13+
"LINK": "link",
14+
"SIZE": "",
15+
"OBJDUMP": "dumpbin",
16+
"OBJCOPY": "",
17+
}
18+
19+
ARFLAGS = None
20+
USE_ASPPCOM = False
21+
22+
BASE_CFLAGS = []
23+
BASE_CXXFLAGS = []
24+
BASE_ASFLAGS = []
25+
BASE_LINKFLAGS = []
26+
BASE_DEFINES = ["msvc"]

ebuild/system.py

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -264,33 +264,48 @@ def apply_toolchain_options(self, base_cflags: Optional[List[str]] = None) -> To
264264
from SCons.Script import GetOption
265265

266266
cflags = list(base_cflags) if base_cflags else []
267+
cc_flags: List[str] = []
268+
arch_flags: List[str] = []
267269

268270
def option_value(name: str, default: str = "") -> str:
269271
value = GetOption(name)
270272
return value or default
271273

272274
cc_prefix = option_value('cross-compile', '')
273275
if cc_prefix:
274-
self.env['CC'] = cc_prefix + 'gcc'
275-
self.env['AR'] = cc_prefix + 'ar'
276-
self.env['AS'] = cc_prefix + 'gcc'
277-
self.env['RANLIB'] = cc_prefix + 'ranlib'
278-
cflags.append('-ffreestanding')
276+
commands = {
277+
"CC": "gcc",
278+
"CXX": "g++",
279+
"AS": "gcc",
280+
"AR": "ar",
281+
"LINK": "gcc",
282+
"SIZE": "size",
283+
"OBJDUMP": "objdump",
284+
"OBJCOPY": "objcopy",
285+
"RANLIB": "ranlib",
286+
}
287+
for key, value in commands.items():
288+
self.env[key] = cc_prefix + value
289+
cc_flags.append('-ffreestanding')
279290

280291
cpu = option_value('cpu', '')
281292
if cpu:
282-
cflags.append(f'-mcpu={cpu}')
293+
arch_flags.append(f'-mcpu={cpu}')
283294

284295
fpu = option_value('fpu', '')
285296
if fpu:
286-
cflags.append(f'-mfpu={fpu}')
297+
arch_flags.append(f'-mfpu={fpu}')
287298

288299
float_abi = option_value('float-abi', '')
289300
if float_abi:
290-
cflags.append(f'-mfloat-abi={float_abi}')
301+
arch_flags.append(f'-mfloat-abi={float_abi}')
291302

292303
if cflags:
293304
self.env.Append(CFLAGS=cflags)
305+
if cc_flags or arch_flags:
306+
self.env.Append(CCFLAGS=cc_flags + arch_flags)
307+
if arch_flags:
308+
self.env.Append(ASFLAGS=arch_flags, LINKFLAGS=arch_flags)
294309

295310
build_program = not cc_prefix
296311
return ToolchainSettings(cc_prefix=cc_prefix, build_program=build_program)
@@ -385,4 +400,5 @@ def prepare(env, workspace_root: Optional[str] = None, project_root: Optional[st
385400
from .toolchain import setup_project
386401

387402
setup_project(env, build.project_root, config_module)
403+
build.apply_toolchain_options()
388404
return build

0 commit comments

Comments
 (0)