我有一个来自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不会像预期的那样更改结果。
答案 0 :(得分:0)
语法高亮显示可能很棘手-我不知道整个目标本身就是变量本身的内容-上面的某些目标是define gen-link-t
开头的多行变量,下面是一些目标。>
目标实际上是在生成之后在文件末尾使用$(eval $(call gen-link-t))
调用的,而不是逐行读取-导致在扩展变量时将$$扩展为$在$(call)中,使调用以纯文本形式返回$。第二个评估发生在make通过$(eval)再次读取该目标时