Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables Makefile:ifeq指令将特殊变量与常量进行比较时不起作用_Variables_Makefile_Conditional - Fatal编程技术网

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

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$

我的Makefile有点问题。我想更改有关工作目录的命令。我在测试当前目标目录($(*D))的规则中添加了一个条件指令

问题是make总是转到我测试的第二个分支,即使我的文件在mySpecialDirectory中,echo确实会打印“mySpecialDirectory”

.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 $@