GNU Makefile 使用单一配方执行从多个先决条件生成多个目标

GNU Makefile generate multiple targets from multiple prerequisites using single recipe execution

我有一个工具 foo 可以接收一个或多个输入并生成相应的输出。例如,foo a.in 生成 a.outfoo a.in b.in 生成 a.outb.outa.out只依赖于a.inb.out只依赖于b.in.

虽然该工具可以在单个输入上 运行,但在多个输入上 运行 效率更高,所以虽然我可以使用规则

%.out: %.in
    foo $?

为了单独生成每个 out 文件,我想将它们批处理到对 foo 的单个调用中。

使用模式规则,我可以使用一个配方的单次执行生成多个目标:

a%out b%out: a%in b%in
    foo $?

但是,a.out 现在不必要地依赖于 b.in 并且 b.out 现在不必要地依赖于 a.in

stamp: a.in b.in a.out b.out
    cat 

当先决条件和目标之间只有一对一的依赖关系时,如何使用单个配方执行从多个输入生成多个目标?

.INTERMEDIATE 暂存文件和时间戳文件可以做到这一点

.INTERMEDIATE: list

stamp: list
    foo `cat list`
    touch stamp

list: a.out b.out a.in b.in
    @:

%out: %in
    echo $? >> list