Makefile结构....哪一个正在运行?

时间:2011-01-31 05:51:28

标签: makefile

我在爱立信RND工作并分析他们的长篇文章写的makefile。我在一个目录中给出了一个命令make。该目录有一个不包含任何依赖项和规则等的makefile。它只包括

-include ./Makefile.local 包括make / def.mk 包括congif.mk

当我通过make all运行makefile时,它说

所有

totalclean

然后输入当前目录的目录...子目录

我怎么知道从哪里接受依赖。制作所有书面的规则在哪里 makefile还包含子目录的名称,这些子目录是在totalclean之后运行make的目录。

尽量帮忙。我需要减少进程的编译时间,我没有得到任何指示。

3 个答案:

答案 0 :(得分:1)

使用GNU make可以做到

make -pn

获取所有规则的列表以及每个命令的文件名和行号。

在输出中,查找以规则名称后跟冒号开头的行。该行之后的注释之一将包含文件名和行号。例如:

#  commands to execute (from `build/build.mk', line 45):

答案 1 :(得分:1)

要查找all规则,请查看这三个文件Makefile.localmake/def.mkcongif.mk。如果您没有看到它,可以尝试逐个从主makefile中删除include指令,以查看“all”何时停止工作。您可以采用相同的方式查找totalclean规则。

“全部”消息可能来自all规则和totalclean规则中的“totalclean”(但正如jcomeau_ictx指出的那样,并非每个编写makefile的人都是文明的 - 消息可以来自任何地方并且意味着什么)。 “totalclean”在“all”之后出现的事实表明它是递归,而不是依赖。

你还没有说过这些makefile实际上在做什么。如果你想通过修改构建过程来减少编译时间,那么你唯一的希望就是防止不必要的编译,这意味着在makefile中删除不必要的依赖(也许在源代码中可能不必要的耦合)。

修改:
Ankit,你要求一个简单的公式来减少大型遗留makefile系统中不必要的依赖;根本就没有一个。我们没有足够的信息来为您提供详细的指导,但我会在黑暗中拍摄:看起来您的makefile每次都运行totalclean,并从头开始重建。这几乎总是不必要的。因此,请查看对totalclean的调用并将其关闭,看看是否会加快速度。

修改:
现在你有三个问题:你正在处理一个设计糟糕的大型makefile系统,你是一个makefile新手,而且管理者正在干涉。

  • 是的,请使用make -j ...。这可能会加快速度,几乎肯定不会造成伤害。
  • 您可以尝试向官员解释,如果您每次都运行totalclean,那么您必须重新编译您需要的所有内容,这会对构建时间造成严格的下限。
  • 您可以在makefile中查找不必要的依赖项。没有简单快捷的方法可以做到这一点,因为机器无法知道真正需要哪些先决条件。如果您了解特定目标的构建过程,请查看规则并判断是否需要每个先决条件。如果您不确定,可以从规则中删除先决条件,制作totalclean,制作目标,然后制作all;如果目标构建失败,那么先决条件是必要的,如果它成功但all构建失败,那么前提条件是必要的,但它应该是不同的规则。

  • 答案 2 :(得分:0)

    MAKAO可能对您有用。它允许您打印已执行make的调用图。