一.变量的高级主题
A.变量值的替换 1.使用指定字符(串)替换变量中的后缀字符(串) 2.语法格式:$(var:a=b) (将a替换成b) a.替换表达式中不能有任何的空格 b.make中支持使用${}对变量进行取值 示例
src:=a.cc b.cc c.cc
obj:=$(src:cc=o)
test:
@echo "obj=>$(obj)"
输出结果 由上图可以看出变量值的替换 B.变量的模式替换 1.使用%保留变量值中的指定字符,替换其它字符 2.语法格式:$(var:a%b=x%y) a.替换表达式中不能有任何的空格 b.make中支持使用${}对变量进行取值 示例
src:=a1b.c a2b.c a3b.c
obj:=$(src:a%b.c=x%y)
test:
@echo "obj=>$(obj)"
输出结果 C.变量值的嵌套引用 1.一个变量名之中可以包含对其它变量的引用 2.嵌套引用的本质是使用一个变量表示另一个变量 如图所示 D.命令行变量 1.运行make时,在命令行定义变量 2.命令行变量默认覆盖makefile中定义的变量 示例及运行结果 E.override关键字 1.用于指示makefile中定义的变量不能被覆盖 2.变量的定义和赋值需要使用override关键字 示例及运行结果 F.define关键字 1.用于在makefile中定义多行变量 2.多行变量的定义从变量名开始到endef结束 3.可使用override关键字防止变量被覆盖 4.define定义的变量等价于使用=定义的变量 示例及运行结果
二.条件判断语句
A.makefile中支持条件判断语句 1.可以根据条件的值来决定make的执行 2.可以比较两个不同变量或者变量和常量值 需要注意的是:条件判断语句只能用于控制make实际执行的语句;但是,不能控制规则中命令的执行过程 条件判断的关键字有四种:
关键字 | 功能 |
---|---|
ifeq | 判断参数是否相等,相等为true,否则为false |
ifneq | 判断参数是否不相等,不相等为true,否则为false |
ifdef | 判断变量是否有值,有值为true,否则为false |
ifndef | 判断变量是否没有值,没有值为true,否则为false |
注意: 1.条件判断语句之前可以有空格,但不能有Tab字符 2.在条件语句中不要使用自动变量($^,$<) 3.一条完整的条件语句必须位于同一个makefile中 4.条件判断类似C语言中的宏,预处理阶段有效,执行阶段无效 5.make在加载makefile时(首先计算表达式的值--赋值方式不同,计算方式不同;根据判断语句的表达式决定执行的内容)
三.函数定义及调用
A.makefile中支持函数的概念 1.make解释器提供了一系列的函数供makefile调用 2.在makefile在支持自定义函数实现,并调用执行 3.通过define关键字实现自定义函数 B.自定义函数的语法 深入理解自定义函数 1.自定义函数是一个多行变量,无法直接调用 2.自定义函数时一种过程调用,没有任何的返回值 3.自定义函数用于定义命令集合,并应用于规则中 示例及运行结果 注意:$(call func2, mylove, dandanxiaohai)对应于func2中的三个参数,通过call进行调用 C.make解释器中的预定义函数 1.make的函数提供了处理文件名,变量和命令的函数 2.可以在需要的地方调用函数来处理指定的参数 3.函数在调用的地方被替换为处理结果 预定义函数的调用 示例及运行结果
.PHONY : test
define func1
@echo "My name is $(0)"
endef
define func2
@echo "My name is $(0)"
endef
var1 := $(call func1)
var2 := $(call func2)
var3 := $(abspath ./)
var4 := $(abspath test.cpp)
test :
@echo "var1 => $(var1)"
@echo "var2 => $(var2)"
@echo "var3 => $(var3)"
@echo "var4 => $(var4)"
分析: 1.makefile中不支持真正意义上的自定义函数 2.自定义函数的本质时多行变量 3.预定义的call函数在调用时将参数传递给多行变量 4.自定义函数是call函数的实参,并在call中被执行