GNU Makefile 使用单一配方执行从多个先决条件生成多个目标
GNU Makefile generate multiple targets from multiple prerequisites using single recipe execution
我有一个工具 foo
可以接收一个或多个输入并生成相应的输出。例如,foo a.in
生成 a.out
,foo a.in b.in
生成 a.out
和 b.out
。
a.out
只依赖于a.in
,b.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
我有一个工具 foo
可以接收一个或多个输入并生成相应的输出。例如,foo a.in
生成 a.out
,foo a.in b.in
生成 a.out
和 b.out
。
a.out
只依赖于a.in
,b.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