# 一、为什么要用 make
- 一个词来说就是:自动化
- 只需要写一个 Makefile,就可以通过一句命令来自动化地完成编译、测试、打包、部署等一系列操作
- 即使是 Linux 内核,也可以通过一句 make 来完成编译
- 而且它不仅仅是用来编译 C/C++ 的,还可以用来执行任何命令
- 比如说用 make 来简化输入命令的
- 有些时候会比 shell 脚本更容易编写
- 处理依赖、读取命令行输入等 make 都会帮你完成
# 二、如何编写 Makefile
target ...: prerequisites ...
command
...
...
1
2
3
4
2
3
4
target: 目标文件 / 可执行文件/ 标签
.PHONY 定义伪目标
.PHONY: clean
1prerequisites: 依赖文件 / 依赖 target
command: 执行的命令
- 即触发 target 时执行的 shell 命令
- 开头加
@
不会在终端输出命令本身 - 开头加
-
会忽略命令执行失败的错误,继续向下执行
# 三、Makefile 变量
- 变量定义:
- VAR = value,value 会在使用时才被展开(可以在文件任何位置)
- VAR := value,右边的 value 会在定义时就被展开
- VAR ?= value,如果 VAR 未定义,则定义为 value
- VAR += value,将 value 追加到 VAR 的末尾
- 变量引用:
- $(VAR):引用变量 VAR(Makefile 中的变量引用)
- ${VAR}:引用变量 VAR(Shell 中的变量引用)
- 会以“字符串”的形式展开(类似 C 中的宏展开)
- 可以通过 $(shell command) 来将 command 的输出结果作为替换的值
- 可以直接使用环境变量,如 $(PATH)
# 四、make 命令
make 后面可以跟多个 target,指定执行的内容
- 如果不跟任何 target,则默认执行第一个 target
可以在 make 后面直接通过
VAR=value
的形式来定义变量- 优先级:make 后 > Makefile 中定义 > 环境变量(make 前)
一些常用的 make 命令 flag:
- make -f FILE:指定 Makefile 文件
- make -n:不执行命令,只显示命令
- make -s:不显示命令
- make -j N:并行执行 N 个任务
- make -k:忽略错误,继续执行
# 五、相关资料
- 🏆 和我一起写 Makefile:seisman/how-to-write-makefile (opens new window)
- GNU make 官方文档:GNU make (opens new window)