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_