Makefile文件简介

Makefile文件简介

因为编译软件用的是WinAVR,其编译器是鼎鼎大名的开源编译器GCC,开源的东西虽然好用但是想要上手还得有点基本功才行,比如Makefile文件的编写对于那些习惯了KEIL C的人来说就不是很顺手了,在KEIL C等编译器中编译软件将所有编译后台工作都做好了,而WinAVR中还得自己编写Makefile文件,不过还好WinAVR自带一个MFile程序简化了Makefile文件的编写,虽然不用亲自手写Makefile文件,但是学学总是好的。

以下笔记摘自《AVR单片机GCC程序设计》第1.3节

一.目标

make 命令引入了目标(targets)的概念。Makefile 描述文件便是它的第一个目标,make 命

令必须处理至少一个目标,否则不会得出任何结果。正如我们在一个没有默认描述文件的当

前目录下敲入 make 一样,make 会输出以下的结果:

1.在项目描述文件中定义目标

一个目标通常从一行的开头开始,并后跟一个冒号。

最简单的MAKEFILE

#当前目录 D:\AVRGCC\TEST

all:

 @echo hello!

#End makefile

 

all:  便是第一个目标 

调用此描述文件结果:

D:\AVRGCC\TEST>make

hello!

 

2.默认目标(goal)

在上面提到过,如果调用 make 时不指定目标名则 make 总是假设在描述文件中遇

到的第一个目标是默认目标。以下示例可以非常好的说明这一问题。

具有三个目标的 makefile

 

#当前目录 D\AVRGCC\TEST

one:

 @echo one.

Two:

 @echo two.

Three:

 @echo three.

#End makefile

 

调用 1:

D:\AVRGCC\TEST>make

one.

由于在命令行没有指定目标,make 从 makefile中找到第一个目标(one)并执行后既退

出。

 

调用 2:

D:\AVRGCC\TEST>maketwo

two.

由于在命令行明确指定了要执行的目标(two),make  在 makefile 中找到指定的目标,

并执行后退出。

 

调用 3:

D:\AVRGCC\TEST  make three one two

three.

one.

two.

 

命令行指定了三个目标,make 一一寻找并执行。

 

在 makefile中非默认的目标称为可替换的目标,只有默认

的依赖关系时它们才有可能被调用。

二.依赖关系

makefile 文件按如下格式指定依赖关系:

目标 1[目标 2 … ] : [ : ][依赖 1][依赖 2] …

[命令]

 

如下例 

#当前目录 D:\AVRGCC\TEST

one: Two

 @echo one.

Two:

 @echo two.

#End makefile

 

执行结果是:

 d:\avrgcc\test>make

 two.

 one.

 

 Make  首先找到第一个目标 one  ,之后发现目标 one 依赖目标 Two 就先执行 Two 后才

行 one 中的命令。

三.Makefile 内容

makefile 内容可分为如下五种类型

①规则定义

语法:

目标 : 依赖

        命令

        ...

其中目标为一个文件名或以空格分开的多个文件名,可含通配符。

例如:

%.o : %.c

 avr-gcc -c  $<  -o  $@

 

以上规则定义了任意一个以 .o 结尾的文件依赖于相同前缀且以.c 结尾的文件。 并

执行下边的命令获得。

规则中目标和依赖分别为 %.o 和%.c,在目标通配符 “%”  代表任意的字符串,而

在依赖中代表与目标中代表的对应字符串。

②隐含规则

  隐含规则是 make 预先定义的规则,用选项 –r 可取消所有的隐含规则。

  例如对于 C 程序 %.o 可以自动的从 %.c 通过命令

$(CC) -c$(CPPFLAGS) $(CFLAGS)'  生成。

 

③变量

  变量是在 makefile 中描述一字符串的的名称。变量可用在目标、依赖、命令和

makefile 其它部分中。变量名由除‘: ’ 、 ‘#’、 ‘=’之外的字符组成,对大小写敏感。

 

 变量的定义并赋值格式:

变量名 =  变量代表字符串

 变量的引用格式:

 $(变量名) 

例如:

 CC = avr-gcc

     %.o : %.c

  $(CC) -c  $<  -o  $@

 

④命令

  命令部分是由 make 传递到系统的字符格式的命令行的组合,在目标被创建时它们

按顺序一行一行传递到系统并执行。

  字符‘@’开始的命令  在系统的输出中不显示本次的指令行。

⑤注释

字符‘# ’  开头的行为注释行,如果注释需要换行需在行尾加 ‘ \ ’,除包含其它

MAKEFIEL 外在行的任意处可插入注释。

 

自动变量

在 makefile中有一组预定义的变量, 当每一规则被执行时根据目标和依赖重新计算

其值,叫作自动变量。

 

下面列出了常用的几个自动变量 

 

$@  :  在规则中代表目标名,如果规则含有多个目标名它将列举所有目标。

 

$%  :  仅在目标是存档文件的成员时起作用,代表目标。

如目标 foo.a(bar.o)中$@  代表 foo.a $%代表 bar.o

$<  :   在规则中代表第一个依赖文件名

 

$?  :   代表在规则中所有以空格隔开的依赖文件名,如果依赖是存档文件的成员则只

有成员名被列出。

$^  :   代表在规则中所有以空格隔开的依赖文件名,如果依赖是存档文件的成员则只

有成员名被列出。

 

猜你喜欢

转载自blog.csdn.net/ymsunshine/article/details/8564241