目前不了解C
1.重大的三个组成部分
target :…….prerequisites….
command
target:需要操作的目标文件
prerequisite:生成target所需要的文件
command: make 的操作指令
书写规则也必须按照上面三个组成部分来写
makefile 中包含什么
显示规则,隐式规则,变量定义,文件指示和注释五个部分
变量定义相当于宏定义,文件指示相当于引用 include,注释需要使用“#”字符号
makefile 中的通配符有三种:“*”,“?”,“[…]”
静态模式需要特别关注,可以节省许多重复的工作
变量的使用
如果你要使用真实的“$”字符, 那么你需要用“$$”来表明
变量的赋值 “=”,“:=”,两者之间有一些区别,最好是“:=”,不会造成递归的问题。
有个有意思的操作符 “?=” , (a)?= (b). 如果a没有定义过,a 的值就是b。
“+=” 追加操作符 override指示符
2.语法知识
2.1条件表达式
ifeq (<arg1> , <arg2> ) 判断两者是否相等,一样为真
ifneq (<arg1> , <arg2> ) 判断两者是否相等,不同为真
ifdef <variable-name> 变量值非空为真
ifndef <variable-name> 变量值空为真
2.2 函数 $(<function>,<arguments>)
$(subst <from>,<to>,<text> ) 把字串中的字符串替换。
$(patsubst <pattern>,<replacement>,<text> ) 模式字符串替换函数
$(strip <string>) 去掉字串中开头和结尾的空字符
$(findstring <find>,<in> ) 在字串中查找字串
$(filter<pattern..>, <list> ) 以模式过滤字符串中的单词,保留符合模式的单词。可以有多个模式。
$(filter-out <pattern..>, <list>) 以模式过滤字符串中的单词,去除符合模式的单词。可以有多个模式
$(sort <list>) 给字符串中的单词排序(升序)
$(word <n>, <text>) 取字符串中第个单词
$(wordlist <s>,<e>,<text> ) 从字符串中取从开始到的单词串。和是一个数字
$(words<text> ) 统计中字符串中的单词个数
$(firstword<text> ) 取字符串中的第一个单词
$(dir<names…> ) 从文件名序列中取出目录部分。目录部分是指最后一个反斜杠(“/”) 之前的部分。如果没有反斜杠,那么返回“./”
$(notdir <names…>) 从文件名序列中取出非目录部分。非目录部分是指最后一个反斜杠(“/ ”)之后的部分
$(suffix<names…> ) 从文件名序列中取出各个文件名的后缀。
$(basename <names…>) 从文件名序列中取出各个文件名的前缀部分
$(addsuffix<suffix>,<names…> ,) 把后缀加到中的每个单词后面
$(addprefix <prefix>,<names…> ) 把前缀加到中的每个单词前面
$(join <list1>, <list2>) 把中的单词对应地加到的单词后面
$(foreach<var> ,<list>,<text> ) 把参数中的单词逐一取出放到参数所指定的变量中, 然后再执行所包含的表达式
$(call <expression>,<parm1>,<parm2>,<parm3>…) call 函数是唯一一个可以用来创建新的参数化的函数
$(origin<variable> ) Origin 函数会以其返回值来告知你这个变量的“出生情况”
2.3 自动化变量
$@ :匹配于 目标中模式定义的集合
$%:仅当目标是函数库文件中,表明规则中的目标成员名
$<:依赖目标中的第一个目标名字
$?:所有比目标新的依赖目标的集合
$^:所有的依赖目标的集合
$+:这个变量很像”$^”,也是所有依赖目标的集合。只是它不去除重复的依赖目标
$*:表明目标模式中”%”及其之前的部分
详细的文档见《跟我一起写Makefile》





















暂无评论内容