【问题标题】:How to override a target-specific variable from the command-line?如何从命令行覆盖特定于目标的变量?
【发布时间】:2015-08-20 07:58:54
【问题描述】:

给定一个带有 target-specific 定义的 makefile:

# A target-specific definition for both: 'all' and 'x'.
all : foo += target
x   : foo += target


all : x ;

x ::
    @echo '$(foo)'


跑步,我明白了:

# override Makefile-level variables, with a command-line definition.
$ make foo=cmd
cmd



现在,与上面相同的 makefile,但具有 pattern-specific 定义:

# A pattern-specific definition that matches both targets: 'all' and 'x'.
% : foo += target


all : x ;

x ::
    @echo '$(foo)'


跑步,我明白了:

# override Makefile-level variables, with a command-line definition.
$ make foo=cmd
cmd cmd cmd

现在,两个 makefile 几乎相同,除了:

  • 对于 Makefile 的第 1 版:(带有 目标 特定定义),我们有:
    all : foo += target
    x : foo += target
  • 对于 Makefile 的第 2 版(带有 模式-特定定义),我们有:
    % : foo += target

在这两种情况下,我们的配置基本相同

  1. 附加到前一个值的模式/目标定义。
  2. 模式/目标定义同时应用于allx 目标。
  3. 我们有一个命令行定义,假设 覆盖 makefile 级别的定义。

现在,在解释或实现该覆盖时,Make 对版本 1(目标定义)与版本 2(模式定义)。

让我们看看:

  • 对于目标定义,Make 完全忽略 makefile 中定义的 ANY 值。因此,最终值为:cmd
  • 然而,对于模式定义,Make 提出了“和解”方法,试图满足 both、makefile 级定义和命令行定义,所以它:
    1. 接受最终值为cmd,根据覆盖生成文件定义的命令行。
    2. 但是,因为 makefile 暗示“模式”应该“附加”附加值 - 别介意那些相同的值已被覆盖 - Make 仍将“服从”这些附加,但它会使用 不同的值(即“获胜”命令行值),从而达到“妥协”,makefile或命令行也无法单独控制变量的最终值。

嗯,当我们期望得到非常不同的最终结果时,Make 采用这些不同的方法来实现命令行覆盖(每个模式与目标特定变量)更加明显他们分别:

  1. cmd(针对特定目标)。
  2. cmd cmd cmd(针对特定模式)。

这合理吗?那是怎么回事?

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    这似乎是一个最小的完整示例:

    %: foo += targ
    
    x:
        @echo $(foo)
    

    make foo=cmd 调用(使用 GNUMake v3.81),这会产生

    cmd cmd
    

    这对我来说似乎是一个错误。根据the manual

    在命令行上提供的变量(如果 ‘-e’ 选项生效)将优先于[针对特定目标的变量]。

    所以 += 语句应该没有效果。但显然,如果分配在模式规则中,命令行值会否决规则尝试附加的 ,而不是 附加它的行为,因此将$(foo) 附加到自身。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 2013-12-19
      • 1970-01-01
      • 2019-02-07
      • 2013-08-31
      • 2011-12-23
      • 1970-01-01
      相关资源
      最近更新 更多