2011-10-27 11 views
5

のためのアクションを実行し、私は私のMakefileの中でこのようなルールを構築したいと思います:メイク:各前提条件

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

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

GNU/makeの前提条件ごとにアクション(ここではプログラムを呼び出すこと)が可能ですか?

How do I make a makefile rule execute its prerequisites?が完全に必要とされる目標logmake log)として、この問題を解決しません。

答えて

15

基本的に、前提条件をループします。これを行うには明白な方法は、シェルにパントすることです:あなたは注意する必要がありますけれども、GNUはforeachループを作るよう、あなたがループを書くことができ

log: test_A test_B 
     for f in $^; do ./$$f; done 

か、そのループの本体に起因するコマンド別の行に表示されます(defineを経由)または(すなわち、セミコロン、簡単です)シェルターミネータで終端されています

log: test_A test_B 
     $(foreach f,$^,./$(f);) 

最後に、このケースでは、あなたがより簡潔に書くことができると、より目立たループする各項目のパターン置換:

log: test_A test_B 
     $(patsubst %,./%;,$^) 

(。私はあなたが適切なように、出力のリダイレクトと$(TESTS)変数を追加することができます確信している)あなたの答えのための

+1

おかげで、それは私がなってしまったものを確認: '$(foreachのテスト、$ ^、 $(shell ./$(test)>> $ @)) ' – CJlano

+1

これがあなたの_log_ルールのコマンドであれば、' $(shell ...) 'は覆されたものです。ルールのコマンドは空です'test_?'の実行は、(コマンドを実行することによって起こるのではなく)コマンドを理解する副産物として起こります。哲学的に間違っていて、実際にはあなたの 'test_? 'スクリプトの一つに失敗したことを知ることはできません。 (しかし、それでもあなたはこの答えに受け入れられるとマークしたいと思うでしょう...) –

+0

このループはtest_Aとtest_Bの2回はありませんか?私も同様の問題があり、makeは非常に奇妙な動作をしています。 – Jaseem

関連する問題