ターゲット固有の変数を強制的にすぐに設定する方法(ライン2)?私が望む結果はmake
torelease
とmake debug
to beですdebug
。
X = release
debug: X = debug
debug: all
# the rest is included from an external file; cannot be changed
Y := $(X)
BUILD := $(Y)
all:
@echo $(BUILD)
ベストアンサー1
問題は、GNUMakeがファイルを解析する方法が原因で発生します。
GNU makeは2つの異なるステップで動作します。最初のステップでは、すべてのメイクファイル、埋め込みメイクファイルなどを読み取り、すべての変数とその値、暗黙的および明示的なルールを内部化し、すべてのターゲットと前提条件の依存関係グラフを作成します。 2番目のステップでは、makeはこれらの内部構造を使用して再構築する必要があるターゲットを決定し、それを実行するために必要なルールを呼び出します。
make debug
依存関係を実行すると、all:
実行したかのように値が印刷されるように見えますmake all
。あなたがしなければならないことは、両方all
ともdebug
同じ依存関係をトリガするようにmakefileを変更することです。通常、次の内容が表示されます。
all: $(executable)
debug: $(executable)
$(executable): $(objs)
<compile objects to executable>
debug
決して実行されませんが、all
どちらの場合も実行可能ファイルをコンパイルします。
あなたのコードは次のとおりです。
X = release
debug: X = debug
Y = $(X)
BUILD = $(Y)
.PHONY: print
print:
@echo $(BUILD)
all: print
debug: print
作成される実際のオブジェクトではないため、偽の依存関係を印刷する必要がありました。それ以外の場合は両方がdebug
必要ですall
が、設定したフラグによって異なるコンパイルの依存関係になります。