0

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

depend: .depend

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

include .depend

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

4

2 回答 2

4

这种处理依赖关系的方法非常不理想。创建依赖信息的最佳方式是作为编译的副作用。它甚至比您现在所做的还要快,因为编译器已经必须计算所有这些信息。

当您编译代码时,您已经知道构建实例需要重新构建目标。构建的副作用,即创建依赖信息,是针对构建的下一个实例。GCC 提供了-MMD -MP使这项工作正常工作的选项。在此配置中,您绝对不应该提供单独的规则来构建包含的文件(这将破坏一切)。相反,请执行以下操作:

SRCS = foo.c bar.c baz.c ...

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

-include $(SRCS:.c=.d)

使用-include这样,如果尚未创建依赖文件,您将不会收到任何错误。就是这样,这就是你所要做的。

于 2013-04-07T15:21:03.047 回答
1

虽然我同意上述评论,即每次重新生成依赖项没有任何好处,但我也认为首先实现所有这些并不是你的工作。作为一个可靠的构建工具,makepp会为您解决这个问题。而且它并不局限于头文件依赖,而是考虑到了所有的东西,就像改变了命令行一样,所以它更正确。

makepp 还有很多。除了做 GNU make 能做的几乎所有事情,还有很多有用的东西,你甚至可以用一些 Perl 编程来扩展你的 makefile。

于 2013-04-07T11:32:57.200 回答