如何在具有多种模式的 Makefile 中制定模式规则?

How to make a pattern rule in a Makefile with multiple patterns?

我想制作一个 GNU Makefile,其中每个目标都像

<dirname>/stamp-<stampname>:

执行了以下命令:

cd <dirname> && make stamp-<stampname>

正如我在这里读到的,所谓的 pattern rules 可以做一些非常相似的事情,例如调用 C 编译器从任何来源生成 .o-s (.c):

%.o: %.c
  $(CC) -o ...

它们可以解决我的问题,但如您所见,在我的情况下,需要多个 % 指令。理想情况下,如果像

这样的语法元素
%1/stamp-%2:
  cd %1 && make stamp-%2

会存在,会解决一切。但事实并非如此。该任务是否存在一些解决方法?

也许是这样的:

STAMPS:=$(shell ls **/stamp-*)

all: $(STAMPS)

.PHONY: $(STAMPS)
$(STAMPS):
    cd $(dir $@) && $(MAKE) $(notdir $@)

这假设 stamp- 文件始终存在并且可以使用 ls 收集。如果不是,您将必须手动指定它们,例如STAMPS:=foo/stamp-1 bar/stamp-2 ....