2016-10-20 10 views
2

は、以下のGNUのmakefileスニペットを考えてみましょう:Make:変数を即座に展開する方法を教えてください。

# this code is not under my control 
A = aaa 
B = bbb 

# this code is under my control 
A += $B 

B = ccc 
# Prints "aaa ccc". I would rather "aaa bbb". 
$(info $A) 

問題がAが最初繰延変数として作成されているので、+=のRHSの値は繰延値として採用されていることです。私が使用できるA += $(immediate B)のようなものがありますか?

TMP := $B 
A += $TMP 

が、これには、ファイルになりますので、オプションではありません、そして(非再帰的なメイクシステムの文脈で)数回使用されます:

次は多少あり得ます。だからTMPはいつも騒がしくなるだろう。

UPDATE

もう少し正当化。これは非再帰的ビルドであり、変数dは処理されるディレクトリの名前を保持します。インクルードファイルが各サブディレクトリに対して呼び出され、いくつかの変数が設定されます。たとえば:

$d.LIBS += $($d.target_dir)/lib.a 
LD_FLAGS += $($d.LIBS) 

ここでの問題は、dは、その値は、すぐに次のディレクトリが処理されるように変化して、短命であるということです。 LD_FLAGSとなります。そのため、$d.LIBSは遅延変数として残す必要がありますが、ここではdをすぐに評価する必要があります。

+1

ファイルを含めて問題が発生していることを示すもので例を更新してください。何が起きているのかを視覚化するのは難しいです。 – user657267

+1

あなたは 'A'を延期し続けるかどうかは言いません。変数を直接変数にしても構わない場合は、 'A:= $ A $ B'を使用してください。 – MadScientist

+0

@ user657267上記のスニペットは完全な実行可能なmakeスクリプトです。実際のユースケースは非再帰的なmakeであり、ディレクトリごとに呼び出されるインクルードファイルがあり、$ Bは現在のディレクトリの名前です。 –

答えて

3

あなたは即座になってAを気にしないならば、あなたはこの使用することができます:あなたはAを延期することを継続するが、すぐ$Bを展開したい場合は、あなたがevalevalために使用することができます

A := $A $B 

をその引数を以下のように拡張します

$(eval A += $B) 

これは$B最初を拡大していきますので、あなたはA += bbbを取得し、その評価します。

あなたには、いくつかの拡張された値の局面および他の人がいない場合は、だけではない - に被拡大コンテンツエスケープ:

$(eval LD_FLAGS += $$($d.LIBS)) 

を私は通常、物事はあなたがしようとしていること、しかし、言うべきターゲット名に基づいて構築された変数名によってさらに処理されます。

などです。

関連する問題