【发布时间】: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 += targetx : foo += target - 对于 Makefile 的第 2 版(带有 模式-特定定义),我们有:
% : foo += target
在这两种情况下,我们的配置基本相同:
- 附加到前一个值的模式/目标定义。
- 模式/目标定义同时应用于
all和x目标。 - 我们有一个命令行定义,假设 覆盖 makefile 级别的定义。
现在,在解释或实现该覆盖时,Make 对版本 1(目标定义)与版本 2(模式定义)。
让我们看看:
- 对于目标定义,Make 完全忽略 makefile 中定义的 ANY 值。因此,最终值为:
cmd。 - 然而,对于模式定义,Make 提出了“和解”方法,试图满足 both、makefile 级定义和命令行定义,所以它:
- 接受最终值为
cmd,根据覆盖生成文件定义的命令行。 - 但是,因为 makefile 暗示“模式”应该“附加”附加值 - 别介意那些相同的值已被覆盖 - Make 仍将“服从”这些附加,但它会使用 不同的值(即“获胜”命令行值),从而达到“妥协”,makefile或命令行也无法单独控制变量的最终值。
- 接受最终值为
嗯,当我们期望得到非常不同的最终结果时,Make 采用这些不同的方法来实现命令行覆盖(每个模式与目标特定变量)更加明显他们分别:
-
cmd(针对特定目标)。 -
cmd cmd cmd(针对特定模式)。
这合理吗?那是怎么回事?
【问题讨论】: