2012-10-19 9 views
8

現在のプロジェクトに非再帰的なmakeビルドシステムを実装しようとしています。私が苦労しているのは変数スコープです。ターゲット固有の変数は、変数がターゲットを定義することが多く、前​​提条件を定義しないため、私のニーズに合っていません。GNU Make。スコープが単一のMakefileに限定された変数

SOMEVAR := original_value 
include Makefile2 
$(warning $(SOMEVAR)) 

Makefile2:

Makefile1:私は必要なもの がある

#some magic here to do what I want and make me happy 
SOMEVAR := included_value 
#and maybe here 

そして、私が欲しい出力は 'original_value' です。

実際にする戦略はありますか?

EDIT:=

+0

その解決策はかなり良いと思う。どうしたの? 'SOMEVAR'とは何ですか?それは何のために使われていますか? – Beta

+1

この解決策で私が好きでないことは、それが非常に不安定であるということです。私の場所を取る貧しい人がアイデアを得ることができず、どこかの驚きを得るために別の場所に入れると –

+1

Makefile2が複数回含まれ、 '$(SOMEVAR)'を参照するレシピが定義されていれば、レシピが実行されたときにレシピ内の変数が評価されます。つまり、レシピが定義されたときの値ではなく、最後に '$(SOMEVAR)'が最後に表示されます。 –

答えて

5

1つの戦略は、昔ながらのソリューションです:私は一瞬のために来た唯一の解決策は、強制的に整理し、自分自身を各特定のMakefileの終わりにすべてのinlcudesを配置するとすぐに、変数の割り当てを使用することですあなたが持っているもの全てがグローバル変数である場合、変数名の衝突に至るまで:変数名に貧しい人の名前空間の形式で接頭辞を追加します。

Makefile1:

Makefile1_SOMEVAR := original_value 
include Makefile2 
$(warning $(Makefile1_SOMEVAR)) 

Makefile2:

# no magic needed 
Makefile2_SOMEVAR := included_value 
# rest of Makefile2 uses $(Makefile2_SOMEVAR) of course 

それぞれのmakefileは、少なくとも自身のローカル変数(または、中に独自の変数を持っているかのようにさきがけねえ、このような大会で、それはです他のメイクファイルと衝突しない名前空間)。

関連する問題