一.变量的高级主题

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中被执行