对makefile的简单理解

2019-06-17  本文已影响0人  小胖_20c7
调用流程(shell --> make --> shell)
1 首先在shell中执行make,做为子进程的make继承了来自shell的坏境变量(并将环境变量下传给执行shell)
2 make本身也有自己的local变量表(不下传,且有缺省值)
3 当make的环境变量中有同名的local变量,local变量被覆盖(因为用的是环境变量,当然也可以下传了)
4 make实际上是一个解释器,它解释makefile脚本,执行内部操作以及产生新的shell来执行cmd
5 如果多个cmd写在一行,用【;】隔开,则代表这些指令是交给同一个shell来执行
基本执行流程
1 读入所有的makefile文件
2 读入被include的其他makefile文件
3 初始化文件中指定的变量(命令行变量 + 环境变量 + 缺省变量 + local变量,可以用origin函数来判断变量来源)
4 推导隐晦规则
5 分析所有规则
6 为所有目标生成依赖关系链(对于同名target,会进行依赖关系合并,通常后面的commands会覆盖前面的commands)
7 根据依赖关系,决定哪些目标要重新生成
8 执行生成的命令
make和shell之间的关系
1 正常情况下,makefile会逐行执行(每一行启动一个shell来执行)
2 每一行执行完毕后,makefile会测试shell的退出码
3 成功,继续下一行
4 失败,停止执行,退出目标(如果每一行首部加上"-",则忽略失败,继续执行)
makefile中的指令前缀
1 "@",不显示该行指令的回显(注意这个是makefile的语法,不是shell的语法)
2 "-",该行指令如果返回错误码,则makefile忽略对该行错误码的检验,继续执行(仅打出警告,-include = sinclude)
makefile中的目录
1 当前的工作目录
2 先决条件和目标的查找路径VPATH
shell和make中变量的区别
1 shell中变量的表示,${var}
2 make中变量的表示,$(var) or ${var}(${var}这种模式我查了手册,是支持的)
3 shell中的转义符,【\】
4 make中的转义符,【$】(所以 $$ = $)
5 make中变量的定义
    1 var = value(可以使用后面定义的变量)
    2 var := value(只能使用前面定义的变量)
关于include filename
1 先生成一个dummy filename文件(or 不生成)
2 根据某条隐式规则,生成真实的filename文件(这时候,文件被重新include,覆盖成功)
3 新的filename会有一些新的规则(通常和之前的某些隐式规则,具有同样的目标)
4 这时候,会进行规则合并(扩充了规则的适用性)
5 下次重新make的时候,会根据新的合并后的规则,来生成相应的目标文件
查看makefile中的变量
make -f sock.mak -f debug.mak d-PROJECT_NAME(我自己实现的一个脚本)
常用的命令行选项(具体查看man)
1 make -w
    即,Print the current directory
    这里的理解是,在每一行指令执行时(实际就是启动一个shell),打印出当前目录的相关信息(如果存在当前目录切换)
    Makefile中的make -f sock.mak,自动加上-w选项
2 make -d
    即,Print lots of debugging information
    用于调试makefile
3 make -n
    只显示命令,不执行命令
    用于调试makefile
4 make -j
    多线程执行makefile
5 make -r
    取消预定义的隐式规则
上一篇下一篇

猜你喜欢

热点阅读