【问题标题】:How to export variables from makefile rule?如何从 makefile 规则中导出变量?
【发布时间】:2018-05-11 13:49:29
【问题描述】:

我在我的Makefile 规则中有哪个设置环境:

.ONESHELL:
set_db_env:
    export DB_USER=XXX
    export DB_PASS=YYY   

我可以重复使用set_db_env 目标吗?

another_rule: set_db_env
    echo ${DB_USER}

我也找到了.EXPORT_ALL_VARIABLES,但是不明白怎么用。

UPD
我发现这是可行的:

$(shell ${APP} db_env > ${CONF_DIR}/db_env.conf)
include ${CONF_DIR}/db_env.conf

但我认为这不是好方法

【问题讨论】:

  • 您的set_db_env 规则/食谱真的有效吗?这应该在单独的 shell 中运行每个 export 语句,在这种情况下,我预计有关 := 的错误是无效语法。
  • @G.M.:我已经更新了问题。但无论如何它会导出到一个父 shell,不是吗?
  • 看看this solution。这应该会给你带来一些启示。
  • @perror:是的,我以前见过。在每条规则之前写 N export VAR 行太冗长了。我只想用一个命令重用它们:set_db_env
  • @EugenKonkov:我不知道.EXPORT_ALL_VARIABLES,但这似乎就是你要找的东西! Here is an example of how to use it。基本上,您只需在 Makefile 中将其声明为空目标。

标签: bash shell makefile


【解决方案1】:

一般来说,变量不会从一个规则传递到另一个规则。但是有一种方法可以使用target-specific variables

another_rule: DB_USER=XXX
another_rule: DB_PASS=YYY                              

another_rule:
    @echo user is ${DB_USER}
    @echo pass is $(DB_PASS)

如果为每条规则写那么多额外的行太乏味,你可以将它们包装在一个函数中:

define db_env
$(1): DB_USER=XXX
$(1): DB_PASS=YYY
endef

$(eval $(call db_env,another_rule))
another_rule:
    @echo user is ${DB_USER}
    @echo pass is $(DB_PASS)

【讨论】:

  • 能否请您提供更多关于这里发生的事情的描述?我读了call,但仍然不明白db_env 在哪里工作。以及为什么将目标名称指定为调用的参数。
  • @EugenKonkov: "another_rule" 是第一个参数,所以call 将该值赋给临时变量1,所以当call 扩展变量db_env 时," $(1)" 变成了 "another_rule"。
【解决方案2】:

替代解决方案可能是使用pattern specific variables:

我的用例:

staging%: export DB_HOST="127.0.0.1"
staging%: export DB_NAME="yolo"

staging-shell:
    @echo "My host is ${DB_HOST}"

staging-server:
    @echo "My host is ${DB_HOST}"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 2017-11-21
    相关资源
    最近更新 更多