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

时间:2012-10-11 08:40:14

标签: makefile

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

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

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

2 个答案:

答案 0 :(得分:1)

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

假设我有一个看起来像

的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,这是一个中间的,在任何标准意义上都不是'二进制'吗?是PRODUCTS,它是一个虚拟目标,但它仍然是依赖规则的目标,甚至是“二进制”?按照这些思路思考,我怀疑在你看来正在寻找的“二元”的定义中,没有真正有用的,甚至是稍微固定的定义。也就是说,我怀疑你提出的问题可能比看上去更加模糊。

因此,最好升级一个级别,忘记二进制文件,并询问是否有任何方法可以提取Makefile的依赖关系图。一旦你有了它,你就可以看一下它,并找出那些你正在寻找的“二元”的东西。

如何获得该依赖图? GNU'make'信息页面提到了依赖图,但没有更详细的内容,特别是没有提供一种发布内部生成的方法。

事实上,通过分析Makefile简单地为自己构建图形可能相当容易。我们去了 - google搜索'makefile parser'确实产生了一些命中:Perl只在我能看到的地方,但你可以用它做点什么。

这是一个很长的说法,我想不出一个漂亮的快速方式(修补automake将是一条路线,如果你通过那条路线生成这些Makefile,但你的问题暗示不然)。

答案 1 :(得分:-1)

在Makefile中找到一个名为clean的目标非常常见,其定义如下:

clean:
    rm -rf *.o core *.stackdump

调用make clean然后导致此目标被构建,即当前工作目录中具有指定名称的所有文件都将被删除,并带有极端偏见。

这大约是你的选择2所暗示的;你可以编写你的makefile,以便clean构建'每次make执行。我认为这比解析Makefile或分析make -d的输出更容易。它可能也是一种简单的方法,可以避免在@Norman Gray的回答中提出的问题。