命令行变量 - 在makefile中 - 扩展为奇怪的值

时间:2015-08-19 05:22:10

标签: makefile gnu-make

来自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'选项生效的环境中)将优先使用。

看来,使用其中之一:

  1. 命令行分配。
  2. 环境设置变量,使用-e--environment-overrides)。
  3. 相同效果,即覆盖文件级(makefile)变量。

    但是,结果差别很大。请记住,命令行中给出的值为:cmd,环境中给出的值为:env

    现在,比较为命令行覆盖与环境覆盖的值:

    1. cmd cmd cmd(对于命令行覆盖)。
    2. env file file(适用于环境覆盖)。
    3. 因此,对于命令行,Make重复相同的值,即cmd 3次,对于环境覆盖,情况是不同即可。也就是说,Make will"重复"环境级值:env 1 时间,然后重复 - 除了重写文件级值:file

      现在,"覆盖"不仅情况完全不同。来自命令行与"覆盖"来自环境,这本身很奇怪,这里的问题要大得多。

      因为,制定规则以给予"优先级"对于命令行(或环境)值,为什么它坚持追加"其他"值(如在环境覆盖的情况下,Make附加"文件文件"),或者在命令行覆盖的情况下(其中Make 重复相同的值*** 3 * 次)。严重?

      它是如何有意义的?这些不一致和奇怪的结果的理由是什么?

1 个答案:

答案 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输出,看看我对特定目标变量的值的含义。)