tools: harden target generator serialization#11557
Open
yanhu7150-tech wants to merge 1 commit into
Open
Conversation
|
👋 感谢您对 RT-Thread 的贡献!Thank you for your contribution to RT-Thread! 为确保代码符合 RT-Thread 的编码规范,请在你的仓库中执行以下步骤运行代码格式化工作流(如果格式化CI运行失败)。 🛠 操作步骤 | Steps
完成后,提交将自动更新至 如有问题欢迎联系我们,再次感谢您的贡献!💐 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
拉取/合并请求描述:(PR description)
为什么提交这份PR (why to submit this PR)
本 PR 修复
tools/targets目录下多个工程生成器在序列化路径、宏定义、编译参数和项目文件字段时存在的不一致问题。这些工具用于根据 RT-Thread 工程信息生成 CMake、Makefile、VSCode、SES、Xmake、Zig、Eclipse、Visual Studio、Keil、IAR、CodeBlocks、CDK、ESP-IDF 等工程或构建文件。修复前,不同生成器分别在各自文件中手工拼接路径、宏定义、编译选项、XML 属性、CMake list、Lua/Zig 字符串等内容,导致一些合法输入在生成目标工程文件时被错误序列化,进而生成不可用或语义错误的项目文件。
本 PR 修复的主要问题包括:
CPPDEFINES/LOCAL_CPPDEFINES中带值宏处理不一致例如 SCons 中常见的宏定义形式
("FOO", "1"),其语义应为FOO=1。旧代码中部分生成器会将 tuple 宏错误展开为两个独立项,例如输出为FOO;1、-DFOO -D1,或者在 XML / IDE 工程字段中产生错误宏定义。部分生成器使用
set()对路径或宏定义去重这会打乱原始顺序,导致生成文件内容不稳定,也可能改变原有 include path、define 或 library path 的优先级。
路径、宏和 flag 缺少面向目标格式的转义
不同工程文件格式对特殊字符的处理规则不同,例如:
#、$;&、<、>、引号等字符;旧代码中多个生成器直接字符串拼接,路径或宏中包含空格、分号、引号等字符时,可能生成语法错误或语义错误的工程文件。
VSCode 生成器对
compile_commands.json的解析不健壮tools/targets/vsc.py旧代码对command字符串直接使用.split(),会错误拆分-I"dir with space"这类带空格的 include 路径。同时,空compile_commands.json会导致空目录树访问list(...)[0],触发IndexError。VSCode 生成器中存在不必要的
eval()去重逻辑旧代码通过
str()+eval()对列表项去重,不够稳健,也不适合处理包含特殊字符的数据结构。本 PR 改为顺序稳定的去重逻辑。SES / CodeBlocks 等生成器存在 Python 3 兼容性问题
例如:
tools/targets/ses.py使用 Python 2 风格的file(),Python 3 下会直接NameError;tools/targets/codeblocks.py中存在对str调用.decode()的情况,Python 3 下会触发AttributeError;ElementTree.tostring(..., encoding='utf-8')返回的 bytes,可能触发TypeError。CodeBlocks 生成器宏定义序列化错误
旧代码会遍历宏字符串中的每一个字符,例如
RT_USING_FINSH可能最终只输出最后一个字符对应的宏选项;tuple 宏("STM32", "1")也可能丢失宏名,仅保留错误的值项。Eclipse / Zig / ESP-IDF 等生成器中 linker script 或 CMake list 解析不完整
例如
-T "dir with space/link.lds"、-Tfoo.lds、-Wl,-T,foo.lds等 linker script 参数形式,旧逻辑可能因简单 split 或正则不完整而截断路径。ESP-IDF 生成的idf_component_register(SRCS ... INCLUDE_DIRS ...)中,路径如果包含空格或分号,也可能破坏 CMake list 语义。以上问题均属于普通工具链/工程生成器的软件缺陷,会影响生成项目文件的正确性和可用性,不涉及安全漏洞。
解决方案是什么
本 PR 引入公共序列化辅助模块,并将多个目标工程生成器中分散的手工拼接逻辑统一收敛到可复用的 helper 中,减少各生成器重复实现导致的不一致问题。
主要修改如下:
新增
tools/targets/target_utils.py新增公共序列化 helper,用于统一处理:
统一宏定义处理
将多个生成器中分散的
CPPDEFINES/LOCAL_CPPDEFINES拼接逻辑改为使用公共 helper。现在支持以下形式:"FOO"→FOO("FOO", "1")→FOO=1["FOO", "1"]→FOO=1"FOO=bar"→FOO=bar"FOO=\"a b\""→ 保持带值宏语义同时避免使用
set()打乱宏定义顺序。修复 CMake / ESP-IDF 相关生成逻辑
对 CMake / ESP-IDF 生成器中的 source path、include path、library path、宏定义和相关 list 项进行面向 CMake 的安全序列化,避免空格、分号、引号等字符破坏 CMake list 语义。
修复 Makefile 生成逻辑
对 Makefile 中的
DEFINES、CPPPATHS、SRC_FILES、LIBS、LIBPATHS等字段进行 Makefile 语义下的转义,同时尽量保留$(BSP_ROOT)/$(RTT_ROOT)等已有 Make 变量语义。修复 VSCode 生成逻辑
compile_commands.json;-Ifoo、-I foo、/Ifoo、/I foo等 include 参数形式;compile_commands.json不再触发IndexError;eval()去重逻辑,改为顺序稳定的去重实现。修复 SES / CodeBlocks Python 3 兼容性问题
file()替换为 Python 3 可用的open();.decode()调用;修复 XML / IDE 工程生成器中的路径和属性序列化
对 Eclipse、Visual Studio、VS2012、Keil、IAR、CodeBlocks、CDK 等生成器中涉及 XML 属性、文件路径、include path、define list 的逻辑进行同主题修复:
修复 Zig / Xmake 生成逻辑
-T相关形式处理不完整的问题;新增回归测试
新增
tools/testcases/test_target_serialization.py,覆盖以下场景:normalize_defines对字符串宏、tuple 宏、带值宏和 quoted value 的处理;compile_commands.json;arguments数组和-I分离写法;FOO=1语义。请提供验证的bsp和config (provide the config and bsp)
本 PR 修改的是
tools/targets下的 Python 工程生成器和对应回归测试,不涉及具体 BSP 源码修改。本 PR 不需要修改任何 BSP
.config选项。本 PR 已在本地完成 Python 语法检查、单元测试和 diff 检查。提交 PR 后,可继续以 GitHub Actions 的结果为准。
本地验证命令如下:
本地测试结果如下:
本地 diff 检查结果:
无 whitespace error。
]
当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up