Makefile 文件命名规范
通常情况下,make 会在工作目录(执行 make 的目录)下按特定顺序查找并读取 Makefile 文件。默认查找顺序为:
GNUmakefilemakefileMakefile
建议优先使用 Makefile(首字母大写),这样在目录中与 README、ChangeLog 等重要文件并列时更显眼,便于发现。不推荐使用 GNUmakefile,因为它仅被 GNU make 识别,其他版本的 make 程序可能无法自动加载。
如果文件名不符合上述标准,可通过 -f 或 --file 选项显式指定。例如:
-f NAME
也可以多次使用该选项指定多个 Makefile 文件,它们将按顺序链接并被解析。一旦通过选项指定了文件,make 将不再自动搜索默认的三个标准文件名。
包含其他 Makefile 文件
若需在 Makefile 中引入外部文件,可使用 include 指示符,用法类似 C 语言的头文件包含。
include FILENAMES...
该指示符会让 make 暂停当前文件的读取,转而去加载指定的文件,完成后继续后续内容。例如存在 a.mk、b.mk、c.mk 三个文件,且变量 $(bar) 展开为 bish bash:
include foo *.mk $(bar)
等价于:
include foo a.mk b.mk c.mk bish bash
include 通常用于以下场景:
- 通用规则复用:多个程序由不同目录下的独立 Makefile 描述,但共享一组变量定义或模式规则。将这些公共部分提取到单独文件中,主 Makefile 通过 include 引入即可。
- 依赖关系管理:源文件自动生成的依赖关系可保存至独立文件,主 Makefile 直接包含。相比在主文件中追加依赖,这种方式更清晰且符合现代 make 的处理习惯。
若 include 指定的文件不是绝对路径且当前目录不存在,make 会依次在 -I 选项指定的目录及 /usr/gnu/include、/usr/local/include、/usr/include 中查找。若仍未找到,make 会发出警告但不会立即退出,而是尝试根据规则创建该文件;若无法创建则报错退出。
为避免因文件缺失导致的构建中断,建议使用 -include 替代 include。前缀 - 告诉 make 忽略错误并继续执行:
-include FILENAMES...
Makefile 的重建机制
Makefile 本身也可由其他文件生成(如 RCS 或 SCCS 文件)。当 make 开始解析时,如果发现 Makefile 需要更新,它会先重新读取更新后的版本。
具体流程如下:
- make 读入所有 Makefile 文件后,将其视为目标寻找更新规则。
- 若存在明确或隐含规则可更新某个 Makefile,则执行更新。
- 若任何已读取的 Makefile 被更新,make 会清除状态重新读取一遍所有文件。

