如何从Makefile获取已编译文件的列表?

如何从Makefile获取已编译文件的列表?,makefile,Makefile,我有一个项目的Makefile。它是有效的,并且有效:如果我键入make,我将在当前文件夹中编译一个二进制文件。我想找到一种方法,通过编程从脚本获取二进制文件的名称,或者,如果make生成多个文件,则获取这些文件的完整列表 我想有三种方法可以做到这一点: 执行make-d或类似命令并分析其输出以获取文件名。它有多可靠?它适用于所有Makefiles还是仅适用于最标准的Makefiles? 调用一些特殊的make命令来清除所有的对象文件,这样我在build目录中只得到结果二进制文件。有这样的命令吗

我有一个项目的Makefile。它是有效的,并且有效:如果我键入make,我将在当前文件夹中编译一个二进制文件。我想找到一种方法,通过编程从脚本获取二进制文件的名称,或者,如果make生成多个文件,则获取这些文件的完整列表

我想有三种方法可以做到这一点:

执行make-d或类似命令并分析其输出以获取文件名。它有多可靠?它适用于所有Makefiles还是仅适用于最标准的Makefiles? 调用一些特殊的make命令来清除所有的对象文件,这样我在build目录中只得到结果二进制文件。有这样的命令吗? 解析Makefile的内容并使用外部实用程序从中获取所有信息。再说一遍,它有多可靠?
我想为任何基于Makefile的项目找到一个通用的解决方案,但如果有一个针对CMake生成的项目的特定解决方案,它在某些情况下也会对我有所帮助。

这是一个有趣的问题。一个问题:什么是二进制

假设我有一个Makefile

foo.pdf foo.aux: foo.tex
    pdflatex foo

foo.tex: foo.tex.in edits.sed
    sed -f edits.sed foo.tex.in >foo.tex

PRODUCTS: foo.pdf
也就是说,不仅仅是构建可执行程序的Makefile。foo.pdf是二进制文件吗?是foo.aux,它是一种辅助产品?是foo.tex,它是一个中间版本,在任何标准意义上都不是“二进制”吗?产品是虚拟目标,但仍然是依赖规则的目标,甚至是“二进制”吗?按照这些思路思考,我怀疑在你看来寻找的意义上,没有真正有用的、甚至是稍微固定的“二进制”定义。也就是说,我怀疑你问的问题可能比表面上更模糊

因此,最好提高一个级别,忘掉二进制文件,询问是否有任何方法可以提取Makefile的依赖关系图。一旦你有了它,你可以看看它,并确定那些东西是一个'二进制'的意义上,你正在寻找

你是如何得到依赖关系图的?GNU的“make”信息页面提到了依赖关系图,但没有更多的细节,特别是没有提供一种发送它内部生成的依赖关系图的方法

事实上,通过分析Makefile为您自己构建图形可能相当容易。现在我们开始了——谷歌搜索“MakefileParser”确实会产生一些点击:Perl只是我所能看到的,但你可能可以用它做点什么


这是一个很长的说法,我想不出一个更快的方法来修补automake,如果您是通过该路径生成这些Makefiles,那么它就是一条路径,但您的问题表明并非如此。

在Makefile中,很常见的情况是,一个名为clean的目标,其定义如下:

clean:
    rm -rf *.o core *.stackdump
调用makeclean将导致“构建”此目标,即删除当前工作目录中具有指定名称的所有文件


这大概就是您的选项2所建议的;您可能会编写makefile,以便每次执行make时都“构建”clean。我认为这将比解析make文件或分析make-d的输出更容易。对于您来说,这可能也是一种规避@Norman Gray答案中提出的问题的简单方法。

理想情况下,我希望能够解析任何Makefile,而不仅仅是我自己的Makefile。它与IDE的功能类似:它从Makefile中获取源文件列表,我希望在不编辑Makefile的情况下获取结果文件。如果确实要解析Makefile,请先检查已包含Makefile解析器的程序的源代码。一种程序,如GNU Make。按照您认为合适的方式进行调整,这就是开源的目的。make-p的输出可能比make-d更有用;它列出了完整的makefile以及扩展的includes和所有内置规则等。这为您提供了一套完整的规则。然后,您必须知道make如何处理推断依赖项规则,即“给定一个目标,它可以从target.c构建,可能通过target.o链接推断。请注意,大多数makefile可以创建大量未列出的目标。如果目录中有文件source.c,则无论是否有makefile,键入makesource通常都有效。