Make 命令教程 - 阮一峰的网络日志

Make 命令教程 - 阮一峰的网络日志

Make 命令教程 - 阮一峰的网络日志

访问网站
我的收藏192 次访问更新于 a month ago反馈
Make 命令教程 - 阮一峰的网络日志 screenshot

详细介绍

Make 命令教程 - 阮一峰的网络日志

简介

《Make 命令教程》是阮一峰于 2015 年 2 月 20 日发布在个人网络日志上的开发者手册类文章。Make 是最常用的构建工具,诞生于 1977 年,主要用于 C 语言项目;实际上,任何只要某个文件有变化就需要重新构建的项目,都可以用 Make 构建。本文从简单的概念讲起,不需要任何基础,只要会使用命令行就能看懂,主要介绍 Make 命令的用法,参考资料包括 Isaac Schlueter 的《Makefile 文件教程》和《GNU Make 手册》。

摄于博兹贾阿达岛,土耳其,2013年7月

主要内容

Make 的概念

Make 命令根据指定的 Shell 命令进行构建。其规则很简单:规定要构建哪个文件、它依赖哪些源文件,当那些文件有变动时,如何重新构建它。具体的构建规则写在 Makefile 文件中(也可写为 makefile,或用 -f / --file 参数指定其他文件名)。

Makefile 文件的格式

Makefile 由一系列规则构成,每条规则形式如下:

复制代码
<target> : <prerequisites>
[tab]  <commands>
  • 目标(target):可以是文件名,也可以是伪目标(phony target,如 clean),可用 .PHONY 声明以避免与同名文件冲突;不指定目标时默认执行第一个目标。
  • 前置条件(prerequisites):一组文件名,只要有一个不存在或比目标更新,目标就需要重新构建。
  • 命令(commands):由一行或多行 Shell 命令组成,每行前必须有一个 tab 键(可用 .RECIPEPREFIX 更改为其他字符);每行命令在独立 Shell 中执行,无继承关系。

Makefile 文件的语法

  • 注释:用 # 表示。
  • 回声:make 默认打印每条命令再执行,命令前加 @ 可关闭回声。
  • 通配符:与 Bash 一致,如 *?[...]
  • 模式匹配:使用 % 进行类似正则的匹配,可一条规则构建同类型大量文件。
  • 变量和赋值符:用 = 自定义变量,调用时放在 $( ) 中;赋值符包括 =(运行时递归扩展)、:=(定义时扩展)、?=(空时才设值)、+=(追加)。
  • 内置变量:如 $(CC) 指向编译器,$(MAKE) 指向 Make 工具。
  • 自动变量:如 $@(当前目标)、$<(第一个前置条件)、$?(比目标更新的前置条件)、$^(所有前置条件)等。
  • 判断和循环:使用 Bash 语法完成,如 ifeq 判断、for 循环。
  • 函数:格式为 $(function arguments),提供 shell 函数等内置函数用来执行命令。

适用场景

  • 需要将代码变成可执行文件的编译与构建安排(如 C 语言项目)。
  • 任何只要某个文件有变化,就要重新构建的项目,都可以使用 Make 构建。
  • 适合刚接触命令行、希望了解 Make 和 Makefile 编写基础的开发者作为入门教程使用。