【Makefile】 - GNU make 总述

上一篇我们说明了为什么需要 make,以及 make 是怎么解决程序构建痛点的。
【Makefile】 - GNU make序&缘起
该篇仍然会进一步介绍 Makefile,希望通过这两篇能让你对 makeMakefile 有一个感性的认识。

Makefile内容

Makefile 中主要包含以下内容:

  • 显式规则。显式规则由我们明确给出,例如:如何生成目标文件,文件的依赖文件有哪些,生成的命令等均属于该范畴。

  • 隐晦规则。即上一篇讲的隐含规则;由于 make 具有自动推导功能,隐晦规则可以帮助我们更快的写出makefile

  • 变量。上一篇涉及到的宏;,当 makefile 被执行时,makefile 中的变量都会被扩展到相应的引用位置上。

  • Makefile指示符。它指明在 make程序 读取 makefile 过程中所要执行的动作。包含以下三部分内容:

    • 读取给定文件名的文件,将其作为 makefile的一部分(类似 C include)。

    • 根据条件忽略 makefile 中的一部分(类似 C条件编译 #if

    • 定义多行变量(多行定义)

  • 注解makefile 中只有行注释,采用 #字符,若注释行结尾存在 反斜杠\,则下一行也被视为注释行。如果我们需要使用 #字符,则需要转义 \#

注意
makefile 中第一个规则之后的所有以 Tab 开始的行,make程序将送由系统的 shell 程序解释执行。所以如果是 Tab 开头的注释行也会送至 shell 处理。

Makefile文件名

默认情况下,make 会在工作目录下查找 makefile,查找遵循以下顺序:

GNUmakefile > makefile > Makefile

GNUmakefile 只有 GNUmake 才能识别,因此不推荐。一般使用 Makefile(比较惹眼)。

如果在工作路径下找不到 makefile 文件,则它将不会读取任何文件作为解析对象,make将报错

通过 help 我们发现 make 指令有一个 -f 选项,可以指定 Makefile ,这时指定的文件可以是任意的。
在这里插入图片描述

包含其他Makefile

Makefile 中使用 include 关键字可以把别的 Makefile 包含进来。被包含的文件会原封不动的替换到 include的位置

include <filename>

make 指令开始时,会寻找 include 所指出的 Makefile 进行替换。若无指定绝对路径,则优先在当前路径下寻找,如果没有找到,则会在 make 执行时"-I"/"-- include-dir" 参数指定的路径下寻找(若有);如果没有找到,目录 <prefix>/include 存在的话也会取寻找(一般是 /usr/local/bin/usr/include)。

如果都没有找到,则会生成警告。待 makefile 文件读取完成,make 会再次尝试寻找这些未找到/无法读取的文件,如果还是无法读取,才会 报错并停止运行

如果我们想让 make 不理会那些无法读取的文件继续执行,只需在 include 前面加上 - 即可。

-include <filename>

变量

MAKEFILES

如果我们定义了环境变量 MAKEFILES ,那么在 make 执行之前,MAKEFILES 指定的文件将会被 include。那么它和 include 的区别是什么呢?

  • 从这个环境变量引入的 makefile 目标不会起作用,如果在工作目录或默认路径下找不到 makefile 文件,同样会报错
  • 如果环境变量中定义的文件发送错误,make 也不理会(既不退出也不报错,因此是比较危险的)
  • make 执行时,先读取 MAKEFILES 指定的文件,随后才在工作目录下查找 makefile。而 include 所指定的文件,是在 make 解析到时停止当前 makefile 解析转而读取 include 指定的文件。

变量 MAKEFILES 主要用在 make 的递归调用过程中的的通信。

注意

由于设置该环境变量,对所有 make 都生效。这样很容易出现混乱,而且也不利于移植,因此尽量少用。

嘿,如果 make出现了一些奇怪的问题,不妨查看下是否与该环境变量有关。

MAKEFILE_LIST

make程序在读取多个makefile文件时,包括MAKEFILES指定的,命令行指定的,当前工作目录下默认的以及使用指示符include包含的…在对这些文件进行解析执行之前,make读取的文件名将会被自动依次追加到变量MAKEFILE_LIST的定义域中。

其他特色变量

GNU make 支持一个特殊的变量,此变量不能通过任何方法赋值。这个变量是 .VARIABLES。它被展开以后是此引用点之前、makefile 文件中所定义的所以全局变量列表。包括:空变量和 make 的隐含变量,但不包含目标指定的变量,目标指定变量值在特定目标的上下文有效。

make工作方式(如何解析Makefile)

GNU make 在工作的时候分为两个阶段:

  • 第一阶段。读取所有的 makefile(包括被includemakefile),初始化文件中的变量;推导隐含规则,并分析所有规则。完成这些以后,就可以构建目标文件的 依赖关系链
  • 第二阶段。 通过依赖关系链决定哪些目标需要被更新,并使用对应的规则来重建这些目标。

若进一步细分,则可以拆分为以下步骤:

  • 依次读取变量 MAKEFILES 定义的 makefile 文件列表
  • 读取工作目录下的 makefile 文件(根据命名的查找顺序 GNUmakefilemakefileMakefile,首先找到那个就读取那个)
  • 依次读取工作目录 makefile 文件中使用指示符 include 包含的文件
  • 查找重建所有已读取的 makefile 文件的规则(如果存在一个目标是当前读取的某一个 makefile 文件,则执行此规则重建此 makefile 文件完成以后从第一步开始重新执行)
  • 初始化变量值并展开那些需要立即展开的变量和函数并根据预设条件确定执行分支
  • 根据 终极目标 以及其他目标的依赖关系建立依赖关系链表
  • 执行除 终极目标 以外的所有的目标的规则(规则中如果依赖文件中任一个文件的时间戳比目标文件新,则使用规则所定义的命令重建目文件)
  • 执行 终极目标 所在的规则

参考鸣谢

程皓《跟我一起写Makefile》

GNU Make(生肉)

徐海兵 译《GNU make中文手册》

小声: 内容大同小异…

GUN make 中文手册 译者:徐海兵 2004-09-11 3.5.6 库文件和搜索目录 .................................................................................................... 36 3.6 Makefile伪目标.............................................................................................................. 37 3.7 强制目标(没有命令或依赖的规则) ............................................................................. 40 3.8 空目标文件..................................................................................................................... 41 3.9 Makefile的特殊目标....................................................................................................... 41 3.10 多目标............................................................................................................................ 44 3.11 多规则目标..................................................................................................................... 44 3.12 静态模式 ........................................................................................................................ 45 3.12.1 静态模式规则的语法 ....................................................................................... 45 3.12.2 静态模式和隐含规则 ....................................................................................... 47 3.13 双冒号规则..................................................................................................................... 48 3.14 自动产生依赖 ................................................................................................................. 49 第四章:规则的命令 .................................................................................................................. 51 4 规则中书写命令 ................................................................................................................... 51 4.1 命令回显 ........................................................................................................................ 51 4.2 命令的执行..................................................................................................................... 52 4.3 并发执行命令 ................................................................................................................. 53 4.4 命令执行的错误.............................................................................................................. 54 4.5 中断make的执行............................................................................................................ 56 4.6 make的递归执行............................................................................................................ 56 4.6.1 变量MAKE ............................................................................................................... 57 4.6.2 变量和递归 ............................................................................................................... 58 4.6.3 命令行选项和递归 .................................................................................................... 61 4.6.4 -w选项...................................................................................................................... 63 4.7 定义命令包..................................................................................................................... 63 4.8 空命令............................................................................................................................ 65 第五章:Makefile中的变量......................................................................................................... 65 5 使用变量 .............................................................................................................................. 65 5.1 变量的引用..................................................................................................................... 66 5.2 两种变量定义(赋值)................................................................................................... 68 5.2.1 递归展开式变量........................................................................................................ 68 5.2.2 直接展开式变量........................................................................................................ 69 5.2.3 如何定义一个空格 .................................................................................................... 70 5.2.4 “?=”操作符 ............................................................................................................. 71 5.3 变量的高级用法.............................................................................................................. 71 5.3.1 变量的替换引用........................................................................................................ 72 5.3.2 变量的套嵌引用........................................................................................................ 72 5.4 变量取值 ........................................................................................................................ 76 5.5 如何设置变量 ................................................................................................................. 76 5.6 追加变量值..................................................................................................................... 77 5.7 override 指示符 ............................................................................................................. 79 5.8 多行定义 ........................................................................................................................ 80 5.9 系统环境变量 ................................................................................................................. 81 5.10 目标指定变量 ................................................................................................................. 83 5.11 模式指定变量 ................................................................................................................. 84 第六章:Makefile的条件执行 ..................................................................................................... 85 6 Makefile的条件判断 ............................................................................................................. 85 6.1 一个例子 ........................................................................................................................ 85 6.2 条件判断的基本语法 ...................................................................................................... 86 2004年9月11日 3GUN make 中文手册 6.3 标记测试的条件语句 ...................................................................................................... 89 第七章:make的内嵌函数.......................................................................................................... 89 7 make的函数 ......................................................................................................................... 89 7.1 函数的调用语法.............................................................................................................. 90 7.2 文本处理函数 ................................................................................................................. 91 7.2.1 $(subst FROM,TO,TEXT) ....................................................................................... 91 7.2.2 $(patsubst PATTERN,REPLACEMENT,TEXT) ..................................................... 91 7.2.3 $(strip STRINT)....................................................................................................... 92 7.2.4 $(findstring FIND,IN) .............................................................................................. 92 7.2.5 $(filter PATTERN...,TEXT) ..................................................................................... 93 7.2.6 $(filter-out PATTERN...,TEXT) ............................................................................... 93 7.2.7 $(sort LIST) ............................................................................................................. 94 7.2.8 $(word N,TEXT) ...................................................................................................... 94 7.2.9 $(wordlist S,E,TEXT).............................................................................................. 94 7.2.10 $(words TEXT) .............................................................................................. 94 7.2.11 $(firstword NAMES...) .................................................................................. 95 7.3 文件名处理函数.............................................................................................................. 95 7.3.1 $(dir NAMES...) ...................................................................................................... 95 7.3.2 $(notdir NAMES...)................................................................................................. 96 7.3.3 $(suffix NAMES...) ................................................................................................. 96 7.3.4 $(basename NAMES...) ......................................................................................... 96 7.3.5 $(addsuffix SUFFIX,NAMES...) ............................................................................. 97 7.3.6 $(addprefix PREFIX,NAMES...) ............................................................................. 97 7.3.7 $(join LIST1,LIST2)................................................................................................. 98 7.3.8 $(wildcard PATTERN) ............................................................................................ 98 7.4 foreach 函数................................................................................................................. 98 7.5 if 函数 ......................................................................................................................... 100 7.6 call函数 ....................................................................................................................... 100 7.7 value函数 .................................................................................................................... 102 7.8 eval函数 ...................................................................................................................... 103 7.9 origin函数 ................................................................................................................... 104 7.10 shell函数 ..................................................................................................................... 106 7.11 make的控制函数.......................................................................................................... 106 7.11.1 $(error TEXT...) ........................................................................................... 107 7.11.2 $(warning TEXT...)...................................................................................... 107 第八章:执行make .................................................................................................................. 108 8 执行make .......................................................................................................................... 108 8.1 指定makefile文件 ........................................................................................................ 108 8.2 指定终极目标 ............................................................................................................... 109 8.3 替代命令的执行............................................................................................................ 111 8.4 防止特定文件重建 ........................................................................................................ 112 8.5 替换变量定义 ............................................................................................................... 113 8.6 使用make进行编译测试............................................................................................... 114 8.7 make的命令行选项 ...................................................................................................... 115 第九章:make的隐含规则........................................................................................................ 119 9 使用隐含规则 ..................................................................................................................... 119 9.1 隐含规则的使用............................................................................................................ 119 9.2 make的隐含规则一览 .................................................................................................. 121 9.3 隐含变量 ...................................................................................................................... 124 9.3.1 代表命令的变量...................................................................................................... 124 9.3.2 命令参数的变量...................................................................................................... 125 9.4 make隐含规则链.......................................................................................................... 126 2004年9月11日 4GUN make 中文手册 9.5 模式规则 ...................................................................................................................... 128 9.5.1 模式规则介绍 ......................................................................................................... 128 9.5.2 模式规则示例 ......................................................................................................... 129 9.5.3 自动化变量 ............................................................................................................. 130 9.5.4 模式的匹配 ............................................................................................................. 133 9.5.5 万用规则 ................................................................................................................ 133 9.5.6 重建内嵌隐含规则 .................................................................................................. 134 9.6 缺省规则 ...................................................................................................................... 135 9.7 后缀规则 ...................................................................................................................... 135 9.8 隐含规则搜索算法 ........................................................................................................ 137 第十章:使用make更新静态库文件 ......................................................................................... 138 10 更新静态库文件............................................................................................................ 138 10.1 库成员作为目标............................................................................................................ 138 ARCHIVE(MEMBER) .............................................................................................................. 138 10.2 静态库的更新 ............................................................................................................... 139 10.2.1 更新静态库的符号索引表 .............................................................................. 140 10.3 make静态库的注意事项............................................................................................... 141 10.4 静态库的后缀规则 ........................................................................................................ 141 第十一章 : GNU make的特点............................................................................................... 142 11 GNU make的一些特点 ................................................................................................. 142 11.1 源自System v的特点 ................................................................................................... 142 11.2 源自其他版本的特点 .................................................................................................... 143 11.3 GNU make自身的特点 ................................................................................................. 143 第十二章 和其它版本的兼容 .................................................................................................... 144 12 不兼容性 ...................................................................................................................... 144 第十三章 Makefile的约定 ........................................................................................................ 146 13 书写约定 ...................................................................................................................... 146 13.1 基本的约定................................................................................................................... 146 13.2 规则命令行的约定 ........................................................................................................ 147 13.3 代表命令变量 ............................................................................................................... 149 13.4 安装目录变量 ............................................................................................................... 150 13.5 Makefile的标准目标名 ................................................................................................. 154 13.6 安装命令分类 ............................................................................................................... 159 第十四章 make的常见错误信息............................................................................................... 161 14 make产生的错误信息 .......................................................................................................... 161 附录1:关键字索引................................................................................................................. 163 GNU make可识别的指示符:.............................................................................................. 163 GNU make函数: ............................................................................................................... 164 GNU make的自动化变量..................................................................................................... 165 GNU make环境变量 ............................................................................................................ 166 后序 ......................................................................................................................................... 166
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值