【问题标题】:Is There a Way to Autogenerate Dependencies Tree in Makefile?有没有办法在 Makefile 中自动生成依赖关系树?
【发布时间】:2011-04-19 22:55:54
【问题描述】:

抽象问题: 我正在编写一个高度模块化的中型 C++/C 程序。它有一个通用接口,允许您使用相同的函数声明、但不同的实现放入许多不同的源代码,并获得具有不同功能的可执行文件。

我正在开发一个可以处理构建职责的 make 系统。目前,它能够根据配置文件的内容(用于制作过程)获取专门的资源,并将它们转储到具有适当通用名称的临时文件夹中。现在,我只需要编译项目。

问题是我有可变数量的源,并且源所依赖的标头可以随着各个实现而改变。换句话说,静态 makefile 无法解决问题。

'1.' 单独使用 Makefile 系统,有没有办法自动生成 Main.cpp 需要编译的对象 (.o) 文件列表?

我知道我可以通过编写一个我的 makefile 调用的小 python 脚本来做到这一点,该脚本随后通过解析 c 文件检查它们的依赖关系来创建一个自定义 makefile,从基本 Main.cpp 文件开始。

但如果有更标准化的解决方案或在 make 中执行此操作的某种方法,我不想求助于这种骇人听闻的解决方案。

'2.'
如果 makefile 系统无法做到这一点,我应该继续使用我的自定义 python 脚本,还是有更优雅的解决方案?

.......

为了完全清楚,我没有依赖项/源/标头/对象的恒定列表,我不想强​​迫我的最终用户维护这样的列表。

我需要某种方式来根据我的 C 文件的内容自动生成这棵树。

抱歉,如果这是一个“愚蠢”的问题,我对 make 世界还比较陌生——而且和大多数人一样,我是自学成才的。

谢谢!

请随时提出任何问题。

仅供参考,不过,我的项目有太多资源,无法全部发布,而且出于专有/研究原因,我不能这样做。

【问题讨论】:

  • 是否有一些不错的 shell 命令可以用来查找源代码?
  • 为了生成对象列表,扫描临时文件夹就足够了吗?也就是说,临时文件夹是否包含所有必须编译的源代码,而不包含其他源代码(暂时不用考虑标题)。

标签: python c makefile compilation


【解决方案1】:

是的,如果您使用的是 GCC!这是我在当前项目中的一些 Makefile(对于所有实际用途,我会将其置于公共领域,玩得开心)。

CC=$(CROSS)gcc -c -g -Wall -Werror -ansi -pedantic $(DEFINES) -I./include

%.o: %.c .d/%.d
    # Your build code here

.d/%.d: %.c
    @$(CC) -MM $< -MF $@

-include $(OBJECTS:%.o=.d/%.d)
-include $(LOBJECTS:%.o=.d/%.d)

如果我遗漏了什么,请告诉我,我会再次检查我的 Makefile。

请注意,$(OBJECTS) 是我想要在我的二进制文件中的对象列表,而 $(LOBJECTS) 是正在编译为静态存档的对象列表。 $(OBJECTS) 和 $(LIB)(由 $(LOBJECTS) 创建,然后编译成最终的可执行文件。因此,整个过程适用于不同类型对象的多个构建,然后是链接等。

哦,是的,请确保您mkdir .d 否则它可能会失败。您需要将一个空的 .d 目录签入到您的版本控制中。

这里唯一需要注意的是,您必须列出来源。但是,如果您愿意,可以设置一些小工具来使用 find 为您查找所有资源。

最后,可以通过使用多个目标 (%.o .d/%d) 将其整理得更高效、更易读;我得调查一下。谢谢你提醒我。

【讨论】:

    【解决方案2】:

    简化构建的一种方法是跳过依赖项。每次都重新编译一切。只有当构建必须进行多次,或者需要“很长时间”,其定义取决于使用,依赖关系变化很大时,做一个有意义详细的依赖构建。

    【讨论】:

    • 没有。这不是一个好的答案,而且绝对是荒谬的。设置依赖需要1分钟!为什么每次都浪费时间重新编译所有内容?
    • @mathepic:在我最近的大多数项目中,编译所有内容的时间从一到五秒不等。这真的值得一个维护问题吗?
    • @wallyk 如果你必须编译超过 12 次,因为设置只需要一分钟(你通常会这样做),那么可以。
    • @mathepic:如果完全依赖依赖的构建总是构建所有东西,那么使用更复杂的 makefile 将获得零收益。
    • @wallyk 从什么时候开始基于依赖的构建构建一切?关键是他们没有。
    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 2013-05-26
    • 1970-01-01
    相关资源
    最近更新 更多