我试图从下面的规则定义的要编译的文件列表中排除main.cpp文件:
$(TMPDIRPATH)%.o: %.cpp
@echo compile $<
ifneq ($(notdir $<), main.cpp)
@$(COMPILE.cpp) $(OUTPUT_OPTION) $<
endif
这种“ifneq”条件总是评估为true,这很奇怪。我究竟做错了什么?是否有更好的方法从明确规则中排除一个文件?
最佳答案
这不是最好的方法,但是如果按照以下步骤进行操作,请将其写为shell条件,而不要使用GNU make conditionals:
$(TMPDIRPATH)%.o: %.cpp
@echo compile $<
@if [ $(notdir $<) != main.cpp ]; \
then $(COMPILE.cpp) $(OUTPUT_OPTION) $<; \
fi
需要继续标记(反斜杠)。分号也是如此。在调用shell解释它们之前,将使用
$
扩展带有make
前缀的值。您可能也不想在回声所在的位置。您可能需要:$(TMPDIRPATH)%.o: %.cpp
@if [ $(notdir $<) != main.cpp ]; \
then echo compile $<; \
$(COMPILE.cpp) $(OUTPUT_OPTION) $<; \
fi
我希望这样做的方法是使用要编译的文件列表。当添加额外的文件时,使用任何通配符机制都会导致问题-其他测试或杂散文件(实际上不是系统的一部分)。
评论说:“但是GNU Make Manual说
ifneq
应该可以工作”。如果
ifneq
放置正确,它将可以正常工作,这意味着“未缩进作为与规则关联的命令的一部分”。因此,您可以编写类似以下内容(一个令人震惊的错误示例,但我的大脑处于困惑状态):ifneq (${CFLAGS}, -Wall)
CFLAGS += -Wall
endif
file1.o: file1.c
${CC} ${CFLAGS} -c $<
但是,如果按问题中的顺序将
ifneq
缩进,那么当make
运行shell处理该命令时,它实际上是在系统上实际上找不到的命令。
关于生成文件。如何从编译中排除一个特定文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5189187/