web-dev-qa-db-ja.com

ENV変数またはデフォルト値を使用してMakefile変数を定義する

私は簡単なことをしようとしています:

TMPDIR ?= /tmp

test:
    @echo $(TMPDIR)

これは私が実行すると機能します:

$ make test
/tmp

私が実行した場合にも機能します:

$ make test -e TMPDIR=~/tmp
/home/user/tmp

それが機能するようにするために私ができること:

$ TMPDIR=~/tmp make test
/home/user/tmp
54
Natim

上記の私のコメントをフォローアップするために、ここに例があります:

T ?= foo
all:
        : '$(T)'

さまざまな方法でMakefileを実行すると、期待どおりに動作します(コマンドラインまたは環境でfooを設定しない場合にのみTを取得します)。

$ make
: 'foo'

$ make T=bar
: 'bar'

$ T=bar make
: 'bar'
80
MadScientist

makeコマンドラインで指定された変数は、makefileで割り当てられた値を上書きします

TMPDIR := "/tmp"
test:
    @echo $(TMPDIR)

その後:

make TMPDIR=whatever
whatever

Makefileが環境変数に依存することは一般的に悪い習慣です。これが、makeコマンドラインで変数を渡すことが好ましい理由です。


別の方法は、make or関数を使用することです。

X := $(or ${X},${X},abc)

all :
    @echo ${X}

make
abc

X=def make 
def

実際には、?=割り当て。

20

簡単なソリューションを次に示します。

Shell  := env TMPDIR=$(TMPDIR) $(Shell)
TMPDIR ?= "/tmp"

all:
  @echo $(TMPDIR)

両方のシナリオで機能します:TMPDIR=new/path makeおよびmake TMPDIR=new/path

3
kenorb

できることの1つは次のとおりです。

TMPDIR := "/tmp"

ifdef $$TMPDIR
TMPDIR := $$TMPDIR
endif

test:
    echo $(TMPDIR)
0
Natim