美文网首页
对makefile的简单理解

对makefile的简单理解

作者: 小胖_20c7 | 来源:发表于2019-06-17 15:59 被阅读0次
    调用流程(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
        取消预定义的隐式规则
    

    相关文章

      网友评论

          本文标题:对makefile的简单理解

          本文链接:https://www.haomeiwen.com/subject/klbafctx.html