我有很多Make文件通过目录层次结构,其中一些定义用于编译的C(CPP)和H文件,其中一些没有,不添加到CPFLAFS -I../../SomeDir1 -I../SomeDir2/SomeDir2/Inc.
等。
部分Make文件是通过make -C PATH Target
调用的。
事情是源的层次结构多年来增长,涵盖不同的项目和目标平台。 现在公司里没有人记得"为什么"并且没有足够的文档。
问题:有没有办法知道用于构建最终目标的特定来源和头文件" all" ?
谢谢
答案 0 :(得分:0)
有一些方法,我知道两个。两者都要求您运行make all
,然后删除所有生成的文件,以便实际重建所有相关文件(通常为make clean
)。
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