【问题标题】:Unset an env variable on a makefile在 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,但不能修改第一个?

标签: bash makefile gnu-make


【解决方案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,所有其他后续任务仍然有效。

    非常感谢您的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-01
      • 2013-10-28
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      • 2016-06-27
      • 2019-05-20
      • 2014-05-02
      相关资源
      最近更新 更多