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