3

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

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

  1. 执行make -d或类似的东西并分析其输出以获取文件名。它有多可靠?它适用于所有Makefile的还是只适用于最标准的?
  2. 调用一些make清理所有目标文件的特殊命令,所以我在构建目录中得到生成的二进制文件。有这样的命令吗?
  3. 解析Makefile的内容并使用外部实用程序从中获取所有信息。再次,它有多可靠?

我想为任何Makefile基于项目的项目找到一个通用的解决方案,但如果 CMake 生成的项目有一个特定的解决方案,它在某些情况下也会对我有所帮助。

4

2 回答 2

2

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

假设我有一个 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 为自己简单地构建图形可能相当容易。我们开始了——谷歌搜索“makefile parser”确实产生了一些结果:Perl 仅据我所知,但你可能可以用它做点什么。

这是一个很长的说法,我想不出一种更快的方法(修补 automake 将是一条路线,如果您通过该路线生成这些 Makefile,但您的问题表明并非如此)。

于 2012-10-11T09:05:38.783 回答
-1

在 Makefile 中找到一个clean具有如下定义的目标是很常见的:

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

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

这大约是您的选项 2 所建议的;您可能可以编写clean每次make执行时都“构建”的makefile。我认为这比解析 Makefile 或分析make -d. 这可能也是您规避@Norman Gray 回答中提出的问题的一种简单方法。

于 2012-10-11T09:28:06.513 回答