0

在尝试将文件编译到 GNU makefile 中之前,我正在尝试根据列表检查文件。每次调用规则时会评估下面的条件 ifneq 还是只评估一次?条件似乎总是以相同的方式评估。

如果不是,那么将条件放入 shell 命令的唯一方法是什么?我意识到目标列表可能“不好”似乎很奇怪……Make系统当然可以修复以消除这种奇怪,但痛苦会更大。

有什么建议么?伊莱

OKSRC := realfile1.cpp realfile2.cpp

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

2 回答 2

1

引用Make 文档

立即解析条件指令。这意味着,例如,自动变量不能在条件指令中使用,因为在调用该规则的配方之前不会设置自动变量。如果您需要在条件指令中使用自动变量,则必须将条件移动到配方中并改用 shell 条件语法。

ifneq是一个条件指令,$<是一个自动变量。简而言之,您的上述代码将不起作用,因此您必须使用基于 shell 的条件。

但我强烈建议您修复根本原因(即错误的依赖生成),而不是试图绕过它。

于 2012-06-18T20:18:30.577 回答
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
于 2013-10-21T10:49:54.223 回答