在Linux内核源代码repo中,/scripts下有Makefile.build,在构建src时会多次调用。有一些目标:先决条件如下:
$(obj)/%.i: $(src)/%.c FORCE
$(call if_changed_dep,cpp_i_c)
并且如果_changed_dep为
if_changed_dep = $(if $(newer-prereqs)$(cmd-check),$(cmd_and_fixdep),@:)
newer-prereqs非常简单,但是cmd-check有点不安全。
cmd-check = $(filter-out $(subst $(space),$(space_escape),$(strip $(cmd_$@))), \
$(subst $(space),$(space_escape),$(strip $(cmd_$1))))
我知道$(cmd_$1)将扩展为cmd_cpp_i_c
,这是当前的编译命令
和$(cmd_$@)将被扩展为$(cmd_$(obj)/%.i)。例如,如果它编译i2c-core-base. c,它将是$(cmd_i2c-core-base.i)(我省略了$(obj))
https://flylib.com/books/en/2.860.1.84/1/表示它是编译时的上一个命令。
我的问题是,既然我找不到cmd_$@的定义位置,我可以在哪里找到证据。
感谢您的评分
1条答案
按热度按时间qjp7pelc1#
执行命令后,宏cmd_and_savecmd将命令行记录到文件.. cmd中。
位于/scripts/Kbuild.include中
当在重建期间再次调用make时,它将包括这些.*.cmd文件。
在/Makefile中
因此,cmd_$@用于跟踪上次构建文件时已经执行的命令。