来先说说makefile吧。在windows的时候,的确很少听到过makefile。如果打算在linux下编程或者把Linux作为主要的开发平台,makefile还是要懂,还得用好。因为Linux下的工程就是靠makefile组织建立规则编译的,makefile更可以灵活的嵌入shell脚本,让make更方便快捷。总之,makefile就是用一条命令来执行的自动化编译。
简单说一下makefile吧:
一、命令
Target : prerequisites
command
Makefile的命令不用多解释,主要说一点:如果prerequisites中有一个文件比target文件要新,command定义的命令就会执行。这点比较重要!
二、变量
Makefile的变量可以当作C语言的宏义来使用。
定义:Object = main.c main.h 使用:$(Object)
三、自动推导
Makefile的自动推导就是省略.c .h源文件,使用其同名的.o文件。因为默认.o是其同名.c+.h自动编译的。也就是说遇到一个a.o则自动执行一条gcc
–c a.c a.h(如果源文件包含a.h).所以我们通常写一条完整的编译语句中可以省略-c的步骤。
exec : main.o
gcc–o exec main.o
(其自动执行了gcc –c main.c main.h生成main.o)
四、clean
为每一个makefile编写一个make clean是一个好习惯。
.PHONY: clean (伪目标,后面详细说明)
clean:
-rm edit $(objects)
在rm命令前加一个小减号,可以省略删除文件时出现的错误(在有些系统中删除一个空文件或者已经删除的文件时会警示)。
五、include使用
如果需要引用另一makefile就可以使用include,操作和C语言的#include类似。
include <filename>
要说明的是filename可以指定绝对或者相对路径。如果没有找到相关的文件,就从编译选项的-I参数指定的位置寻找,还是没有找到就会到系统的include里找。(忽略警示同样可以在前面加一个小减号)
六、通配符
make支持的三种通配符:“*”“?”“[…]”
需要说明的是如果文件中包含‘*’号,可以用转义\*表示真实的’*’。linux的shell符号也可以在make中通用,如果”~/test”代表宿主目录,”../..”代表上层目录的上层。
七、文件搜寻
方式一、特殊变量:VPATH(大写)。
VPATH = src: ../include
两个目录之间用“冒号”分开,VPATH是从当前目录为基准的。
方式二、vpath关键字(小写)
1、vpath<pattern> <directories>
在<directories>目录中寻找符合<pattern>的文件。通常用%字符表示匹配零或若干字符。
“%.h”表示以”.h”结尾的文件。
2、vpath<pattern>
3、vpath
八、伪目标
前面第四点中提到的clean就是一个伪目标,说明clean不是一个可执行的文件,而执行make clean实际是执行clean中的command指令(-rm
*)而不生成clean。“.PHONY”是指明目标就是伪目标,无论是否存在。
伪目标的另一用法:一次生成多个可执行文件。通常放在第一个,作为默认目标.
all : exec1 exec2 exec3
.PHONY : all
exec1: $(objects).o
gcc–o exec1 $(source).c $(source).h
…..
所以只需要make all就可以编译出exec1 exec2 exec3。。。若干目标。
九、自动化变量。
“$@”表示目前规则中所有目标的集合,(%.o)。
“@<”表示目前规则中所有的依赖目标集合,(%.c)。
用一条通用语句说明吧:$(CC)–c $(CFLAGS) $< -o $@
十、静态模式
<targets…> : <target-pattern> :< prereq-patterns …>
<command>
…可以理解为多个目标集合依赖于目标集而再一次依赖目标定义。通常在多目标的规则用可以很灵活的运用。
结合自动化变量有以下示例:
objects = foo.o bar.o
all:$(objects)
$(objects): %.o : %.c
$(CC) –c $(CFLAGS) $ < -o $@
等于:
foo.o : foo.c
$(CC) –c $(CFLAGS) foo.c –o foo.o
bar.o : bar.c
$(CC) –c $(CLFAGS) bar.c –o bar.o
其实还有一些高级的用法,如果make内嵌函数,shell结合等。这些高级用法,后面再单独讨论。
以上内容参考:GNU make.pdf
在Makefile.include源文件中大量使用了变量定义,函数和shell一些基本的用法已经有“Contiki2.6 Makefile.include拆解【图文】”文章中说明。
在makefile.include中用到的函数大致如下:
-------------------------------------------------------------------------------------------------如图---------------------------------------------------------------------------------------------------------------------
理解了上述函数,剩下的就是结合源代码对makefile的结构进行分析了。
---------------------------------------------------------------------------------------------------------===我是分割线===---------------------------------------------------------------------------------------------------