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 $@ $<
答案 0 :(得分:1)
if函数的文档说它扩展了它的第一个参数,如果结果是空字符串,则为false。如果它不是空字符串,那就是真的。
所以你必须找到一种方法来构造一个语句,当你想要else部分时,如果你想要then-part和一个空字符串,它将被扩展为非空字符串。如果您使用单个单词进行字符串比较,则$(filter ...)
是一个不错的选择:
depends_on = $(if $(filter the_file.exe,$@),fooinc.h,nothing)