通过 $(if ...) 在 makefile 中分配变量的语法

Posted

技术标签:

【中文标题】通过 $(if ...) 在 makefile 中分配变量的语法【英文标题】:Syntax for assigning variable in makefile via $(if ...) 【发布时间】:2013-06-02 11:55:22 【问题描述】:

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 的解释和插图确实回答了上面提出的问题。要完全实现所需的功能,需要Secondary Expansion的概念;如下图所示——注意 .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 $@  $<     

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于通过 $(if ...) 在 makefile 中分配变量的语法的主要内容,如果未能解决你的问题,请参考以下文章

Makefile中怎么使用Shell if判断

如何在makefile中验证非空行和非注释行的文件

Makefile中的条件编译:ifeqifneqifdef和ifndef

makefile中wildcard判断文件存在

如何检查 Makefile 中是不是存在文件以便删除它?

makefile里怎么表达elseif