如何收集大型Makefile项目的所有依赖项?

时间:2014-05-19 13:27:08

标签: c gcc makefile

在一个大型C项目中,我在不同的子目录中有一个顶级Makefile和许多子Makefile。我需要收集编译的所有依赖项。为此,我将 -MMD 添加到 CFLAGS 并获取一堆 .d 依赖项文件。

这些 .d 文件分散在子目录中。此外,依赖关系有时被写为绝对路径,有时作为与编译目录相关的路径,有时包含符号链接。我编写了一个脚本,它可以找到所有.d文件,遍历它们的目录,并解析所有找到的路径。这有效,但有数万个依赖项文件,这个依赖项集合与编译大致相同! (等待太久了:))

是否有更快的方法来获取单个文件中的所有依赖项?如果这很重要,那就是ANSI C,GCC和Linux。提前谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用-MM代替-MMD,它将依赖项发送到标准输出。

然后,您可以使用

将所有输出收集到顶级目录中的某个依赖项文件中
gcc -MM ... file.c >>$(top)/all.d

如果后期处理是在一个文件中收集输出的唯一原因,您可以使用管道过滤输出

gcc -MM ... file.c | sh filter.sh >file.d

并将依赖项文件分开。

如果某个本地包含文件(defs.h)或主要来源的路径很重要,您可以通过提供相应的-I选项强制gcc包含路径,例如

gcc -MM -I$(top)/path/to ... $(top)/path/to/file.c >>$(top)/all.d

gcc -MM -I$(top)/path/to ... $(top)/path/to/file.c | sh filter.sh >file.d

而不是

file.o: file.c defs.h

gcc会发出

file.o: /absolute/path/to/file.c /absolute/path/to/defs.h

当然,这也适用于相对路径。

答案 1 :(得分:0)

您可以创建依赖项文件以及第一次编译运行。

在第一次运行期间,对象尚不存在,因此无论如何都将调用编译器。首先创建空的依赖项文件,然后在编译时更新它们。

应该可以扩展minimal Makefile for a single-directory C++ project以使用子目录。