make工具的使用
本节是b站上关于make教学的笔记,参考网址:
https://www.bilibili.com/video/BV1xt411b7Qu?from=search&seid=2641837473750143994&spm_id_from=333.337.0.0
1、什么是make
make工程管理器是Linux下的一个“自动编译管理器”,对于维护一些具有相互依赖关系的文件特别有用,能自动确定工程的那部分源文件需要重新编译,然后执行命令去编译它们。
make使用语法:make [options] [target]…
options为make工具的参数选项,target为makefile中指定的目标。
make工具参数选项:
- -f filename :显示的指定文件作为Makefile;
- -C dimname:制定make在开始运行后的工作目录为dimname
- -e:不允许在Makefile中替换环境变量的赋值
- -k:执行命令出错时,放弃当前目标,继续维护其它目标
- -n:按实际运行时的执行顺序模拟执行命令(包括用@开头的命令),没有实际执行效果,仅用于显示执行过程;
- -p:显示Makefile中所有变量和内部规则;
- -r:忽略内部规则
- -s:执行但不显示命令,常用来检查Makefile的正确性;
- -t:修改每个目标文件的创建日期;
- -I:忽略运行make中执行命令的错误;
- -V:显示make的版本号。
2、Makefile的书写规则
2.1、Makefile基本语法规则
target:prerequisites
command
或者:
target:prerequisite;command
command
- target是目标文件名,多个文件以空格分开,可以使用通配符*、?、[ ];
- Prerequisite是目标所依赖的文件;
- Command是命令行;以tab键开头;
2.2、通配符
通配符使用在变量中,如objects = *.o,但不会在变量中展开,如需展开,可用objects := $(wildcard *,o);
2.3、伪目标
伪目标并不是一个文件,而是一个标签。为避免伪目标和文件重名,可以使用.PHONY来显示的指明一个目标就是伪目标
2.4、多目标
自动化变量“$@”表示目前规则中所有目标的集合。
3、Makefile的命令
如果要让上一条命令的结果应用在下一条命令,需要使用分号分隔这两条命令。为了忽略命令的出错,在命令行前加一个减号“-”,标记为不管命令是否出错都认为是成功的。
4、Makefile中使用变量
- 变量的命名可以包含字符串、数字、下划线,但不能包含“:”、“#”、“=”。
- 变量在申明时需要给初值,在使用时在变量名前面加上“$”符号。
- 变量支持嵌套定义;
- 使用“:=”操作符定义变量时,前面的变量不能使用后面的变量。
- 使用“?=”操作符,变量若没有定义,则赋值,否则什么也不做。
- 使用“+=”操作符给变量追加值。
5、Makefile中常用函数调用
语法:$(<fun ction> <arguments>)或${<fun ction> <arguments>}
是函数名,是函数的参数。
5.1字符串处理函数
-
字符串替换函数subst
格式:$(subst <from>,<to>,<text>) 功能:把<text>中<from>字符串替换成<to>。
-
模式字符串替换函数patsubst
格式:$(patsubst <patten>,<replacement>,<text>)
-
查找字符串函数findstring
格式:$(findstring <find>,<in>)
-
过滤函数filter
-
反过滤函数filter-out
-
排序函数sort
-
取单词函数word
-
取单词串函数wordlist
-
单词个数统计函数words
-
首单词函数firstword
5.2、文件名操作函数
- 取目录函数dir
- 取文件名函数notdir
- 取后缀名函数suffix
- 名称取前缀函数basename
- 加后缀函数addsuffix
- 加前缀函数addprefix
5.3 循环函数foreach
格式:$(foreach <var>,<list>,<text>)
把参数中的单词逐一取出放到参数所指定的变量中,然后再执行
5.4 条件判断函数
ifeq、ifneq、ifdef、ifndef
$(if <condition>,<then-part>,<else_part>)
6、Makefile的隐式规则
Makefile预先约定好的,不用再写出来的规则。隐式规则中使用的变量有两种,一种是命令相关的,一种是参数相关的。
模式规则,目标的定义需要有%。例如%.o:%.c;<command…>,指出了所有的.c文件生成相应的.o文件跟规则。
自动化变量,把模式中所定义的一系列文件自动的逐个的取出,直到所有的符合模式的文件都符合要求。