

要在基于RT-Thread的scons构建的Keil工程中增加并持久化自定义project_targets,同时确保首次构建完全复制RT-Thread模板且后续构建不覆盖配置,需通过以下步骤实现:
scons --target=mdk首次生成时完全复制template.uvprojx的所有配置(包括Targets)。bsp/your_board/tools/template.uvprojx中添加自定义Target(如NewTarget)。修改RT-Thread的keil.py脚本(位于rt-thread/tools/building/keil.py),添加配置合并逻辑:
步骤 1: 备份用户自定义Target配置
首次生成工程后,将用户自定义的Target配置(如NewTarget节点)保存到独立文件(如custom_targets.xml)。
步骤 2: 修改构建脚本
在生成工程后,将custom_targets.xml中的配置合并到新生成的project.uvprojx中。修改keil.py中的generate_project()函数:
# 在 generate_project() 函数末尾添加合并逻辑
def generate_project(project):
# ... 原有生成工程逻辑 ...
# 合并自定义Target配置
merge_custom_targets(project)
# 新增合并函数
def merge_custom_targets(project):
import xml.etree.ElementTree as ET
project_path = os.path.join(project_root, 'project.uvprojx')
# 加载生成的工程文件
tree = ET.parse(project_path)
root = tree.getroot()
# 加载自定义配置(如存在)
custom_config = os.path.join(project_root, 'custom_targets.xml')
if os.path.exists(custom_config):
custom_tree = ET.parse(custom_config)
custom_root = custom_tree.getroot()
# 找到工程中的Targets节点
targets = root.find('.//Targets')
# 插入自定义Target配置
for target in custom_root.findall('Target'):
targets.append(target)
# 保存合并后的工程文件
tree.write(project_path, encoding='UTF-8', xml_declaration=True)project.uvprojx,添加NewTarget并配置参数。 NewTarget的XML节点,保存为custom_targets.xml(位于工程根目录)。
NewTarget
ARM-ADS
scons --target=mdk后,脚本自动将custom_targets.xml中的Target插入新工程。),解析时需指定: ET.register_namespace('', "http://www.keil.com/project") # 注册命名空间唯一,避免与RT-Thread默认Target冲突。.NewTargetObjects)确保可移植性。custom_targets.xml独立于模板,RT-Thread升级无需修改。graph TD
A[首次构建] --> B[scons --target=mdk]
B --> C[生成 project.uvprojx]
C --> D[手动添加 NewTarget]
D --> E[提取 NewTarget 配置 → custom_targets.xml]
F[后续构建] --> G[scons --target=mdk]
G --> H[生成临时 project.uvprojx]
H --> I[合并 custom_targets.xml]
I --> J[最终 project.uvprojx]
提示:此方案需熟悉Python XML操作,若需完整脚本示例或进一步调试,建议参考RT-Thread官方脚本扩展指南。
举报
更多回帖