RT-Thread论坛
直播中

李慧

8年用户 971经验值
私信 关注
[问答]

基于rtt的scons构建的keil工程如何增加project_targets?


基于rtt的scons构建的keil工程如何增加project_targets 且再第一次构建能一比一复制rt-thread 再之能在每次scons构建后保证原来对新的project_targets的一些设置不变更
目前来看 有人说在template.uvprojx中增加一个
   
      New-Target
      中间省略
   
但是治标不治本 scons构建完以后只是增加了新的target  许多配置并不会复制过来 或者说是构建到目标target里 如下图

没有好的办法
是不是要改脚本  怎么改 有没有指导


回帖(1)

dplion5

2025-10-20 17:02:29

要在基于RT-Thread的scons构建的Keil工程中增加并持久化自定义project_targets,同时确保首次构建完全复制RT-Thread模板且后续构建不覆盖配置,需通过以下步骤实现:




核心思路



  1. 初次构建复制完整模板

    确保scons --target=mdk首次生成时完全复制template.uvprojx的所有配置(包括Targets)。

  2. 持久化自定义Target配置

    修改RT-Thread的构建脚本,使其在生成工程后合并自定义Target配置(而非覆盖)。




具体步骤


1. 修改模板文件(临时方案)



  • bsp/your_board/tools/template.uvprojx中添加自定义Target(如NewTarget)。

  • 缺点:升级RT-Thread时模板可能被覆盖;需手动维护。


2. 修改脚本实现配置合并(推荐)


修改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)

3. 自定义配置持久化流程



  • 首次构建:  

    1. 手动修改生成的project.uvprojx,添加NewTarget并配置参数。  

    2. 提取NewTarget的XML节点,保存为custom_targets.xml(位于工程根目录)。  


      NewTarget
      ARM-ADS



  • 后续构建

    每次执行scons --target=mdk后,脚本自动将custom_targets.xml中的Target插入新工程。


4. 关键注意事项



  • XML命名空间处理

    Keil工程文件包含命名空间(如),解析时需指定:
     ET.register_namespace('', "http://www.keil.com/project")  # 注册命名空间

  • 配置冲突

    确保自定义Target的唯一,避免与RT-Thread默认Target冲突。

  • 路径调整

    如果自定义Target涉及文件路径,使用相对路径(如.NewTargetObjects)确保可移植性。




方案优势



  • 不依赖模板升级custom_targets.xml独立于模板,RT-Thread升级无需修改。

  • 配置完全保留:所有Target参数(优化选项、宏定义、头文件路径等)均被保留。

  • 无重复劳动:只需首次手动配置,后续全自动合并。




完整流程图


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官方脚本扩展指南。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分