Makefile:ifeq指令将特殊变量与常量进行比较不起作用

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)

Gre*_*osz 7

这是预期的行为.

条件陈述

条件语法的所有实例都是立即解析的; 这包括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.

希望这可以帮助!