介绍
# 目标 依赖目标
foo.o: foo.c defs.h
# 命令
cc -c -g foo.c
关键字
@
:用于命令前,在执行makefile时避免显示命令本身-
:用于命令前,不管命令执行成功与否都认为执行成功export
、unexport
:传递/禁止传递变量到下级makefile中;默认只有命令行参数会向下传递,若想传递文件中的变量,需要使用export
关键字声明override
:若make有命令行参数,那么makefile中对这个变量的赋值会被忽略。如果想在makefile中设置这类参数的值,那么可以给在变量赋值前面加上override
vpath
:指定不同的文件在不同的搜索目录中vpath <pattern> <directories>
:为符合模式的所有文件指定搜索目录vpath <pattern>
:清除符合模式的文件的搜索目录vpath
:清除所有设置好的文件搜索目录
include
:类似C语言中的#include
,可将其他makefile文件展开到当前makefile中define
、endef
、ifdef
、ifndef
、ifeq
、ifneq
、endif
、else
:类似C语言中的条件编译,define
可以用于定义命令包
变量
-
赋值
=
:直接赋值,允许此前未定义的变量赋值:=
:不允许此前未定义的变量赋值+=
:对变量进行追加,若变量此前未定义则默认先前规则为=
;若变量此前定义,则根据先前定义规则进行追加
-
环境变量
CC
、CFLAG
、MAKE
、MAKEFILES
、VPATH
等
-
目标变量
<target>: <variable-assignment>
:当设置了这样一个变量,此变量会作用到由这个目标锁引发的所有规则中,具有局部性;目标可以使用模式,如此变量会作用在符合模式的所有目标上
-
自动化变量
$@
:目标$<
:第一个依赖目标$?
:所有比目标新的依赖目标的集合$^
:所有依赖目标的集合,去除重复依赖目标$+
:所有依赖目标的集合,不去除重复依赖目标
规则
-
显式规则
- 当依赖目标新于目标时,执行当前目标下的命令
- 命令规则为Unix下的文件规则
- 伪目标:
- 对于实际不需要生成文件的目标,我们把它们叫做伪目标
- 如果伪目标有依赖目标,那么依赖目标将总是被检查
- 用一个特殊目标
.PHONY
来显式指明伪目标,保持它是一个好习惯
- 自动生成依赖性:
- 编译器支持参数
-M
,可以生成.d
文件,其中有目标文件的依赖关系,可以直接通过makefile中的关键字include
将其加入makefile中 - GNU的编译器需要用参数
-MM
,不然.d
文件中会包含一些标准库的头文件 - 如果使用参数
-MD
或-MMD
,那么编译器会从.c
同时生成.o
和.d
文件
- 编译器支持参数
-
隐含规则
- make会运行一些makefile中没有写出的规则,例如把
.c
文件编译成.o
,就算你不写,make也会自动推导出这种规则,并生成.o
文件
- make会运行一些makefile中没有写出的规则,例如把
-
模式规则
-
<target-pattern>: <prereq-pattern>; <command>;
-
%
的展开发生在变量和函数的展开之后,变量和函数的展开发生在make载入 Makefile时,而模式规则中的%
则发生在运行时。
-
-
静态模式规则
<target>: <target-pattern>: <prereq-patterns>
-
后缀规则(弃用)
函数
函数格式:S(<function> <arguments>)
- 字符串函数
subst
:$(subst <from>,<to>,<text>)
- 将串
<text>
中的<from>
替换为<to>
- 返回替换后的串
- 将串
patsubst
:$(patsubst <pattern>,<replacement>,<text>)
- 基本与
subst
相同,前两个参数可以使用模式匹配
- 基本与
strip
:$(strip <string>)
- 去掉串开头和结尾的空字符
- 返回去掉空格后的串
findstring
:$(findstring <find>,<to>)
- 在串
<in>
中查找串<find>
- 找到则返回串
<find>
,否则返回空串
- 在串
filter
:$(filter <pattern...>,<text>)
- 以模式
<pattern>
过滤串<text>
,保留符合模式的子串,可以有多个模式 - 返回符合模式的子串
- 以模式
filter-out
:$(filter-out <pattern...>,<text>)
- 作用与
filter
相反,去除符合模式的子串 - 返回不符合模式的子串
- 作用与
sort
:$(sort <list>)
- 升序排序串中的子串,并去除重复的子串
- 返回排序后的串
word
:$(word <n>,<text>)
- 取串
<text>
中的第<n>
个子串(从1开始) - 返回串
<text>
的第<n>
个子串;若<n>
大于<text>
的子串数,返回空串
- 取串
wordlist
:$(wordlist <ss>,<e>,<text>)
- 从串
<text>
中取从<ss>
开始到<e>
(闭区间)的子串 - 返回串
<text>
从<ss>
到<e>
的子串;若<ss>
大于<text>
子串数,返回空串;若<e>
大于<text>
子串数,返回<ss>
到串<text>
结束的子串
- 从串
words
:$(words <text>)
- 统计串
<text>
中子串个数 - 返回串
<text>
中的子串数
- 统计串
firstword
:$(firstword <text>)
- 取串
<text>
的第一个子串 - 返回串
<text>
的第一个子串
- 取串
- 文件函数
dir
:$(dir <names...>)
- 从文件名集
<names...>
中取出目录部分 - 返回文件名集
<names...>
的目录部分;如果子串没有/
,那么返回./
- 从文件名集
notdir
:$(notdir <names...>)
- 从文件名集
<names...>
中取出非目录部分 - 返回文件名集
<names...>
的非目录部分
- 从文件名集
suffix
:$(suffix <names...>)
- 从文件名集
<names...>
中取出各个子串的后缀 - 返回文件名集
<names...>
中各个子串的后缀
- 从文件名集
basename
:$(basename <names...>)
- 从文件名集
<names...>
中取出各个子串的前缀 - 返回文件名集
<names...>
中各个子串的前缀
- 从文件名集
addsuffix
:$(addsuffix <suffix>,<names...>)
- 把后缀
suffix
加到文件名集<names...>
的每个子串后 - 返回加过后缀的文件名序列
- 把后缀
addprefix
:$(addprefix <prefix>,<names...>)
- 把前缀
prefix
加到文件名集<names...>
的每个子串前 - 返回加过前缀的文件名序列
- 把前缀
- 其他函数
join
foreach
if
call
origin
shell
- 控制make的函数
error
warning