From d75cda78f54d1c9ce06373874acf654d2c14c8d9 Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+Jack-Zhang-1314@users.noreply.github.com> Date: Sat, 3 Dec 2022 04:41:21 -0500 Subject: [PATCH] docs: add make cheatsheet (#202) #200 --- README.md | 1 + docs/make.md | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 docs/make.md diff --git a/README.md b/README.md index 0b735c05..8b532bcd 100644 --- a/README.md +++ b/README.md @@ -125,6 +125,7 @@ Quick Reference [Chmod](./docs/chmod.md) [Cron](./docs/cron.md) [CMake](./docs/cmake.md) +[Make](./docs/make.md) [Git](./docs/git.md) [Grep](./docs/grep.md) [Find](./docs/find.md) diff --git a/docs/make.md b/docs/make.md new file mode 100644 index 00000000..23f2ee7c --- /dev/null +++ b/docs/make.md @@ -0,0 +1,117 @@ +make 备忘清单 +=== + +包含 最重要概念、函数、方法等的 make 备忘单。 初学者的完整快速参考。 + +Makefile 入门 +--- + + +### 示例 + +```makefile +a.txt: b.txt c.txt + cat b.txt c.txt > a.txt +``` + +#### 工作流程 + +* 读入所有的 `Makefile`。 +* 读入被 `include` 的其它 `Makefile`。 +* 初始化文件中的变量。 +* 推导隐晦规则,并分析所有规则。 +* 为所有的目标文件创建依赖关系链。 +* 根据依赖关系,决定哪些目标要重新生成。 +* 执行生成命令。 + + + +### 文件命令 + +文件会以 `GNUmakefile`(不推荐使用)、`Makefile`、`makefile` 查找目录下的名称。 + +#### 自定义文件名称 + +```bash +$ make target -f NAME +``` + +我们可以使用 `-f NAME` 来指定需要编译的文件名 + +#### 隐式生成 + +如果文件夹中没有 makefile 文件,只有 main.c 源文件,那么我们可以使用 `make main.o` 隐式生成链接文件 + +```bash +$ make main.o +# 实际执行: cc -c -o main.o main.c +``` + +### 规则 + +```makefile +TARGET: PREREQUISITES + COMMAMD +... +``` + +* `target`: 规则的目标。目标可以是规则的动作(如 `clean` 等),也可以是目标文件或者最后的可执行文件。 +* `prerequisites`: 规则的依赖。生成规则目标文件所需要的文件名列表(通常一个目标依赖于一个或者多个文件)。 +* `command`: 规则的命令行。规则要执行的动作(任意的 shell 命令或者在 shell 下执行的程序)。命令需要以 tab 键开头 + + + +### 清空目标文件 + +```makefile +.PHONY: clean +clean: + rm *.o temp +``` + +`.PHONY` 内置命令将排除 clean 文件,不会因为当前目录中因为有 clean 文件而不会不执行 clean 伪目标 + +clean 从来都是放在文件的最后 + + + +### 注释 + +makefile 文件的注释与 bash 脚本一致 + +```makefile +# 这是一个注释 +main.o : main.c + cc -c main.c +``` + +### 换行 `\` + +```makefile +# 这是一个注释 +main.o : main.c + cc -c \ + main.c +``` + +### 引用其它的 Makefile + +`include` 关键字可以把别的 Makefile 包含进来。这样使用 make 运行的时候就会 + +```makefile +# makefile +include foo.make +``` + +如果你想让 make 不理那些无法读取的文件,而继续执. + +```makefile +-include +``` + +另见 +--- + +* [make 中文教程](https://seisman.github.io/how-to-write-makefile/overview.html) _(seisman.github.io)_ +* [make 手册](https://www.gnu.org/software/make/manual/make.html#toc-Overview-of-make)_(www.gnu.org)_ +* [make 官网](https://www.gnu.org/software/make/)_www.gnu.org_