0

我有一个看起来像这样的 Makefile:

gator: LIB=-lm
gatorgpu : GPU=-DG

 ....
STATIC=
ifdef STATIC
  $(info CPU static)    
endif

但我想有类似的东西:

gator: LIB=-lm
gatorgpu : GPU=-DG

 ....
STATIC=
ifdef STATIC
   ifdef GPU
     $(info GPU static) 
   else
    $(info CPU static)
   endif
 endif

因此,当有人键入时$make gatorgpu STATIC=1$make gator STATIC=1它将根据目标使用静态库进行编译,在这种情况下是 CPU 或 GPU。不幸的是,STATIC被读取但GPU变量不是,所以它总是适用于CPU static. 有没有优雅的方法呢?

4

2 回答 2

1

根据您的描述,我想说可以使用以下方法:

ifdef STATIC
gator: LIB:=-static -lstaticlib
gatorgpu: GPU:=-DSTATICDEF
else
gator: LIB:=-lm
gatorgpu: GPU:=-DG
endif

STATIC您还没有明确说明在定义时与未定义时要使用或更改的选项,因此我制作了一些示例值。

于 2013-03-15T18:39:33.113 回答
1

出于某种原因,目标特定变量仅在相应的配方中可用。不同的目标可以为其配方使用相同变量的不同版本。

尽管如果您决定使用特定于目标的变量来实现您想做的任何事情,这将起作用:

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'

一些小的更正,尽管它不会对结果产生太大影响:

  • ?=称为conditional variable assignment operator)仅在变量未赋值时才执行赋值。因此,当您运行时make mytarget STATIC=1,不会分配变量 STATIC 0
  • ifeq并且ifneq与 相比,检查更为稳健ifdef,因为您可以将变量与您感兴趣的特定值进行比较。
  • :=应该优先于常规=,以避免不必要的 make 减速,除非你真的需要recursively expanded variables.

更好的方法是重构您的 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
于 2013-03-15T18:54:19.440 回答