Makefile 打印出所有必要的编译文件

Makefile 打印出所有必要的编译文件,makefile,Makefile,通过目录层次结构,我有很多Make文件,其中一些定义了在编译中使用的C(CPP)和H文件,一些没有,它们没有添加到CPFLAFS-I.././SomeDir1-I../SomeDir2/SomeDir2/Inc.等 一些Make文件是通过Make-C PATH Target调用的 问题是源的层次结构多年来一直在增长,涵盖了不同的项目和目标平台。 现在,公司里已经没有人记得“为什么会这样”,也没有足够的文档 问题是:有没有办法知道用于构建最终目标“all”的特定源和头文件 谢谢有两种方法,我知道。

通过目录层次结构,我有很多Make文件,其中一些定义了在编译中使用的C(CPP)和H文件,一些没有,它们没有添加到
CPFLAFS-I.././SomeDir1-I../SomeDir2/SomeDir2/Inc.

一些Make文件是通过
Make-C PATH Target
调用的

问题是源的层次结构多年来一直在增长,涵盖了不同的项目和目标平台。 现在,公司里已经没有人记得“为什么会这样”,也没有足够的文档

问题是:有没有办法知道用于构建最终目标“all”的特定源和头文件


谢谢

有两种方法,我知道。两者都要求您运行
makeall
,在此之前删除所有生成的文件,以便实际重建所有有问题的文件(通常是
makeclean

使用
strace
如果
strace
可用,则可以通过跟踪和分析系统调用来查找文件。 您可以这样做:

$ strace -f -o trace make all
$ grep 'open.*\.[ch]"' trace | grep -v 'open("/\(tmp\|usr\)' | sed -e 's/.*open("//' -e 's/".*//' | sort -u
使用依赖项文件(不适用于所有编译器) 如果编译器可以生成依赖项文件(即,
gcc
armcc
),则可以分析依赖项文件。确保通过在
CFLAGS
CPPFLAGS
中放置相应选项来生成依赖项文件。对于
gcc
,这将是
-MMD
。如果Makefiles编写得很好,您可以在命令行上设置
CPPFLAGS
,我将在这里使用这个示例

$ make all CPPFLAGS+=-MMD
$ find -name "*.d" -exec cat {} \; | sed -e 's/[:\\]//' -e 's/ /\n/g' | grep '\.[ch]$' | sort -u

执行make命令时打开详细模式。像
makev=1
如果makefile写得很糟糕,那么可能没有简单的方法来找出使用了哪些源文件和头文件;你必须一行一行地通过它。记住,使用的文件可能不是必需的。@Santosh,你在V=1下是什么意思?我在Make文件中没有这样的变量。@KSI:V=1表示启用详细模式。打印所有已执行的命令executed@Santosh
V=1
是大多数(所有?
make
不支持的功能。看起来这是某些
Makefile
s的特性,而不是一般的
make
make
打印默认情况下执行的命令(命令回显),选项
-s
或前缀
@
将禁用命令回显。打印命令只是问题的部分解决方案,因为使用命令我只会了解源文件,而不会了解头文件。(为什么我没有重读gcc man)Christian Hujer,使用-save temp代替还是除了-MMD之外?“取而代之”-否,您想知道在构建过程中读取哪些头文件,是吗?“此外”-如果您愿意,为什么不呢?尽管它只会生成中间预处理的C文件(.i)、汇编文件(.s)以及中间对象文件(.o)。一般来说,出于好奇或其他原因,出于调试目的,它可能很有用,但对于找出为
make all
实际读取了哪些C源文件和头文件的问题,它并不是有用的-这就是我理解您的问题的方式。这是我一直在寻找的。谢谢你的澄清。不幸的是,有些Makefile编写得很糟糕,所以我需要直接添加这些选项。