24.1基本用法
Makefile语法:
目标(target)…: 依赖(prerequiries)…
<tab>命令(command)
如果“依赖文件”比“目标文件”更加新,那么执行“命令”来重新生成“目
标文件”。命令被执行的 2 个条件:依赖文件比目标文件新,或是目标文件还没生成。
make 命令根据文件更新的时间戳来决定哪些文件需要重新编译,这使得可以避免编译已经编译过的、没有变化的程序,可以大大提高编译效率。
24.2四种变量
“:=” 即时变量 ,定义时就起效
“=” 延时变量 ,使用时才起效
“?=” 延时变量 ,如果是第一次定义才起效,前面有定义过则忽略
“+=” 附加变量,它是即时变量还是延时变量取决于前面的定义
输出结果:
echo相当于打印,前面加个@的作用是打印结果时省略当前语句,“&()”相当于取哪个变量的值,例如这里&(B),就是取变量B的值,即C的值,为“abc 123”
24.3常用函数
1.foreach(扩展输出)
使用语法:$(foreach var,list,text)
在Makefile脚本中,A = a b c定义了一个变量,包含三个元素a、b和c。然后,B = $(foreach f , $(A), $(f).o )使用了foreach函数,对于每个元素f在列表$(A)中,执行了操作$(f).o,生成了对应的对象文件(如a.o、b.o、c.o)。因此,变量B最终会包含这些对象文件的列表。
当目标all被执行时,@echo B = $(B)打印出变量B的值:
2.filter/filter-out(筛选符合内容的值)
$(filter pattern...,text) # 在text中取出符合patten格式的值
$(filter-out pattern...,text) # 在text中取出不符合patten格式的值
3.Wildcard(筛选符合文件的值)
$(wildcard pattern) # pattern定义了文件名的格式, wildcard取出其中存在的文件
4.patsubst(替换内容)
$(patsubst pattern,replacement,\$(var))
patsubst 函数是从 var 变量里面取出每一个值,如果这个符合 pattern 格式,把它替换成
replacement 格式,
通配符%是文件内含有的内容,好比c语言的“%d”,*是文件名含有的内容。
代码:
输出:
分析:
B使用了foreach的函数,把A的内容统统扩展为%.o,故输出为a.o...
D使用了filter函数,筛选了C中含有“/”的内容
E使用了filter-out函数,筛选了C中不含有“/”的内容
F使用了filter函数,筛选了B中含有“.o”的内容,而B的输出均含有.o,故F的输出结果即为B的内容
files使用了wildcard函数,筛选了当前文件夹内含有.c的文件
files3也使用了wildcard函数,将files2的内容中筛选出了当前文件夹真正存在的文件
Dep_files使用了patsubst函数,将files2的内容中含有.c的内容替换为.d,若不含有则不替换,正常打印。