は、以下の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
をすぐに評価する必要があります。
ファイルを含めて問題が発生していることを示すもので例を更新してください。何が起きているのかを視覚化するのは難しいです。 – user657267
あなたは 'A'を延期し続けるかどうかは言いません。変数を直接変数にしても構わない場合は、 'A:= $ A $ B'を使用してください。 – MadScientist
@ user657267上記のスニペットは完全な実行可能なmakeスクリプトです。実際のユースケースは非再帰的なmakeであり、ディレクトリごとに呼び出されるインクルードファイルがあり、$ Bは現在のディレクトリの名前です。 –