如何在依赖名称和目标主体中重用替换结果?

问题描述 投票:0回答:2

我正在尝试使用 SECONDEXPANSION 功能https://www.gnu.org/software/make/manual/make.html#Secondary-Expansion 动态选择依赖项。到目前为止,我有以下代码片段。但是,我想在定义表达式时避免重复

$(word 4, $(subst -, , $@))
.

.SECONDEXPANSION:


mydep-4v1:
    echo 4v1


mydep-4v2:
    echo 4v2


foo-%: mydep-$$(word 4, $$(subst -, , $$@))
    X=$(word 4, $(subst -, , $@)) && \
    echo foo: $$X
make foo-a-b-4v1-c-d # foo: 4v1
make foo-2-3-4v1-5-6 # foo: 4v1
make foo-a-b-4v2-c-d # foo: 4v2
make foo-2-3-4v2-5-6 # foo: 4v2
makefile
2个回答
0
投票

我正在尝试使用 SECONDEXPANSION 功能 [...] 来动态选择依赖项。

在我看来,这通常是个坏主意。当然,我也倾向于不赞成大多数其他 GNU

make
扩展。

到目前为止,我有以下代码片段。但是,我想在定义表达式 $(word 4, $(subst -, , $@)) 时避免重复。

即使那些比我更接受 GNU 扩展的人通常也应该避免在食谱中调用

make
函数。改用 shell 功能几乎总是更好。在这种特殊情况下,你已经有了你想要的结果作为先决条件名称的一部分,你可以使用
make
自动变量来访问它,所以也许你正在寻找这样的东西:

foo-%: mydep-$$(word 4, $$(subst -, , $$@))
    X='$<'; \
    echo foo: "$${X#mydep-}"

0
投票

这个“对不对”我没意见,但是随心所欲是微不足道的。只需将表达式放入变量中:

get-word = $(word 4, $(subst -, , $@))

foo-%: mydep-$$(get-word)
        X='$(get-word)' && echo foo: $$X

由于你逃脱了先决条件列表中

$(get-word)
的调用,所以它不会扩展到二次扩展。当然你也可以使用:

foo-%: mydep-$$(get-word)
        X='$(patsubst mydep-%,%,$<)' && echo foo: $$X

或者按照 John 的建议在 shell 中完成所有操作。

© www.soinside.com 2019 - 2024. All rights reserved.