出于某种原因,目标特定变量仅在相应的配方中可用。不同的目标可以为其配方使用相同变量的不同版本。
尽管如果您决定使用特定于目标的变量来实现您想做的任何事情,这将起作用:
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