一、什么是makefile
一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,Makefile 文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,也就是说 makefile规定了编译的规则。因为 Makefile 文件就像一个 Shell 脚本一样,也可以执行操作系统的命令。
Makefile 带来的好处就是“自动化编译” ,一旦写好,只需要一个 make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。 make 是一个命令工具,是一个解释 Makefile 文件中指令的命令工具,一般来说,大多数的 IDE 都有这个命令,比如 Delphi 的 make, Visual C++ 的 nmake, Linux 下 GNU 的 make。
这里主要介绍的是Linux下的GNU的make。
二、make的运行
最简单的就是直接 在命令行下输入 make 命令, make 命令会找当前目录的makefile 来执行,一切都是自动的。但也有时你也许只想让 make 重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,你想在不同的时候使用不同的编译规则,等等。
GNU make 寻找 默认的 Makefile 的规则 是在 当前目录下 依次找三个文件“GNUmakefile”、“makefile”和“Makefile”。 其按顺序找这三个文件,一旦找到,就开始读取这个文件并执行。
也可以给 make 命令 指定一个特殊名字的 Makefile。要达到这个功能,我们要使用 make 的“-f”或是“--file”参数(“--makefile”参数也行)
例如:
有个makefile 的名字是“MyMakefile.mk”,那么,我们可以这样来让 make 来执行这个文件:
make -f MyMakefile.mk
三、makefile的规则 和 一些语法
1.makefile的执行规则
一个makefile文件中可以 有一个或者多个规则
目标 : 依赖 ...
命令(Shell命令)
...
目标: 最终要生成的文件 (除了伪目标)
依赖: 生成目标所需要的文件 或是 目标
命令: 通过执行命令对依赖操作生成目标 (命令前必须 Tab 缩进)
2.makefile的工作原理
命令 在执行之前,需要先检查规则中的依赖是否存在?
如果存在,执行命令; 如果不存在,向下检查其它的规则,检查有没有一个规则是用来生成这个依赖的,如果找到了,则执行该规则中的命令;
检测更新,在执行规则中的命令时,会比较目标和依赖文件的时间:
如果 依赖文件的时间 比 目标的时间晚,需要重新生成目标;如果依赖的时间比目标的时间早,目标不需要更新,对应规则中的命令不需要被执行。
3.makefile中的变量
3.1 自定义变量
变量名 = 变量值 或 变量名:= 变量值
var = hello var := hello
区别是:
第一种写法,前面的变量可以使用后面的变量; 第二中方法定义的变量,前面的变量不可以使用后面的变量。
比如:
x = $(y)
y = later(等价于 x = later)
3.2 预定义变量
AR:归档维护程序的名字,默认值是 ar
CC: C编译器的名称,默认值为 CC
CXX: C++编译器的名称,默认值为 g++
$@: 目标的完成名称
$<: 第一个依赖文件的名称
$^: 所有的依赖文件
$@ , $< ,$^ 为 自动化变量 ,自动化变量只能在规则的命令中使用。 例如:
app:main.c a.c b.c
$(CC) -c $^ -o $@
等价于:
app:main.c a.c b.c
gcc -c main.c a.c b.c
3.3 获取变量的值
$(变量名)
4.模式匹配
%.o : %.c
%:通配符,匹配一个字符串两个 ; 两个 % 匹配的是同一个字符串。
5.函数
函数的调用语法是:
$(<function> <arguments>)
或
${<function> <arguments> }
<function>就是函数名, make 支持的函数不多。 <arguments>是函数的参数,参数间以逗号“,”分隔,而函数名和参数之间以“空格”分隔。
函数调用以“$”开头,以圆括号或花括号把函数名和参数括起。函数中的参数可以使用变量,为了风格的统一,函数和变量的括号最好一样,如使用“$(subst a,b,$(x))”.
Makefile中还有很多规则和函数等,具体可以,在我的另一篇博客下载,《跟我一起写makefile》pdf电子书:
跟我一起写makefile.pdf_Appleeatingboy的博客-CSDN博客
【Linux高并发服务器开发】 坚持的 第 4 天 ,加油 !!