GNU make:clean目标取决于include

Pot*_*ter 13 dependencies makefile gnu-make

我正在使用gmake并gcc -MM跟踪手册中的标题依赖项.该机制依赖于makefile include指令来导入计算的依赖项.

由于.d文件包含在makefile中,因此它们必须存在于任何目标中,包括clean.因此,在clean做正确的事情之前,必须生成依赖关系,如果一个人无法构建,那么就会clean变得更加混乱.

此外clean,它希望在构建任何目标之前创建所有依赖项.

此外,如果任何文件被更改为包含不存在的文件,则依赖关系解析会中断,并且根本不会构建任何文件.

如果删除了标头,那么现有的依赖项文件仍然将其命名为目标,并且在删除有问题的依赖项文件之前不会构建任何内容...这是无法完成的clean.

include用通配符替换替换模式以包含所有预先存在的依赖项文件可以解决一些问题,但它仍然无法清除损坏的依赖项,并且永远不会删除过时的依赖项文件.有更好的解决方案吗?该手册的示例是否真正用于实际用途?

Eld*_*mov 18

只是不提供生成.d文件的规则.Paul Smith的"高级自动依赖生成" - GNU Make的维护者可以很好地解释为什么它不那么好(包括你的情况).

简而言之,以下模式适用于所有情况:

CPPFLAGS += -MMD -MP

%.o: %.c
    $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $<

-include $(OBJS:.o=.d)
Run Code Online (Sandbox Code Playgroud)

另见我以前的相关答案:


小智 6

解决方案是使用条件语法:

ifneq ($(MAKECMDGOALS), clean)
-include $(notdir $(SOURCES:.cpp=.d))
endif
Run Code Online (Sandbox Code Playgroud)

这使得清洁目标完全不需要*.d目标,当你运行,因为make clean*.d文件将不被包括在Makefile中.

参考:https://www.gnu.org/software/make/manual/html_node/Goals.html