makefile自动依赖生成

自动依赖生成

基于make的构建环境要正确工作, 一个很重要(也很烦人)的任务是, 在makefile中正确列
举依赖.

这个文档将介绍了一个非常有用的让make自身来创建和维护这些依赖的方法.

文章来源

所有的make程序都需要知道, 某个特定的target依赖的文件有哪些, 以便确认它(target)
会在必要的时候进行rebuild.

手动更行这个清单不仅仅是让人乏味, 而且非常容易出错. 多数系统(不论大小)都偏向与
提供自动提取这个信息的自动化工具. 传统的工具的是makedepend程序, 其会读取c源代
码, 并以可以include至makefile中的__目标-依赖__模式生成头文件清单.

如果使用更加强大一点的编译器或者预处理器, 更加现代话的解决方案是让编译器或者预
处理器来生成这个信息.

这篇文章的意图不是专门讨论依赖信息获得的方式的(尽管有涉及到), 而是, 介绍一些有
用的将这些工具的调用,输出和gnu make组合, 来确保依赖信息总是正确和最新的, 衔接越
紧密(且越高效)越好.

这些方法依赖gnu make提供的特性. 可能可以通过修改它们来在其他版本的make上应用.
那就等你自己尝试啦. 但是, 在尽心那个尝试之前请看哈paul的makefile第一原则

gcc方案

如果有谁已近不耐烦了, 这是一个完整的最佳的实践方案. 这个方案需要你的编译器的支
持: 默认你使用gcc作为编译器(或者提供了和gcc兼容的预处理选项的编译器). 如果你的
编译器不满足这个条件, 请看另外的方案.

将这个加入到你的makefile环境中,(蓝色的部分是对gnu make提供的内建内容的改动). 当
然, 你可以却略不符合你需要的模式规则(或者添加你需要的, whatever).
(当然我这里并没有蓝色...whatever)

depdir := .deps
depflags = -mt $@ -mmd -mp -mf $(depdir)/$*.d

compile.c = $(cc) $(depflags) $(cflags) $(cppflags) $(target_arch) -c

%.o : %.c
%.o : %.c $(depdir)/%.d | $(depdir)
        $(compile.c) $(output_option) $<

$(depdir): ; @mkdir -p $@

depfiles := $(srcs:%.c=$(depdir)/%.d)
$(depfiles):

include $(wildcard $(depfiles))

要注意, include这一行需要出现在初始, 默认target之后, 否则引入的依赖会取代你的
默认target配置. 将这个加到makefile末尾是很好的(或者放在一个单独的makefile文件里
并include他)

还这, 这里认为srcs变量包含所有你想要跟踪依赖的源文件(不是头文件)

如果你只是先要知道这些改动的意义的话, 并且考虑一些问题和对它们的解决方案, 可以(看原文,..)

传统的make depend方法

一个由来已久的处理依赖生成的方式是, 在makefiles中提供一个特殊的target, 通常是
depend, 其可以用于创建依赖信息. 这个target的命令会对xx文件调用一些依赖跟踪工具
..生成makefile格式的依赖信息.

如果你的make版本支持include, 你可以将它们(依赖输出)重定向到一个文件, 然后
include这个文件. 如果不支持的话, 通常还需要利用shell来将依赖列表追加到makefile
文件末尾...

这样虽然很简单, 但是存在很严重的问题. 首先也是最重要的是, 依赖只在使用者明确要
求更新的时候才更新, 如果使用者并没有经常运行make depend, 依赖可能会严重果实,
make就不能正确得rebuild target.. 因此, 我们没法说这是无缝且正确的.

第二个问题是, 运行make depend是不高效的, 特别是第一次. 因为它会修改makefile,
通常需要作为一个单独的构建步骤, 也就是在每个子目录的每次make都需要额外调用一次
之类的, 除去依赖生成工具自身的开销不说. 还有, 它会检查每个文件的依赖, 即使是没
有改变的文件

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值