我正在尝试做一个简单的事情:
TMPDIR ?= /tmp
test:
@echo $(TMPDIR)
如果我运行,这可以工作:
$ make test
/tmp
如果我运行它也可以:
$ make test -e TMPDIR=~/tmp
/home/user/tmp
我也可以做些什么来使其适用于:
$ TMPDIR=~/tmp make test
/home/user/tmp
我正在尝试做一个简单的事情:
TMPDIR ?= /tmp
test:
@echo $(TMPDIR)
如果我运行,这可以工作:
$ make test
/tmp
如果我运行它也可以:
$ make test -e TMPDIR=~/tmp
/home/user/tmp
我也可以做些什么来使其适用于:
$ TMPDIR=~/tmp make test
/home/user/tmp
TMPDIR ?= "/tmp"
,echo $(TMPDIR)
唯一的事情就是不要忘记变量名周围的括号。
-e
向后使用的功能。-e
表示允许env var覆盖makefile中定义的变量,它们不影响来自命令行参数的变量分配。
?=
确实可以。如果它没有做您想要的事情,那么上面的解释会令人困惑,我们无法理解您想要什么,或者您的实际环境中有一些事情没有反映在上面的问题中。
Answers:
为了跟进我上面的评论,下面是一个示例:
T ?= foo
all:
: '$(T)'
现在,如果我以各种方式运行Makefile,它的行为将与我们预期的一样(foo
仅当我未T
在命令行或环境中进行设置时,我才能得到):
$ make
: 'foo'
$ make T=bar
: 'bar'
$ T=bar make
: 'bar'
all:;:
什么
all:
为所有目标创建规则。分号结束先决条件列表并开始第一个配方行。最后:
是食谱;冒号是一种特殊的POSIX Shell运算符,基本上意味着“什么也不做”。因此,这为all
目标制定了一条完整的规则,该目标具有不执行任何操作的配方。
在make命令行上指定的变量将覆盖makefile中分配的值:
TMPDIR := "/tmp"
test:
@echo $(TMPDIR)
然后:
make TMPDIR=whatever
whatever
通常,makefile文件依赖于环境变量是一种不好的做法,这就是为什么首选在make命令行中传递变量的原因。
另一种方法是使用makeor
函数:
X := $(or ${X},${X},abc)
all :
@echo ${X}
make
abc
X=def make
def
实际上,您应该只使用?=
分配。
TMPDIR := $(or $$TMPDIR,$$TMPDIR,"/tmp")
但似乎没有用。
$(or
调用超出了需要。这不行吗?$(or $X,abc)
?
?=
并且设置了环境变量,那么将使用环境变量的值代替)。到底是什么问题(为什么您认为它不起作用)?