有没有办法在Makefile中自动生成依赖树?

时间:2011-04-19 22:55:54

标签: python c makefile compilation

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

我正在制定一个可以处理建筑责任的制造系统。目前,它可以根据配置文件的内容(对于make进程)获取专用源,并将它们转储到具有正确通用名称的临时文件夹中。现在,我只需要编译项目。

问题是我有可变数量的源,并且源所依赖的头可以随着各个实现而改变。换句话说,静态makefile不会起作用。

'1'。 单独使用Makefile系统,是否有某种方法可以自动生成Main.cpp需要编译的对象(.o)文件列表?

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

但如果有一个更标准化的解决方案或某种方式在make中做到这一点,我不想转向这种hackish解决方案。

'2'。
如果makefile系统不能用,我应该继续使用自定义python脚本,还是有更优雅的解决方案?

...............

要非常清楚,我再也没有依赖项/ sources / headers / objects的常量列表,我不想强​​迫我的最终用户维护这样的列表。

根据我的C文件的内容,我需要一些自动生成这棵树的方法。

道歉,如果这是一个“愚蠢”的问题,我对制作世界相对较新 - 而且大多数人都是自学成才。

谢谢!

随意提出任何问题。

但是,仅供参考,我的项目有太多来源,只是将它们全部发布,而出于专有/研究原因,我不能这样做。

2 个答案:

答案 0 :(得分:0)

是的,如果你正在使用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),可以将其整理得更高效,更具可读性;我要调查一下。谢谢你提醒我。

答案 1 :(得分:-3)

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