Variables Makefile:ifeq指令将特殊变量与常量进行比较时不起作用
我的Makefile有点问题。我想更改有关工作目录的命令。我在测试当前目标目录($(*D))的规则中添加了一个条件指令 问题是make总是转到我测试的第二个分支,即使我的文件在mySpecialDirectory中,echo确实会打印“mySpecialDirectory”Variables Makefile:ifeq指令将特殊变量与常量进行比较时不起作用,variables,makefile,conditional,Variables,Makefile,Conditional,我的Makefile有点问题。我想更改有关工作目录的命令。我在测试当前目标目录($(*D))的规则中添加了一个条件指令 问题是make总是转到我测试的第二个分支,即使我的文件在mySpecialDirectory中,echo确实会打印“mySpecialDirectory” .c.o.cpp.o.cc.o: ifeq($(*D),mySpecialDirectory) @echo“我在mySpecialDirectory!\o/” $(CC)$(调试标志)$(MYSPECIALFLAGS)-c$
.c.o.cpp.o.cc.o:
ifeq($(*D),mySpecialDirectory)
@echo“我在mySpecialDirectory!\o/”
$(CC)$(调试标志)$(MYSPECIALFLAGS)-c$<-o$@
其他的
@echo“失败!我在$(*D)”中
$(CC)$(调试标志)$(非特殊标志)-c$<-o$@
恩迪夫
这是预期的行为
条件语句
条件语法的所有实例都会立即全部解析;这包括ifdef、ifeq、ifndef和ifneq表单当然,这意味着自动变量不能在条件语句中使用,因为在调用该规则的命令脚本之前不会设置自动变量。如果需要在条件中使用自动变量,则必须在命令脚本中使用shell条件语法,而不是生成条件
$(*D)
是一个自动变量。
请考虑做:
.c.o .cpp.o .cc.o:
$(CC) $(DEBUG_FLAGS) $(if $(subst mySpecialDirectory,,$(*D)),$(NOTTHATSPECIALFLAGS),$(MYSPECIALFLAGS)) -c $< -o $@
.c.o.cpp.o.cc.o:
$(CC)$(DEBUG_FLAGS)$(如果$(subst mySpecialDirectory,,$(*D)),$(NOTTHATSPECIALFLAGS),$(MYSPECIALFLAGS))-c$<-o$@
其想法是将$(subst)
滥用到一些平等性测试中,用空字符串替换mySpecialDirectory
。然后,如果$(*D)
扩展等于mySpecialDirectory
,它将被空字符串完全替换,并且$(if)
的else部分将按照以下公式计算:
$(如果是条件,则部分[,否则部分])
if函数支持函数上下文中的条件扩展(与GNU make makefile条件相反,例如ifeq(参见条件语法)
第一个参数condition首先去掉所有前面和后面的空格,然后展开。如果它展开为任何非空字符串,则认为该条件为true。如果它展开为空字符串,则认为该条件为false
请注意,在这个hack中,then部分
和else部分
之间的翻转
希望这有帮助!非常感谢Gregory,这正是我想要做的。很好的解释,我显然不会想到使用if和subst来做这个把戏,这很聪明;)
.c.o .cpp.o .cc.o:
$(CC) $(DEBUG_FLAGS) $(if $(subst mySpecialDirectory,,$(*D)),$(NOTTHATSPECIALFLAGS),$(MYSPECIALFLAGS)) -c $< -o $@