1

Makefile 中的以下行通过 echo 的输出显示,尝试分配 $(if ... ) 的各种语法都是不正确的(下面显示的 $(if...) 的三个变体只是我尝试过的一些变体):

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 的语法,但我无法找到单行 $(if ...) 的任何解释。

更新:@MadScientist 的解释和插图确实回答了上面提出的问题。要完全实现所需的功能,需要二次扩展的概念;如下图所示——注意 .SECONDEPANSION:、用于扩展 depends_on 的双 $,以及 echo 操作中的 $^(而不是 $<):

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 $@  $<     
4

1 回答 1

1

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

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

depends_on = $(if $(filter the_file.exe,$@),fooinc.h,nothing)
于 2013-06-06T13:01:55.997 回答