首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GNU中的双美元"$$@“目标名

GNU中的双美元"$$@“目标名
EN

Stack Overflow用户
提问于 2019-06-12 15:52:17
回答 1查看 355关注 0票数 0

我有一个规则来自OP-TEE (使用大型makefile include并制作调用树来编译两个操作系统内核和应用程序),其中包含一些立即扩展的变量--据我所知,这里没有第二个相关的扩展,因为双双美元在规则中,因此不受第二次扩展的限制。应始终在第二阶段扩大这一范围:

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

在输出中,可以看到,所有出现的$@$$@都是通过make而不是sh扩展的,但是单个美元的值没有被正确的值填充,而双美元的值并没有脱身:

代码语言:javascript
复制
echo Target '', 'out/someuuid.elf', "", "out/someuuid.elf"
Target , out/someuuid.elf, , out/someuuid.elf

我所期待的是:

代码语言:javascript
复制
echo Target 'out/someuuid.elf', '$@', "out/someuuid.elf", "$@"
Target out/someuuid.elf, $@, out/someuuid.elf,

制造的哪一种机制可能是扩展在这里不同运作的原因?

这个目标嵌套在其他makefile中的两个层和四个make调用中,因此在这里很难找到构建链配置的不同。

我不能用最小的makefile来再现这种行为:

代码语言:javascript
复制
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参数的字符串或空列表:

代码语言:javascript
复制
echo Target1 'target1', '$@', "target1", "$@"
Target1 target1, $@, target1,
echo Target2 'target2', '$@', "target2", "$@"
Target2 target2, $@, target2,
echo Target3 'target3', '$@', "target3", "$@"
Target3 target3, $@, target3,

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

EN

回答 1

Stack Overflow用户

发布于 2019-06-12 15:57:20

语法突出显示可能很棘手--我不知道整个目标是变量本身的内容--上面的一些目标有一个define gen-link-t开始了一个多行变量,在下面结束了一些目标。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56566132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档