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

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)

  • 这是什么:`全部:;:`? (2认同)
  • all:为目标_all_创建规则。分号结束先决条件列表并开始第一个配方行。最后的`:`是配方;冒号是一种特殊的POSIX Shell运算符,基本上意味着“什么也不做”。因此,这为“ all”目标定义了一条完整的规则,该目标具有不执行任何操作的配方。 (2认同)

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)

实际上,你应该坚持使用?=作业.


ken*_*orb 9

这是一个简单的解决方案:

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

all:
  @echo $(TMPDIR)
Run Code Online (Sandbox Code Playgroud)

这适用于两种情况:TMPDIR=new/path makemake TMPDIR=new/path