WHAT
makefile 是一个用于构建复杂编译的开源的自动化编译工具
WHERE
Linux 系统都会自带makefile程序
优点
通过依赖与目标的对比模式 实现重复编译时只需编译更新过的依赖链,无需全部重新编译
HOW
-
文件结构
在当前目录在创建名称为 Makefile或makefile的文件,程序会自动识别文件
-
一个简单的makefile代码
编译一个main.c 文件生成main可执行文件
# 生成可执行文件main
main:main.o
cc -o main main.o
# 生成main.o对象文件
main.o:main.c
cc -c main.c
# 清除指令,删除执行过程中生成的文件
clean:
rm main main.o
基本规则
target...:prerequisites...
<tab> command
运行指令
#运行指定文件的指定target
make -f file target...
#运行当前目录下makefile文件的第一个target
make
#运行当前目录下makefile文件的clean
make clean
工作方式
- 读入所有的Makefile。
- 读入被include的其它Makefile。
- 初始化文件中的变量。
- 推导隐晦规则,并分析所有规则。
- 为所有的目标文件创建依赖关系链。
- 根据依赖关系,决定哪些目标要重新生成。
- 执行生成命令。
规则
- 显形规则:自己书写的规则
- 隐晦规则: make自动推导的规则 隐晦规则
- 变量的定义
path="~/share"
-
文件指示
-
引用其他Makefile,类似C的include的
include <filename> # exp include fo.make *.mk
- 指定Makefile中的有效部分,类似C的#if
- 定义一个多行的命令
-
引用其他Makefile,类似C的include的
注释 :
#
是注释符号文件搜索 :查找未指定路径的文件
#规则
vpath <pattern> <direcctories>
# exp 添加head目录下的h文件到搜索集
vpath *.h ./head
# 清除符合模式<pattern>的文件的搜索目录
vpath <pattern>
# 清除所有已被设置好了的文件搜索目录
vpath
-
逻辑运算
- 条件表达式
<conditional-directive> <text-if-true> else <text-if-false> endif #conditional-directive 控制指令 ## 判断两个参数值是否相等 ifeq <arg1> <arg2> ## 判断两个参数是否不同 ifneq <arg1> <arg2> ## 判断变量值是否声明了 ifdef <variable-name> ## 判断变量是否没声明 ifndef <variable-name>
- 循环表达式
- 内置for函数
-
内置函数
- 函数表达式 常用函数表
$(<function> <arguments> )
规则静态模式
# 规则
<targets ...>: <target-pattern>: <prereq-patterns ...>
<commands>
# exp
objects = foo.o bar.o
all: $(objects)
## 编译objects里的所有o文件
## $< 依赖集
## $@ 目标集
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@