Makefile 语法
操作符
1、BUILD_CONFIG_FILE ?= $(CURDIR)/build.config
==?\=== 该操作符的意思是只有BUILD_CONFIG_FILE此变量之前没有被赋值过的情况下才会对这个变量进行赋值。
2、 关于=、:= 和 +=
的区别:+= 是添加等号后面的值, 如:x本来是X, 通过 x += YZ 运算之后x的值就成为XYZ 例: x := sb; y := u$(x); x := all 运行结果是 x = all, y = usb. 把 := 换成 = 运行的结果则会是: x = all, y = uall
关于makefile中的 @和@echo
makefile中的命令默认是回显的(不确定是不是所有的命令),命令前面加上@之后该命令不会回显在标准输出上,但是命令还是会正常执行自动变量
自动变量是make自动根据规则生成的,不需要用户显式的指出相应的文件或目标名称。以下就是七个最核心的自动变量:
$@ 目标文件的文件名;
$% 仅当目标文件为归档成员文件(.lib 或者 .a)时,显示文件名,否则为空;
$< 依赖(prerequisite)列表里面的第一个文件名;
$? 所有在prerequisite列表里面比当前目标新的文件名,用空格隔开;
$^ 所有在prerequisite列表中的文件,用空格隔开; 如果有重复的文件名(包含扩展名),会自动去除重复;
$+ 与$\^相似,也是prerequisite列表中的文件名用空格隔开,不同的是这里包含了所有重复的文件名;
$* 显示目标文件的主干文件名,不包含后缀部分。此外,上面的每个变量都带有两个不同的变种,用于适应不同种类的make。分别是在后面附加一个“D”或者“F”。例如,$(^D)就是代表所有依赖文件的路径,$(<F) 表示依赖文件第一个的文件部分的值。makefile 函数
1、notdir,取文件名函数,即从文件名序列中取出非目录部分; ==如:$(notdir “/User/lgh/lgh/work/ranch”) \==>ranch==
2、realpath,返回绝对路径
3、strip,去掉字串开头和结尾的空字符,并将其中多个连续空字符合并为一个空字符;==如:$(strip “ a b c ”) \==>” a b c “, $(strip a b c )\==> a b c==
4、$(wildcard PATTERN), 该函数用来获取当前工作目录下匹配此模式的所有文件列表,使用空格分开
5、\$(subst From, To, String); 将字符串String中的子字符串From替换成To并且返回新字符串,==如:\$(subst cpp,o,test1.cpp test2.cpp)返回的结果是test1.o test2.o==
6、call, 创建新的参数化函数;log = "====debug===" $1 "====end===" $2 hao_test: @echo $(call log,"makeing","makeed") 输出结果是:====debug=== makeing ====end=== makeed
7、查找字符串函数: $(findstring ,),功能: 在字符串 \ 中查找 \ 字符串
8、\$(foreach \,\,\),循环遍历\,最后按text输出#makefile 文件内容如下 targets := a b c d objects := $(foreach i,$(targets),$(i).o) all: @echo $(targets) @echo $(objects) $ make a b c d a.o b.o c.o d.o
9、if函数
语法: $(if \<condition>,\<then-part>) $(if \<condition>,\<then-part>,\<else-part>)
10、加前缀函数:
$(addprefix <prefix>,<names...>)
功能: 把前缀<prefix>
加到<names>
中的每个单词前面
返回: 加过前缀的文件名序列
11、过滤函数: $(filter < pattern…>, < text>)
功能: 以 模式过滤字符串 , 保留 符合模式 的单词, 可以有多个模式
返回: 符合模式 的字符串
12、反过滤函数: $(filter-out < pattern…>,),该功能和filter函数相反关于clean
.PHONY: clean clean: -rm lexer.c $(object) count_words
.PHONY表示clean是一个“伪目标”,而rm命令前面的减号则表示,不管出现什么问题都要继续做后面的事情。 ==PS:clean规则不要放在makefile的开头,不然就会变成make的默认目标了。==