【问题标题】:If Else syntax evaluating wrong clause in GNU MakefileIf Else 语法评估 GNU Makefile 中的错误子句
【发布时间】:2018-02-18 17:16:05
【问题描述】:

我正在尝试获取 Makefile 中的 if else 语法

TYPE=src
RTL=src

program_%:
ifeq ($(TYPE),$(RTL))  
        echo "RTL"      
else                    
        echo "Test"         
endif

这里是命令行

$make -f test.make prog_src

我在输出中得到以下内容

echo "RTL"
RTL

但是,当我更改 if 语句,而不是硬编码变量时,我会执行类似的操作

program_%:
ifeq ($(TYPE),$*)  
        echo "RTL"      
else                     
        echo "Test"
endif

然后运行如下

$make -f test.make prog_src

我得到了错误的子句评估

echo "Test"
Test

【问题讨论】:

  • ifeqendifonly 语法。您不能在由 bash 评估的 makefile 的任何部分中使用它,而不是通过 make。
  • @CharlesDuffy 从代码中删除了 /bin/bash。现在它是如何工作的?
  • @CharlesDuffy 我做到了,还根据stackoverflow.com/questions/4483313/…格式化了代码

标签: bash if-statement gnu-make


【解决方案1】:

删除条件中的空格

ifeq ($(TYPE),$(RTL))  

关于问题的第二部分:

没有;这是不可能的 ifeq 在 makefile 的上下文中进行评估,$* 没有在那里扩展。您可以尝试$(if ...),但无法直接检查相等性:

program_%:
    @echo $(if $(filter ${TYPE},$*),"RTL","Test")

“makefile 的上下文”表示if* 只看到全局make 变量。 $* 等特殊变量仅在规则上下文中可用。

复杂的规则

复杂的规则可以通过

define complex_rule_A
@echo "complex_rule_A"
@echo "done"
endef

define complex_rule_B
@echo "complex_rule_B"
@echo "failed"
endef


program_%:
    $(if $(filter ${TYPE},$*),$(call complex_rule_A),$(call complex_rule_B))

替代解决方案

${TYPE} 可以枚举时,一个更干净的解决方案可能是

program_%:  .program_${TYPE}_%
    :

.program_RTL_%:
    echo else

.program_RTL_RTL:
    echo RTL

【讨论】:

  • 太棒了。这行得通。有没有办法让它在没有硬编码变量的情况下工作。
  • 我更正了帖子。请参阅帖子的第二部分
  • 你能解释一下它在 Makefile 的上下文中的含义,而不是在 Makefile 的上下文中,因为我认为 $* 在 Makefile 的上下文中。我在 GNU Make 手册中看到过
  • 最后,如果条件为真,我想执行其他语句,如果条件为假,我想执行其他语句。为此,我将如何更改您的上述语法
猜你喜欢
  • 2013-03-05
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 2017-08-02
  • 2020-02-24
  • 1970-01-01
相关资源
最近更新 更多