【问题标题】:Variable Assignment in MakefileMakefile 中的变量赋值
【发布时间】:2018-12-01 01:54:19
【问题描述】:

在制作以下基本 makefile 时,我看到的行为让我觉得我缺少一些基本的东西:

define foo
    var := $1
    $(info var_value: [$(var)] vs value: [$1])
endef

all:
    $(eval $(call foo,FIRST))
    $(eval $(call foo,SECOND))

该 makefile 的输出如下:

var_value: [] vs value: [FIRST]
var_value: [FIRST] vs value: [SECOND]
make: `all' is up to date.

我的理解是var := $1 意味着 $1 中的任何值都会立即展开并设置为 var。 因此,我会(天真地)期望 var 的内容和实际值始终相等,但事实并非如此。谁能给我一个提示?

【问题讨论】:

    标签: variables makefile variable-assignment expansion


    【解决方案1】:

    eval 扩展它的参数并在传递给 shell 之前扩展结果。 $$ 逃脱了第一次扩展:

    define foo
        var := $1
        $$(info var_value: [$$(var)] vs value: [$1])
    endef
    $(foreach n,FIRST SECOND,$(eval $(call foo,$(n))))
    
    all:;
    

    演示:

    $ make all
    var_value: [FIRST] vs value: [FIRST]
    var_value: [SECOND] vs value: [SECOND]
    make: 'all' is up to date.
    

    【讨论】:

      【解决方案2】:

      这是一个何时评估事物的问题。起初变量var 是空的,所以在第一次调用时foo 扩展为:

      var := FIRST
      $(info var_value: [] vs value: [FIRST])
      

      Make 对此进行评估,并为var 提供值“FIRST”。 由于var 的值为“FIRST”,所以对foo 的第二次调用扩展为:

      var := SECOND
      $(info var_value: [FIRST] vs value: [SECOND])
      

      【讨论】:

      • 一个巧妙的技巧,通过使用$(foreach var,expr,body) 分配一个值来延迟扩展。还有$(value var),虽然它不会扩展子表达式。
      猜你喜欢
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      相关资源
      最近更新 更多