私は簡単なことをしようとしています:
TMPDIR ?= /tmp
test:
@echo $(TMPDIR)
これは私が実行すると機能します:
$ make test
/tmp
私が実行した場合にも機能します:
$ make test -e TMPDIR=~/tmp
/home/user/tmp
それが機能するようにするために私ができること:
$ TMPDIR=~/tmp make test
/home/user/tmp
上記の私のコメントをフォローアップするために、ここに例があります:
T ?= foo
all:
: '$(T)'
さまざまな方法でMakefileを実行すると、期待どおりに動作します(コマンドラインまたは環境でfoo
を設定しない場合にのみT
を取得します)。
$ make
: 'foo'
$ make T=bar
: 'bar'
$ T=bar make
: 'bar'
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
実際には、?=
割り当て。
簡単なソリューションを次に示します。
Shell := env TMPDIR=$(TMPDIR) $(Shell)
TMPDIR ?= "/tmp"
all:
@echo $(TMPDIR)
両方のシナリオで機能します:TMPDIR=new/path make
およびmake TMPDIR=new/path
。
できることの1つは次のとおりです。
TMPDIR := "/tmp"
ifdef $$TMPDIR
TMPDIR := $$TMPDIR
endif
test:
echo $(TMPDIR)