我正在尝试使用 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
我正在尝试使用 SECONDEXPANSION 功能 [...] 来动态选择依赖项。
在我看来,这通常是个坏主意。当然,我也倾向于不赞成大多数其他 GNU
make
扩展。
到目前为止,我有以下代码片段。但是,我想在定义表达式 $(word 4, $(subst -, , $@)) 时避免重复。
即使那些比我更接受 GNU 扩展的人通常也应该避免在食谱中调用
make
函数。改用 shell 功能几乎总是更好。在这种特殊情况下,你已经有了你想要的结果作为先决条件名称的一部分,你可以使用 make
自动变量来访问它,所以也许你正在寻找这样的东西:
foo-%: mydep-$$(word 4, $$(subst -, , $$@))
X='$<'; \
echo foo: "$${X#mydep-}"
这个“对不对”我没意见,但是随心所欲是微不足道的。只需将表达式放入变量中:
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 中完成所有操作。