通过$(如果......)在makefile中赋值变量的语法

时间:2013-06-06 12:55:14

标签: if-statement makefile variable-assignment

Makefile中的以下几行显示,通过echo的输出,为$(如果...)赋值的各种语法都是不正确的($的三个变体(如果......) )如下所示只是我试过的一些变种:

exes  =  $(patsubst %.cc,%.exe,$(wildcard *.cc))    

#depends_on = $(ifeq "$@" "the_file.exe",fooinc.h,nothing)    
#depends_on = $(if (ifeq($@,the_file.exe),1,0),`echo true $@`,`echo false $@`)    
depends_on = $(if "a" eq "ha",fooinc.h,nothing)    

all:  ${exes}     

%.exe:%.cc       
    @echo depends on: $(depends_on)      
    $(VERBOSE)${gcc} ${flags} ${INC}  -o $@  $<   

gnu makefile的文档解释了多行if ... else .. endif的语法,但我无法找到单行$(如果......)的任何解释。

更新:@MadScientist的解释和插图确实回答了上面提到的问题。为了完全实现所需的功能,需要Secondary Expansion的概念;下面说明了这一点 - 注意.SECONDEXPANSION:,用于扩展depends_on的double $和echo操作中的$ ^(而不是$&lt;):

depends_on = $(if $(filter the_file.exe,$@),fooinc.h,)  

.SECONDEXPANSION:  
%.exe: $$(depends_on)  %.cc     
    @echo depends on: $(depends_on) carat: $^  ampersand: $@      
    $(VERBOSE)${gcc} ${flags} ${INC}  -o $@  $<     

1 个答案:

答案 0 :(得分:1)

if函数的文档说它扩展了它的第一个参数,如果结果是空字符串,则为false。如果它不是空字符串,那就是真的。

所以你必须找到一种方法来构造一个语句,当你想要else部分时,如果你想要then-part和一个空字符串,它将被扩展为非空字符串。如果您使用单个单词进行字符串比较,则$(filter ...)是一个不错的选择:

depends_on = $(if $(filter the_file.exe,$@),fooinc.h,nothing)