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

时间:2009-12-02 17:53:36

标签: variables makefile conditional

我的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

1 个答案:

答案 0 :(得分:7)

这是预期的行为。

  

条件语句

     

条件语法的所有实例都是立即解析的;这包括ifdef,ifeq,ifndef和ifneq表单。 当然这意味着自动变量不能在条件语句中使用,因为在调用该规则的命令脚本之前不会设置自动变量。如果需要在条件中使用自动变量,则必须在命令脚本中使用shell条件语法,对于这些测试,不要使用条件。

$(*D)是一个自动变量。

相反,请考虑:

.c.o .cpp.o .cc.o:
   $(CC) $(DEBUG_FLAGS) $(if $(subst mySpecialDirectory,,$(*D)),$(NOTTHATSPECIALFLAGS),$(MYSPECIALFLAGS)) -c $< -o $@

我们的想法是通过用空字符串替换$(subst)来将mySpecialDirectory滥用到某些相等测试中。然后,如果$(*D)扩展等于mySpecialDirectory,则它将被空字符串完全替换,而$(if)的else部分将按以下方式进行评估:

  

$(if condition,then-part[,else-part])

     

if函数在函数上下文中提供对条件扩展的支持(与GNU make makefile条件如ifeq相反(参见条件语法)。

     

第一个参数condition首先将所有前导和尾随空格剥离,然后展开。如果它扩展为任何非空字符串,则认为该条件为真。如果它扩展为空字符串,则该条件被视为false。

请注意then-partelse-part之间的这种黑客攻击。

希望这有帮助!