2014年10月

编写过一段Makefile文件后会发现,目标文件、依赖文件、编译命令之间存在一定的规律。比如目标文件一般依赖同名的.c文件,而生成这种目标文件使用gcc编译。为了简化Makefile文件的编写,make命令在实现时内嵌了隐含规则。

1、make命令在实现时内嵌了隐含规则,自动建立关于这个目标文件的依赖文件和编译所使用的命令。
隐含规则的基础是目标文件的拓展名! 比如:

program : header1.h header2.h

make会认为program是一个可执行文件,并根据隐含规则建立如下规则:

program : header1.h header2.h
    gcc -o program program.c

- 阅读剩余部分 -

编写makefile文件时通常会用到变量,makefile中定义变量的一般形式是:

变量名 赋值符 变量值
  • 变量名习惯上只使用数字、字母、下划线,并且开头不能为数字,也可以使用其他字符,但不能使用以下字符::#=,空白符;
  • 赋值符主要有四个:=:=+=?=

makefile中的变量类似于C语言中的宏,且变量区分大小写。有一些变量时系统预定义的,如自动变量:$@$?$<$*等。

1、引用变量
变量引用方式:$(变量名)${变量名},如果变量名是单字符,可以直接使用$变量名$在makefile中有特殊含义,$$表示字符$

2、定义变量
makefile中两种类型变量:递归展开变量和立即展开变量。通过=赋值的变量时递归展开变量,:=赋值的是直接展开变量。

- 阅读剩余部分 -

一个完整的Makefile文件由5部分构成:显式规则、隐含规则、使用变量、文件指示和注释。

1、显式规则
显式规则指明了目标文件、依赖文件、生成或更新目标文件所使用的命令。有些规则没有命令,这些规则只是描述了文件间的依赖关系。例如:

foo.o:foo.c defs.h
    gcc -c -g foo.c

规则两个作用:

  • 目标文件是否过时(不存在或比依赖文件早);
  • 重新生成foo.o,命令中没有明确指出defs.hfoo.c已经包含过头文件,这也是作为依赖文件出现的原因;

一般形式:

目标文件列表  分隔符  依赖文件列表  [; 命令]
    [命令]
    [命令]

书写规则几个注意点:
(1)规则命令两种写法:命令和“目标文件、依赖文件”放在同一行,使用,将命令和依赖文件分开;命令放在下一行作为独立命令行,以Tab键开头,Makefile中所有以Tab键开头的都作为命令行处理;
(2)Makefile中$表示使用变量或函数,规则中需要$的地方,书写两个连续的$$
(3)Makefile中较长的行,使用反斜线\将其书写到独立的物理行上;

- 阅读剩余部分 -