Makefile 使用手记(1)

来源:互联网 发布:php doc转html 编辑:程序博客网 时间:2024/04/30 18:47

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:=gccCFLAGS:= -Wall -L xx/xx/xxDESTDIR= abc def gcdSRCDIR=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
原创粉丝点击