Bash 我能告诉Make忽略环境变量吗?
我最近在使用Make(v3.81)时遇到了一些奇怪的行为 假设我有以下生成文件:Bash 我能告诉Make忽略环境变量吗?,bash,makefile,Bash,Makefile,我最近在使用Make(v3.81)时遇到了一些奇怪的行为 假设我有以下生成文件: FOOBAR = $(shell find nonexistentdirectory -iname "foobar" | tr '\n' ' ') all: @echo "Hi" clean: @echo "Hi again" 看起来很简单,对吧?值得注意的是,FOOBAR是一个“递归扩展的变量”,所以在我引用它之前不应该对它求值。请注意,我从未提及过它。还请注意,nonexistentdir
FOOBAR = $(shell find nonexistentdirectory -iname "foobar" | tr '\n' ' ')
all:
@echo "Hi"
clean:
@echo "Hi again"
看起来很简单,对吧?值得注意的是,FOOBAR
是一个“递归扩展的变量”,所以在我引用它之前不应该对它求值。请注意,我从未提及过它。还请注意,nonexistentdirectory
并不像您预期的那样存在
现在假设我在调用Make目标之前在shell中设置FOOBAR
:
compy386$ FOOBAR="stuff" make clean
find: nonexistentdirectory: No such file or directory
Hi again
为什么要评估
FOOBAR
?显然,这与变量是在shell中定义的这一事实有关。我是否应该预料到用户可能已经在shell中设置了变量?我做错了什么 在=
之前添加一个?
,如:
FOOBAR ?= $(shell find nonexistentdirectory -iname "foobar" | tr '\n' ' ')
如果设置,则将使用环境变量,并且仅在未设置或为空时进行计算。
FOOBAR
正在进行计算,因为您正在运行配方(用于clean
),并且在进入make
时环境中存在FOOBAR
。由于进入时环境中存在FOOBAR
,因此它将成为导出变量,这意味着make
将其作为环境的一部分提供给配方中的任何程序<代码>制作无特殊情况回音
;它只使用在您的路径中找到的路径。它不知道该实用程序是否会引用特定的环境变量,因此它必须导出所有导出的变量,这意味着它必须计算FOOBAR
(官方文字请参见制作手册中的第三段。另请参见上的配方。)
要回答直接的问题,您可以告诉make
忽略变量来自环境的事实,这样它就不会重新导出它,方法是取消移植它:
unexport FOOBAR