通过递归调用构建依赖关系make?

问题描述 投票:1回答:2

我已经阅读了一些文章,解释了在使用子目录编译项目时递归makefile是如何邪恶的。

但是,我发现了这种自动生成依赖关系的方法

exec = main
objs  = main.o A.o B.o C.o   # main and object modules

deps = $(objs:.o=.d)         # dependencies file

all: $(deps)
    $(MAKE) $(exec)

-include $(deps)

%.d: %.c                        # how to build dependency files
    $(CC) -MM $(CFLAGS) $< > $@

main: $(objs)          # How to build the main exec

构建目标“all”会根据需要更新依赖项文件,然后在需要时考虑重建主exec。

这种方法有根本缺陷吗?

c makefile
2个回答
4
投票

如果你正在使用GNU make,那么这个hack是不必要的。 GNU make是smart enough自动重建包含的任何(make)文件,然后重启自己:

由于'.d'文件与其他文件一样是makefile,因此make会根据需要重新制作它们,而无需您进一步处理。见Remaking Makefiles

关于其他make实现,GNU make手册有这样的说法:

对于旧的make程序,传统的做法是使用[-M]编译器功能通过“make depend”之类的命令按需生成先决条件。该命令将创建一个包含所有自动生成的先决条件的文件。然后makefile可以使用include来读取它们(参见Include)。


0
投票

正如其他贡献者所说,gnu将.d依赖项文件视为Makefile,并在需要时自动重建它们。

这使得递归调用变得不必要,并且问题变得平淡。

当然,像往常一样,“被认为是有害的”纸质书籍必须用一丝盐阅读,如果真的完全阅读,从悠久的传统(克努斯的“反驳”Dijkstra的论文引用Disjktra自己的恐惧被认为是非常教条“和”其他人制造它的宗教“。”狂热的拥护者越过董事会“!)。

© www.soinside.com 2019 - 2024. All rights reserved.