doc: update make.md (#215)

This commit is contained in:
fw_qaq 2022-12-07 20:56:56 +08:00 committed by GitHub
parent b07df71f57
commit 403838287e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -369,6 +369,35 @@ run:
书写规则
---
### 文件搜寻(`vpath`
<!--rehype:wrap-class=col-span-3-->
如果没有指定 vpath 变量make 只会在当前的目录中去寻找依赖文件和目标文件。否则,如果当前目录没有,就会到指定的目录中去寻找
:- | :-
:- | :-
`vpath <pattern> <directories>` | 为符合模式 \<pattern> 的文件指定搜索目录 \<directories>
`vpath <pattern>` | 清除符合模式 \<pattern> 的文件的搜索目录。
`vpath` | 清除所有已被设置好了的文件搜索目录
#### `%`
* vpath 使用方法中的 \<pattern> 需要包含 `%` 字符。`%` 的意思是匹配零或若干字符(类似于**通配符**,并且引用规则是需要使用**自动变量**
```makefile
vpath %.c dist
TARGET = hello
OBJ = bar.o foo.o
$(TARGET): $(OBJ)
$(CC) -o $@ $^
%.o: $.c
$(CC) -o $< -o #@
```
<!--rehype:className=auto-wrap-->
### 通配符
#### `*`
@ -399,36 +428,6 @@ run:
ls -ll packag?.json
```
### 文件搜寻(`vpath`
如果没有指定 vpath 变量make 只会在当前的目录中去寻找依赖文件和目标文件。否则,如果当前目录没有,就会到指定的目录中去寻找
:- | :-
:- | :-
`vpath <pattern> <directories>` | 为符合模式 \<pattern> 的文件指定搜索目录 \<directories>
`vpath <pattern>` | 清除符合模式 \<pattern> 的文件的搜索目录。
`vpath` | 清除所有已被设置好了的文件搜索目录
#### `%`
* vpath使用方法中的 \<pattern> 需要包含 `%` 字符。
* `%` 的意思是匹配零或若干字符
* 并且引用规则是需要使用**自动变量**
```makefile
vpath %.c dist
TARGET = hello
OBJ = bar.o foo.o
$(TARGET): $(OBJ)
$(CC) -o $@ $^
%.o: $.c
$(CC) -o $< -o #@
```
<!--rehype:className=auto-wrap-->
### 静态模式
```makefile
@ -469,6 +468,20 @@ clean :
rm *.o temp
```
### 约定俗成的规则
<!--rehype:wrap-class=col-span-2-->
:- | :-
:- | :-
`all` | 该伪目标是所有目标的目标,一般用于编译所有的目标
`clean` | 该伪目标用于删除所有由 make 创建的文件
`install` | 该伪目标用于安装已编译好的程序,即将目标执行文件拷贝到指定目标中
`print` | 该伪目标用于例出改变过的源文件
`tar` | 该伪目标用于把源程序打包备份为 tar 文件
`dist` | 该伪目标用于创建压缩文件,一般将 tar 文件压成 Z 或 gz 文件
`TAGS` | 该伪目标用于更新所有的目标,以备完整地重编译使用
`check/test` | 这两个伪目标用于测试 makefile 的流程
<!--rehype:className=style-round-->
<!--rehype:className=auto-wrap-->
@ -535,6 +548,60 @@ exec:
cd /home/hchen; pwd
```
### make 参数
<!--rehype:wrap-class=col-span-3-->
:- | :-
:- | :-
`-b`,`-m` | 忽略和其它版本make的兼容性
`-B` | (`--always-make`) 认为所有的目标都需要重编译
`-C <dir>` | (`--directory=<dir>`) 指定读取makefile的目录
`-e` | (`--environment-overrides`) 指明环境变量的值覆盖 makefile 中定义的变量的值
`-f=<file>` | 指定需要执行的makefile
`-h` | 显示帮助信息
`-i` | (`--ignore-errors`)在执行时忽略所有的错误
`-I <dir>` | (`--include-dir=<dir>`) 指定一个被包含 makefile 的搜索目标
`-j [<nums>]` | (`--jobs[=<jobsnum>]`)指同时运行命令的个数
`-k` | (`--keep-going`)出错也不停止运行
`-l <load>` | `--load-average[=<load>]``-max-load[=<load>]` 指定make运行命令的负载
`-n` | (`--just-print`, `--dry-run`, `--recon`) 仅输出执行过程中的命令序列,但不执行
`-o <file>` | (`--old-file=<file>`, `--assume-old=<file>`)不重新生成的指定的 \<file>,即使目标的依赖文件新于它
`-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 <file>` | `--what-if=<file>`, `--new-file=<file>`, `--assume-file=<file>` 假定目标 \<file> 需要更新,如果和 `-n` 选项使用,那么这个参数会输出该目标更新时的运行动作
`--warn-undefined-variables` | 只要 make 发现有未定义的变量,那么就输出警告信息
<!--rehype:className=left-align-->
### `-debug[=<options>]`
<!--rehype:wrap-class=col-span-2-->
输出 make 的调试信息。下面是 \<options>的取值:
options | :-
:- | :-
`a` | `all`,输出所有的调试信息
`b` | `basic`,只输出简单的调试信息。即输出不需要重编译的目标
`v` | `verbose`,包括 b 的信息。输出包括 makefile 被解析的信息,不需要被重编译的依赖文件等
`i` | `implicit`,输出所有的隐含规则
`j` | `jobs`,输出执行规则中命令的详细信息,如命令的 PID、返回码等
`m` | `makefile`,输出 make 读取 makefile更新 makefile执行 makefile 的信息
<!--rehype:className=left-align-->
### make 的退出码
:- | :-
:- | :-
`0` | 成功执行
`1` | 运行时出现错误
`2` | 使用了 `-q` 选项,并且一些目标不需要更新
判断和循环
---