Makefile结构…哪个正在运行?

Makefile结构…哪个正在运行?,makefile,Makefile,我在爱立信RND工作,分析他们很久以前写的Make文件。我在目录中发出make命令。该目录有一个makefile,它不包含任何依赖项和规则等 -包括./Makefile.local 包括make/def.mk 包括congif.mk 当我通过makeall运行makefile时,它说 全部 彻底清洁 然后输入当前目录的目录..子目录 我该如何知道它从何处获得依赖性。写所有东西的规则在哪里 makefile还包含子目录的名称,这些子目录是totalclean之后运行make的目录 请尽量帮忙。我需

我在爱立信RND工作,分析他们很久以前写的Make文件。我在目录中发出make命令。该目录有一个makefile,它不包含任何依赖项和规则等

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

当我通过makeall运行makefile时,它说

全部

彻底清洁

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

我该如何知道它从何处获得依赖性。写所有东西的规则在哪里 makefile还包含子目录的名称,这些子目录是totalclean之后运行make的目录


请尽量帮忙。我需要减少这个过程的编译时间,但我没有得到任何指导

使用GNU make,您可以

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

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

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

要查找
all
规则,请查看这三个文件,
Makefile.local
make/def.mk
congif.mk
。如果看不到,可以尝试从主makefile中逐个删除
include
指令,以查看“all”何时停止工作。您可以用同样的方法查找
totalclean
规则

“all”消息很可能来自
all
规则,而“totalclean”则来自
totalclean
规则(但正如jcomeau_ictx所指出的,并不是每个编写makefile的人都是文明的——消息可能来自任何地方,具有任何意义)。“totalclean”在“all”之后的事实表明它是递归,而不是依赖性

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

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

编辑:
现在您有三个问题:您正在处理一个设计糟糕的大型makefile系统,您是一个makefile新手,而且管理者正在干预

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

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

    您需要分析其中包含的所有3个make文件,以了解发生了什么。这可能会变得非常复杂,这取决于创建它们的人的恶意程度。谢谢你的回答,依赖关系非常大。有大量的文件。有几个子目录,所有子目录都有自己的depend文件,其中包含依赖项。现在你说,为了减少编译时间,我应该分析所有的依赖项。这真的很难。并行执行有帮助吗??。。使用-j命令!!!这些文件是1997年编写的。基本上,这些makefiles将java和c中的源代码转换为可执行文件,还使用了一些脚本。我应该研究哪个方向来减少编译时间。普雷森蒂也想到了这个主意,但官员们说,我们确实需要清理这些东西。还有其他方法吗?。。我是否应该尝试使用-j命令并测试构建是否被破坏,如果被破坏,在哪里更改依赖项?我是一个制作文件的新手,所以我没有太多的想法。我每天都在读关于这些事情的书。文件中是否有冗余?。如何识别和删除它们?因为这些文件是97年写的。嘿……非常感谢你的回答。我能知道这些规则是在哪里写的吗…我是说哪个makefile..我知道规则和正在执行的语句,但我不知道这个makefile在哪里。如果你能帮我完成这项任务。我能看到规则谢谢!!!如果出现任何其他问题,我们将返回..非常有用的建议!!..:-)