使用ENV变量或默认值定义Makefile变量

时间:2014-06-17 12:02:31

标签: bash shell makefile environment-variables

我想做一件简单的事情:

TMPDIR ?= /tmp

test:
    @echo $(TMPDIR)

如果我跑:

,这是有效的
$ make test
/tmp

如果我跑:

,它也有效
$ make test -e TMPDIR=~/tmp
/home/user/tmp

我还能做些什么呢?

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

4 个答案:

答案 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 makemake TMPDIR=new/path

答案 3 :(得分:0)

你可以做的一件事是:

TMPDIR := "/tmp"

ifdef $$TMPDIR
TMPDIR := $$TMPDIR
endif

test:
    echo $(TMPDIR)