在 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 上取消设置环境变量的主要内容,如果未能解决你的问题,请参考以下文章