Kyo*_*one 4 variables conditional makefile
我的Makefile有点问题.我想make改变有关工作目录的命令.我在测试当前目标的目录($(*D))的规则中添加了条件指令.
问题是make总是进入我的测试的第二个分支,即使我的文件在mySpecialDirectory中并且echo确实打印了"mySpecialDirectory".
.c.o .cpp.o .cc.o:
ifeq ($(*D),mySpecialDirectory)
@echo "I'm in mySpecialDirectory! \o/"
$(CC) $(DEBUG_FLAGS) $(MYSPECIALFLAGS) -c $< -o $@
else
@echo "Failed! I'm in $(*D)"
$(CC) $(DEBUG_FLAGS) $(NOTTHATSPECIALFLAGS) -c $< -o $@
endif
Run Code Online (Sandbox Code Playgroud)
这是预期的行为.
条件陈述
条件语法的所有实例都是立即解析的; 这包括ifdef,ifeq,ifndef和ifneq表单.当然,这意味着自动变量不能在条件语句中使用,因为在调用该规则的命令脚本之前,不会设置自动变量.如果需要在条件中使用自动变量,则必须在命令脚本中使用shell条件语法,对于这些测试,不要使用条件.
$(*D) 是一个自动变量.
相反,考虑做:
.c.o .cpp.o .cc.o:
$(CC) $(DEBUG_FLAGS) $(if $(subst mySpecialDirectory,,$(*D)),$(NOTTHATSPECIALFLAGS),$(MYSPECIALFLAGS)) -c $< -o $@
Run Code Online (Sandbox Code Playgroud)
这个想法是$(subst)通过替换mySpecialDirectory空字符串来滥用某些相等的测试.然后,如果$(*D)扩展等于mySpecialDirectory,则它将被空字符串完全替换,并且else-part将根据以下内容$(if)进行评估:
$(if condition,then-part[,else-part])if函数在函数上下文中提供对条件扩展的支持(与GNU make makefile条件如ifeq相反(参见条件语法).
第一个参数condition首先将所有前导和尾随空格剥离,然后展开.如果它扩展为任何非空字符串,则认为该条件为真.如果它扩展为空字符串,则该条件被视为false.
注意在这个then-part和之间的这个黑客的翻转else-part.
希望这可以帮助!