質問: make:前提条件ごとにアクションを実行する 私はMakefileにこのようなルールを作りたいと思います: ``` log: test_A test_B ./test_A >> [email protected] ./test_B >> [email protected] ``` `test_A` と `test_B` は `$(TESTS)`変数の一部です。 ですから、GNU/makeの各前提条件に対してアクション(ここではプログラムを呼び出す)を行うことは可能でしょうか? 注: makefileルールで前提条件を実行させるには?<>は、ターゲット `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)`変数を適切に追加できると確信しています)。