为什么“cmd_$@”是构建linux内核时的前一个命令

mwyxok5s  于 2023-01-29  发布在  Linux
关注(0)|答案(1)|浏览(190)

在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_$@的定义位置,我可以在哪里找到证据。
感谢您的评分

qjp7pelc

qjp7pelc1#

执行命令后,宏cmd_and_savecmd将命令行记录到文件.. cmd中。
位于/scripts/Kbuild.include中

cmd_and_savecmd =                                                            \
    $(cmd);                                                              \
    printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd

当在重建期间再次调用make时,它将包括这些.*.cmd文件。
在/Makefile中

-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)

因此,cmd_$@用于跟踪上次构建文件时已经执行的命令。

相关问题