取消设置makefile上的env变量

时间:2014-06-16 17:07:07

标签: bash makefile gnu-make

我有一个makefile,通过首先设置一些变量来运行其他make目标:

make -C somedir/ LE_VAR=/some/other/stuff LE_ANOTHER_VAR=/and/so/on

现在我需要取消设置 LE_VAR (实际上未设置,不只是用“”覆盖值。)

有没有办法在 GNU Make 3.81

上这样做

谢谢!

3 个答案:

答案 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,并且所有其他后续任务仍然有效。

非常感谢你的帮助!