【发布时间】:2018-06-22 23:29:25
【问题描述】:
我读过一些文章,解释了在使用子目录编译项目的情况下,递归 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。
这种方法是否存在根本缺陷?
【问题讨论】:
-
只是关于“被认为有害”的论文的注释:许多人在标题中认为不应该使用递归,但这实际上并不是论文所谈论的。它讨论了将依赖关系图拆分为多个 makefile 是如何不好的。但是,在某些情况下,递归不会这样做(例如,在您的情况下,您正在构建一套与主要对象分开的先决条件)。递归可以是一个强大的工具,不应该只是根据标题扔掉......就像大多数强大的工具一样,使用它的方法是正确的和错误的。