ターゲット固有の変数は、理由により、対応するレシピ内でのみ使用できます。ターゲットが異なれば、レシピに同じ変数の異なるバージョンを使用できます。
ターゲット固有の変数を使用して、やろうとしていることをすべて達成することにした場合でも、これは機能します。
gator: export LIB := -lm
gatorgpu : export GPU := -DG
STATIC ?= 0
ACTUAL ?= 0
export STATIC
ifeq ($(ACTUAL),1)
ifeq ($(STATIC), 1)
ifneq ($(GPU),)
$(info GPU static)
else
$(info CPU static)
endif
endif
endif
.gator:
@echo LIB=$(LIB) GPU=$(GPU)
.gatorgpu:
@echo LIB=$(LIB) GPU=$(GPU)
gator:
@$(MAKE) .gator ACTUAL=1
gatorgpu:
@$(MAKE) .gatorgpu ACTUAL=1
PHONY: .gator .gatorgpu gator gatorgpu
- これには、エクスポートされた変数の正しいセットを使用して(ターゲットごとに)追加のmakeを呼び出すオーバーヘッドがあります。
- エクスポートにより、から実行されるすべてのサブプロセスに変数が設定されます
make
。
これは私が見る結果です:
$ make gatorgpu
make[1]: Entering directory `/home/ash/.scratch/make-test'
LIB= GPU=-DG
make[1]: Leaving directory `/home/ash/.scratch/make-test'
$ make gator
make[1]: Entering directory `/home/ash/.scratch/make-test'
LIB=-lm GPU=
make[1]: Leaving directory `/home/ash/.scratch/make-test'
$ make gatorgpu STATIC=1
GPU static
make[1]: Entering directory `/home/ash/.scratch/make-test'
LIB= GPU=-DG
make[1]: Leaving directory `/home/ash/.scratch/make-test'
$ make gator STATIC=1
CPU static
make[1]: Entering directory `/home/ash/.scratch/make-test'
LIB=-lm GPU=
make[1]: Leaving directory `/home/ash/.scratch/make-test'
結果にはあまり影響しませんが、いくつかの小さな修正があります。
より良いアプローチは、Makefileをリファクタリングして、次の値に基づいてさまざまなターゲット固有の変数またはルールを定義することです。STATIC
ifeq ($(STATIC), 1)
gator: LIB := -lm
gatorgpu : GPU := -DG
else
gator: LIB := <SOMETHING_ELSE_HERE>
gatorgpu : GPU := <SOMETHING_ELSE_HERE>
endif
$(MAKECMDGOALS)
makeが呼び出されたターゲットを含むの値をチェックすることを含むあまり推奨されないアプローチもあります。
ifeq ($(MAKECMDGOALS),gatorgpu)
GPU := -DG
endif