给定一个带有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几乎都是相同,但是:
all : foo += target
x : foo += target
% : foo += target
在这两种情况下,我们基本上都有相同的配置:
all
和x
目标。现在,解释或实施覆盖,Make使用一种非常不同的方法,版本 1 (目标定义)而不是版本 2 (模式定义)。
让我们看看:
cmd
。cmd
。嗯,当我们期望得到的最终结果非常不同时,Make实现命令行覆盖(每个模式与目标特定变量)的这些不同方法更加明显他们分别是:
cmd
(针对特定目标)。cmd cmd cmd
(针对特定模式)。这是否合理?怎么会这样?
答案 0 :(得分:3)
这似乎是一个最小的完整示例:
make foo=cmd
调用cmd cmd
(使用GNUMake v3.81),生成
$(foo)
这对我来说似乎是一个错误。根据the manual:
命令行上提供的变量(如果是,则在环境中提供) '-e'选项有效)优先于[特定于目标的变量]。
所以+ =语句应该没有效果。但显然,如果赋值是在模式规则中,则命令行值会否决规则尝试追加的值,而不是追加它的行为,以便将S2: INDEX(ref_player, ref_world, timestamp)
追加到自己身上。