我有一个规则来自OP-TEE (使用大型makefile include并制作调用树来编译两个操作系统内核和应用程序),其中包含一些立即扩展的变量--据我所知,这里没有第二个相关的扩展,因为双双美元在规则中,因此不受第二次扩展的限制。应始终在第二阶段扩大这一范围:
$(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,制造的哪一种机制可能是扩展在这里不同运作的原因?
这个目标嵌套在其他makefile中的两个层和四个make调用中,因此在这里很难找到构建链配置的不同。
我不能用最小的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 '$@', '$$@', "$@", "$$@"产生预期的输出,$@扩展到目标名称,$$@展开为位置shell参数的字符串或空列表:
echo Target1 'target1', '$@', "target1", "$@"
Target1 target1, $@, target1,
echo Target2 'target2', '$@', "target2", "$@"
Target2 target2, $@, target2,
echo Target3 'target3', '$@', "target3", "$@"
Target3 target3, $@, target3,指定.SECONDEXPANSION不会像预期的那样更改结果。
发布于 2019-06-12 15:57:20
语法突出显示可能很棘手--我不知道整个目标是变量本身的内容--上面的一些目标有一个define gen-link-t开始了一个多行变量,在下面结束了一些目标。
实际上,在生成之后,在文件末尾使用$(eval $(call gen-link-t))调用了目标,而不是逐行读取--导致在$(调用)中展开变量时,$$第一次扩展为$,从而使调用返回$为纯文本。第二个评估发生在make通过$(eval)再次读取这个目标时。
https://stackoverflow.com/questions/56566132
复制相似问题