GNU Makefile的"预处理器"是什么?

5

有没有输出“预处理”makefile的选项,类似于GCC的-E选项?

我的项目由数十个模块组成,每个模块都有自己的makefile。构建是从主makefile中调用的。那个主makefile包含了包含文件、变量定义、命令行选项相关的变量等等。

因此,我要找的是处理后的makefile,包括所有的替换。


1
在这种情况下,make -n 不是很有用吗? - Eugeniu Rosca
@EugeniuRosca - 看起来这个选项并没有产生我想要的结果。 - ysap
1个回答

4
我并不知道有这样的功能。最接近的方法是使用make -qp(或类似命令)输出结果,它会将make数据库打印出来。
问题的一部分在于许多替换等操作发生在目标被处理时,并且目标列表可能未知,除非实际尝试构建(至少在某种程度上),因此不一定可能在原地完全展开/等效一个Makefile。 make -d输出对于与make文件相关的某些附带信息也很有用,但并不直接包含makefile内容。 Remake 也可以提供一些额外有用的信息。
如果您正在寻找某些组装/等效的全局make变量的计算值,则Eric Melski的这篇博客文章可能非常有用。
简而言之,它向Makefile添加了如下目标(虽然博客文章中还有更多魔法,所以我建议您阅读它)。
print-%:
    @echo '$*=$($*)'
    @echo '  origin = $(origin $*)'
    @echo '  flavor = $(flavor $*)'
    @echo '   value = $(value  $*)'

虽然在个人使用中,我将第一行替换为以下内容:

@echo '$*=$(subst ','\'',$($*))'

为了保持结果的引用正确,请使用引号。

谢谢。这里有很多信息(超过3,000行输出),需要一些挖掘,但我想只要花足够的时间,就可以找到所需的信息。 - ysap
@ysap,你具体想找出什么?可能有更简单的方法来实现它。(实际上,我现在会将一个常用的方法添加到答案中。) - Etan Reisner
基本上,反向工程一个项目,以创建一个基于IDE(Eclipse)的项目。有许多模块,制作了几个库,其中许多没有编译/链接到最终二进制文件中。在其中一个常见的makefile模块中有模块选择变量(开关)。 - ysap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接