1.wildcard : 扩展通配符 notdir : 去除路径 patsubst :替换通配符
举例:有文件 /a.c /b.c /home/a.c /home/b.c /home/k.o
src=$(wildcard *.c ./home/*.c)
file=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(src) )
src= a.c b.c /home/a.c /home/b.c
file= a.c b.c a.c b.c
obj= a.o b.o /home/a.o /home/b.o
2.find 目录 -name 文件 查找目录下 文件具体位置 绝对位置
3.dirname 获取对应的目录 basename 去掉文件名的目录和后缀(好像是linux的不是Makefile)
举例: dirname /etc/init.d/rcS => /etc/init.d
dirname /etc/init.d =>/etc
basename /home/abc.k/a.c => a
basename /home/abc.k/ =>abc.k
$(dir /etc/init.d/rcS ) => /etc/init.d
$(dirname /etc/init.d/rcS ) => ""
4. lastword firstword 如字面意思 分别为取最后一个单词和第一个单词
5.make -C $(aaa) M=$(bbb)
-C表示跳转到aaa下的读取下面的Makefile
M= 表明执行后跳转到bbb目录下
6. 单引号和双引号的区别:单引号告诉shell忽略所有特殊字符,而双引号忽略大多数,但不包括①美元符号②反引号③反斜杠,这3种特殊字符将不被忽略。 不忽略美元符号意味着shell在双引号内部可进行变量名替换。
反引号将字符串做命令行处理
7.--start-group和--end-grou ld
正常情况,链接的时候库文件只会按出现在命令行的顺序搜索一遍,如果包里有未定义的引用标号,而且该包却被放在命令行的后面,这样链接器就无法解决该标号的引用问题。通过给包分组,这些包可以被循环搜索直到所有的引用都可以解决为止。使用该选项将降低性能。只有在无法避免多个包之间互相引用的情况下才使用
8. $(sort LIST)
排序函数,去掉重复
9.$(SRC:%.c=%.o)
将SRC变量中所有以.c结尾的文件名替换成以.o结尾的文件名,并将其重新赋值给SRC
10. $(foreach <var>,<list>,<text>)
<var>;是一个变量名,<list>;可以是一个表达式,而<text>;中一般会使用<var>;这个参数来依次枚举<list>;中的单词。
举例: names := a b c d
files := $(foreach n,$(names),$(n).o)
依次遍历names中字符,存到变量‘n’中,然后将变量每个值改为$(n).o,输出依次为a.o b.o d.o d.o 中间空格隔开
11.$(addsuffix .SUFFIX,NAMES)
NAMES添加后缀.SUFFIX 例如:$(addsuffix .c,a) 输出a.c