【问题标题】:set env variable from a Makefile command and use in another Make command从 Makefile 命令设置环境变量并在另一个 Make 命令中使用
【发布时间】:2021-04-12 11:26:34
【问题描述】:

我正在尝试使用 python 脚本连接到一些 API。该 API 需要一个可用的环境变量。为了获得那个环境,我有另一个命令。我将这两个命令组合在一个 Makefile 命令中

# Current Makefile
cmd_1:
    $(eval MY_ENV := $somevalue)
    MY_ENV=$(MY_ENV) python myscript.py cmd_1

cmd_2:
    $(eval MY_ENV := $somevalue)
    MY_ENV=$(MY_ENV) python myscript.py cmd_2

现在你可以看到上面两个命令中的某些部分(第一行)是相同的。我想摆脱这种重复。我想要类似下面的东西,这样即使将来我有超过 2 个 mgmt 命令,我也可以重用它。

# Desired Makefile (Using DRY)?
get_env:
        $(eval MY_ENV := $somevalue)
    
cmd_1:
        MY_ENV=$(MY_ENV) python myscript.py cmd_1

cmd_2:
        MY_ENV=$(MY_ENV) python myscript.py cmd_2

我试图包装这两个命令并创建另一个 Make 命令,如下所示。但没有运气。

mycmd:
    @$(MAKE) get_env
    @$(MAKE) cmd_1 

所以我想知道是否有更好的方法来做到这一点?

【问题讨论】:

  • 在收到答案后更改您的问题只会让未来的访问者感到困惑。现在答案没有意义,因为它指的是问题的早期版本。 (答案有待编辑,所以我现在不会回滚;但以后请不要这样做。)
  • 我同意 Tripleee 的观点:我必须同时更改问题和答案才能再次成为问题的答案!请不要再更改。
  • 您为什么要在配方中的eval 中设置变量?如果您希望它对两个规则都有效,为什么不将其设置为全局级别的 make 变量?

标签: makefile


【解决方案1】:

让我建议一下:

get_env ::
    $(eval MY_ENV := $somevalue)

cmd_1 cmd_2 :: get_env
    MY_ENV=$(MY_ENV) python myscript.py $@

一些解释:

  • :: 使目标变得虚假,因此您不必在 Makefile 中添加一行 .PHONY: get_env cmd_1 cmd_2
  • $@ 是当前目标

关键是在规则中给get_env添加一个依赖,这样MY_ENV就保留下来了。

如需更简单的试用,请使用此玩具 Makefile 运行 make barmake baz

foo ::
    $(eval qux := `pwd`)

bar baz :: foo
    @echo "qux = $(qux) and target = $@"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 2014-07-30
    • 2021-12-25
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    相关资源
    最近更新 更多