【问题标题】:Export variable for a target in POSIX MakePOSIX Make 中目标的导出变量
【发布时间】:2018-09-20 14:19:01
【问题描述】:

在 GNU Make 中,您可以为目标导出变量:

foo: export X=42
foo:
    echo $$X
    # Call several more commands that use $X.

有没有办法在便携式 POSIX Make 中做到这一点?到目前为止,我找到了两种方法。第一种是基本上将所有命令合并为一个:

foo:
    export X=42; \
        echo $$X; \
        # Call several more commands that use $X.

这很糟糕,因为现在所有东西都捆绑在一起了。二是拨打$(MAKE)

foo:
    $(MAKE) foo_ X=42
foo_:
    echo $$X
    # Call several more commands that use $X.

但这需要再次调用。有没有更好的办法?

【问题讨论】:

  • 改用 make 变量?例如,您可以将 echo $$X 替换为 echo $(X)。注意:我很惊讶您的第二个解决方案(使用递归 make)有效。
  • 我调用的命令是从环境中读取X 的值,所以这不起作用,除非我执行export X=$(X); cmd1 之类的操作。
  • 我明白了。最简单的解决方案可能是通过使用make X=42 调用make 在命令行上设置变量。这样 1. 定义 make X 变量并将其设置为 42,即使它在 Makefile 中设置为另一个值 2. 定义 shell 环境变量 X 并将所有配方设置为 42。如果你不能使用它(例如,因为它是计算值的 make)递归 make 解决方案可能是最简单的。注意:忘记我之前评论的最后一部分,我没有认真阅读您的问题。
  • 介意转发您的评论作为答案吗?如果没有更好的答案,我会在几天后接受。
  • 完成。我最近answered 至少还有一个关于这些 make - shell 变量交互的问题。还有another one。也许你会在那里找到有用的东西?我记得MadScientist 也回答了类似的问题,如果你能找到的话。

标签: makefile environment-variables posix


【解决方案1】:

最简单的解决方案可能是在命令行上通过调用 make 来设置变量:

make X=42

这边:

  1. make X 变量已定义并设置为 42,即使它在 Makefile 中设置为另一个值。
  2. shell 环境变量 X 已定义并针对所有配方设置为 42。

如果你不能使用它(例如因为它是计算值的 make)递归 make 解决方案可能是最好的选择:

ifeq ($(X),)
X := <some-make-magic>

all:
    $(MAKE) X=$(X) all
else
all:
    <recipe-that-uses-X-environment-variable>
endif

【讨论】:

  • 一点点:POSIX Make 没有ifeq,所以条件可能应该在规则内并且在 sh 语法中;类似if [ "$(X)" = "" ]; then ...; else ...; fi
  • 哎呀,你是对的,这不是 POSIX 版本。对不起。
猜你喜欢
  • 2011-03-05
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多