我尝试在GNU makefile中编译它之前尝试检查文件。每次调用规则还是只调用一次时,是否会评估下面的条件ifneq?这种情况似乎总是以同样的方式评估。
如果不是这样做的唯一方法将条件放在shell命令中?我意识到目标列表可能“不行”可能看起来很奇怪......制造系统当然可以修复以消除这种奇怪但痛苦会更大。
有什么建议吗? 利
OKSRC := realfile1.cpp realfile2.cpp
%.o: %.cpp
ifneq ($(findstring $<,$(OKSRC),),)
... do the compile
else
#skip the file
endif
答案 0 :(得分:1)
立即解析条件指令。这意味着,例如,自动变量不能在条件指令中使用,因为在调用该规则的配方之前不会设置自动变量。如果需要在条件指令中使用自动变量,则必须将条件移动到配方中,并使用shell条件语法。
ifneq
是一个条件指令,$<
是一个自动变量。简而言之,您的上述代码将无效,因此您必须使用基于shell的条件。
但我强烈建议您修复根本原因(即错误的依赖关系生成),而不是试图破解它。
答案 1 :(得分:0)
我认为您可以使用if
函数来推迟自动变量的扩展,直到评估条件为止。
OKSRC = realfile1.cpp realfile2.cpp
.cpp.o:
$(if $(findstring $<,$(OKSRC)),$(CC) $(CFLAGS) -c $<,@echo skip $<)
结果显示:
$ make realfile1.o realfile2.o realfile3.o
cc -c realfile1.cpp
cc -c realfile2.cpp
skip realfile3.cpp