我正在试图弄清楚如何实现this Makefile代码来生成依赖项。
depend: .depend
.depend: $(SRCS)
rm -f ./.depend
$(CC) $(CFLAGS) -MM $^ > ./.depend;
include .depend
但是,我必须对其进行修改,以便每次运行make时都会重新生成.depend。我试图通过制作一个调用rm -f ./.depend
的虚假目标来实现这一点,但是,无论我如何安排事情,它总是在.depend
之后和include
之前运行。另一方面,如果我可以让.depend
食谱无论如何运行,那都会更好。
答案 0 :(得分:4)
这种处理依赖关系的方法非常不理想。创建依赖关系信息的最佳方法是编译的副作用。它比你现在正在做的更快,因为编译器已经必须计算所有这些信息。
当您编译代码时,您已经知道此构建实例需要重建目标。构建的副作用(创建依赖关系信息)适用于构建的 next 实例。 GCC提供-MMD -MP
选项,使这项工作做得很好。在此配置中,您绝对不应该提供单独的规则来构建包含的文件(这会破坏所有内容)。相反,做这样的事情:
SRCS = foo.c bar.c baz.c ...
%.o : %.c
$(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MP -o $@ -c $<
-include $(SRCS:.c=.d)
使用-include
,这样如果尚未创建依赖项文件,则不会出现任何错误。就是这样,这就是你所要做的一切。
答案 1 :(得分:1)
虽然我同意上述评论,但每次重新生成依赖项都没有任何好处,我也认为首先实现所有这些并不是你的工作。作为可靠的构建工具,makepp会为您解决此问题。它并不局限于头文件依赖,但它会考虑所有内容,比如更改的命令行,所以它更正确。
makepp还有很多。除了做几乎所有GNU make之外,还有更多有用的东西,你甚至可以通过一些Perl编程扩展你的makefile。