Makefile操作序列

时间:2013-04-07 00:28:27

标签: makefile

我正在试图弄清楚如何实现this Makefile代码来生成依赖项。

depend: .depend

.depend: $(SRCS)
        rm -f ./.depend
        $(CC) $(CFLAGS) -MM $^ >  ./.depend;

include .depend

但是,我必须对其进行修改,以便每次运行make时都会重新生成.depend。我试图通过制作一个调用rm -f ./.depend的虚假目标来实现这一点,但是,无论我如何安排事情,它总是在.depend之后和include之前运行。另一方面,如果我可以让.depend食谱无论如何运行,那都会更好。

2 个答案:

答案 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。