我有一个makefile,通过首先设置一些变量来运行其他make目标:
make -C somedir/ LE_VAR=/some/other/stuff LE_ANOTHER_VAR=/and/so/on
现在我需要取消设置 LE_VAR (实际上未设置,不只是用“”覆盖值。)
有没有办法在 GNU Make 3.81 ?
上这样做谢谢!
答案 0 :(得分:1)
假设你的makefile包含这样的内容来调用子make:
submake:
$(MAKE)
您需要修改神奇变量MAKEOVERRIDES
,如下所示:
MAKEOVERRIDES := $(filter-out LE_VAR=%,$(MAKEOVERRIDES))
unexport LE_VAR
submake:
$(MAKE)
答案 1 :(得分:1)
检查出unexport variable
。
来自gnu手册
export variable
export variable-assignment
unexport variable
Tell make whether or not to export a particular variable to child processes
参考https://www.gnu.org/software/make/manual/html_node/Quick-Reference.html
答案 2 :(得分:0)
非常感谢您的回复,这非常棘手。
执行make时,在参数中设置vars,例如:
make -C le/path install ONEVAR=one OTHERVAR=two
我们在env上有ONEVAR和OTHERVAR,第一个命令运行子任务。这种困惑让我困惑,因为我添加到任务(在le / path)执行一个只执行的简单bash脚本:
echo $ONEVAR
unset ONEVAR
令我惊讶的是,var $ ONEVAR实际上是#34;一个" (所以它在env上)并且unset实际上清除了它。但是,添加一个" echo $(ONEVAR)"在makefile上仍然输出" one" ..这是由于MAKEOVERRIDES,事实上,正如Communicating Options to a Sub-make所建议的那样:
命令行变量定义确实出现在变量中 MAKEOVERRIDES和MAKEFLAGS包含对此变量的引用。如果 你确实想要正常通过旗帜,但不想传递下来 在命令行变量定义中,您可以将MAKEOVERRIDES重置为 空的,像这样: MAKEOVERRIDES =
或者正如MadScientist上面所说:)
但这还不够,因为这个var仍然被传递给下面的其他子任务(在这种情况下,一些nodejs模块正在本地文件夹上编译,运气不好,来自phantomjs的js文件和一些使用具有相同名称的var的其他makefile(例如,$ ONEVAR)。
unexport变量告诉是否要导出特定的 变量到子进程。 GNU Make Appendix A Quick Reference
我做的是:
DESTDIR_BUFFER=$(DESTDIR)
MAKEOVERRIDES := $(filter-out DESTDIR=%,$(MAKEOVERRIDES))
unexport DESTDIR
然后才能安装npm。
在此任务结束时,我使用DESTDIR_BUFFER的值导出DESTDIR,并且所有其他后续任务仍然有效。
非常感谢你的帮助!