我想在我的Makefile中建立一个像这样的规则:
log: test_A test_B
./test_A >> $@
./test_B >> $@
但test_A
和test_B
是$(TESTS)
变量的一部分。
那么,是否可以为GNU / make中的每个先决条件执行一个操作(这里:调用程序)?
注意:How do I make a makefile rule execute its prerequisites?并未完全解决此问题,因为目标log
是必需的(make log
)。
答案 0 :(得分:19)
基本上你想循环先决条件。这样做的显而易见的方法就是向shell发展:
log: test_A test_B
for f in $^; do ./$$f; done
或者您可以将循环编写为GNU Make foreach
循环,但您必须小心,循环体所产生的命令会出现在单独的行上(通过define
)或用shell终结符终止(即分号,这更容易):
log: test_A test_B
$(foreach f,$^,./$(f);)
最后,在这种情况下,您可以更简洁,更隐晦地编写它作为每个要循环的项目的模式替换:
log: test_A test_B
$(patsubst %,./%;,$^)
(我确信您可以根据需要添加输出重定向和$(TESTS)
变量。)