Skip to content
安装与配置

安装与配置

GNU Make 是一个经典的构建自动化工具:通过 Makefile 中的规则描述「目标 → 依赖 → 命令」,把编译、测试、打包、部署等重复操作浓缩成一条 make xxx 命令。它是跨语言、跨平台的项目「统一入口」,尤其适合把 Go/Node/Docker 等异构工具的散落命令收敛到一个文件里。


什么是 Make

Make 的核心思想非常简单:

目标(target) ← 依赖(prerequisite) + 命令(recipe)
  • 当你执行 make build 时,Make 会检查 build 依赖的文件是否更新过
  • 只有依赖比目标「新」,或目标不存在时,才会执行命令
  • 一条 make test 背后可能串起十几种工具,但使用者只需记住一个词

💡 为什么用 Make 管理项目:它不是编译器专属工具,而是通用的「任务编排器」。团队协作时,新人只要 make help 就能知道这个项目能做什么、怎么跑起来,无需翻 README 或记住一长串命令。


安装

Windows

Make 依赖 Unix 环境,推荐以下方式之一:

# 方式一:Chocolatey
choco install make

# 方式二:Scoop
scoop install make

# 方式三:MinGW / MSYS2(自带 mingw32-make)
# 安装后可能叫 mingw32-make,可复制/别名成 make

# 方式四:WSL(推荐,体验最完整)
wsl --install          # 安装 WSL2 + Ubuntu
# 进入 WSL 后按 Linux 方式安装

🚨 Windows 下 mingw32-make:MinGW 提供的可执行文件叫 mingw32-make.exe,而非 make。若要兼容 make 命令,可手动复制一份为 make.exe,或始终用 mingw32-make

macOS

# 方式一:Xcode Command Line Tools(自带 GNU Make 3.81)
xcode-select --install

# 方式二:Homebrew(推荐,版本更新,自带补丁)
brew install make
# brew 安装后命令是 gmake,需手动建别名:
# 在 ~/.zshrc 加入:alias make='gmake'

Linux

# Ubuntu / Debian
sudo apt-get update
sudo apt-get install make

# CentOS / RHEL
sudo yum install make

# 开发全家桶(gcc + make + 常用工具)
sudo apt-get install build-essential

验证安装

make --version
# GNU Make 4.4.1
# Built for x86_64-pc-linux-gnu
# ...

🚨 GNU Make vs BSD make:macOS 系统自带的 make 是 GNU Make 3.81(2006 年的老版本),很多新特性(如 .ONESHELL$(file ...) 等)不支持。凡是 GNU Make 打头的才是我们讨论的对象,BSD make(bmake)语法不兼容,不要混用。


运行 Make 的几种方式

make                # 执行默认目标(Makefile 中的第一个目标)
make build          # 执行指定目标 build
make build test     # 一次执行多个目标(按顺序)
make -j4            # 并行执行(4 个并发任务)
make -n             # dry-run:只打印将执行的命令,不真正执行
make -B             # 强制重建:忽略时间戳,全部重跑

常用参数

参数 作用
-f <file> / --file 指定 Makefile 文件名(默认找 makefile/Makefile)
-C <dir> 先切换到指定目录再执行
-j [n] 并行执行;-j 不加数字表示不限制并发数
-k 出错后继续执行其它无关目标(而非立即停止)
-n / --dry-run 只打印命令,不执行
-s / --silent 静默模式,不打印执行的命令
-B 强制重建所有目标
--debug[=FLAGS] 打印调试信息(如 --debug=v 看变量值)
VAR=value 通过命令行覆盖变量

指定文件

# Makefile 命名优先级(自动查找顺序):
#   GNUmakefile  >  makefile  >  Makefile
# 推荐统一用 Makefile(最通用、最显眼)

# 使用非标准文件名
make -f build.mk build

第一个 Makefile

.PHONY: hello
hello:
	@echo "Hello, Make!"
make hello
# Hello, Make!

🚨 两个关键细节

  1. 命令行前面必须是 Tab(制表符),不能用空格——这是新手最常见的报错源。
  2. @ 前缀表示「不打印这条命令本身,只输出结果」;去掉 @ 会先回显 echo "Hello, Make!" 再输出结果。

目录结构约定

一个规范项目的 Makefile 通常放在仓库根目录,与 README、go.mod、package.json 等并列:

my-project/
├── Makefile          # 项目统一入口
├── README.md
├── go.mod            # 或 package.json / Cargo.toml 等
├── cmd/
├── internal/
├── Dockerfile
└── scripts/          # 复杂脚本可下沉到这里,Makefile 只做编排

💡 Makefile 保持「薄」——只负责编排调用,复杂逻辑下沉到 scripts/*.sh。这样脚本可以单独调试,Makefile 也好读。