1.
:= 表示如果变量为空就对其赋值,否则就不赋值
2.
$(RM) 等于rm -f
3.
foreach函数是makefile的,不是shell的,shell里没有foreach
4.
Makefile中的宏定义可参考:https://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html
5.
CPPFLAGS : 预处理器需要的选项 如:-I (大写i指定头文件路径)
CFLAGS:编译的时候使用的参数 –Wall –g -c
LDFLAGS :链接库使用的选项 –L -l (大写L指定动态库的路径,小写L指定动态库的名称)
6.
$@:应评估为当前目标的完整目标名称,或库归档目标的归档文件名部分。必须针对目标规则和推理规则进行评估。
例如,在.ca推断规则中,$ @表示要构建的过期.a文件。同样,在一个makefile目标规则来构建lib.a从file.c,$ @代表了过期的lib.a。
$%:仅当当前目标是libname形式的归档库成员( 成员 .o)时,才应评估$%宏。在这些情况下,$ @将评估为libname,而$%将评估为成员 .o。必须针对目标规则和推断规则评估$%宏。
例如,在生成文件目标规则来构建lib.a(file.o),$%表示file.o,而不是$ @,这代表lib.a。
$?:宏应评估比当前目标新的先决条件列表。必须针对目标规则和推理规则进行评估。
例如,在makefile目标规则中,从file1.o,file2.o和file3.o来构建prog,并且 prog相对于file1.o而言不是过期的,但是与关于file2.o和 file3.o,$?代表file2.o和file3.o。
$<:在推理规则中,$ <宏应求值为文件名,该文件名的存在允许为目标选择推理规则。在.DEFAULT规则中,$ <宏应求值为当前目标名称。$ <宏的含义应另行指定。
例如,在.ca推理规则中,$ <表示必备的.c文件。
$*:宏应评估为当前目标名称,并删除其后缀。至少应根据推理规则对其进行评估。
例如,在.ca推断规则中,$ * 。o表示与必备.c文件相对应的过期.o文件。
7.
用make -j带一个参数,可以把项目在进行并行编译,比如在一台双核的机器上,完全可以用make -j4,让make最多允许4个编译命令同时执行,这样可以更有效的利用CPU资源。
还是用Kernel来测试:
用make: 40分16秒
用make -j4:23分16秒
用make -j8:22分59秒
此看来,在多核CPU上,适当的进行并行编译还是可以明显提高编译速度的。但并行的任务不宜太多,一般是以CPU的核心数目的两倍为宜。
8.
wildcard 表示shell中通配符
shell常用的通配符就几个
* 匹配0至任意多个字符
? 匹配x个任意字符
[] 匹配[]内部的字符
[-] 匹配范围
{} 匹配组合
9.
$(arch)表示体系结构,它的值可以为i386或者ARM,x86_64,32之类
$(shell sh -c 'uname -s 2>/dev/null || echo not')表示当前操作系统
10.
set -x 执行指令后,会先显示该指令及所下的参数。
待更新。。。