如果Else语法在GNU Makefile中评估错误子句

时间:2018-02-18 17:16:06

标签: bash if-statement gnu-make

我试图在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

1 个答案:

答案 0 :(得分:2)

删除条件

中的空格
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