什么是 Makefile
make
是一个构建工具,主要用于C/C++
项目。Makefile
本质上就是一个脚本文件,通常使用make
来解释该脚本文件中的指令,来对我们的项目进行编译。
当项目非常复杂时,Makefile
能够建立各个文件之间的依赖关系,根据文件的时间戳来判断文件是否修改,是否需要重新编译,从而减少编译的工作量。
规则
#目标: 依赖
# 命令 # 前面是一个 tab
main: main.c
gcc main.c -o main
变量
变量的赋值
简单赋值
a := 1 # 1
b := $(a)2 # 12
a := 2 # b is 12
变量的值会在使用处展开;赋值后,前后两个变量的值不再具有联系。
递归赋值
a := 1 # a is 1
b = $(a)2 # b is 12
a := 2 # b is 22
条件赋值
a ?= 1 # a is 1
b = $(a)2 # b is 12
a ?= 2 # a is 1, b is 12
追加赋值
a := 1 # a is 1
a += 2 # a is 1 2
a += 3 # a is 1 2 2
在原变量尾部添加空格,将新值追加上去。有点像字符串的拼接规则。
内置变量
**CC** |
C 语言编译器的名称 |
---|---|
**CXX** |
C++ 语言编译器的名称 |
**CFLAGS** |
C 语言编译器的编译选项,无默认值 |
https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html
分支判断
ARCH ?= x86
ifeq ($(ARCH), x86)
CC := gcc
else
CC := arm-linux-gcc
endif
可以用来根据不同的 CPU 架构选择合适的编译器,在执行make
时,可以灵活设置:
make print ARCH=arm
显式规则与隐式规则
显式规则是说,用Makefile
生成文件时,所有具体的文件都由我们直接写出来。
隐式规则:如果我们不指明规则,Makefile
自己有一套规则来完成目标文件的生成(自动推导依赖关系)。