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

If statement 通过$(if…)在makefile中分配变量的语法,if-statement,makefile,variable-assignment,If Statement,Makefile,Variable Assignment,Makefile中的以下几行通过echo的输出显示,尝试分配$(if…)的各种语法都不正确(下面显示的$(if…)的三个变体只是我尝试的一些变体): exes=$(patsubst%.cc、%.exe、$(通配符*.cc)) #依赖于=$(如果eq“$@”“the_file.exe”,fooinc.h,无任何内容) #依赖于=$(如果(ifeq($@,the_file.exe),1,0),`echo true$@`,`echo false$@`) 取决于=$(如果“a”eq“ha”,fooinc

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

exes=$(patsubst%.cc、%.exe、$(通配符*.cc))
#依赖于=$(如果eq“$@”“the_file.exe”,fooinc.h,无任何内容)
#依赖于=$(如果(ifeq($@,the_file.exe),1,0),`echo true$@`,`echo false$@`)
取决于=$(如果“a”eq“ha”,fooinc.h,则为零)
全部:${exes}
%.exe:%.cc
@回声取决于:$(取决于)
$(详细)${gcc}${flags}${INC}-o$@$<
gnu makefile的文档解释了多行if。。。其他的endif,但是我还没有找到任何关于单行$(if…)的解释


更新:@MadScientist的解释和说明确实回答了上述问题。要完全实现所需的功能,需要以下概念:;如下所示--请注意.SECONDEXPANSION:、用于扩展的双精度$和$^(而不是$)if函数的文档说明它扩展了第一个参数,如果结果是空字符串,则为false。如果不是空字符串,则为true

因此,您必须找到一种方法来构造一条语句,当对该语句求值时,如果您需要then部分,它将扩展为非空字符串,如果您需要else部分,它将扩展为空字符串。如果您使用单个单词进行字符串比较,那么
$(filter…
是一个很好的选择:

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

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

因此,您必须找到一种方法来构造一条语句,当对该语句求值时,如果您需要then部分,它将扩展为非空字符串,如果您需要else部分,它将扩展为空字符串。如果您使用单个单词进行字符串比较,那么
$(filter…
是一个很好的选择:

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