2017-10-27 2 views
1

私はPythonのtry/finallyと、さまざまなシェルの組み込みトラップコマンドの大ファンです。私は同じ種類のロジックを適用したいMakeターゲットを持っています。私はこのターゲットと依存関係を持っていると仮定します。テストサーバーがどのように殺されるのを保証するのですか?

test : start-server run-test-group-1 run-test-group-2 stop-server 

テストが実行テスト - *フェーズで失敗した場合、ストップ・サーバ・アクションが実行されません。 "-k"が与えられていなくても、stop-serverアクションが実行されることを保証する方法はありますか? run-test- *アクションで関連するコマンドの前に " - "を置くことができたことは分かりますが、makeが0の状態で終了すると、制御プロセスはテストが成功したと考えるようになります。私はまだ親プロセスがテストが失敗したことを知りたい。

+0

私はあなたが依存関係のメカニズムを使用することはできませんと同時に、独自の変数でexit statiを持ち歩いとしてレシピの戻り値を無視して除いて、ルールの成功についての完全に異なる何かを言う作るたと思います' - '。 BTW私は個人的には、あなたがそこで行ったようなレシピ達成の書面による注文には決して頼りません。たとえそれが保証されていても(私があなたが並行するとすぐには保持しないと思います) – Vroomfondel

+0

ありがとう。私は実行順序が-jでウィンドウ外に出ることを理解していますが、呼び出しを制御すると、それは私が暮らすことができる問題です。私はおそらく、他のターゲットのアクションの個々のセットをこのターゲットのアクションに埋め込まなければならないと思います。 – smontanaro

答えて

2

代わりにシェルトラップメカニズムを使用し、makeを再帰的に実行しますか?このように:

test: 
    trap EXIT ERR "$(MAKE) stop-server"; \ 
    $(MAKE) start-server && \ 
    $(MAKE) actual-test 

actual-test: run-test-group-1 run-test-group-2 
+0

ありがとう、それは素晴らしい提案のように見えます。私はすでに3つの別々の再帰サブミットに分割しましたが、成果を掘り起こして成功または失敗の証拠を探していなければなりませんでした。なぜ私はトラップを使用するとは思わなかったのか分かりません。おそらく、すべてのステートメントを保証するために必要な "; \"ハックに対する私の一般的な嫌悪感は、単一のプロセスによって実行されるでしょう。 – smontanaro

+0

GNU Makeは便利な.ONESHELL擬似ターゲットを持っています。その効果はグローバルであるため、回答では使用しないようにします。しかし、レガシーメイクファイルを維持していなければ、見てみる価値があります。 –

+0

この定式化は、コマンドの直列性を明示的にするため、最良です。このための依存関係の順序付けに依存することは、良いスタイルではありません(パラレル・メイクの下でブレークします。パラレルを使用しますか?) – bobbogo

関連する問題