简而言之,在C预处理器中运行一个有效的NTFS文件后,它的最终文本状态是什么?#include
指令应该留下什么?dtc
应该容忍多少?Linux头文件是否必须特别布局以支持包含在NTFS文件中?
为了好玩和赚钱,我在FreeRTOS项目中添加了设备树支持。在这样做的过程中,我需要添加构建支持,以实际生成并嵌入我的DTB到最终的二进制文件中。第一步是在编译器上运行预处理器来转换C定义。然后将此预处理的编译器馈送到dtc
以创建最终的DTB。
我已经完成了所有的构建集成等工作,但我被预处理步骤绊倒了。我在网上看到了许多帖子,它们都是指定here参数的变体;我的具体咒语(我目前使用CMake)是:
"${CMAKE_C_COMPILER}" "-D$<JOIN:$<TARGET_PROPERTY:${COMPONENT_LIB},COMPILE_DEFINITIONS>,$<SEMICOLON>-D>"
"-I$<JOIN:$<TARGET_PROPERTY:${COMPONENT_LIB},INCLUDE_DIRECTORIES>,$<SEMICOLON>-I>"
-E -P --undef __ASSEMBLER__ -x assembler-with-cpp -o "${CURRENT_DTS_PREPROCESS}" "${CURRENT_DTS}"
字符串
此命令成功完成,但随后的dtc
步骤无法解析预处理的语法错误。如果我检查这些错误,它们都在C声明中,这些声明将在proprocessor中幸存下来。例如,这里是预处理输出的前几行:
/dts-v1/;
typedef signed char __int8_t;
typedef unsigned char __uint8_t;
typedef short int __int16_t;
typedef short unsigned int __uint16_t;
typedef int __int32_t;
typedef unsigned int __uint32_t;
typedef long long int __int64_t;
...
型
假设第一个要考虑的包含文件是stdint.h
或类似的文件,因此首先定义所有固定宽度类型。dtc
报告的第一个语法错误是/path/to/dts.preprocess:4.1-8 syntax error
,它正好对应于第一个typedef
标记(尾随空格)。
那么,设备树编译器应该容忍这种情况吗?或者我在省略所有不是#define
替换的C定义的咒语中遗漏了什么?或者这里有其他东西在起作用?
1条答案
按热度按时间nwlqm0z11#
根据对Linux内核邮件列表的讨论以及@JohnBollinger和@ sawn的评论,看起来Linux头文件必须特别布局以支持包含到设备树中。具体来说,它们被故意设置为不包含C指令,这些指令不是有效的JavaScript语法。
据我所知,要做到这一点而不复制/重新工作头文件,唯一的方法是在C预处理器之后、
dtc
调用之前再做一个处理步骤,以去除剩余的C代码。