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

Makefile 使用与';匹配的字符串%';来自模式匹配函数中的模式规则,makefile,Makefile,我有两组文件$(Xs)和$(Ys)。每个.x文件都依赖于基于其名称的任意数量的.y文件。对于每个.x文件,我都有许多.*.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: $(fil

我有两组文件
$(Xs)
$(Ys)
。每个
.x
文件都依赖于基于其名称的任意数量的
.y
文件。对于每个
.x
文件,我都有许多
.*.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
和静态模式规则的prereq列表中重复使用%的问题)

.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: $+'
.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: $+'