对GNU makefile命令中的字符串列表进行条件检查

时间:2012-06-17 21:38:28

标签: makefile command conditional gnu

我尝试在GNU makefile中编译它之前尝试检查文件。每次调用规则还是只调用一次时,是否会评估下面的条件ifneq?这种情况似乎总是以同样的方式评估。

如果不是这样做的唯一方法将条件放在shell命令中?我意识到目标列表可能“不行”可能看起来很奇怪......制造系统当然可以修复以消除这种奇怪但痛苦会更大。

有什么建议吗? 利

OKSRC := realfile1.cpp realfile2.cpp

%.o: %.cpp
ifneq ($(findstring $<,$(OKSRC),),)
        ... do the compile
else
        #skip the file
endif

2 个答案:

答案 0 :(得分:1)

引用Make documentation

  

立即解析条件指令。这意味着,例如,自动变量不能在条件指令中使用,因为在调用该规则的配方之前不会设置自动变量。如果需要在条件指令中使用自动变量,则必须将条件移动到配方中,并使用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