Makefile 使用手记(1)

Makefile 使用手记【1】

最近做IoT 的gateway 程序,写了几个简单地段子之后,发现编译管理是个问题,分散在不同的文件夹里,编译、连接都是一个问题。于是打算用Makefile 管理。一方面,用Makefile管理起来比较方便,另一方面,以前经常看Makefile,总觉得人家的很复杂(linux kernel 里的makefile 还真的很复杂), 自己亲手写一遍或许就了解其中的细节了,以后看Makefile 也就不那么头疼了。BTW,Makefile 确实能让我对C&Compiler 有不少重新的认识,还是很有必要学好的。

我觉得**Makefile**比较好的地方在于,它比较适合管理比较大型的程序。一般,一个大型的程序包括了N个部分,每个大的部分就是一个文件夹,每个部分可能又包括了M个小的部分,如此下去。 如果没有一个自动编译管理的程序的话,人工几乎是不可能理清楚的。 其次,个人感觉Makefile很适合管理那些对移植性比较强的程序。

Makefile的结构

复杂的 Makefile 看上去非常的繁杂,都不知道从哪个地方开始。但是其实基本原理是一致的,对于Make本身来说,变量目标 始终是它唯一关心的主题。对于一个无论有多复杂的Makefile 而言,最后一定是一群变量的集合和一群目标的集合。如下所示。

Makefile=Set(Variables)+Set(goals)
举个简单的例子:

CC:=gcc
CFLAGS:= -Wall -L xx/xx/xx
DESTDIR= abc def gcd
SRCDIR=src1 src2 src3 

goal1:$(dependent files)
    $(CC) $(CFLAGS) $^ $@
goal2:$(dependent files)
    $(CC) $(CFLAGS) $^ $@
    @echo ....
    @rm -rf ....

这个简单的Makefile中,主题就是两个part, set(variables)={CC,CFLAGS,DESTDIR,SRCDIR} , 目标集合 set(goals)={goal1,goal2} . 实际上,也可以看出来,变量都是服务于目标,目标中有需要什么,则会把相应地变量展开在那里。

因此,Makefile的执行过程应该是先对文件内的变量进行展开,然后找到对应目标,开始对目标的依赖目标进行检查,依赖目标全部到位后,便开始执行目标下面的代码。例如,上面的makefile中,如果输入make goal1; 应该会对goal1所依赖的文件进行检查,全部到位后,开始执行指令

$(CC) $(CFLAGS) $^ $@
....#第二行指令
.....#第三行指令, and so on.

流程图如下所示

Created with Raphaël 2.1.2 开始 展开变量 展开依赖关系 执行目标生成过程 结束

既然理清楚了Makefile的基本结构,那下面基本上就可以各个击破了。从变量的展开规则到依赖、执行目标生成。每一个过程都可以存在复杂的规则,隐藏规则 and 各种.. 不过,不忘初衷,定能搞定…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值