make:前提条件ごとにアクションを実行する

私はMakefileにこのようなルールを作りたいと思います:

log: test_A test_B
    ./test_A >> [email protected]
    ./test_B >> [email protected]

test_Atest_B$(TESTS)変数の一部です。

ですから、GNU/makeの各前提条件に対してアクション(ここではプログラムを呼び出す)を行うことは可能でしょうか?

注: makefileルールで前提条件を実行させるには?<>は、ターゲット log が必要なので( make log )、この問題を完全に解決するわけではありません。

6

1 答え

基本的には、前提条件をループする必要があります。これを行うための明白な方法は、シェルにパントすることです:

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)変数を適切に追加できると確信しています)。

17
追加された
これがあなたの log ルールのコマンドであれば、 $(shell ...)は覆されたものです。ルールのコマンドは空になり、 > test _?の実行は、(コマンドを実行することによって起こるのではなく)コマンドを理解する副産物として発生します。哲学的に間違っていて、実際には test _ スクリプトのいずれかの失敗を捕まえるために拡張することは不可能です。 (でも、あなたはこの答えを受け入れられたとマークしたいと思われるでしょう...)
追加された 著者 John Marshall,
このループは、test_Aの場合は1回、test_Bの場合は1回です。私も同様の問題があり、makeは非常に奇妙な動作をしています。
追加された 著者 Jaseem,
あなたの答えをありがとう、それは私が結局何をしたかを確認します: $(foreach test、$ ^、$(shell ./$(test)>> $ @))
追加された 著者 CJlano,