some_name.o.cmd
我在 Linux 内核代码中看到了哪些文件?它们是自动生成的吗?
答案1
从Linux 2.5 中的内核配置和构建(我引用的部分涉及 2.5/2.6 内核中带来的更改):
一次性编译内置对象和模块,识别更改的命令行参数[...]
内核构建的主要性能问题是 make 的调用(当然,大多数时间通常花在编译/链接上,但此成本与所使用的构建系统无关)。 make 必须读取本地 Make 文件、一般规则和所有依赖项,并从中找出要完成的工作。因此,优化构建系统性能的一个明显方法是避免不必要的调用。[...]
创建了一个更灵活的方案来处理 GNU make 中不断变化的命令行。实际使用非常简单,不是将命令直接写入规则的命令部分,而是将其分配给变量
cmd_link_l_target
,构建系统负责根据需要执行命令,并跟踪命令行本身的更改。实施工作如下。执行命令后,宏if_changed
将命令行记录到文件中.<target>.cmd
。当重建期间再次调用 make 时,它将包含这些.*.cmd
文件。当它尝试决定是否重建时L_TARGET
,它将FORCE
在先决条件中找到,这实际上迫使它始终重新运行规则的命令部分。
基本上,这是内核编译优化。这些文件用于防止make
在不必要时进行过多的工作。正如您在上面所读到的,some_name.o.cmd
在编译some_name.o
.
有关更多信息,请参阅我之前链接的文档的第 4.5 节(Linux-2.5/2.6 的 kbuild 有什么新功能?)。
答案2
Linux 内核文档中对 .cmd 文件的最新描述:关联。在那里寻找.cmd
。
文档解释说,这不仅仅是一种优化:“当命令行自上次调用以来发生更改时,也应该重建目标。Make 本身不支持这一点,因此 Kbuild 通过一种元编程来实现这一点”。