现在的位置: 首页 > 综合 > 正文

Contiki2.6 Makefile.include注解【图文】

2013年06月05日 ⁄ 综合 ⁄ 共 2632字 ⁄ 字号 评论关闭

来先说说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支持的三种通配符:“*”“?”“[…]

需要说明的是如果文件中包含‘*’号,可以用转义\*表示真实的’*’linuxshell符号也可以在make中通用,如果”~/test”代表宿主目录,”../..”代表上层目录的上层。

 

七、文件搜寻

方式一、特殊变量:VPATH(大写)。   

VPATH = src: ../include  
两个目录之间用“冒号”分开,VPATH是从当前目录为基准的。

方式二、vpath关键字(小写)

         1vpath<pattern> <directories>

         <directories>目录中寻找符合<pattern>的文件。通常用%字符表示匹配零或若干字符。

         “%.h”表示以”.h”结尾的文件。

         2vpath<pattern>

         3vpath

 

八、伪目标

前面第四点中提到的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的结构进行分析了。

---------------------------------------------------------------------------------------------------------===我是分割线===---------------------------------------------------------------------------------------------------

抱歉!评论已关闭.