通过 $(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 中分配变量的语法的主要内容,如果未能解决你的问题,请参考以下文章