2009-12-09 9 views
11

私はツールのバージョンをチェックするときに特定の文字列が見つからない場合、makefileから脱出する方法を探しています。grepの結果に基づいてメイクファイルを条件付けする方法は?

私は一致しているよgrepの式は次のとおりです。

DPLUSの適切なバージョンがインストールされている場合、一致する行を返します
dplus -VV | grep 'build date and time: Nov 1 2009 19:31:28' 

この式に基づいてメイクファイルに条件を設定するにはどうすればよいですか?ここで

+0

これはどちらですか?グヌー? – Davide

+0

はい。特にCygwinでは、それは単なるGNUです。 –

答えて

12

を行うことができますここでは別の方法ですそれはGNU Makeで動作します:

 
DPLUSVERSION = $(shell dplus -VV | grep 'build date and time: Nov 1 2009 19:31:28') 

target_of_interest: do_things do_things_that_uses_dplus 

do_things: 
    ... 


do_things_that_uses_dplus: 
ifeq ($(DPLUSVERSION),) 
    $(error proper version of dplus not installed) 
endif 
    ... 

このターゲットは、実際のものでも、実際のターゲットに依存するPHONYターゲットでもかまいません。

+0

魅力的な作業をして、ifeq ... $(エラー...)は、開発者にビルドの理由を知らせるエラーメッセージを表示させます。 –

+0

警告! '$(エラー)'が**評価されたときに起動します**。つまり、 'DPLUSVERSION'がエラー状態を引き起こした場合、' do_things'は**決して実行されません**。それを解決するために編集。 https://www.gnu.org/software/make/manual/html_node/Make-Control-Functions.html – gcb

+0

@gcb:ソリューションをテストしたとは思いません。 – Beta

3

は一つの方法です:

.PHONY: check_dplus 

check_dplus: 
    dplus -VV | grep -q "build date and time: Nov 1 2009 19:31:28" 

のgrepが、一致を検出できなかった場合、それは

make: *** [check_dplus] Error 1 

を与える必要があります次に、あなたの他のターゲットがcheck_dplusターゲットに依存しています。

2

これがgnu makeであれば、あなたはmakeが条件文をサポートしていない場合Makefile contionals

についてはこちらを参照してください

your-target: $(objects) 
    ifeq (your-condition) 
     do-something 
    else 
     do-something-else 
    endif 

を行うことができ、あなたは常に

your-target: 
    dplus -VV | grep -q "build date and time: Nov 1 2009 19:31:28" || $(MAKE) -s another-target; exit 0 
    do-something 

another-target: 
    do-something-else 
関連する問題