使用模式匹配函数中模式规则与'%'匹配的字符串

时间:2014-06-13 14:05:02

标签: makefile

我有两组文件$(Xs)$(Ys)。每个.x文件根据其名称依赖于任意数量的.y文件。对于每个<name>.x文件,我有许多<name>_*.y个文件。

我可以为.x文件编写单独的规则,并使用函数来计算它的依赖关系。

.PHONY: build
Xs = a.x b.x
Ys = a_1.y a_2.y b_1.y b_2.y

build: $(Xs)

a.x: $(filter a%,$(Ys))             
    @echo $@" with dependencies: "$+

b.x: $(filter b%,$(Ys))             
    @echo $@" with dependencies: "$+

%.y:
    @echo "y : "$@

...或者我可以为所有.x文件编写模式规则并枚举依赖项

$(Xs) : %.x : %_1.y %_2.y
    @echo $@" with dependencies: "$+

但我可以同时做两件事吗?我不知道如何在规则中使用%匹配字符串,并在$(filter)中使用它。

$(Xs) : %.x : $(filter ???,$(Ys))
    @echo $@" with dependencies: "$+

1 个答案:

答案 0 :(得分:1)

您可以使用Secondary ExpansionCanned Recipe执行此操作(需要解决filter的双重用法以及静态模式规则&#39 ;先决条件清单。

.PHONY: build
Xs = a.x b.x
Ys = a_1.y a_2.y b_1.y b_2.y

build: $(Xs)

%.y:
    @echo 'y : $@'

define yf
    $(filter $(1)_%.y,$(Ys))
endef

.SECONDEXPANSION:
$(Xs) : %.x : $$(call yf,%)
    @echo '$@ with dependencies: $+'