我有一个项目Makefile
。它是有效的,它可以工作:如果我输入make
,我将获得在当前文件夹中编译的二进制文件。我想找到一种方法(从脚本)获取二进制文件的名称,或者如果make
生成多个文件,则获取这些文件的完整列表。
我想有三种方法可以做到这一点:
make -d
或类似的东西并分析其输出以获取文件名。它有多可靠?它适用于所有Makefile
或仅适用于最标准的吗?make
命令清除所有目标文件,因此我只在构建目录中获得 结果二进制文件。有这样的命令吗?Makefile
的内容并使用外部实用程序从中获取所有信息。再一次,它有多可靠?我想为任何基于Makefile
的项目找到一个通用的解决方案,但如果CMake生成的解决方案有特定的解决方案,那么在某些情况下它也会对我有帮助。
答案 0 :(得分:1)
这是一个有趣的问题。一个问题:什么是二进制文件?
假设我有一个看起来像
的Makefilefoo.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的回答中提出的问题。