Nat*_*tim 55 bash shell makefile environment-variables
我想做一件简单的事情:
TMPDIR ?= /tmp
test:
@echo $(TMPDIR)
Run Code Online (Sandbox Code Playgroud)
这有效,如果我运行:
$ make test
/tmp
Run Code Online (Sandbox Code Playgroud)
如果我运行它也有效:
$ make test -e TMPDIR=~/tmp
/home/user/tmp
Run Code Online (Sandbox Code Playgroud)
我还能做些什么呢?
$ TMPDIR=~/tmp make test
/home/user/tmp
Run Code Online (Sandbox Code Playgroud)
Mad*_*ist 87
为了跟进我上面的评论,这是一个例子:
T ?= foo
all:
: '$(T)'
Run Code Online (Sandbox Code Playgroud)
现在,如果我运行各种选项,它会按预期运行(foo只有T在命令行或环境中没有设置时才会得到):
$ make
: 'foo'
$ make T=bar
: 'bar'
$ T=bar make
: 'bar'
Run Code Online (Sandbox Code Playgroud)
Max*_*kin 21
make命令行中指定的变量会覆盖makefile中指定的值:
TMPDIR := "/tmp"
test:
@echo $(TMPDIR)
Run Code Online (Sandbox Code Playgroud)
然后:
make TMPDIR=whatever
whatever
Run Code Online (Sandbox Code Playgroud)
makefile依赖于环境变量通常是不好的做法,这就是首选在make命令行中传递变量的原因.
另一种方法是使用make or函数:
X := $(or ${X},${X},abc)
all :
@echo ${X}
make
abc
X=def make
def
Run Code Online (Sandbox Code Playgroud)
实际上,你应该坚持使用?=作业.
这是一个简单的解决方案:
SHELL := env TMPDIR=$(TMPDIR) $(SHELL)
TMPDIR ?= "/tmp"
all:
@echo $(TMPDIR)
Run Code Online (Sandbox Code Playgroud)
这适用于两种情况:TMPDIR=new/path make和make TMPDIR=new/path。