我的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
答案 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-part
和else-part
之间的这种黑客攻击。
希望这有帮助!