生成文件。如何从编译中排除一个特定文件?

标签 makefile

我试图从下面的规则定义的要编译的文件列表中排除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/

相关文章:

Eclipse CDT 创建的 makefile 在 Windows 上无法 "clean"

C++ makefile 构建多个 dll 和项​​目结构

c++ - 如何将nana编译成静态库

c++ - 指定包含路径以仅在 g++ 中提升到一个位置

c++ - 使用 Visual Studio 调试 Clang 4.0

c++ - Makefile 不检查头文件中的更新

c++ - 通用 makefile 显示没有规则生成目标错误

c - Makefile 覆盖自身

c - 如何使用 GNU make 将多个不相关的源文件编译为多个不相关的目标文件?

linux - 使: no rule to make target