我想做一件简单的事情:
TMPDIR ?= /tmp
test:
@echo $(TMPDIR)
如果我跑:
,这是有效的$ make test
/tmp
如果我跑:
,它也有效$ make test -e TMPDIR=~/tmp
/home/user/tmp
我还能做些什么呢?
$ TMPDIR=~/tmp make test
/home/user/tmp
答案 0 :(得分:74)
为了跟进我上面的评论,以下是一个例子:
T ?= foo
all:;: '$(T)'
现在,如果我运行各种选项,它会按预期运行(只有在命令行或环境中不设置foo
时才会T
}:
$ make
: 'foo'
$ make T=bar
: 'bar'
$ T=bar make
: 'bar'
答案 1 :(得分:19)
Variables specified on make command line override the values assigned in 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
实际上,您应该坚持使用?=
作业。
答案 2 :(得分:2)
这是一个简单的解决方案:
SHELL := env TMPDIR=$(TMPDIR) $(SHELL)
TMPDIR ?= "/tmp"
all:
@echo $(TMPDIR)
适用于两种情况:TMPDIR=new/path make
和make TMPDIR=new/path
。
答案 3 :(得分:0)
你可以做的一件事是:
TMPDIR := "/tmp"
ifdef $$TMPDIR
TMPDIR := $$TMPDIR
endif
test:
echo $(TMPDIR)