MakeFile中给变量赋值:
A = $(B)
B = debug
此时A的值是debug
如果使用:
A := $(B)
B = debug
此时A的值为空,即使用 ":=" 来对变量赋值,则只能使用已经定义好的变量,如果变量前面没有定义,则使用空值来代替.
同时使用 "?=" 来对变量赋值会先判断这个变量有没有在前面被定义过,如果没有定义,则给这个变量赋值,否则使用已经定义的值
"+="为当前变量追加内容
MakeFile中使用文件搜索路径:
vpath %.c $(APP_PATH)
上命令表示在APP_PATH变量所指路径下搜索所有的.c文件
MakeFile中的字符串替换函数原型:$(subst <from>,<to>,<text>)
例:$(subst , / , \ , $(APP_PATH) )
MakeFile中的 ".PHONY"符号使用
.PHONY:all
all:.....
.PHONY用于显示的指明一个目标为伪目标,目的说明不管是否有这个文件,这个目标都是伪目标.
MakeFile中的 "@echo"
.PHONY:complete
complete:
@echo ------------------------------------------------
echo ------------------------------------------------
输出为:
-----------------------------------------------------
echo ------------------------------------------------------
即在命令前加@符号不会输出命令信息
MakeFile中的$@表示当前依赖关系的目标文件集
@echo $@可以将其输出
MakeFile中的$(@F:.o=.c)
将$(@F)中的.o替换成.c,$(@F)表示$@中的文件名部分
MakeFile中的.SUFFIXES用于通知make新的扩展名
.SUFFIXES:清空所有的文件拓展名识别
.SUFFIXES:.o .c .s .mix .dep 声明五个文件拓展名
MakeFile中$*表示目标模式中"%"及其之前的部分.如果目标是"dir/a.foo.b",并且目标的模式是"a.%.b",那么"$*"的值就是"dir/a.foo".
如果目标中没有模式的定义,那么"$*"也就不能被推导出,但是,如果目标文件的后缀是make所识别的,那么"$*"就是除了后缀的那一部分.
例如目标是"foo.c",因为".c"是make所能识别的后缀名,所以,"$*"的值就是"foo".
$<表示依赖目标的第一个目标名字,如果依赖目标是以模式(即"%")定义的,那么"$<"表示依赖目标文件集
MakeFile中条件判断语句
ifneq , ifeq , ifdef , ifndef , else endif
ifeq的意思表示条件语句的开始,并指定一个条件表达式,表达式包含两个参数,以逗号分隔,表达式以圆括号括起。
else表示条件表达式为假的情况。endif表示一个条件语句的结束,任何一个条件表达式都应该以endif结束。
其中ifeq判断条件相等,ifneq判断条件不相等
ifdef/ifndef判断变量是/否被定义
MakeFile中的$(filter <pattern>,<text>):从text中过滤出pattern所指的字符串
$(filter-out <pattern>,<text>);从text中过滤掉pattern后的字符串
例:$(filter all , $(MAKECMDGOALS) ):从变量MAKECMDGOALS中过滤出all字符串
MakeFile中的小短线"-",放在命令前面忽略命令错误
MakeFile中的$^:所有的依赖目标的集合.以空格分隔.如果在依赖目标中有多个重复的,那么会去除重复的依赖目标,只保留一份.
MakeFile中的$%:仅当目标是函数库文件中,表示规则中的目标成员名。例如,如果一个目标是"foo.a(bar.o)",那么,"$%"就是"bar.o" , "$@"就是"foo.a"
如果目标不是函数库文件,则其值为空.