make:为每个先决条件执行操作

CJl*_*ano 7 makefile

我想在我的Makefile中构建一个像这样的规则:

log: test_A test_B
    ./test_A >> $@
    ./test_B >> $@
Run Code Online (Sandbox Code Playgroud)

但是test_A并且test_B$(TESTS)变量的一部分.

那么,是否可以为GNU/make中的每个先决条件执行一个操作(这里:调用程序)?

注意:如何使makefile规则执行其先决条件?没有完全解决这个问题,因为目标log是必需的(make log).

Joh*_*all 19

基本上你想要遍历先决条件.显而易见的方法就是向shell发展:

log: test_A test_B
        for f in $^; do ./$$f; done
Run Code Online (Sandbox Code Playgroud)

或者您可以将循环编写为GNU Make foreach循环,但您必须小心,循环体所产生的命令出现在单独的行(via define)上或以shell终止符(即分号)结束,这更容易):

log: test_A test_B
        $(foreach f,$^,./$(f);)
Run Code Online (Sandbox Code Playgroud)

最后,在这种情况下,您可以更简洁,更模糊地编写它作为要循环的每个项目的模式替换:

log: test_A test_B
        $(patsubst %,./%;,$^)
Run Code Online (Sandbox Code Playgroud)

(我确定你可以根据需要添加输出重定向和$(TESTS)变量.)