このようなルールをMakefileで作りたいのですが、どうすればいいですか?
log: test_A test_B
./test_A >> $@
./test_B >> $@
しかし、test_A
と test_B
は $(TESTS)
変数の一部であるため、test_A
と test_B
は $(TESTS)
変数に含まれます。
そこで、GNU/makeで各前提条件に対してアクション(ここではプログラムの呼び出し)を行うことは可能でしょうか?
注意: https://stackoverflow.com/questions/3518531/how-do-i-make-a-makefile-rule-execute-its-prerequisites では、ターゲットである log
が必要なため、この問題を完全に解決できません (make log
).
基本的に、あなたは前提条件をループさせたいと考えています。 これを行うための明らかな方法は、シェルにパントすることです。
log: test_A test_B
for f in $^; do ./$$f; done
あるいは、GNU Make の foreach
ループとしてループを書くこともできますが、ループの本体から生じるコマンドが (define
によって) 別々の行になるか、シェルのターミネータ (つまりセミコロン、これが簡単) で終了するように注意する必要があります。
log: test_A test_B
$(foreach f,$^,./$(f);)
最後に、この場合、ループさせる各項目のパターン置換として、より簡潔で、よりわかりやすく書くことができます。
log: test_A test_B
$(patsubst %,./%;,$^)
(適宜、出力のリダイレクトや$(TESTS)
変数を追加すればよいと思います)。