GNU Make中的双元“ $$ @”目标名称

时间:2019-06-12 15:52:17

标签: makefile gnu-make gnu op-tee

我有一个来自OP-TEE的规则(使用大的makefile include和make调用树来编译两个操作系统内核和应用程序),带有一些立即扩展的变量-据我所知,这里没有第二个扩展相关,因为双倍的双美元已成为规则,因此无需进行二次扩展。在第二阶段中应始终对其进行扩展:

$(link-out-dir$(sm))/$(user-ta-uuid).elf: $(objs) $(libdeps) \
                  $(link-script-pp$(sm))
    @$(cmd-echo-silent) '  LD      $$@'
    echo Target '$@', '$$@', "$@", "$$@"

在输出中,可以看到$@$$@的所有匹配项都是通过make而不是sh扩展的,但是单个美元未用正确的值填充,而两倍那些没有逃脱自己的人:

echo Target '', 'out/someuuid.elf', "", "out/someuuid.elf"
Target , out/someuuid.elf, , out/someuuid.elf

我期望的是:

echo Target 'out/someuuid.elf', '$@', "out/someuuid.elf", "$@"
Target out/someuuid.elf, $@, out/someuuid.elf,

make的哪种机制可能是扩展在此处工作不同的原因?

此目标嵌套在其他makefile文件的两层中,并嵌套四个make调用,因此在这里很难找到buildchain配置不同的内容。


我无法使用最小的makefile来重现此行为:

all: target1 target2 target3

.PHONY: target1 target2 target3 all
.SUFFIXES:

target1:
        echo Target1 '$@', '$$@', "$@", "$$@"

# should make no difference, since used in immediate context on rule specification
TARGET2 := target2
TARGET3 = target3

$(TARGET2):
        echo Target2 '$@', '$$@', "$@", "$$@"

$(TARGET3):
        echo Target3 '$@', '$$@', "$@", "$$@"

使用$ @扩展为目标名称,$$ @扩展为位置外壳参数的字符串或空列表,以产生预期的输出:

echo Target1 'target1', '$@', "target1", "$@"
Target1 target1, $@, target1,
echo Target2 'target2', '$@', "target2", "$@"
Target2 target2, $@, target2,
echo Target3 'target3', '$@', "target3", "$@"
Target3 target3, $@, target3,

指定.SECONDEXPANSION不会像预期的那样更改结果。

1 个答案:

答案 0 :(得分:0)

语法高亮显示可能很棘手-我不知道整个目标本身就是变量本身的内容-上面的某些目标是define gen-link-t开头的多行变量,下面是一些目标。

目标实际上是在生成之后在文件末尾使用$(eval $(call gen-link-t))调用的,而不是逐行读取-导致在扩展变量时将$$扩展为$在$(call)中,使调用以纯文本形式返回$。第二个评估发生在make通过$(eval)再次读取该目标时