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

ターゲット固有の変数は、理由により、対応するレシピ内でのみ使用できます。ターゲットが異なれば、レシピに同じ変数の異なるバージョンを使用できます。

ターゲット固有の変数を使用して、やろうとしていることをすべて達成することにした場合でも、これは機能します。

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 に答える
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 に答える