在 makefile 上取消设置环境变量

Posted

技术标签:

【中文标题】在 makefile 上取消设置环境变量【英文标题】:Unset an env variable on a makefile 【发布时间】:2014-08-06 13:50:58 【问题描述】:

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

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

现在我需要取消设置 LE_VAR(真的取消设置,而不仅仅是用“”覆盖值)。

有没有办法在 GNU Make 3.81 上做到这一点?

谢谢!

【问题讨论】:

你可以修改第二个makefile,但不能修改第一个? 【参考方案1】:

假设您的 makefile 包含类似这样的内容来调用子 make:

submake:
         $(MAKE)

你需要修改神奇的变量MAKEOVERRIDES,像这样:

MAKEOVERRIDES := $(filter-out LE_VAR=%,$(MAKEOVERRIDES))
unexport LE_VAR

submake:
        $(MAKE)

【讨论】:

仍然不起作用..它是作为参数传递的 var 以使真正成为 env 变量,还是有另一种处理方式? 哦,我明白了;您正在运行子制作,并且希望在调用子制作时从命令行中删除该变量分配。我以为你想从环境中删除这个变量。 make 命令行上的变量不是环境变量,它们是 make 变量。 是的..我制作了一个包装脚本,它做了一个“未设置”但仍然无法工作:S 真正的问题是我有一个使用同名 var 的子 node_module.. 如果你的子makefile使用正常赋值,你可以省略上面的“unexport”;这将优先于环境中的任何事物。【参考方案2】:

查看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

【讨论】:

【参考方案3】:

非常感谢您的回复,这很棘手。

执行make时,在参数中设置vars,比如:

make -C le/path install ONEVAR=one OTHERVAR=two

我们在 env 上同时拥有 ONEVAR 和 OTHERVAR,并且子任务由第一个命令运行。这让我很困惑,因为我添加到任务(在 le/path)来执行一个简单的 bash 脚本,它只做了:

echo $ONEVAR
unset ONEVAR

令我惊讶的是,var $ONEVAR 实际上是“一”(所以它在 env 上),而 unset 实际上清除了它。但是,在 makefile 上添加“echo $(ONEVAR)”仍然会输出“one”。这是由于 MAKEOVERRIDES,事实上,正如 Communicating Options to a Sub-make 所建议的那样:

命令行变量定义真正出现在变量中 MAKEOVERRIDES 和 MAKEFLAGS 包含对此变量的引用。如果 您确实想正常传递标志,但不想传递 命令行变量定义,您可以将 MAKEOVERRIDES 重置为 空的,像这样: 改头换面 =

或者像上面的 MadScientist 建议的那样:)

但这还不够,因为这个 var 仍然被传递给下面的其他子任务(在这种情况下,一些 nodejs 模块正在本地文件夹中编译,运气不好,来自 phantomjs 的 js 文件和一些其他使用同名 var 的 makefile(例如,$ONEVAR)。

unexport 变量告诉 make 是否导出一个特定的 子进程的变量。 GNU Make Appendix A Quick Reference

我所做的是:

DESTDIR_BUFFER=$(DESTDIR)
MAKEOVERRIDES := $(filter-out DESTDIR=%,$(MAKEOVERRIDES))
unexport DESTDIR

然后才进行 npm 安装。

在此任务结束时,我使用 DESTDIR_BUFFER 的值导出 DESTDIR,所有其他后续任务仍然有效。

非常感谢您的帮助!

【讨论】:

以上是关于在 makefile 上取消设置环境变量的主要内容,如果未能解决你的问题,请参考以下文章

取消设置单个命令的环境变量

在目标内设置 Makefile 变量

makefile export的用法 //设置环境变量

如何使用 NMake 设置环境变量

努力在 bash 中取消设置环境变量

在 grunt-env 中取消设置环境变量