2009-08-27 18 views
13

私はGNU make Makefileを作成しようとしています。 私はtarget-specific variablesを使ってこれらのバリエーションを表現しようとしています。これらの変数の値の中には、前提条件として使用したいファイルを参照するものがあります。例えば:私は「TARGET_1 make」を呼び出すときMakefileの前提条件としてのターゲット固有の変数

target_1:special_filename=target1_prereq 
target_2:special_filename=target2_prereq 

target_1 target_2: common_filename $(special_filename) 
    do_something common_filename --a-weird-option=$(special_filename) 

、私はそれが存在しない場合、それはtarget1_prereqを作りたいです。現時点では、buildコマンド(do_something)が正しいパラメータで呼び出されていても、target1_prereqを前提条件として使用していないようです。

私はGNU Make 3.80を使用しています。


編集:実際のシステムから さらにいくつかの合併症。変数のいくつかは、それ自体が他の変数の値に基づいています。前提条件を手動で指定しても縮尺は変わりません。 Aもう少し複雑な例:簡単な回避策として

target_1:special_filename_base=target1_prereq 
target_2:special_filename_base=target2_prereq 

some_filename_a = $(special_filename_base).exta 
some_filename_b = $(special_filename_base).extb 

target_1 target_2: common_filename $(special_filename_b) $(special_filename_a) 
    do_something common_filename --a-weird-option=$(special_filename_a) --second=$(special_filename_b) 

答えて

3

ターゲット固有の変数は、ターゲットのコマンド(または他のターゲット固有の割り当て)でのみ定義されます。ターゲットの前提条件の1つとして使用することはできません。私はあなたがメイクでやりたいきれいな方法はないと思うが、次のようないくつかのkludgeyのアプローチがある:の

 
EXTENSIONS = .exta .extb 
target_1: $(addprefix target1_prereq,$(EXTENSIONS)) 
target_2: $(addprefix target2_prereq,$(EXTENSIONS)) 

target_1 target_2: common_filename 
    do_something common_filename --a-weird-option=$(filter %.exta,$^) --second=$(filter %.extb,$^) 
+4

このスレッドは、間違っている人の利益のためにこのスレッドを再起動します。 [より洗練されたソリューション](http://stackoverflow.com/questions/9311743/make-using-target-specific-variables-in-prerequisites)では、2次拡張が使用されています。 – Seth

+0

@Seth、私は同意します: 'target_1 target_2:common_filename $$(special_filename_base).exta $$(special_filename_base).extb ...' – Beta

2

 
target_1:special_filename=target1_prereq 
target_1:target1_prereq 
target_2:special_filename=target2_prereq 
target_2:target2_prereq 

target_1 target_2: common_filename $(special_filename) 
    do_something common_filename --a-weird-option=$(special_filename) 

あり、いくつかの冗長性があるが、それがローカライズされているので、それがあまりにも悪くはありません。

+0

私が投稿した特定のケースを解決すると思いますが、もっと一般的な解決策を望んでいました。 もっと複雑な例で編集します。 –

2

私が見つけたというきれいな方法は、サイドステップ、この制限を。我々はMakefileを再実行するとき、彼らがアクセスできるよように

  1. exportターゲット変数、:

    target_1:export special_filename_base=target1_prereq 
    target_2:export special_filename_base=target2_prereq 
    
    some_filename_a = $(special_filename_base).exta 
    some_filename_b = $(special_filename_base).extb 
    
    target_1 target_2: 
        $(MAKE) -f $(firstword $(MAKEFILE_LIST)) target-proxy 
    
    target-proxy: common_filename $(special_filename_b) $(special_filename_a) 
        do_something common_filename --a-weird-option=$(special_filename_a) --second=$(special_filename_b) 
    

    二つの重要なポイント:それはこのような何かを行くだろう。

  2. 元の前提条件がすべてtarget_1 target_2であり、target_1 target_2にあるプロキシターゲットを作成し、このプロキシターゲットでMakefileを再度呼び出します。特定の変数は、それまでの値を持つことになり、目標(我々がその時点でのレシピであり)彼らはexport編だったので、彼らはtarget-proxyで利用可能になるだろう - の出来上がり:)

欠点このアプローチは、別のmakeプロセスを作成しているということです。もしそれがちょうど別のものであればそれは大丈夫ですが、YMMVはもっと注意してください。

関連する問題