From 403838287e2818292a53636353ce49d76c8ac16f Mon Sep 17 00:00:00 2001 From: fw_qaq <82551626+fwqaaq@users.noreply.github.com> Date: Wed, 7 Dec 2022 20:56:56 +0800 Subject: [PATCH] doc: update make.md (#215) --- docs/make.md | 127 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 97 insertions(+), 30 deletions(-) diff --git a/docs/make.md b/docs/make.md index 65b50e4..637d9f0 100644 --- a/docs/make.md +++ b/docs/make.md @@ -369,6 +369,35 @@ run: 书写规则 --- +### 文件搜寻(`vpath`) + + +如果没有指定 vpath 变量,make 只会在当前的目录中去寻找依赖文件和目标文件。否则,如果当前目录没有,就会到指定的目录中去寻找 + +:- | :- +:- | :- +`vpath ` | 为符合模式 \ 的文件指定搜索目录 \ +`vpath ` | 清除符合模式 \ 的文件的搜索目录。 +`vpath` | 清除所有已被设置好了的文件搜索目录 + +#### `%` + +* vpath 使用方法中的 \ 需要包含 `%` 字符。`%` 的意思是匹配零或若干字符(类似于**通配符**),并且引用规则是需要使用**自动变量** + +```makefile +vpath %.c dist +TARGET = hello +OBJ = bar.o foo.o + +$(TARGET): $(OBJ) + $(CC) -o $@ $^ + +%.o: $.c + $(CC) -o $< -o #@ +``` + + + ### 通配符 #### `*` @@ -399,36 +428,6 @@ run: ls -ll packag?.json ``` -### 文件搜寻(`vpath`) - -如果没有指定 vpath 变量,make 只会在当前的目录中去寻找依赖文件和目标文件。否则,如果当前目录没有,就会到指定的目录中去寻找 - -:- | :- -:- | :- -`vpath ` | 为符合模式 \ 的文件指定搜索目录 \ -`vpath ` | 清除符合模式 \ 的文件的搜索目录。 -`vpath` | 清除所有已被设置好了的文件搜索目录 - -#### `%` - -* vpath使用方法中的 \ 需要包含 `%` 字符。 -* `%` 的意思是匹配零或若干字符 -* 并且引用规则是需要使用**自动变量** - -```makefile -vpath %.c dist -TARGET = hello -OBJ = bar.o foo.o - -$(TARGET): $(OBJ) - $(CC) -o $@ $^ - -%.o: $.c - $(CC) -o $< -o #@ -``` - - - ### 静态模式 ```makefile @@ -469,6 +468,20 @@ clean : rm *.o temp ``` +### 约定俗成的规则 + + +:- | :- +:- | :- +`all` | 该伪目标是所有目标的目标,一般用于编译所有的目标 +`clean` | 该伪目标用于删除所有由 make 创建的文件 +`install` | 该伪目标用于安装已编译好的程序,即将目标执行文件拷贝到指定目标中 +`print` | 该伪目标用于例出改变过的源文件 +`tar` | 该伪目标用于把源程序打包备份为 tar 文件 +`dist` | 该伪目标用于创建压缩文件,一般将 tar 文件压成 Z 或 gz 文件 +`TAGS` | 该伪目标用于更新所有的目标,以备完整地重编译使用 +`check/test` | 这两个伪目标用于测试 makefile 的流程 + @@ -535,6 +548,60 @@ exec: cd /home/hchen; pwd ``` +### make 参数 + + +:- | :- +:- | :- +`-b`,`-m` | 忽略和其它版本make的兼容性 +`-B` | (`--always-make`) 认为所有的目标都需要重编译 +`-C ` | (`--directory=`) 指定读取makefile的目录 +`-e` | (`--environment-overrides`) 指明环境变量的值覆盖 makefile 中定义的变量的值 +`-f=` | 指定需要执行的makefile +`-h` | 显示帮助信息 +`-i` | (`--ignore-errors`)在执行时忽略所有的错误 +`-I ` | (`--include-dir=`) 指定一个被包含 makefile 的搜索目标 +`-j []` | (`--jobs[=]`)指同时运行命令的个数 +`-k` | (`--keep-going`)出错也不停止运行 +`-l ` | `--load-average[=]`、`-max-load[=]` 指定make运行命令的负载 +`-n` | (`--just-print`, `--dry-run`, `--recon`) 仅输出执行过程中的命令序列,但不执行 +`-o ` | (`--old-file=`, `--assume-old=`)不重新生成的指定的 \,即使目标的依赖文件新于它 +`-p` | (`--print-data-base`) 输出 makefile 中的所有数据,包括所有的规则和变量 +`-q` | (`--question`) 不运行命令,也不输出。仅仅是检查所指定的目标是否需要更新 +`-r` | (`--no-builtin-rules`) 禁止 make 使用任何隐含规则 +`-R` | (`--no-builtin-variabes`) 禁止 make 使用任何作用于变量上的隐含规则 +`-s` | (`--silent`,`--quiet`) 在命令运行时不输出命令的输出 +`-S` | (`--no-keep-going`, `--stop`) 取消“-k”选项的作用 +`-t` | `--touch` 相当于 UNIX 的 touch 命令,只是把目标的修改日期变成最新的,也就是阻止生成目标的命令运行 +`-v` | (`--version`) 输出 make 程序的版本、版权等关于 make 的信息 +`-w` | (`--print-directory`) 输出运行 makefile 之前和之后的信息。`--no-print-directory` 可以禁止 `-w` +`-W ` | `--what-if=`, `--new-file=`, `--assume-file=` 假定目标 \ 需要更新,如果和 `-n` 选项使用,那么这个参数会输出该目标更新时的运行动作 +`--warn-undefined-variables` | 只要 make 发现有未定义的变量,那么就输出警告信息 + + +### `-debug[=]` + + +输出 make 的调试信息。下面是 \的取值: + +options | :- +:- | :- +`a` | `all`,输出所有的调试信息 +`b` | `basic`,只输出简单的调试信息。即输出不需要重编译的目标 +`v` | `verbose`,包括 b 的信息。输出包括 makefile 被解析的信息,不需要被重编译的依赖文件等 +`i` | `implicit`,输出所有的隐含规则 +`j` | `jobs`,输出执行规则中命令的详细信息,如命令的 PID、返回码等 +`m` | `makefile`,输出 make 读取 makefile,更新 makefile,执行 makefile 的信息 + + +### make 的退出码 + +:- | :- +:- | :- +`0` | 成功执行 +`1` | 运行时出现错误 +`2` | 使用了 `-q` 选项,并且一些目标不需要更新 + 判断和循环 ---