来自docs:
特定于目标的变量具有与其他变量相同的优先级 makefile变量。在命令行上提供的变量(和 环境如果' -e'选项有效)优先。 指定'覆盖'指令将允许特定于目标 变量值是首选。
所以,一个简单的makefile,如:
# A pattern-specific variable assignment.
% : foo += file
all : x ;
# Target is a double-colon w/o dependencies, so Make will ALWAYS run its commands.
x ::
@echo '$(foo)'
跑步,我们得到:
# Override makefile-level variables, with a command-line assignment.
$ make foo=cmd
cmd cmd cmd
# Set the value in the environment, And tell Make to prefer it over any makefile-level definitions.
$ foo=env make --environment-overrides
env file file
现在返回上面的引文,来自文档:
命令行上提供的变量(以及在' -e'选项生效的环境中)将优先使用。
看来,使用其中之一:
-e
(--environment-overrides
)。相同效果,即覆盖文件级(makefile)变量。
但是,结果差别很大。请记住,命令行中给出的值为:cmd
,环境中给出的值为:env
。
现在,比较为命令行覆盖与环境覆盖的值:
cmd cmd cmd
(对于命令行覆盖)。env file file
(适用于环境覆盖)。因此,对于命令行,Make重复相同的值,即cmd
, 3次,对于环境覆盖,情况是不同即可。也就是说,Make will"重复"环境级值:env
仅 1 时间,然后重复 - 除了重写文件级值:file
。
现在,"覆盖"不仅情况完全不同。来自命令行与"覆盖"来自环境,这本身很奇怪,这里的问题要大得多。
因为,制定规则以给予"优先级"对于命令行(或环境)值,为什么它坚持追加"其他"值(如在环境覆盖的情况下,Make附加"文件文件"),或者在命令行覆盖的情况下(其中Make 重复相同的值*** 3 * 次)。严重?
它是如何有意义的?这些不一致和奇怪的结果的理由是什么?
答案 0 :(得分:2)
我相信这里的答案与this other question of yours的答案有关。 (可能是env覆盖版本中的一个错误。)
全局变量和特定于目标的变量是不同的变量。
cmd cmd cmd
结果是因为当您编写%: foo += file
时,将存储作为变量{{1}的特定于目标的值的变量foo
的当前值的补充。 } foo
。
但是,当您在命令行上设置file
时,make 会覆盖特定于目标的变量foo
的值,而不是foo
而不是{{ 1}}。因此,当每次获得cmd
时,使变量成为变量。
我认为,那个解释应该让你file
然后我不知道为什么它不会。这可能是一个错误,也可能是关于env如何覆盖变量和特定于目标的变量值的其他细节。我不确定。
(检查这两种情况的cmd cmd cmd
输出,看看我对特定目标变量的值的含义。)