# FreeBSD Port 开发者手册

如果您计划将第三方软件移植到 FreeBSD（Port），这是必读内容。

本项目已经经过了充分地校对和审阅。最后同步：93d98e91f6bfaacd7fae40dd398efe47d44f085b

本翻译项目遵循 [BSD 2-Clause 许可证](https://github.com/FreeBSD-Ask/porter-handbook/blob/main/LICENSE/README.md)。

原文地址：[FreeBSD Porter's Handbook](https://docs.freebsd.org/en/books/porters-handbook/)


# 编辑日志


# 译者说明

## 术语翻译对照表

|   英语  | 中文/翻译 |   原因  |        其他说明       |  应用 |
| :---: | :---: | :---: | :---------------: | :-: |
| Ports | Ports | 无实际意义 | 单个软件包组为 port，不加 s |     |


# FreeBSD Port 开发者手册

版权所有 © 2000-2023 FreeBSD 文档项目

商标

FreeBSD 是 FreeBSD 基金会的注册商标。

Sun、Sun 微系统、Java、Java 虚拟机、JDK、JRE、JSP、JVM、Netra、OpenJDK、Solaris、StarOffice、SunOS 和 VirtualBox 是 Sun 微系统公司在美国和其他国家的商标或注册商标。

UNIX 是 The Open Group 在美国和其他国家的注册商标。

制造商和销售商用来区分其产品的许多名称被视为商标。如果这些名称出现在本文档中，并且 FreeBSD 项目意识到了商标声明，则这些名称后面将跟随“™”或“®”符号。


# 目录

* [FreeBSD Port 开发者手册](/)
* [编辑日志](/bian-ji-ri-zhi)
* [译者说明](/yi-zhe-shuo-ming)
* [FreeBSD Port 开发者手册](/freebsd-kai-fa-zhe-shou-ce)
* [目录](/mu-lu)

## 第 1 章 简介

* [1.1.简介](/di-1-zhang-jian-jie/di-1-zhang-jian-jie)

## 第 2 章 制作新的 Port

* [2.1.制作新的 Port](/di-2-zhang-zhi-zuo-xin-de-port/di-2-zhang-zhi-zuo-xin-de-port)

## 第 3 章 简单的 Port

* [3.1.编写 Makefile](/di-3-zhang-jian-dan-de-port/3.1.-bian-xie-makefile)
* [3.2.编写描述文件](/di-3-zhang-jian-dan-de-port/3.2.-bian-xie-miao-shu-wen-jian)
* [3.3.创建校验和文件](/di-3-zhang-jian-dan-de-port/3.3.-chuang-jian-xiao-yan-he-wen-jian)
* [3.4.测试 Port](/di-3-zhang-jian-dan-de-port/3.4.-ce-shi-port)
* [3.5.用 portlint 来检查 Port](/di-3-zhang-jian-dan-de-port/3.5.-yong-portlint-lai-jian-cha-port)
* [3.6.提交新的 Port](/di-3-zhang-jian-dan-de-port/3.6.-ti-jiao-xin-de-port)

## 第 4 章 复杂的 Port

* [4.1 Port 工作原理](/di-4-zhang-fu-za-de-port/4.1.-ta-shi-zen-mo-yun-zuo-de)
* [4.2.获取源代码](/di-4-zhang-fu-za-de-port/4.2.-huo-qu-yuan-dai-ma)
* [4.3.修改 Port](/di-4-zhang-fu-za-de-port/4.3.-xiu-gai-port)
* [4.4.打补丁](/di-4-zhang-fu-za-de-port/4.4.-da-bu-ding)
* [4.5.配置](/di-4-zhang-fu-za-de-port/4.5.-pei-zhi)
* [4.6.处理用户输入](/di-4-zhang-fu-za-de-port/4.6.-chu-li-yong-hu-shu-ru)

## 第 5 章 配置 Makefile

* [5.1.原始来源](/di-5-zhang-pei-zhi-makefile/5.1.-zuo-zhe-fa-bu-de-dai-ma)
* [5.2.命名](/di-5-zhang-pei-zhi-makefile/5.2.-ming-ming)
* [5.3.归类](/di-5-zhang-pei-zhi-makefile/5.3.-gui-lei)
* [5.4.源代码包文件](/di-5-zhang-pei-zhi-makefile/5.4.-yuan-dai-ma-bao-wen-jian)
* [5.5.维护者（MAINTAINER）](/di-5-zhang-pei-zhi-makefile/5.5.-wei-hu-zhe-maintainer)
* [5.6.一句话说明（COMMENT）](/di-5-zhang-pei-zhi-makefile/5.6.-yi-ju-hua-shuo-ming-comment)
* [5.7.项目网站](/di-5-zhang-pei-zhi-makefile/5.7.-xiang-mu-wang-zhan)
* [5.8.许可证](/di-5-zhang-pei-zhi-makefile/5.8.-xu-ke-zheng)
* [5.9.PORTSCOUT](/di-5-zhang-pei-zhi-makefile/5.9.portscout)
* [5.10.依赖](/di-5-zhang-pei-zhi-makefile/5.10.-yi-lai)
* [5.11.从属 Port 和 MASTERDIR](/di-5-zhang-pei-zhi-makefile/5.11.-cong-shu-port-he-masterdir)
* [5.12.man 手册](/di-5-zhang-pei-zhi-makefile/5.12.man-shou-ce)
* [5.13.info 文件](/di-5-zhang-pei-zhi-makefile/5.13.info-wen-jian)
* [5.14.Makefile 参数](/di-5-zhang-pei-zhi-makefile/5.14.makefile-can-shu)
* [5.15.特殊的工作目录](/di-5-zhang-pei-zhi-makefile/5.15.-te-shu-de-gong-zuo-mu-lu)
* [5.16.解决冲突](/di-5-zhang-pei-zhi-makefile/5.16.-jie-jue-chong-tu)
* [5.17.安装文件](/di-5-zhang-pei-zhi-makefile/5.17.-an-zhuang-wen-jian)
* [5.18. 使用 BINARY\_ALIAS 来重命名命令，而不是在编译中打补丁](/di-5-zhang-pei-zhi-makefile/5.18.-shi-yong-binaryalias-lai-zhong-ming-ming-ming-ling-er-bu-shi-zai-bian-yi-zhong-da-bu-ding)

## 第 6 章 特殊情况

* [第 6 章 特殊情况](/di-6-zhang-te-shu-qing-kuang/di-liu-zhang)

## 第 7 章 Flavors

* [7.1.Flavors 简介](/di-7-zhang-flavors/7.1.-flavors-jian-jie)
* [7.2.使用 FLAVORS](/di-7-zhang-flavors/7.2.-shi-yong-flavors)
* [7.3.USES=php 和 Flavors](/di-7-zhang-flavors/7.3.usesphp-he-flavors)
* [7.4.USES=python 和 Flavors](/di-7-zhang-flavors/7.4.usespython-he-flavors)
* [7.5.USES=lua 和 Flavors](/di-7-zhang-flavors/7.5.useslua-he-flavors)
* [7.6.USES=guile 和 Flavors](/di-7-zhang-flavors/7.6.guile-he-flavors)

## 第 8 章 高级 pkg-plist 实践

* [8.1.根据 make 变量对 pkg-plist 进行修改](/di-8-zhang-gao-ji-pkgplist-shi-jian/8.1.-gen-ju-make-bian-liang-dui-pkgplist-jin-hang-xiu-gai)
* [8.2.空目录](/di-8-zhang-gao-ji-pkgplist-shi-jian/8.2.-kong-mu-lu)
* [8.3.配置文件](/di-8-zhang-gao-ji-pkgplist-shi-jian/8.3.-pei-zhi-wen-jian)
* [8.4.动态与静态软件包列表](/di-8-zhang-gao-ji-pkgplist-shi-jian/8.4.-dong-tai-yu-jing-tai-ruan-jian-bao-lie-biao)
* [8.5.自动创建软件包列表](/di-8-zhang-gao-ji-pkgplist-shi-jian/8.5.-zi-dong-chuang-jian-ruan-jian-bao-lie-biao)
* [8.6.用关键词扩展软件包列表](/di-8-zhang-gao-ji-pkgplist-shi-jian/8.6.-yong-guan-jian-ci-kuo-zhan-ruan-jian-bao-lie-biao)

## 第 9 章 pkg-\*

* [9.1.pkg-message（安装二进制包时显示的消息文件）](/di-9-zhang-pkg/9.1.pkgmessage-an-zhuang-er-jin-zhi-bao-shi-xian-shi-de-xiao-xi-wen-jian)
* [9.2.pkg-install、pkg-pre-install 和 pkg-post-install（安装二进制包时执行的脚本文件）](/di-9-zhang-pkg/9.2.-pkginstall-an-zhuang-er-jin-zhi-bao-shi-zhi-hang-de-jiao-ben-wen-jian)
* [9.3.pkg-deinstall、pkg-pre-deinstall 和 pkg-post-deinstall（卸载时执行的脚本文件）](/di-9-zhang-pkg/9.3.pkgdeinstall-xie-zai-shi-zhi-hang-de-jiao-ben-wen-jian)
* [9.4.修改 pkg-\* 文件的名字](/di-9-zhang-pkg/9.4.-xiu-gai-pkg-wen-jian-de-ming-zi)
* [9.5.使用 SUB\_FILES 和 SUB\_LIST](/di-9-zhang-pkg/9.5.-shi-yong-subfiles-he-sublist)

## 第 10 章 测试 port

* [10.1.运行 make describe](/di-10-zhang-ce-shi-port/10.1.-yun-hang-make-describe)
* [10.2.运行 make test](/di-10-zhang-ce-shi-port/10.2-yun-hang-make-test)
* [10.3.Portclippy / Portfmt](/di-10-zhang-ce-shi-port/10.3.portclippy-portfmt)
* [10.4.Portlint](/di-10-zhang-ce-shi-port/10.4.portlint)
* [10.5.Port 工具](/di-10-zhang-ce-shi-port/10.5.porttools)
* [10.6.PREFIX 和 DESTDIR](/di-10-zhang-ce-shi-port/10.6.prefix-he-destdir)
* [10.7.Poudriere](/di-10-zhang-ce-shi-port/10.7.poudriere)
* [10.8.调试 port](/di-10-zhang-ce-shi-port/10.8.tiao-shi-port)

## 第 11 章 升级 port

* [11.1.使用 Git 制作补丁](/di-11-zhang-sheng-ji-port/11.1.-shi-yong-git-zhi-zuo-bu-ding)
* [11.2.UPDATING 和 MOVED](/di-11-zhang-sheng-ji-port/11.2.updating-he-moved)

## 第 12 章 安全

* [12.1.安全为何如此重要](/di-12-zhang-an-quan/12.1.-wei-he-an-quan-ru-ci-zhong-yao)
* [12.2.修复安全漏洞](/di-12-zhang-an-quan/12.2.-xiu-fu-an-quan-lou-dong)
* [12.3.向社区通报情况](/di-12-zhang-an-quan/12.3.-rang-she-qu-le-jie-qing-kuang)

## 第 13 章 该做什么和不该做什么

* [第 13 章 该做什么和不该做什么](/di-13-zhang-gai-zuo-shen-me-he-bu-gai-zuo-shen-me/di-13-zhang)

## 第 14 章 一个示例 Makefile

* [第 14 章 一个示例 Makefile](/di-14-zhang-yi-ge-shi-li-makefile/di-14-zhang-makefile-shi-li)

## 第 15 章 在 Port Makefile 中变量的顺序

* [第 15 章 在 Port Makefile 中变量的顺序](/di-15-zhang-zai-port-makefile-zhong-bian-liang-de-shun-xu/di-15-zhang)

## 第 16 章 保持更新

* [第 16 章 保持更新](/di-16-zhang-bao-chi-geng-xin/di-16-zhang)

## 第 17 章 使用 USES 宏

* [第 17 章 使用 USES 宏](/di-17-zhang-shi-yong-uses-hong/di-17-zhang)

## 第 18 章 `__FreeBSD_version` 的值

* [第 18 章 `__FreeBSD_version` 的值](/di-18-zhang-freebsdversion-de-zhi/18)


# 1.1.简介

FreeBSD Ports Collection 是几乎所有人安装应用程序（“Ports”）的方式。和 FreeBSD 的其他方面一样，它主要依靠志愿者的努力。阅读本文档时，请记住这一点。

在 FreeBSD 中，任何人都可以提交新 Port，或者自愿维护现有的无人维护的 Port。不需要特别的提交权限。


# 2.1.制作新的 Port

想要创建新 Port，或升级现有的 Port？太好了！

接下来是一些为 FreeBSD 创建新 Port 的指导方针。要升级现有的 Port，请阅读本文，然后阅读[升级 Port](https://docs.freebsd.org/en/books/porters-handbook/upgrading/#port-upgrading)。

当本文档内容不够详细时，请参考 **/usr/ports/Mk/bsd.port.mk**，所有 Port 的 `Makefile` 都会包含该文件。即使不是每天修改 `Makefile` 的人，也能从中获得大量知识。此外，具体的问题可以发送到 [FreeBSD Ports 邮件列表](https://lists.freebsd.org/subscription/freebsd-ports)。

> **注意**
>
> 本文档仅提到了一小部分可以被覆盖的变量（`VAR`）。大部分（如果不是全部的话）已在 **/usr/ports/Mk/bsd.port.mk** 开头处说明；其余的可能也应当加以说明。请注意，该文件使用了非标准的制表符设置：Emacs 和 Vim 会在加载该文件时识别该设置。加载文件后，通过输入 `:set tabstop=4` 可以将 [vi(1)](https://man.freebsd.org/cgi/man.cgi?query=vi\&sektion=1\&format=html) 和 [ex(1)](https://man.freebsd.org/cgi/man.cgi?query=ex\&sektion=1\&format=html) 都设置为正确的值。

想找一些简单的入门项目？查看 [请求的 Port 列表](https://wiki.freebsd.org/WantedPorts)，看看你是否能着手处理其中一个（或多个）。


# 3.1.编写 Makefile

本节说明了如何快速创建新 Port。对于那些快速方法不够充分的应用程序，完整的“慢速移植”过程在 [慢速移植](https://docs.freebsd.org/en/books/porters-handbook/slow-porting/#slow-porting) 中有详细说明。

首先，获取原始的 tarball 文件并将其放入 `DISTDIR`，默认路径为 **/usr/ports/distfiles**。

> **注意**
>
> 这些步骤假设软件可以开箱即用编译运行。换句话说，应用程序在 FreeBSD 系统上运行时完全不需要修改。如果需要修改，请参考 [慢速移植](https://docs.freebsd.org/en/books/porters-handbook/slow-porting/#slow-porting)。

> **注意**
>
> 建议在进行移植之前，在 **/etc/make.conf** 中设置 [make(1)](https://man.freebsd.org/cgi/man.cgi?query=make\&sektion=1\&format=html) 变量 `DEVELOPER`。
>
> ```sh
> # echo DEVELOPER=yes >> /etc/make.conf
> ```
>
> 此设置启用“开发者模式”，该模式会显示弃用警告，并在调用 `make` 时激活一些额外的质量检查。

***

**Makefile** 的最简版本看起来如下所示：

```makefile
PORTNAME=	oneko
DISTVERSION=	1.1b
CATEGORIES=	games
MASTER_SITES=	ftp://ftp.rediris.es/sites/ftp.freebsd.org/pub/FreeBSD/

MAINTAINER=	youremail@example.com
COMMENT=	Cat chasing a mouse all over the screen
WWW=		http://www.daidouji.com/oneko/

.include <bsd.port.mk>
```

尝试理解它。更详细的示例请参见 [示例 Makefile](https://docs.freebsd.org/en/books/porters-handbook/porting-samplem/#porting-samplem) 部分。


# 3.2.编写描述文件

有两个描述文件是每个 Port 必需的，无论它是否实际打包。它们是 **pkg-descr** 和 **pkg-plist**。它们的 **pkg-** 前缀将它们与其他文件区分开来。

## 3.2.1. **pkg-descr**

这是 Port 的详细描述。简洁地用一到几段话解释该 Port 的功能即可。

> **注意**
>
> 这不是手册，也不是如何使用或编译 Port 的详细描述！*从 **README** 或手册页复制时请小心*。它们往往不是对 Port 的简洁描述，或者格式不合适。例如，手册页有对齐空格，这在等宽字体下看起来特别难看。
>
> 另一方面，**pkg-descr** 的内容必须比 [Makefile 中的 `COMMENT` 行](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-comment) 更长。它必须更深入地解释该 Port 的功能。

编写得好的 **pkg-descr** 完全描述了 Port，使用户不必查阅文档或访问网站，就能理解该软件的功能、用途或特别的优点。提及一些要求，如图形工具包、较重的依赖关系、运行时环境或实现语言，有助于用户决定这个 Port 是否适合他们。

> **注意**
>
> 以前在 **pkg-descr** 文件的最后一行包含的 URL 已经移到 **Makefile** 中。

## 3.2.2. **pkg-plist**

该文件列出了 Port 安装的所有文件。它也叫做“打包列表”，因为软件包是通过打包这里列出的文件生成的。路径名是相对于安装前缀（通常是 **/usr/local**）的。

下面是个小示例：

```sh
bin/oneko
man/man1/oneko.1.gz
lib/X11/app-defaults/Oneko
lib/X11/oneko/cat1.xpm
lib/X11/oneko/cat2.xpm
lib/X11/oneko/mouse.xpm
```

有关打包列表的详细信息，请参阅 [pkg-create(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-create\&sektion=8\&format=html) 手册页。

> **注意**
>
> 推荐将此文件中的所有文件名按字母顺序排列。这样在升级 Port 时验证更改会更容易。排序应在变量展开后进行。框架在 [自动生成](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-autoplist) 包列表时会正确地进行排序。

> **技巧**
>
> 手动创建打包列表可能是一个非常繁琐的任务。如果 Port 安装了大量文件，[自动创建打包列表](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-autoplist) 可能会节省时间。

只有在一种情况下，**pkg-plist** 可以从 Port 中省略。如果 Port 仅安装少量文件，则可以在 Port 的 **Makefile** 中通过 `PLIST_FILES` 列出它们。例如，我们可以通过将以下行添加到 **Makefile** 中来省略上述 **oneko** Port 的 **pkg-plist**：

```makefile
PLIST_FILES=	bin/oneko \
		man/man1/oneko.1.gz \
		lib/X11/app-defaults/Oneko \
		lib/X11/oneko/cat1.xpm \
		lib/X11/oneko/cat2.xpm \
		lib/X11/oneko/mouse.xpm
```

> **注意**
>
> 不应滥用 `PLIST_FILES`。在寻找文件的来源时，人们通常会尝试在 Ports 树中的 **pkg-plist** 文件中查找。将文件列在 **Makefile** 中的 `PLIST_FILES` 会使得此类搜索更加困难。

> **技巧**
>
> 如果 Port 需要创建一个空目录，或者在安装过程中在 **${PREFIX}** 外部创建目录，请参考 [清理空目录](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-dir-cleaning) 以获取更多信息。

> **技巧**
>
> 由于 `PLIST_FILES` 是一个 [make(1)](https://man.freebsd.org/cgi/man.cgi?query=make\&sektion=1\&format=html) 变量，因此任何包含空格的条目都必须加上引号。例如，如果使用 [pkg-create(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-create\&sektion=8\&format=html) 和 [通过关键字扩展包列表](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-keywords) 中描述的关键字，条目必须加上引号。
>
> ```makefile
> PLIST_FILES=	"@sample ${ETCDIR}/oneko.conf.sample"
> ```

稍后我们将看到如何使用 **pkg-plist** 和 `PLIST_FILES` 来完成 [更复杂的任务](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist)。


# 3.3.创建校验和文件

只需运行 `make makesum`。Ports 框架将自动生成 **distinfo**。不要尝试手动生成该文件。


# 3.4.测试 Port

确保 Port 规则完全符合预期，包括打包 Port。需要验证以下几个重要点：

* **pkg-plist** 中不应包含任何未由 Port 安装的文件。
* **pkg-plist** 中应包含 Port 安装的所有文件。
* 可以使用 `install` 目标安装 Port。这验证了安装脚本可以正确工作。
* 可以使用 `deinstall` 目标正确卸载 Port。这验证了卸载脚本可以正确工作。
* Port 仅在 `fetch` 目标阶段才能访问网络资源。这对于包构建器非常重要，比如 [ports-mgmt/poudriere](https://cgit.freebsd.org/ports/tree/ports-mgmt/poudriere/)。
* 确保 `make package` 可以作为普通用户运行（即，不是作为 `root`）。如果失败，软件可能需要打补丁。另请参见 [`fakeroot`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-fakeroot) 和 [`uidfix`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-uidfix)。

推荐的测试顺序：

1. `make stage`
2. `make stage-qa`
3. `make package`
4. `make install`
5. `make deinstall`
6. `make package`（作为用户）

确保所有阶段没有警告。

可以通过 Ports Collection 中的 [ports-mgmt/poudriere](https://cgit.freebsd.org/ports/tree/ports-mgmt/poudriere/) 进行全面的自动化测试，详细信息请参见 [poudriere](https://docs.freebsd.org/en/books/porters-handbook/testing/#testing-poudriere)。它维护了 `jails`，可以在不影响主机系统状态的情况下测试上述所有步骤。


# 3.5.用 portlint 来检查 Port

请使用 `portlint` 检查 Port 是否符合我们的规范。[ports-mgmt/portlint](https://cgit.freebsd.org/ports/tree/ports-mgmt/portlint/) 程序是 Ports Collection 的一部分。特别是，检查 [Makefile](https://docs.freebsd.org/en/books/porters-handbook/porting-samplem/#porting-samplem) 是否符合规范，以及 [package](https://docs.freebsd.org/en/books/porters-handbook/porting-pkgname/#porting-pkgname) 是否命名得当。

> **重要**
>
> 不要盲目跟随 `portlint` 输出的结果。它是一个静态 lint 工具，有时会出错。


# 3.6.提交新的 Port

在提交新的 Port 之前，请阅读 [DOs 和 DON’Ts](https://docs.freebsd.org/en/books/porters-handbook/porting-dads/#porting-dads) 部分。

如果你对 Port 满意，剩下的就是将它放入 FreeBSD 的主 Ports 树，并让其他人也感到满意。

> **重要**
>
> 我们不需要 **work** 目录或 **pkgname.txz** 包，所以现在就删除它们。

接下来，创建一个 [patch(1)](https://man.freebsd.org/cgi/man.cgi?query=patch\&sektion=1\&format=html) 文件。假设该 Port 名为 `oneko`，并位于 `games` 分类下。

**示例 1. 为新 Port 创建 .diff 文件**

使用 `git add .` 添加所有文件，然后用 `git diff` 查看差异。例如：

```sh
% git add .
% git diff --staged
```

确保所有必要的文件都已包括，然后将更改提交到本地分支，并使用 `git format-patch` 生成补丁：

```sh
% git commit
% git format-patch origin/main
```

使用 `git format-patch` 生成的补丁会包括作者的身份和电子邮件地址，使开发人员能够更容易地应用补丁（使用 `git am`），并正确归属功劳。

> **重要**
>
> 为了方便提交者在其 Ports 树的工作副本中应用补丁，请从 Ports 树的根目录生成 **.diff** 文件。

通过 [问题报告提交表单](https://bugs.freebsd.org/submit/) 提交 **oneko.diff**。选择产品 "Ports & Packages"，组件 "Individual Port(s)"，并遵循那里显示的指南。在 PR 的描述字段中添加该程序的简短描述（也许是 `COMMENT` 的简短版本），并记得将 **oneko.diff** 作为附件添加。

> **注意**
>
> 在问题报告的总结中给出一个好的说明，可以让 Port 提交者和分类员的工作变得更容易。新 Port 的预期格式是 "**\[NEW PORT]** *类别/Port 名 Port 简要描述*"。使用这个格式可以让提交新 Port 的工作开始得更快更顺利。

提交 Port 后，请耐心等待。将新 Port 纳入 FreeBSD 的时间可能从几天到几个月不等。问题报告数据库的简单搜索表单可在 <https://bugs.freebsd.org/bugzilla/query.cgi> 访问。

要列出 *Open* 状态的 Port PR，可以在搜索表单中选择 *Open* 和 *Ports & Packages*，然后点击 **Search**。

在查看新 Port 后，我们会根据需要回复，并将其提交到 Ports 树中。提交者的名字也会被添加到 [Additional FreeBSD Contributors](https://docs.freebsd.org/en/articles/contributors/#contrib-additional) 和其他文件的列表中。

> **重要**
>
> 之前提交新 Port 的补丁可以使用 [shar(1)](https://man.freebsd.org/cgi/man.cgi?query=shar\&sektion=1\&format=html) 文件；但随着 [git(1)](https://man.freebsd.org/cgi/man.cgi?query=git\&sektion=1\&format=html) 的发展，这已经不再是有效的方式。提交者现在不再接受 [shar(1)](https://man.freebsd.org/cgi/man.cgi?query=shar\&sektion=1\&format=html) 文件，因为它容易出错，并且不会在分类的 **Makefile** 中添加相关条目。


# 4.1 Port 工作原理

好的，看来这并没有那么简单，Port 需要一些修改才能正常工作。在本节中，我们将逐步解释如何修改它，以使其适应 Ports 的使用模式。

***

首先，当用户在 Port 目录下输入 `make` 时，会发生以下事件。在阅读本节时，在另一个窗口中打开 **bsd.port.mk** 有助于理解这一过程。

但别担心，并没有多少人完全理解 **bsd.port.mk** 的工作原理… *:-)*

1. `fetch` 目标运行。`fetch` 目标负责确保 tarball 文件存在于本地的 `DISTDIR` 中。如果 `fetch` 在 `DISTDIR` 找不到所需的文件，它会查找 **Makefile** 中定义的 `MASTER_SITES` URL，或者我们将 distfiles 放入的 FTP 镜像站点作为备份。它将尝试使用 `FETCH` 下载指定的分发文件，假设发起请求的站点可以直接访问互联网。如果下载成功，文件将保存在 `DISTDIR` 中供将来使用，然后继续进行下一步。
2. `extract` 目标运行。该目标会在 `DISTDIR` 中查找 Port 的分发文件（通常是压缩的 tarball 文件），并将其解压到 `WRKDIR` 指定的临时子目录中（默认是 **work**）。
3. `patch` 目标运行。首先，应用在 `PATCHFILES` 中定义的补丁。其次，如果在 `PATCHDIR` 中找到任何名为 **patch-**\* 的补丁文件（默认位于 **files** 子目录中），则按字母顺序在此时应用它们。
4. `configure` 目标运行。这个目标可以执行许多不同的操作。
   1. 如果存在，则运行 **scripts/configure**。
   2. 如果设置了 `HAS_CONFIGURE` 或 `GNU_CONFIGURE`，则运行 **WRKSRC/configure**。
5. `build` 目标运行。该目标负责进入 Port 的私有工作目录（`WRKSRC`）并进行编译。
6. `stage` 目标运行。这个目标将最终构建好的文件放入一个临时目录（`STAGEDIR`，请参见 [Staging](https://docs.freebsd.org/en/books/porters-handbook/special/#staging)）。该目录的层级结构与将要安装该包的系统相对应。
7. `package` 目标运行。这个目标会根据 `stage` 目标期间创建的临时目录中的文件以及 Port 的 **pkg-plist** 来创建一个包。
8. `install` 目标运行。这个目标将通过 `package` 目标创建的包安装到主机系统中。

以上是默认的操作步骤。此外，可以定义 `pre-something` 或 `post-something` 目标，或在 **scripts** 子目录中放置相应的脚本，它们将在默认操作前后执行。

例如，如果 **Makefile** 中定义了 `post-extract` 目标，并且 **scripts** 子目录中有一个 **pre-build** 文件，那么 `post-extract` 目标将在常规的解压操作之后被调用，而 **pre-build** 文件则会在默认的构建规则之前执行。建议在操作较简单时使用 **Makefile** 目标，因为这样更容易让其他人理解 Port 需要什么样的非默认操作。

默认的操作由 **bsd.port.mk** 中的 `do-something` 目标完成。例如，解压 Port 的命令位于 `do-extract` 目标中。如果默认目标没有正确执行某个操作，可以重新定义 **Makefile** 中的 `do-something` 目标。

> **注意**
>
> “主要”目标（例如 `extract`、`configure` 等）只不过是确保所有前置阶段都已完成，然后调用真正的目标或脚本，它们不应该被修改。要修复解压问题，就修改 `do-extract`，但绝不能改变 `extract` 的操作！另外，`post-deinstall` 目标无效，Port 基础设施不会运行它。

了解了用户输入 `make install` 时的操作流程之后，接下来我们将逐步介绍如何创建完美的 Port。


# 4.2.获取源代码

获取原始源代码（通常是压缩的 tarball 文件，**foo.tar.gz** 或 **foo.tar.bz2**），并将其复制到 `DISTDIR` 中。尽可能使用 *主流* 的源代码。

将变量 `MASTER_SITES` 设置为原始 tarball 存放的位置。对于大多数主流站点，**bsd.sites.mk** 中有快捷方式定义。如果可能的话，请使用这些站点及其相关定义，以避免在源代码中重复相同的信息。由于这些站点会随着时间的推移发生变化，这会成为所有相关人员维护上的噩梦。有关详细信息，请参见 [`MASTER_SITES`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-master_sites)。

如果没有一个 FTP/HTTP 站点与互联网连接良好，或者只能找到格式令人烦恼的非标准站点，请将源文件放在可靠的 FTP 或 HTTP 服务器上（例如，个人主页）。

如果找不到合适且可靠的地方来存放 distfile，我们可以将其“寄存”在 `ftp.FreeBSD.org` 上；然而，这种方法是最不推荐的。distfile 必须放在某个 `freefall` 账户的 **\~/public\_distfiles/** 目录下。请让提交该 Port 的人来完成此操作。这个人还会将 `MASTER_SITES` 设置为 `LOCAL/username`，其中 `username` 是他们的 FreeBSD 集群登录名。

如果 Port 的 distfile 经常变化，而作者没有进行版本更新，请考虑将 distfile 放在个人主页上，并将其列为第一个 `MASTER_SITES`。尝试说服作者停止这样做；这确实有助于建立某种源代码管理。托管特定版本将防止用户遇到 `checksum mismatch` 错误，并减少我们 FTP 站点维护者的工作量。此外，如果一个 Port 只有一个主站点，建议将备份放在个人主页上，并将其列为第二个 `MASTER_SITES`。

如果 Port 需要额外的补丁，并且这些补丁可以从互联网下载，请同样将它们下载并放入 `DISTDIR`。即使这些补丁来自与主要源代码 tarball 不同的网站，也不需要担心，我们有办法处理这种情况（请参见下文对 [PATCHFILES](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-patchfiles) 的描述）。


# 4.3.修改 Port

在一个私有目录中解压 tarball 的副本，并进行必要的修改，以确保该 Port 可以在当前版本的 FreeBSD 下正确编译。要**仔细记录**每个步骤，因为稍后将需要将这些步骤自动化。当 Port 完成时，所有操作，包括文件的删除、添加或修改，都必须可以通过自动化脚本或补丁文件来完成。

如果 Port 需要大量的用户交互或定制来编译或安装，可以参考 Larry Wall 的经典 Configure 脚本，可能需要做一些类似的工作。新的 Ports Collection 的目标是使每个 Port 尽可能“即插即用”，同时占用最小的磁盘空间。

> **注意**
>
> 除非明确说明，否则创建并贡献给 FreeBSD Ports Collection 的补丁文件、脚本及其他文件，都假设受标准 BSD 版权条件约束。


# 4.4.打补丁

在准备 Port 时，可以使用 [diff(1)](https://man.freebsd.org/cgi/man.cgi?query=diff\&sektion=1\&format=html) 记录已添加或修改的文件，稍后将这些差异提供给 [patch(1)](https://man.freebsd.org/cgi/man.cgi?query=patch\&sektion=1\&format=html)。对典型文件进行此操作时，需要在进行任何更改之前，使用 **.orig** 后缀保存原始文件的副本。

```sh
% cp file file.orig
```

在所有更改完成后，`cd` 回到 Port 目录。使用 `make makepatch` 在 **files** 目录中生成更新的补丁文件。

> **技巧**
>
> 使用 `BINARY_ALIAS` 在构建过程中替代硬编码命令，避免修改构建文件。有关更多信息，请参阅 [使用 `BINARY_ALIAS` 重命名命令，而不是修改构建](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#binary-alias)。

## 4.4.1. 补丁的一般规则

补丁文件存储在 `PATCHDIR` 中，通常是 **files/**，从这里它们会被自动应用。所有补丁必须相对于 `WRKSRC`。通常 `WRKSRC` 是 `WRKDIR` 的子目录，即提取 distfile 的目录。使用 `make -V WRKSRC` 查看实际路径。补丁名称需要遵循以下规则：

* 避免多个补丁修改同一个文件。例如，**patch-foobar.c** 和 **patch-foobar.c2** 都修改 **${WRKSRC}/foobar.c**，这样会使补丁变得脆弱且难以调试。
* 在创建补丁文件名时，将每个下划线 (`_`) 替换为两个下划线 (`__`)，将每个斜杠 (`/`) 替换为一个下划线 (`_`)。例如，要修补名为 **src/freeglut\_joystick.c** 的文件，对应的补丁应命名为 **patch-src\_freeglut\_\_joystick.c**。不要使用像 **patch-aa** 或 **patch-ab** 这样的命名方式。始终在补丁名称中使用路径和文件名。使用 `make makepatch` 可以自动生成正确的名称。
* 如果更改相关，补丁可以修改多个文件，并且补丁名称应适当命名。例如，**patch-add-missing-stdlib.h**。
* 补丁名称只能使用字符 `[-+._a-zA-Z0-9]`。特别地，*不要使用 `::` 作为路径分隔符*，应使用 `_` 代替。

尽量减少补丁中的非功能性空白字符更改。在开源世界中，项目常常共享大量代码库，但遵循不同的样式和缩进规则。当从一个项目中提取出一个工作功能并修复另一个项目中的类似问题时，请小心：结果补丁可能充满了非功能性更改。这不仅增加了 Ports 仓库的大小，还使得很难确定到底是什么导致了问题，或者具体修改了哪些内容。

如果必须删除文件，请在 `post-extract` 目标中进行，而不是作为补丁的一部分。

## 4.4.2. 手动生成补丁

> **注意**
>
> 通常不需要手动创建补丁。自动生成补丁，如本节前述，通常是首选方法。然而，有时可能需要手动补丁。

补丁保存为名为 **patch-\*** 的文件，其中 \* 表示被修补的文件路径名，例如 **patch-Imakefile** 或 **patch-src-config.h**。不以 **patch-** 开头的补丁文件名将不会被自动应用。

修改文件后，使用 [diff(1)](https://man.freebsd.org/cgi/man.cgi?query=diff\&sektion=1\&format=html) 记录原始文件和修改后文件之间的差异。`-u` 选项使 [diff(1)](https://man.freebsd.org/cgi/man.cgi?query=diff\&sektion=1\&format=html) 生成“统一”格式的差异，这是首选格式。

```sh
% diff -u file.orig file > patch-pathname-file
```

当为新添加的文件生成补丁时，使用 `-N` 告诉 [diff(1)](https://man.freebsd.org/cgi/man.cgi?query=diff\&sektion=1\&format=html) 将不存在的原始文件视为存在但为空的文件：

```sh
% diff -u -N newfile.orig newfile > patch-pathname-newfile
```

使用 [diff(1)](https://man.freebsd.org/cgi/man.cgi?query=diff\&sektion=1\&format=html) 的递归选项 (`-r`) 生成补丁是可以的，但请检查生成的补丁，确保其中没有不必要的内容。特别是，两个备份文件之间的差异、当 Port 使用 `Imake` 或 GNU `configure` 时的 **Makefile** 之间的差异等，都是不必要的，应该删除。如果需要编辑 **configure.in** 并运行 `autoconf` 以重新生成 `configure`，不要对 `configure` 进行差异比较（它通常会变得很大，达到几千行！）。相反，定义 `USES=autoreconf`，并对 **configure.in** 进行差异比较。

## 4.4.3. 简单自动替换

可以通过 Port 的 **Makefile** 直接使用 [sed(1)](https://man.freebsd.org/cgi/man.cgi?query=sed\&sektion=1\&format=html) 的原地模式进行简单的替换。这对于需要使用变量值的更改非常有用：

```makefile
post-patch:
	@${REINPLACE_CMD} -e 's|/usr/local|${PREFIX}|g' ${WRKSRC}/Makefile
```

> **重要**
>
> 仅使用 [sed(1)](https://man.freebsd.org/cgi/man.cgi?query=sed\&sektion=1\&format=html) 来替换变量内容。必须使用补丁文件而不是 [sed(1)](https://man.freebsd.org/cgi/man.cgi?query=sed\&sektion=1\&format=html) 来替换静态内容。

在移植软件时，源文件中常常使用 CR/LF 换行符约定。这可能会导致进一步打补丁时出现问题、编译警告或脚本执行错误（例如 `/bin/sh^M not found`）。要快速将所有文件从 CR/LF 转换为仅 LF，可以在 Port 的 **Makefile** 中添加以下内容：

```makefile
USES=	dos2unix
```

可以指定要转换的特定文件列表：

```makefile
USES=	dos2unix
DOS2UNIX_FILES=	util.c util.h
```

使用 `DOS2UNIX_REGEX` 可以跨子目录转换一组文件。其参数是一个与 [find(1)](https://man.freebsd.org/cgi/man.cgi?query=find\&sektion=1\&format=html) 兼容的正则表达式。有关格式的更多信息，请参阅 [re\_format(7)](https://man.freebsd.org/cgi/man.cgi?query=re_format\&sektion=7\&format=html)。此选项对于转换所有具有特定扩展名的文件非常有用。例如，转换所有源代码文件，而保持二进制文件不变：

```makefile
USES=	dos2unix
DOS2UNIX_REGEX=	.*\.([ch]|cpp)
```

类似的选项是 `DOS2UNIX_GLOB`，它会对其中列出的每个元素运行 `find`。

```makefile
USES=	dos2unix
DOS2UNIX_GLOB=	*.c *.cpp *.h
```

可以设置转换的基础目录。这在存在多个 distfile 且其中几个文件需要进行行结束符转换时非常有用。

```makefile
USES=	dos2unix
DOS2UNIX_WRKSRC=	${WRKDIR}
```

## 4.4.4. 条件性打补丁

有些 Ports 需要在特定的 FreeBSD 版本或启用/禁用某个选项时才应用补丁。条件性补丁通过将补丁文件的完整路径添加到 `EXTRA_PATCHES` 中来指定。条件性补丁的文件名通常以 **extra-** 开头，虽然这不是必须的。然而，它们的文件名 *不能* 以 **patch-** 开头。如果以 **patch-** 开头，框架将无条件地应用它们，这对条件性补丁来说是不可取的。

**示例 1. 针对特定 FreeBSD 版本应用补丁**

```makefile
.include <bsd.port.options.mk>

# 在此之前打上 iconv const 限定符
.if ${OPSYS} == FreeBSD && ${OSVERSION} < 1100069
EXTRA_PATCHES=	${PATCHDIR}/extra-patch-fbsd10
.endif

.include <bsd.port.mk>
```

**示例 2. 可选地应用补丁**

当一个 [选项](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-options) 需要补丁时，可以使用 `opt_EXTRA_PATCHES` 和 `opt_EXTRA_PATCHES_OFF` 使补丁依赖于 `opt` 选项。有关更多信息，请参阅 [通用变量替换，`OPT_VARIABLE` 和 `OPT_VARIABLE_OFF`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-variables)。

```makefile
OPTIONS_DEFINE=	  FOO BAR
FOO_EXTRA_PATCHES=  ${PATCHDIR}/extra-patch-foo
BAR_EXTRA_PATCHES_OFF=	${PATCHDIR}/extra-patch-bar.c \
		${PATCHDIR}/extra-patch-bar.h
```

**示例 3. 将 `EXTRA_PATCHES` 与目录配合使用**

有时，某个功能需要多个补丁，在这种情况下，可以将 `EXTRA_PATCHES` 指向一个目录，它将自动应用该目录中所有名为 **patch-\*** 的文件。

在 **${PATCHDIR}** 中创建一个子目录，并将补丁文件移入其中。例如：

```sh
% ls -l files/foo-patches
-rw-r--r--  1 root  wheel    350 Jan 16 01:27 patch-Makefile.in
-rw-r--r--  1 root  wheel   3084 Jan 18 15:37 patch-configure.ac
```

然后将以下内容添加到 **Makefile** 中：

```makefile
OPTIONS_DEFINE=	FOO
FOO_EXTRA_PATCHES=	${PATCHDIR}/foo-patches
```

框架将会使用该目录中所有名为 **patch-\*** 的文件。


# 4.5.配置

将任何额外的自定义命令包含到 **configure** 脚本中，并将其保存在 **scripts** 子目录中。如上所述，也可以通过 **Makefile** 目标和/或名为 **pre-configure** 或 **post-configure** 的脚本来实现这一点。


# 4.6.处理用户输入

如果 Port 在构建、配置或安装时需要用户输入，请在 **Makefile** 中设置 `IS_INTERACTIVE`。这将允许“过夜构建”跳过这些步骤。如果用户在环境中设置了变量 `BATCH`（如果用户同时设置了变量 `INTERACTIVE`，那么*只有*那些需要交互的 Ports 会被构建）。这将节省那些持续构建 Ports 的机器上的大量时间（见下文）。

如果问题有合理的默认答案，建议在 `PACKAGE_BUILDING` 被设置时使用它来关闭交互式脚本。这将允许我们为 CDROM 和 FTP 构建软件包。


# 5.1.原始来源

配置 **Makefile** 非常简单，再次建议在开始之前查看现有的示例。此外，本手册中有个 [示例 Makefile](https://docs.freebsd.org/en/books/porters-handbook/porting-samplem/#porting-samplem)，请查看并遵循该模板中的变量和部分的顺序，以便其他人更容易阅读 Port。

在设计新的 **Makefile** 时，请按顺序考虑以下问题：

***

它是否以类似 **foozolix-1.2.tar.gz** 的标准 `gzip` 压缩 tarball 存储在 `DISTDIR` 中？如果是，继续下一步。如果不是，分发文件格式可能需要覆盖 `DISTVERSION`、`DISTNAME`、`EXTRACT_CMD`、`EXTRACT_BEFORE_ARGS`、`EXTRACT_AFTER_ARGS`、`EXTRACT_SUFX` 或 `DISTFILES` 中的一个或多个。

在最坏的情况下，可以创建自定义的 `do-extract` 目标来覆盖默认设置。但这种情况很少发生，几乎不需要。


# 5.2.命名

Port 的 **Makefile** 的第一部分命名 Port，描述其版本号，并将其列入正确的类别。

## 5.2.1. `PORTNAME`

将 `PORTNAME` 设置为软件的基础名称。它作为 FreeBSD 包的基础名称，并用于 [`DISTNAME`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-distname)。

> **重要**
>
> 包名称必须在整个 Ports 树中唯一。确保 `PORTNAME` 不被现有的 Port 使用，并且没有其他 Port 使用相同的 `PKGBASE`。如果该名称已被使用，可以添加 [`PKGNAMEPREFIX` 或 `PKGNAMESUFFIX`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-pkgnameprefix-suffix)。

## 5.2.2. 版本，`DISTVERSION` *或* `PORTVERSION`

将 `DISTVERSION` 设置为软件的版本号。

`PORTVERSION` 是用于 FreeBSD 包的版本。它将自动从 `DISTVERSION` 推导出来，以便与 FreeBSD 的包版本方案兼容。如果版本中包含字母，可能需要设置 `PORTVERSION` 而不是 `DISTVERSION`。

> **重要**
>
> 一次只能设置 `PORTVERSION` 和 `DISTVERSION` 其中一个。

有时，某些软件使用的版本方案与 `DISTVERSION` 在 `PORTVERSION` 中的转换方式不兼容。

> **技巧**
>
> 在更新 Port 时，可以使用 [pkg-version(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-version\&sektion=8\&format=html) 的 `-t` 参数检查新版本是否大于或小于之前的版本。请参阅下文了解如何使用 [pkg-version(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-version\&sektion=8\&format=html) 比较版本。

**示例 1. 使用** [**pkg-version(8)**](https://man.freebsd.org/cgi/man.cgi?query=pkg-version\&sektion=8\&format=html) **比较版本**

`pkg version -t` 接受两个版本作为参数，如果第一个版本小于、等于或大于第二个版本，它会分别返回 `<`、`=` 或 `>`。

```sh
% pkg version -t 1.2 1.3
< ①
% pkg version -t 1.2 1.2
= ②
% pkg version -t 1.2 1.2.0
= ③
% pkg version -t 1.2 1.2.p1
> ④
% pkg version -t 1.2.a1 1.2.b1
< ⑤
% pkg version -t 1.2 1.2p1
< ⑥
```

* ① `1.2` 在 `1.3` 之前。
* ② `1.2` 和 `1.2` 相等，因为它们版本相同。
* ③ `1.2` 和 `1.2.0` 相等，因为零等同于没有。
* ④ `1.2` 在 `1.2.p1` 之后，因为 `.p1`，可以理解为“预发布 1”。
* ⑤ `1.2.a1` 在 `1.2.b1` 之前，可以理解为“alpha”和“beta”，`a` 在 `b` 之前。
* ⑥ `1.2` 在 `1.2p1` 之前，可以理解为“2，修补级别 1”，它是任何 `2.X` 后但在 `3` 之前的版本。

在这里，`a`、`b` 和 `p` 被用作“alpha”、“beta”或“预发布”和“修补级别”的缩写，但它们只是字母，按字母顺序排序，因此可以使用任何字母，它们将按适当的顺序排序。

**表 1. `DISTVERSION` 和派生的 `PORTVERSION` 示例**

| DISTVERSION | PORTVERSION |
| ----------- | ----------- |
| 0.7.1d      | 0.7.1.d     |
| 10Alpha3    | 10.a3       |
| 3Beta7-pre2 | 3.b7.p2     |
| 8:f\_17     | 8f.17       |

**示例 2. 使用 `DISTVERSION`**

当版本号仅包含由点、破折号或下划线分隔的数字时，使用 `DISTVERSION`。

```makefile
PORTNAME=   nekoto
DISTVERSION=	1.2-4
```

这将生成 `PORTVERSION` 为 `1.2.4`。

**示例 3. 使用 `DISTVERSION` 当版本以字母或前缀开始**

当版本以字母、前缀或后缀（这些不是版本的一部分）开始或结束时，使用 `DISTVERSIONPREFIX`、`DISTVERSION` 和 `DISTVERSIONSUFFIX`。

如果版本是 `v1.2-4`：

```makefile
PORTNAME=   nekoto
DISTVERSIONPREFIX=  v
DISTVERSION=	1_2_4
```

有时，使用 GitHub 的项目会将其名称包含在版本中。例如，版本可能是 `nekoto-1.2-4`：

```makefile
PORTNAME=   nekoto
DISTVERSIONPREFIX=  nekoto-
DISTVERSION=	1.2_4
```

这些项目有时还会在版本末尾使用某些字符串，例如 `1.2-4_RELEASE`：

```makefile
PORTNAME=   nekoto
DISTVERSION=	1.2-4
DISTVERSIONSUFFIX=  _RELEASE
```

或者同时使用这两者，例如 `nekoto-1.2-4_RELEASE`：

```makefile
PORTNAME=   nekoto
DISTVERSIONPREFIX=  nekoto-
DISTVERSION=	1.2-4
DISTVERSIONSUFFIX=  _RELEASE
```

`DISTVERSIONPREFIX` 和 `DISTVERSIONSUFFIX` 在构建 `PORTVERSION` 时不会使用，只会用于 `DISTNAME`。

所有这些都会生成 `PORTVERSION` 为 `1.2.4`。

**示例 4. 使用 `DISTVERSION` 当版本包含字母表示 “alpha”、“beta” 或 “pre-release”**

当版本包含由点、破折号或下划线分隔的数字，且字母表示“alpha”、“beta” 或 “pre-release”（即，在没有字母的版本之前），使用 `DISTVERSION`。

```makefile
PORTNAME=   nekoto
DISTVERSION=	1.2-pre4
```

```makefile
PORTNAME=   nekoto
DISTVERSION=	1.2p4
```

这两者都会生成 `PORTVERSION` 为 `1.2.p4`，它在 1.2 之前。[pkg-version(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-version\&sektion=8\&format=html) 可用于验证这一点：

```sh
% pkg version -t 1.2.p4 1.2
<
```

**示例 5. 不使用 `DISTVERSION` 当版本包含字母表示 “Patch Level”**

当版本包含字母，但这些字母不是表示“alpha”、“beta” 或 “pre”（而是表示“修补级别”），且表示的是在没有字母的版本之后，使用 `PORTVERSION`。

```makefile
PORTNAME=   nekoto
PORTVERSION=	1.2p4
```

在这种情况下，使用 `DISTVERSION` 是不可行的，因为它会生成 `1.2.p4` 的版本，这将排在 `1.2` 之前，而不是之后。[pkg-version(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-version\&sektion=8\&format=html) 将验证这一点：

```sh
% pkg version -t 1.2 1.2.p4
> ①
% pkg version -t 1.2 1.2p4
< ②
```

* ① `1.2` 在 `1.2.p4` 之后，这在这种情况下是 *错误的*。
* ② `1.2` 在 `1.2p4` 之前，这是所需的。

对于一些更高级的设置 `PORTVERSION` 示例，当软件的版本管理方式与 FreeBSD 的版本方案不兼容，或者当分发文件本身不包含版本时，参见 [`DISTNAME`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-distname)。

## 5.2.3. `PORTREVISION` 和 `PORTEPOCH`

### 5.2.3.1. `PORTREVISION`

`PORTREVISION` 是一个单调递增的值，每次 `DISTVERSION` 增加时都会重置为 0，通常是在有新的官方供应商发布版本时。如果 `PORTREVISION` 非零，则该值会附加到包名中。`PORTREVISION` 的更改会被自动化工具（如 [pkg-version(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-version\&sektion=8\&format=html)）用于确定新包是否可用。

每次对 Port 进行更改，且该更改以某种方式影响生成的包时，都必须增加 `PORTREVISION`。这包括仅影响具有非默认 [选项](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-options) 的包的更改。

以下是需要增加 `PORTREVISION` 的示例：

* 添加补丁以修复安全漏洞、错误或为 Port 添加新功能。
* 更改 Port 的 **Makefile** 以启用或禁用包中的编译时选项。
* 更改包的打包清单或安装时的行为。例如，修改生成初始数据的脚本，如 [ssh(1)](https://man.freebsd.org/cgi/man.cgi?query=ssh\&sektion=1\&format=html) 主机密钥。
* Port 的共享库依赖项版本更新（在这种情况下，用户在安装依赖项的新版本后尝试安装旧包将失败，因为它会查找旧的 libfoo.x 而不是 libfoo.(x+1)）。
* 对 Port 的分发文件进行的静默更改，且具有重要的功能差异。例如，对分发文件的更改需要更正 `distinfo`，但 `DISTVERSION` 没有相应改变，且 `diff -ru` 比较新旧版本显示代码有非平凡的差异。
* 更改 `MAINTAINER`。

以下是一些不需要增加 `PORTREVISION` 的更改示例：

* 对 Port 骨架的样式更改，没有影响最终包的功能。
* 更改 `MASTER_SITES` 或其他对 Port 的功能性更改，不会影响生成的包。
* 对分发文件进行微小的补丁，如拼写错误修正，其重要性不足以让用户费力升级。
* 构建修复，使得原本无法编译的包变得可编译。只要这些更改不会在以前能够构建的其他平台上引入功能性变化。由于 `PORTREVISION` 反映了包的内容，如果包之前无法构建，则不需要增加 `PORTREVISION` 来标记更改。

一个经验法则是判断提交到 Port 的更改是否会让某些人受益。不管是增强功能、修复问题，还是因为新包实际上能正常工作。然后，权衡这一点与这样一个事实，即这会导致所有定期更新 Ports 树的人被迫进行更新。如果是这样，就必须增加 `PORTREVISION`。

> **注意**
>
> 如果没有增加 `PORTREVISION`，使用二进制包的人 *永远* 看不到更新。没有增加 `PORTREVISION`，包构建器无法检测到更改，因此无法重建包。

### 5.2.3.2. `PORTEPOCH`

有时，软件供应商或 FreeBSD Port 维护者会做出一些不合逻辑的决定，发布一个实际上在数字上小于之前版本的版本。例如，Port 可能从 `foo-20000801` 更新为 `foo-1.0`（前者会被错误地视为更新版本，因为 `20000801` 在数字上大于 `1`）。

> **技巧**
>
> 版本号比较的结果并不总是显而易见的。可以使用 `pkg version`（请参见 [pkg-version(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-version\&sektion=8\&format=html)）来测试两个版本号字符串的比较。例如：
>
> ```sh
> % pkg version -t 0.031 0.29
> >
> ```
>
> `>` 输出表示版本 `0.031` 被认为大于版本 `0.29`，这一点可能对 Port 维护者来说并不显而易见。

在这种情况下，必须增加 `PORTEPOCH`。如果 `PORTEPOCH` 非零，它会像前述章节中描述的那样附加到包名中。`PORTEPOCH` 绝不能减少或重置为零，因为这样会导致与先前 epoch 的包比较时出现问题。例如，这个包将无法被检测为过时。尽管新版本号 `1.0,1` 在数字上仍小于之前的版本 `20000801`，但是 `,1` 后缀会被自动化工具特殊处理并被视为大于先前包中的 `,0` 后缀。

错误地丢弃或重置 `PORTEPOCH` 会导致不断的麻烦。如果上述讨论不够清晰，请参考 [FreeBSD ports 邮件列表](https://lists.freebsd.org/subscription/freebsd-ports)。

预计大多数 Port 不会使用 `PORTEPOCH`，通过合理使用 `DISTVERSION` 或谨慎使用 `PORTVERSION`，通常可以避免在软件的未来版本更改版本结构时需要使用 `PORTEPOCH`。然而，当供应商发布没有官方版本号的版本时（例如代码“快照”版本），FreeBSD Port 维护者需要特别小心。由于有时会将版本标记为发布日期，这会在新“官方”版本发布时引起问题，正如上面的例子所示。

例如，如果在 `20000917` 发布了一个快照版本，而该软件的先前版本是 `1.2`，则不应将 `20000917` 用作 `DISTVERSION`。正确的做法是使用 `1.2.20000917` 作为 `DISTVERSION`，或者类似的格式，这样后续版本（如 `1.3`）仍然是数字上更大的版本。

### 5.2.3.3. `PORTREVISION` 和 `PORTEPOCH` 使用示例

`gtkmumble` Port，版本 `0.10`，已提交到 Ports：

```makefile
PORTNAME=	gtkmumble
DISTVERSION=	0.10
```

`PKGNAME` 变为 `gtkmumble-0.10`。

发现了一个安全漏洞，需要一个本地的 FreeBSD 补丁。`PORTREVISION` 相应地增加。

```makefile
PORTNAME=	gtkmumble
DISTVERSION=	0.10
PORTREVISION=	1
```

`PKGNAME` 变为 `gtkmumble-0.10_1`

供应商发布了一个新版本，版本号为 `0.2`（事实证明作者实际上想要的是 `0.10` 代表 `0.1.0`，而不是“0.9 后的版本”——哎呀，现在已经太迟了）。由于新的次版本 `2` 在数字上小于之前的版本 `10`，必须增加 `PORTEPOCH` 来手动强制将新包检测为“更新的”。由于这是代码的新版本发布，`PORTREVISION` 被重置为 0（或从 **Makefile** 中删除）。

```makefile
PORTNAME=	gtkmumble
DISTVERSION=	0.2
PORTEPOCH=	1
```

`PKGNAME` 变为 `gtkmumble-0.2,1`

下一个版本是 0.3。由于 `PORTEPOCH` 不会减少，因此版本变量现在是：

```makefile
PORTNAME=	gtkmumble
DISTVERSION=	0.3
PORTEPOCH=	1
```

`PKGNAME` 变为 `gtkmumble-0.3,1`

> **注意**
>
> 如果在此升级中将 `PORTEPOCH` 重置为 `0`，那么安装了 `gtkmumble-0.10_1` 包的用户将无法检测到 `gtkmumble-0.3` 包为更新的版本，因为 `3` 仍然小于 `10`。记住，这正是 `PORTEPOCH` 的作用所在。

## 5.2.4. `PKGNAMEPREFIX` 和 `PKGNAMESUFFIX`

两个可选变量，`PKGNAMEPREFIX` 和 `PKGNAMESUFFIX`，与 `PORTNAME` 和 `PORTVERSION` 结合，形成 `PKGNAME`，其格式为 `${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}`。确保它符合我们的[良好包名指南](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-pkgname)。特别地，`PORTVERSION` 中不允许使用连字符（`-`）。此外，如果包名中有 *language-* 或 *-compiled.specifics* 部分（见下文），则分别使用 `PKGNAMEPREFIX` 和 `PKGNAMESUFFIX`，不要将它们作为 `PORTNAME` 的一部分。

## 5.2.5. 包命名规范

这些是命名包时要遵循的规范。目的是使包目录便于扫描，因为目前已经有成千上万个包，如果名称伤眼，用户会因此离开！

包名的格式为 **语言\_地区-名称-编译特性-版本号**

包名定义为 `${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}`。确保设置变量以符合该格式。

**语言\_地区-** FreeBSD 力求支持其用户的母语。当 Port 专用于某种特定语言时，`语言-` 部分是该语言的 ISO-639 两个字母缩写。例如，`ja` 表示日语，`ru` 表示俄语，`vi` 表示越南语，`zh` 表示中文，`ko` 表示韩语，`de` 表示德语。

如果 Port 专用于某个特定地区的语言，则还应添加两位字母的国家代码。例如，`en_US` 表示美式英语，`fr_CH` 表示瑞士法语。

`语言-` 部分由 `PKGNAMEPREFIX` 设置。

**名称** 确保 Port 的名称和版本清晰地分开并放入 `PORTNAME` 和 `DISTVERSION` 中。`PORTNAME` 中包含版本部分的唯一原因是如果上游发行版确实是按该方式命名的，例如 [textproc/libxml2](https://cgit.freebsd.org/ports/tree/textproc/libxml2/) 或 [japanese/kinput2-freewnn](https://cgit.freebsd.org/ports/tree/japanese/kinput2-freewnn/) Port。否则，`PORTNAME` 中不能包含任何版本特定的信息。多个 Port 使用相同的 `PORTNAME` 是很常见的，就像 [www/apache\*](https://cgit.freebsd.org/ports/tree/www/apache*/) Port 那样；在这种情况下，使用 `PKGNAMEPREFIX` 和 `PKGNAMESUFFIX` 值来区分不同的版本（以及不同的索引条目）。

有一个传统，就是为 `Perl 5` 模块命名时，前面加上 `p5-`，并将双冒号分隔符转换为连字符。例如，`Data::Dumper` 模块变为 `p5-Data-Dumper`。

**-编译特性** 如果 Port 可以通过不同的 [硬编码默认值](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-masterdir) 来构建（通常是某个 Port 家族的目录名称的一部分），那么 `-编译特性` 部分表示已编译的默认值。连字符是可选的。示例包括纸张大小和字体单位。

`-编译特性` 部分由 `PKGNAMESUFFIX` 设置。

**-版本号** 版本字符串跟随一个连字符（`-`），并且是由整数和小写字母组成的由句点分隔的列表。特别地，版本字符串中不允许再有其他的连字符。唯一的例外是字符串 `pl`（表示“补丁级别”），只能在软件没有主版本号和次版本号时使用。如果软件版本中包含类似“alpha”，“beta”，“rc”或“pre”之类的字符串，则取其首字母并直接放在句点后。如果版本字符串在这些名称后继续，则数字紧跟在单个字母后，不会有额外的句点（例如，`1.0b2`）。

这样做的目的是为了便于通过版本字符串对 Port 进行排序。特别地，确保版本号的各个部分始终由句点分隔，如果日期是版本字符串的一部分，则使用 `dyyyy.mm.dd` 格式，而不是 `dd.mm.yyyy` 或不符合 Y2K 的 `yy.mm.dd` 格式。重要的是在版本前加上字母前缀，这里用 `d`（表示日期），以防发布带有实际版本号的版本时，其数值会小于 `yyyy`。

> **重要**
>
> 包名必须在整个 Ports 树中唯一，检查是否已经存在相同的 `PORTNAME`，如果存在，则添加 [`PKGNAMEPREFIX` 或 `PKGNAMESUFFIX`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-pkgnameprefix-suffix) 之一。

以下是一些（真实的）示例，展示了如何将软件作者指定的名称转换为合适的包名。每行只设置了 `DISTVERSION` 或 `PORTVERSION` 其中一个，取决于在 Port 的 **Makefile** 中使用的是哪一个：

**表 2. 包命名示例**

| 发行版名称           | PKGNAMEPREFIX | PORTNAME | PKGNAMESUFFIX | DISTVERSION | PORTVERSION | 原因或备注                                    |
| --------------- | ------------- | -------- | ------------- | ----------- | ----------- | ---------------------------------------- |
| mule-2.2.2      | (空)           | mule     | (空)           | 2.2.2       |             | 无需更改                                     |
| mule-1.0.1      | (空)           | mule     | 1             | 1.0.1       |             | 这是 mule 的版本 1，版本 2 已经存在                  |
| EmiClock-1.0.2  | (空)           | emiclock | (空)           | 1.0.2       |             | 单个程序名不能使用大写字母                            |
| rdist-1.3alpha  | (空)           | rdist    | (空)           | 1.3alpha    |             | 版本将是 `1.3.a`                             |
| es-0.9-beta1    | (空)           | es       | (空)           | 0.9-beta1   |             | 版本将是 `0.9.b1`                            |
| mailman-2.0rc3  | (空)           | mailman  | (空)           | 2.0rc3      |             | 版本将是 `2.0.r3`                            |
| v3.3beta021.src | (空)           | tiff     | (空)           |             | 3.3         | 那到底是什么？                                  |
| tvtwm           | (空)           | tvtwm    | (空)           |             | p11         | 文件名中没有版本号，使用上游给出的版本号                     |
| piewm           | (空)           | piewm    | (空)           | 1.0         |             | 文件名中没有版本号，使用上游给出的版本号                     |
| xvgr-2.10pl1    | (空)           | xvgr     | (空)           |             | 2.10.pl1    | 在这种情况下，`pl1` 表示补丁级别，因此不能使用 `DISTVERSION` |
| gawk-2.15.6     | ja-           | gawk     | (空)           | 2.15.6      |             | 日语版本                                     |
| psutils-1.13    | (空)           | psutils  | -letter       | 1.13        |             | 在包构建时硬编码了纸张大小                            |
| pkfonts         | (空)           | pkfonts  | 300           | 1.0         |             | 300dpi 字体包                               |

如果原始源代码中完全没有版本信息，并且原作者不太可能发布另一个版本，则将版本字符串设置为 `1.0`（如上面 `piewm` 示例）。否则，询问原作者或使用源文件发布的日期字符串（`dyyyy.mm.dd`，或 `dyyyymmdd`）作为版本。

> **技巧**
>
> 可以使用任何字母。这里的 `d` 代表日期，如果源是 Git 仓库，通常使用 `g` 后跟提交日期，使用 `s` 表示快照也是常见的。


# 5.3.归类

## 5.3.1. `CATEGORIES`

当创建一个包时，它会被放置在 **/usr/ports/packages/All** 目录下，并且会从 **/usr/ports/packages** 的一个或多个子目录中创建链接。这些子目录的名称由变量 `CATEGORIES` 指定。这样做是为了方便用户在 FTP 站点或 CDROM 上浏览成千上万的包时更轻松。请查看 [当前的分类列表](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-categories)，选择适合该 Port 的分类。

该列表还决定了 Port 在 Ports 树中的导入位置。如果有多个分类，Port 文件必须放在第一个分类名称的子目录中。更多关于如何选择正确分类的讨论，请参见 [下文](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#choosing-categories)。

## 5.3.2. 当前分类列表

以下是当前的 Port 分类列表。带有星号（`*`）标记的是 *虚拟* 分类——这些分类在 Ports 树中没有对应的子目录，仅作为次要分类使用，并且仅用于搜索目的。

> **注意**
>
> 对于非虚拟分类，每个子目录的 **Makefile** 中的 `COMMENT` 会有一行描述。

| 分类                      | 说明                                                              | 备注                                                                               |
| ----------------------- | --------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| **accessibility**       | 帮助残障用户的 Port。                                                   |                                                                                  |
| **afterstep**`*`        | 支持 [AfterStep](http://www.afterstep.org/) 窗口管理器的 Port。          |                                                                                  |
| **arabic**              | 阿拉伯语语言支持。                                                       |                                                                                  |
| **archivers**           | 压缩与归档工具。                                                        |                                                                                  |
| **astro**               | 天文学相关的 Port。                                                    |                                                                                  |
| **audio**               | 音频支持。                                                           |                                                                                  |
| **benchmarks**          | 基准测试工具。                                                         |                                                                                  |
| **biology**             | 生物学相关的软件。                                                       |                                                                                  |
| **budgie**`*`           | 与 Budgie 桌面环境相关的软件。                                             |                                                                                  |
| **cad**                 | 计算机辅助设计工具。                                                      |                                                                                  |
| **chinese**             | 中文语言支持。                                                         |                                                                                  |
| **comms**               | 通信软件。                                                           | 主要是用于与串口通信的软件。                                                                   |
| **converters**          | 字符编码转换工具。                                                       |                                                                                  |
| **databases**           | 数据库相关的软件。                                                       |                                                                                  |
| **deskutils**           | 曾经在计算机发明之前属于桌面上的工具。                                             |                                                                                  |
| **devel**               | 开发工具。                                                           | 不要仅仅因为是库文件就把它们放在这个分类下。除非它们真正不属于其他分类，否则不应放在此分类。                                   |
| **dns**                 | 与 DNS 相关的软件。                                                    |                                                                                  |
| **docs**`*`             | FreeBSD 文档的元 Port。                                              |                                                                                  |
| **editors**             | 一般文本编辑器。                                                        | 专用编辑器应放在特定工具的分类中。例如，数学公式编辑器应放在 **math** 分类中，并将 **editors** 作为第二分类。               |
| **education**`*`        | 与教育相关的软件。                                                       | 包括主要或大部分设计用于帮助用户学习特定主题或进行一般学习的应用程序、工具或游戏。还包括课程编写应用程序、课程交付应用程序以及课堂或学校管理应用程序。      |
| **elisp**`*`            | Emacs-lisp 的 Port。                                              |                                                                                  |
| **emulators**           | 其他操作系统的模拟器。                                                     | 终端模拟器不应放在此分类中。基于 X 的模拟器应放入 **x11** 分类，基于文本的模拟器应放入 **comms** 或 **misc**，具体取决于功能。  |
| **enlightenment**`*`    | 与 Enlightenment 窗口管理器相关的 Port。                                  |                                                                                  |
| **filesystems**         | 文件系统及相关工具。                                                      |                                                                                  |
| **finance**             | 与货币、金融相关的应用程序。                                                  |                                                                                  |
| **french**              | 法语语言支持。                                                         |                                                                                  |
| **ftp**                 | FTP 客户端和服务器工具。                                                  | 如果 Port 同时支持 FTP 和 HTTP，应将其放入 **ftp** 分类，并加上 **www** 作为第二分类。                     |
| **games**               | 游戏。                                                             |                                                                                  |
| **geography**`*`        | 与地理相关的软件。                                                       |                                                                                  |
| **german**              | 德语语言支持。                                                         |                                                                                  |
| **gnome**`*`            | 来自 [GNOME](https://www.gnome.org/) 项目的 Port。                    |                                                                                  |
| **gnustep**`*`          | 与 GNUstep 桌面环境相关的软件。                                            |                                                                                  |
| **graphics**            | 图形工具。                                                           |                                                                                  |
| **hamradio**`*`         | 业余无线电相关软件。                                                      |                                                                                  |
| **haskell**`*`          | 与 Haskell 语言相关的软件。                                              |                                                                                  |
| **hebrew**              | 希伯来语语言支持。                                                       |                                                                                  |
| **hungarian**           | 匈牙利语语言支持。                                                       |                                                                                  |
| **irc**                 | 互联网中继聊天工具。                                                      |                                                                                  |
| **japanese**            | 日语语言支持。                                                         |                                                                                  |
| **java**                | 与 Java™ 语言相关的软件。                                                | **java** 分类不应是 Port 唯一的分类。除非是直接与 Java 语言相关的 Port，否则不建议使用 **java** 作为 Port 的主要分类。 |
| **kde**`*`              | 来自 [KDE](https://www.kde.org/) 项目的 Port（通用）。                    |                                                                                  |
| **kde-applications**`*` | 来自 [KDE](https://www.kde.org/) 项目的应用程序。                         |                                                                                  |
| **kde-frameworks**`*`   | [KDE](https://www.kde.org/) 项目的 Qt 编程附加库。                       |                                                                                  |
| **kde-plasma**`*`       | 来自 [KDE](https://www.kde.org/) 项目的桌面环境。                         |                                                                                  |
| **kld**`*`              | 可加载的内核模块。                                                       |                                                                                  |
| **korean**              | 韩语语言支持。                                                         |                                                                                  |
| **lang**                | 编程语言。                                                           |                                                                                  |
| **linux**`*`            | Linux 应用程序和支持工具。                                                |                                                                                  |
| **lisp**`*`             | 与 Lisp 语言相关的软件。                                                 |                                                                                  |
| **mail**                | 邮件软件。                                                           |                                                                                  |
| **mate**`*`             | 与 MATE 桌面环境相关的 Port，GNOME 2 的一个分支。                              |                                                                                  |
| **math**                | 数值计算软件及其他数学相关工具。                                                |                                                                                  |
| **mbone**`*`            | MBone 应用程序。                                                     |                                                                                  |
| **misc**                | 杂项工具。                                                           | 不属于其他分类的工具。如果可能，尽量为 Port 找到更合适的分类，而不是放在 `misc` 中，因为该分类中的 Port 往往容易被忽视。           |
| **multimedia**          | 多媒体软件。                                                          |                                                                                  |
| **net**                 | 各种网络软件。                                                         |                                                                                  |
| **net-im**              | 即时通讯软件。                                                         |                                                                                  |
| **net-mgmt**            | 网络管理软件。                                                         |                                                                                  |
| **net-p2p**             | 点对点网络应用。                                                        |                                                                                  |
| **net-vpn**`*`          | 虚拟专用网络应用。                                                       |                                                                                  |
| **news**                | USENET 新闻软件。                                                    |                                                                                  |
| **parallel**`*`         | 处理计算中的并行性的应用程序。                                                 |                                                                                  |
| **pear**`*`             | 与 Pear PHP 框架相关的 Port。                                          |                                                                                  |
| **perl5**`*`            | 需要 Perl 5 版本运行的 Port。                                           |                                                                                  |
| **plan9**`*`            | 来自 [Plan9](https://9p.io/wiki/plan9/Download/index.html) 的各种程序。 |                                                                                  |
| **polish**              | 波兰语语言支持。                                                        |                                                                                  |
| **ports-mgmt**          | 用于管理、安装和开发 FreeBSD Ports 和包的工具。                                 |                                                                                  |
| **portuguese**          | 葡萄牙语语言支持。                                                       |                                                                                  |
| **print**               | 打印软件。                                                           | 包括桌面出版工具（如预览器等）。                                                                 |
| **python**`*`           | 与 [Python](https://www.python.org/) 语言相关的软件。                    |                                                                                  |
| **ruby**`*`             | 与 [Ruby](https://www.ruby-lang.org/) 语言相关的软件。                   |                                                                                  |
| **rubygems**`*`         | [RubyGems](https://www.rubygems.org/) 包的 Port。                  |                                                                                  |
| **russian**             | 俄语语言支持。                                                         |                                                                                  |
| **scheme**`*`           | 与 Scheme 语言相关的软件。                                               |                                                                                  |
| **science**             | 不适合其他分类的科学相关 Ports，如 **astro**、**biology** 和 **math**。          |                                                                                  |
| **security**            | 安全工具。                                                           |                                                                                  |
| **shells**              | 命令行 Shell。                                                      |                                                                                  |
| **spanish**`*`          | 西班牙语语言支持。                                                       |                                                                                  |
| **sysutils**            | 系统工具。                                                           |                                                                                  |
| **tcl**`*`              | 使用 Tcl 运行的 Port。                                                |                                                                                  |
| **textproc**            | 文本处理工具。                                                         | 不包括桌面出版工具，这些应放入 **print** 分类。                                                    |
| **tk**`*`               | 使用 Tk 运行的 Port。                                                 |                                                                                  |
| **ukrainian**           | 乌克兰语语言支持。                                                       |                                                                                  |
| **vietnamese**          | 越南语语言支持。                                                        |                                                                                  |
| **wayland**`*`          | 支持 Wayland 显示服务器的 Port。                                         |                                                                                  |
| **windowmaker**`*`      | 支持 Window Maker 窗口管理器的 Port。                                    |                                                                                  |
| **www**                 | 与万维网相关的软件。                                                      | HTML 语言支持也应归入此分类。                                                                |
| **x11**                 | X 窗口系统及其相关工具。                                                   | 该分类仅适用于直接支持窗口系统的软件。不要将常规 X 应用程序放入此分类。大多数应放入其他 **x11-\*** 子分类（见下文）。               |
| **x11-clocks**          | X11 时钟工具。                                                       |                                                                                  |
| **x11-drivers**         | X11 驱动程序。                                                       |                                                                                  |
| **x11-fm**              | X11 文件管理器。                                                      |                                                                                  |
| **x11-fonts**           | X11 字体和字体工具。                                                    |                                                                                  |
| **x11-servers**         | X11 服务器。                                                        |                                                                                  |
| **x11-themes**          | X11 主题。                                                         |                                                                                  |
| **x11-toolkits**        | X11 工具包。                                                        |                                                                                  |
| **x11-wm**              | X11 窗口管理器。                                                      |                                                                                  |
| **xfce**`*`             | 与 [Xfce](https://www.xfce.org/) 桌面环境相关的 Port。                   |                                                                                  |
| **zope**`*`             | [Zope](https://www.zope.org/) 支持。                               |                                                                                  |

## 5.3.3. 选择正确的分类

由于许多分类有重叠，选择哪一个分类作为 Port 的主要分类可能会很繁琐。对此有几个规则。以下是按优先顺序递减的规则：

* 第一个分类必须是物理分类（见[上文](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-categories)）。这是为了使打包工作正常进行。虚拟分类和物理分类可以在之后混合使用。
* 语言特定的分类总是优先。例如，如果该 Port 安装的是日语 X11 字体，则 `CATEGORIES` 行应写为 **japanese x11-fonts**。
* 特定的分类应列在不太具体的分类之前。例如，一个 HTML 编辑器应该列为 **www editors**，而不是反过来。并且，如果 Port 属于 **irc**、**mail**、**news**、**security** 或 **www** 中的任何一个分类时，不要列出 **net**，因为 **net** 已经隐含包含在内。
* **x11** 仅在主要分类为自然语言时作为二级分类使用。特别是，不要将 **x11** 放在 X 应用程序的分类行中。
* Emacs 模式应放置在与其支持的应用程序相同的 Ports 分类中，而不是放在 **editors** 中。例如，用于编辑某编程语言源文件的 Emacs 模式应放在 **lang** 分类下。
* 安装可加载内核模块的 Ports 也应在 `CATEGORIES` 行中包含虚拟分类 **kld**。这可以通过添加 `USES=kmod` 自动处理。
* **misc** 不应与任何其他非虚拟分类一起使用。如果 `CATEGORIES` 中出现了 **misc** 和其他分类，那就意味着可以安全地删除 **misc**，并将 Port 只放在另一个子目录下。
* 如果该 Port 确实不属于任何其他分类，则将其放入 **misc**。

如果分类不明确，请在[提交 Port 时](https://bugs.freebsd.org/submit/)在 bug 数据库中加入评论，以便在导入前进行讨论。作为提交者，请向 [FreeBSD Ports 邮件列表](https://lists.freebsd.org/subscription/freebsd-ports)发送通知，以便我们先进行讨论。很多时候，新的 Ports 被导入到错误的分类中，之后又立即被移动。

## 5.3.4. 提议新分类

随着 Ports 的不断发展，已经引入了多个新分类。新分类可以是 *虚拟* 分类——即在 Ports 树中没有对应的子目录的分类——或者是 *物理* 分类——即有对应子目录的分类。本节讨论了创建新物理分类时涉及的问题。在提议新分类之前，请仔细阅读以下内容。

我们现有的做法是，除非有大量的 Port 明显属于该分类，或者这些 Port 是逻辑上独立的且属于一般兴趣有限的群体（例如与口语人类语言相关的分类），否则避免创建新的物理分类，最好是两者都满足。

这样做的原因是，这样的变更会给 [提交者和用户](https://docs.freebsd.org/en/articles/committers-guide/#ports)带来相当大的工作量，特别是那些追踪 Ports 变化的用户。此外，提议的分类更改往往会引发争议。（也许这是因为对于分类何时“过大”以及分类是否应便于浏览（因此理想的分类数量是多少）等问题，缺乏明确的共识，等等。）

以下是提出新物理分类的程序：

1. 在 [FreeBSD Ports 邮件列表](https://lists.freebsd.org/subscription/freebsd-ports)上提议新分类。提供详细的理由，说明现有分类不足之处，并列出拟迁移到该分类的现有 Ports。（如果有在 Bugzilla 中待处理的符合该分类的新 Ports，也请列出。）如果你是维护者和/或提交者，请提及这一点，因为这可能有助于你的提议。
2. 参与讨论。
3. 如果看起来有支持这一想法的声音，请提交一个 PR，包含新分类的理由和需要迁移的现有 Ports 列表。理想情况下，PR 还应包括以下补丁：
   * 新 Ports 的 **Makefile**，在它们被复制到新位置后
   * 新分类的 **Makefile**
   * 旧分类的 **Makefile**
   * 依赖旧 Ports 的 **Makefile**
   * （额外的奖励，提供根据提交者指南中程序要求需要更改的其他文件）
4. 由于它影响 Ports 基础设施，并涉及迁移和补丁许多 Ports，可能还需要在构建集群上运行回归测试，因此请将 PR 分配给 Ports 管理团队 <portmgr@FreeBSD.org>。
5. 如果该 PR 获得批准，提交者将需要按照 [提交者指南](https://docs.freebsd.org/en/articles/committers-guide/#ports) 中概述的其余程序进行操作。

提议新虚拟分类与上述类似，但要简单得多，因为实际上不需要迁移任何 Port。在这种情况下，PR 中仅需包含那些将新分类添加到受影响 Port 的 `CATEGORIES` 的补丁。

## 5.3.5. 提议重新组织所有分类

偶尔有人提议以 2 层结构或其他某种关键字结构重新组织分类。到目前为止，这些提议没有取得任何进展，因为虽然提出这些提议很容易，但将整个现有 Ports 进行任何形式的重组工作非常庞大，可以说是非常艰巨的任务。在发布此类想法之前，请阅读邮件列表档案中的这些提议的历史记录。此外，准备好接受挑战，提供一个有效的原型。


# 5.4.源代码包文件

**Makefile** 的第二部分描述了为构建 Port 而必须下载的文件，以及这些文件的下载位置。

## 5.4.1. `DISTNAME`

`DISTNAME` 是由软件的作者指定的名称。`DISTNAME` 默认为 `${PORTNAME}-${DISTVERSIONPREFIX}${DISTVERSION}${DISTVERSIONSUFFIX}`，如果未设置，则 `DISTVERSION` 默认为 `${PORTVERSION}`，因此只有在必要时才需要覆盖 `DISTNAME`。`DISTNAME` 只在两个地方使用。首先，分发文件列表（`DISTFILES`）默认值为 `${DISTNAME}${EXTRACT_SUFX}`。其次，分发文件预计会解压到一个名为 `WRKSRC` 的子目录中，默认值为 **work/${DISTNAME}**。

一些厂商的分发名称不适合 `${PORTNAME}-${PORTVERSION}` 方案时，可以通过设置 `DISTVERSIONPREFIX`、`DISTVERSION` 和 `DISTVERSIONSUFFIX` 来自动处理。`PORTVERSION` 会从 `DISTVERSION` 自动派生。

> **重要**
>
> `PORTVERSION` 和 `DISTVERSION` 只能设置其中一个。如果 `DISTVERSION` 无法派生出正确的 `PORTVERSION`，则不要使用 `DISTVERSION`。

如果上游版本方案可以派生为与 Port 兼容的版本方案，请设置一个变量来表示上游版本，*不要* 使用 `DISTVERSION` 作为变量名。根据你创建的变量将 `PORTVERSION` 设置为计算出的版本，并相应地设置 `DISTNAME`。

如果上游版本方案无法轻松转换为兼容的 Port 版本值，请将 `PORTVERSION` 设置为一个合理的值，并将 `DISTNAME` 设置为包含上游版本的 `PORTNAME`。

**示例 6. 手动派生 `PORTVERSION`**

BIND9 使用的版本方案与 Port 版本方案不兼容（版本中包含 `-`），且无法使用 `DISTVERSION` 派生，因为在 9.9.9 版本发布后，它将以 `9.9.9-P1` 的形式发布“补丁级别”。`DISTVERSION` 会将其转换为 `9.9.9.p1`，而在 Port 版本方案中，`9.9.9.p1` 表示 `9.9.9` 的预发布 1，意味着它是在 9.9.9 之前，而不是之后。因此，`PORTVERSION` 是从 `ISCVERSION` 变量手动派生的，输出为 `9.9.9p1`。

通过使用 [pkg-version(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-version\&sektion=8\&format=html) 的 `-t` 参数检查 Port 框架和 pkg 对版本的排序：

```sh
% pkg version -t 9.9.9 9.9.9.p1
> ①
% pkg version -t 9.9.9 9.9.9p1
< ②
```

* ① `>` 符号表示传递给 `-t` 的第一个参数大于第二个参数。`9.9.9` 排在 `9.9.9.p1` 后面。
* ② `<` 符号表示传递给 `-t` 的第一个参数小于第二个参数。`9.9.9` 排在 `9.9.9p1` 前面。

例如，在 Port **Makefile** 中，如 [dns/bind99](https://cgit.freebsd.org/ports/tree/dns/bind99/)，它通过以下方式实现：

```makefile
PORTNAME=	bind
PORTVERSION=	${ISCVERSION:S/-P/P/:S/b/.b/:S/a/.a/:S/rc/.rc/}
CATEGORIES=	dns net
MASTER_SITES=	ISC/bind9/${ISCVERSION}
PKGNAMESUFFIX=	99
DISTNAME=	${PORTNAME}-${ISCVERSION}

MAINTAINER=	mat@FreeBSD.org
COMMENT=	BIND DNS suite with updated DNSSEC and DNS64
WWW=		https://www.isc.org/bind/

LICENSE=	ISCL

# ISC 发布的版本如 9.8.0-P1 或 9.8.1rc1，与我们的版本管理不兼容。
ISCVERSION=	9.9.9-P6
```

在此示例中，定义了上游版本为 `ISCVERSION`，并带有说明 *为什么* 需要它。使用 `ISCVERSION` 来获得兼容 Port 的 `PORTVERSION`，并使用 `ISCVERSION` 直接获得正确的分发文件 URL，并以 `ISCVERSION` 来命名分发文件。

**示例 7. 从 `PORTVERSION` 派生 `DISTNAME`**

有时，分发文件名称与软件的版本几乎没有关系。

在 [comms/kermit](https://cgit.freebsd.org/ports/tree/comms/kermit/) 中，分发文件中仅包含版本的最后一部分：

```makefile
PORTNAME=	kermit
PORTVERSION=	9.0.304
CATEGORIES=	comms ftp net
MASTER_SITES=	ftp://ftp.kermitproject.org/kermit/test/tar/
DISTNAME=	cku${PORTVERSION:E}-dev20
```

其中，`:E` 是 [make(1)](https://man.freebsd.org/cgi/man.cgi?query=make\&sektion=1\&format=html) 修饰符，用于返回变量的后缀，在此示例中是 `304`。因此，分发文件会正确生成为 `cku304-dev20.tar.gz`。

**示例 8. 特殊情况 1**

有时，软件名称、版本及其分发文件之间没有任何关联。

例如在 [audio/libworkman](https://cgit.freebsd.org/ports/tree/audio/libworkman/) 中：

```makefile
PORTNAME=       libworkman
PORTVERSION=    1.4
CATEGORIES=     audio
MASTER_SITES=   LOCAL/jim
DISTNAME=       ${PORTNAME}-1999-06-20
```

**示例 9. 特殊情况 2**

在 [comms/librs232](https://cgit.freebsd.org/ports/tree/comms/librs232/) 中，分发文件没有版本号，因此需要使用 [`DIST_SUBDIR`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-dist_subdir)：

```makefile
PORTNAME=       librs232
PORTVERSION=    20160710
CATEGORIES=     comms
MASTER_SITES=   http://www.teuniz.net/RS-232/
DISTNAME=       RS-232
DIST_SUBDIR=	${PORTNAME}-${PORTVERSION}
```

> **注意**
>
> `PKGNAMEPREFIX` 和 `PKGNAMESUFFIX` 不会影响 `DISTNAME`。还需要注意的是，如果 `WRKSRC` 等于 **${WRKDIR}/${DISTNAME}**，而原始源归档的名称与 `${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX}` 不同，则只需定义 `DISTFILES`，而不需要同时定义 `DISTNAME` 和 `WRKSRC`（以及可能的 `EXTRACT_SUFX`）。

## 5.4.2. `MASTER_SITES`

在 `MASTER_SITES` 中记录指向原始 tarball 的 FTP/HTTP URL 的目录部分。不要忘记尾部的斜杠（**/**）！

如果系统上找不到分发文件，`make` 宏将尝试使用此规范通过 `FETCH` 获取分发文件。

建议在此列表中包含多个站点，最好来自不同的大陆。这将有助于避免广域网问题。

> **重要**
>
> `MASTER_SITES` 不能为空。它必须指向实际托管分发文件的站点。不能指向网页档案或 FreeBSD 分发文件缓存站点。唯一的例外是没有分发文件的 Ports。例如，meta-Ports 没有分发文件，因此不需要设置 `MASTER_SITES`。

### 5.4.2.1. 使用 `MASTER_SITE_*` 变量

对于流行的档案站点，如 SourceForge（`SOURCEFORGE`）、GNU（`GNU`）或 Perl CPAN（`PERL_CPAN`），提供了简写的变量。`MASTER_SITES` 可以直接使用这些变量：

```makefile
MASTER_SITES=	GNU/make
```

旧的扩展格式仍然有效，但所有 Ports 已经转换为简洁格式。扩展格式如下所示：

```makefile
MASTER_SITES=		${MASTER_SITE_GNU}
MASTER_SITE_SUBDIR=	make
```

这些值和变量定义在 [Mk/bsd.sites.mk](https://cgit.freebsd.org/ports/tree/Mk/bsd.sites.mk) 中。此文件经常添加新的条目，因此在提交 Port 之前，确保检查该文件的最新版本。

> **技巧**
>
> 对于任何 `MASTER_SITE_FOO` 变量，可以使用简写形式 `FOO`。例如，使用：
>
> ```makefile
> MASTER_SITES=	FOO
> ```
>
> 如果需要 `MASTER_SITE_SUBDIR`，则使用：
>
> ```makefile
> MASTER_SITES=	FOO/bar
> ```

> **注意**
>
> 一些 `MASTER_SITE_*` 名称较长，为了便于使用，已定义了简写形式。

**表 3. `MASTER_SITE_*` 宏的简写**

| 宏                 | 简写      |
| ----------------- | ------- |
| `PERL_CPAN`       | `CPAN`  |
| `GITHUB`          | `GH`    |
| `GITHUB_CLOUD`    | `GHC`   |
| `LIBREOFFICE_DEV` | `LODEV` |
| `NETLIB`          | `NL`    |
| `RUBYGEMS`        | `RG`    |
| `SOURCEFORGE`     | `SF`    |

### 5.4.2.2. 魔法 `MASTER_SITES` 宏

一些流行站点有可预测的目录结构，存在一些“魔法”宏。对于这些站点，只需使用简写，系统会自动选择子目录。例如，对于名为 `Stardict`，版本为 `1.2.3`，并托管在 SourceForge 上的 Port，添加以下行：

```makefile
MASTER_SITES=	SF
```

这将推测出名为 `/project/stardict/stardict/1.2.3` 的子目录。如果推测的目录不正确，可以覆盖它：

```makefile
MASTER_SITES=	SF/stardict/WyabdcRealPeopleTTS/${PORTVERSION}
```

也可以写成：

```makefile
MASTER_SITES=	SF
MASTER_SITE_SUBDIR=	stardict/WyabdcRealPeopleTTS/${PORTVERSION}
```

**表 4. 魔法 `MASTER_SITES` 宏**

| 宏                         | 假定子目录                                                           |
| ------------------------- | --------------------------------------------------------------- |
| `APACHE_COMMONS_BINARIES` | `${PORTNAME:S,commons-,,}`                                      |
| `APACHE_COMMONS_SOURCE`   | `${PORTNAME:S,commons-,,}`                                      |
| `APACHE_JAKARTA`          | `${PORTNAME:S,-,/,}/source`                                     |
| `BERLIOS`                 | `${PORTNAME:tl}.berlios`                                        |
| `PYPI`                    | `source/${DISTNAME:C/(.).*/\1/}/${DISTNAME:C/(.*)-[0-9].*/\1/}` |
| `CPAN`                    | `${PORTNAME:C/-.*//}`                                           |
| `DEBIAN`                  | `pool/main/${PORTNAME:C/^((lib)?.).*$/\1/}/${PORTNAME}`         |
| `FARSIGHT`                | `${PORTNAME}`                                                   |
| `FESTIVAL`                | `${PORTREVISION}`                                               |
| `GCC`                     | `releases/${DISTNAME}`                                          |
| `GENTOO`                  | `distfiles`                                                     |
| `GIMP`                    | `${PORTNAME}/${PORTVERSION:R}/`                                 |
| `GH`                      | `${GH_ACCOUNT}/${GH_PROJECT}/tar.gz/${GH_TAGNAME}?dummy=/`      |
| `GHC`                     | `${GH_ACCOUNT}/${GH_PROJECT}/`                                  |
| `GNOME`                   | `sources/${PORTNAME}/${PORTVERSION:C/^([0-9]+\.[0-9]+).*/\1/}`  |
| `GNU`                     | `${PORTNAME}`                                                   |
| `GNUPG`                   | `${PORTNAME}`                                                   |
| `GNU_ALPHA`               | `${PORTNAME}`                                                   |
| `HORDE`                   | `${PORTNAME}`                                                   |
| `LODEV`                   | `${PORTNAME}`                                                   |
| `MATE`                    | `${PORTVERSION:C/^([0-9]+\.[0-9]+).*/\1/}`                      |
| `MOZDEV`                  | `${PORTNAME:tl}`                                                |
| `NL`                      | `${PORTNAME}`                                                   |
| `QT`                      | `archive/qt/${PORTVERSION:R}`                                   |
| `SAMBA`                   | `${PORTNAME}`                                                   |
| `SAVANNAH`                | `${PORTNAME:tl}`                                                |
| `SF`                      | `${PORTNAME:tl}/${PORTNAME:tl}/${PORTVERSION}`                  |

## 5.4.3. `USE_GITHUB`

如果分发文件来自 [GitHub](https://github.com/) 上的特定提交或标签，而没有官方发布的文件，可以通过一种简单的方法自动设置正确的 `DISTNAME` 和 `MASTER_SITES`。

> **警告**
>
> 从 2023 年 2 月 21 日起，[GitHub](https://github.blog/2023-02-21-update-on-the-future-stability-of-source-code-archives-and-hashes/) 宣布源代码下载将稳定一年。请切换到发布的资产，如果没有发布，要求上游生成相应的资产。

以下是可用的变量：

**表 5. `USE_GITHUB` 说明**

| 变量           | 说明                                                                                                                                                                                      | 默认值                                                      |
| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
| `GH_ACCOUNT` | 托管项目的 GitHub 用户名                                                                                                                                                                        | `${PORTNAME}`                                            |
| `GH_PROJECT` | GitHub 上的项目名称                                                                                                                                                                           | `${PORTNAME}`                                            |
| `GH_TAGNAME` | 要下载的标签名称（例如 2.0.1、哈希值等）。这里使用分支名称是不正确的。也可以使用提交 ID 的哈希值来进行快照。                                                                                                                             | `${DISTVERSIONPREFIX}${DISTVERSION}${DISTVERSIONSUFFIX}` |
| `GH_SUBDIR`  | 当软件需要额外的分发文件并且这些文件需要在 `${WRKSRC}` 内提取时，可以使用此变量。有关更多信息，请参见 [从 GitHub 获取多个文件](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-master_sites-github-multiple) 的示例。   | （无）                                                      |
| `GH_TUPLE`   | `GH_TUPLE` 允许将 `GH_ACCOUNT`、`GH_PROJECT`、`GH_TAGNAME` 和 `GH_SUBDIR` 放入一个变量中。格式为 *account*`:`*project*`:`*tagname*`:`*group*`/`*subdir*。其中 `/`*subdir* 部分是可选的。当有多个 GitHub 项目需要获取时，这非常有用。 |                                                          |

> **重要**
>
> 不要使用 `GH_TUPLE` 来处理默认的分发文件，因为它没有默认值。

**示例 10. 简单使用 `USE_GITHUB`**

在为来自 GitHub 上 FreeBSD 用户的 `pkg` 版本 `1.2.7` 制作 Port 时，位于 <https://github.com/freebsd/pkg/> 上，**Makefile** 会像下面这样（为了示例做了略微简化）：

```makefile
PORTNAME=	pkg
DISTVERSION=	1.2.7

USE_GITHUB=	yes
GH_ACCOUNT=	freebsd
```

它会自动将 `MASTER_SITES` 设置为 `GH`，并将 `WRKSRC` 设置为 `${WRKDIR}/pkg-1.2.7`。

**示例 11. 更完整地使用 `USE_GITHUB`**

在为来自 GitHub 上 FreeBSD 用户的 `pkg` 的最新版本制作 Port 时，位于 <https://github.com/freebsd/pkg/> 上，**Makefile** 会像下面这样（为了示例做了略微简化）：

```makefile
PORTNAME=	pkg-devel
DISTVERSION=	2.7.4.20260626

USE_GITHUB=	yes
GH_ACCOUNT=	freebsd
GH_PROJECT=	pkg
GH_TAGNAME=	2678d2b6a8ca3cf80cb4dbc8da557a2998e1b5c0
```

它会自动将 `MASTER_SITES` 设置为 `GH`，并将 `WRKSRC` 设置为 `${WRKDIR}/pkg-6dbb17b`。

`20260626` 是 `GH_TAGNAME` 中引用的提交的日期，而不是 **Makefile** 编辑的日期，也不是提交的日期。

**示例 12. 使用 `USE_GITHUB` 和 `DISTVERSIONPREFIX`**

有时，`GH_TAGNAME` 会与 `DISTVERSION` 略有不同。例如，如果版本是 `1.0.2`，标签是 `v1.0.2`。在这种情况下，可以使用 `DISTVERSIONPREFIX` 或 `DISTVERSIONSUFFIX`：

```makefile
PORTNAME=	foo
DISTVERSIONPREFIX=	v
DISTVERSION=	1.0.2

USE_GITHUB=	yes
```

它会自动将 `GH_TAGNAME` 设置为 `v1.0.2`，同时 `WRKSRC` 会保持为 `${WRKDIR}/foo-1.0.2`。

**示例 13. 当上游没有使用版本时使用 `USE_GITHUB`**

如果上游从未使用过版本号，则不要像 `0.1` 或 `1.0` 那样虚构一个版本号。创建 Port 时，将 `DISTVERSION` 设置为 `gYYYYMMDD`，其中 `g` 代表 Git，`YYYYMMDD` 代表 `GH_TAGNAME` 中引用的提交的日期。

```makefile
PORTNAME=	bar
DISTVERSION=	g20260626

USE_GITHUB=	yes
GH_TAGNAME=	c472d66b70dd603bf9e67607f0869639276796ce
```

这创建了一个随时间增长的版本控制方案，并且仍然处于版本 `0` 之前（参见 [使用 pkg-version(8) 比较版本的章节](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-versions-ex-pkg-version)）：

```sh
% pkg version -t g20260626 0
<
```

这意味着，如果上游将来决定创建版本，则不需要使用 `PORTEPOCH`。

**示例 14. 使用 `USE_GITHUB` 来访问两个版本之间的提交**

如果当前版本的软件使用 Git 标签，而 Port 需要更新到一个没有标签的较新中间版本，可以使用 [git-describe(1)](https://man.freebsd.org/cgi/man.cgi?query=git-describe\&sektion=1\&format=html) 来找出要使用的版本：

```sh
% git describe --tags f0038b1
v0.7.3-14-gf0038b1
```

`v0.7.3-14-gf0038b1` 可以分为三个部分：

`v0.7.3` 这是在请求的提交之前，Git 提交历史中出现的最后一个 Git 标签。

`-14` 这意味着请求的提交 `f0038b1` 是在 `v0.7.3` 标签之后的第 14 次提交。

`-gf0038b1` `-g` 代表 "Git"，`f0038b1` 是此引用指向的提交哈希值。

```makefile
PORTNAME=	bar
DISTVERSIONPREFIX=  v
DISTVERSION=	0.7.3-14
DISTVERSIONSUFFIX=  -gf0038b1

USE_GITHUB=	yes
```

这创建了一个随着时间推移（实际上是随着提交增加）的版本控制方案，并且与创建 `0.7.4` 版本不会冲突。（参见 [使用 pkg-version(8) 比较版本的章节](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-versions-ex-pkg-version)）：

```sh
% pkg version -t 0.7.3 0.7.3.14
<
% pkg version -t 0.7.3.14 0.7.4
<
```

如果请求的提交与某个标签相同，默认会显示一个更短的描述。更长的版本是等效的：

```sh
% git describe --tags c66c71d
v0.7.3

% git describe --tags --long c66c71d
v0.7.3-0-gc66c71d
```

### 5.4.3.1. 从 GitHub 获取多个文件

`USE_GITHUB` 框架还支持从 GitHub 的不同位置获取多个分发文件。它的工作方式与 [从多个位置获取多个分发文件或补丁文件](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-master-sites-n) 非常相似。

多个值可以添加到 `GH_ACCOUNT`、`GH_PROJECT` 和 `GH_TAGNAME` 中。每个不同的值会分配到一个组。主值可以没有组，或者使用 `:DEFAULT` 组。如果值与默认值相同，可以省略（详细信息请参见 [`USE_GITHUB` 描述](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-master_sites-github-description)）。

当需要处理很多分发文件时，也可以使用 `GH_TUPLE`。它有助于将账户、项目、标签名和组信息集中在同一地方。

对于每个组，会创建一个 `${WRKSRC_group}` 辅助变量，包含文件提取到的目录。`${WRKSRC_group}` 变量可以在 `post-extract` 中用于移动目录，或添加到 `CONFIGURE_ARGS`，或者执行其他需要的操作，以便软件正确构建。

> **小心**
>
> `:group` 部分 *必须* 只用于一个分发文件。它作为一个唯一的键使用，如果多次使用，它将覆盖之前的值。

> **注意**
>
> 由于这是 `DISTFILES` 和 `MASTER_SITES` 之上的语法糖，组名必须遵循 [从多个位置获取多个分发文件或补丁文件](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-master-sites-n) 中列出的组名限制。

在从 GitHub 获取多个文件时，有时默认的分发文件不会从 GitHub 获取。要禁用默认分发文件的获取，请设置：

```makefile
USE_GITHUB=	nodefault
```

> **重要**
>
> 使用 `USE_GITHUB=nodefault` 时，**Makefile** 必须在其 [顶部块](https://docs.freebsd.org/en/books/porters-handbook/porting-order/#porting-order-portname) 中设置 `DISTFILES`。定义应为：
>
> ```makefile
> DISTFILES=    ${DISTNAME}${EXTRACT_SUFX}
> ```

**示例 15. 使用 `USE_GITHUB` 获取多个分发文件**

有时需要获取多个分发文件。例如，当上游 Git 仓库使用子模块时，可以通过在 `GH_*` 变量中使用组来轻松实现：

```makefile
PORTNAME=	foo
DISTVERSION=	1.0.2

USE_GITHUB=	yes
GH_ACCOUNT=	bar:icons,contrib
GH_PROJECT=	foo-icons:icons foo-contrib:contrib
GH_TAGNAME=	1.0:icons fa579bc:contrib
GH_SUBDIR=	ext/icons:icons

CONFIGURE_ARGS=	--with-contrib=${WRKSRC_contrib}
```

这将从 GitHub 获取三个分发文件。默认文件来自 **foo/foo**，版本为 `1.0.2`。第二个文件（带有 `icons` 组）来自 **bar/foo-icons**，版本为 `1.0`。第三个文件来自 **bar/foo-contrib**，使用 Git 提交 `fa579bc`。分发文件命名为 **foo-foo-1.0.2\_GH0.tar.gz**、**bar-foo-icons-1.0\_GH0.tar.gz** 和 **bar-foo-contrib-fa579bc\_GH0.tar.gz**。

所有分发文件都将被解压到 `${WRKDIR}` 中的各自子目录中。默认文件仍然被解压到 `${WRKSRC}`，在此示例中为 **${WRKDIR}/foo-1.0.2**。每个附加的分发文件会解压到 `${WRKSRC_group}` 中。这里，`icons` 组的文件解压到 `${WRKSRC_icons}`，其中包含 **${WRKDIR}/foo-icons-1.0**。带有 `contrib` 组的文件解压到 `${WRKSRC_contrib}`，其中包含 `${WRKDIR}/foo-contrib-fa579bc`。

该软件的构建系统期望在其源代码中找到 **ext/icons** 子目录，因此使用了 `GH_SUBDIR`。`GH_SUBDIR` 确保 **ext** 存在，但 **ext/icons** 不会已经存在。然后，它会执行如下操作：

```makefile
post-extract:
      @${MV} ${WRKSRC_icons} ${WRKSRC}/ext/icons
```

**示例 16. 使用 `USE_GITHUB` 获取多个分发文件并使用 `GH_TUPLE`**

这与 [使用 `USE_GITHUB` 获取多个分发文件](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-master_sites-github-multi) 功能相同，但使用了 `GH_TUPLE`：

```makefile
PORTNAME=	foo
DISTVERSION=	1.0.2

USE_GITHUB=	yes
GH_TUPLE=	bar:foo-icons:1.0:icons/ext/icons \
		bar:foo-contrib:fa579bc:contrib

CONFIGURE_ARGS=	--with-contrib=${WRKSRC_contrib}
```

在前一个示例中使用了 `bar:icons,contrib` 来进行分组。由于 `GH_TUPLE` 无法进行分组，因此会存在一些冗余信息。

**示例 17. 如何使用 `USE_GITHUB` 与 Git 子模块一起使用？**

使用 GitHub 作为上游仓库的 Ports 有时会使用子模块。有关更多信息，请参见 [git-submodule(1)](https://man.freebsd.org/cgi/man.cgi?query=git-submodule\&sektion=1\&format=html)。

子模块的问题在于每个子模块都是一个独立的仓库。因此，必须分别获取每个子模块。

以 [finance/moneymanagerex](https://cgit.freebsd.org/ports/tree/finance/moneymanagerex/) 为例，其 GitHub 仓库为 <https://github.com/moneymanagerex/moneymanagerex/>。在根目录下有一个 [.gitmodules](https://github.com/moneymanagerex/moneymanagerex/blob/master/.gitmodules) 文件。该文件描述了该仓库中使用的所有子模块，并列出了所需的附加仓库。该文件会告诉需要哪些附加仓库：

```ini
[submodule "lib/wxsqlite3"]
	path = lib/wxsqlite3
	url = https://github.com/utelle/wxsqlite3.git
[submodule "3rd/mongoose"]
	path = 3rd/mongoose
	url = https://github.com/cesanta/mongoose.git
[submodule "3rd/LuaGlue"]
	path = 3rd/LuaGlue
	url = https://github.com/moneymanagerex/LuaGlue.git
[submodule "3rd/cgitemplate"]
	path = 3rd/cgitemplate
	url = https://github.com/moneymanagerex/html-template.git
[...]
```

该文件唯一缺少的信息是要使用的提交哈希或标签。可以在克隆仓库后找到该信息：

```sh
% git clone --recurse-submodules https://github.com/moneymanagerex/moneymanagerex.git
Cloning into 'moneymanagerex'...
remote: Counting objects: 32387, done.
[...]
Submodule '3rd/LuaGlue' (https://github.com/moneymanagerex/LuaGlue.git) registered for path '3rd/LuaGlue'
Submodule '3rd/cgitemplate' (https://github.com/moneymanagerex/html-template.git) registered for path '3rd/cgitemplate'
Submodule '3rd/mongoose' (https://github.com/cesanta/mongoose.git) registered for path '3rd/mongoose'
Submodule 'lib/wxsqlite3' (https://github.com/utelle/wxsqlite3.git) registered for path 'lib/wxsqlite3'
[...]
Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/3rd/LuaGlue'...
Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/3rd/cgitemplate'...
Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/3rd/mongoose'...
Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/lib/wxsqlite3'...
[...]
Submodule path '3rd/LuaGlue': checked out 'c51d11a247ee4d1e9817dfa2a8da8d9e2f97ae3b'
Submodule path '3rd/cgitemplate': checked out 'cd434eeeb35904ebcd3d718ba29c281a649b192c'
Submodule path '3rd/mongoose': checked out '2140e5992ab9a3a9a34ce9a281abf57f00f95cda'
Submodule path 'lib/wxsqlite3': checked out 'fb66eb230d8aed21dec273b38c7c054dcb7d6b51'
[...]
% cd moneymanagerex
% git submodule status
 c51d11a247ee4d1e9817dfa2a8da8d9e2f97ae3b 3rd/LuaGlue (heads/master)
 cd434eeeb35904ebcd3d718ba29c281a649b192c 3rd/cgitemplate (cd434ee)
 2140e5992ab9a3a9a34ce9a281abf57f00f95cda 3rd/mongoose (6.2-138-g2140e59)
 fb66eb230d8aed21dec273b38c7c054dcb7d6b51 lib/wxsqlite3 (v3.4.0)
[...]
```

这些信息也可以在 GitHub 上找到。每个子模块的子目录显示为 `目录 @ 哈希`，例如，`mongoose @ 2140e59`。

虽然从 GitHub 获取信息似乎更直接，但使用 `git submodule status` 获取的信息将提供更有意义的信息。例如，在这里，`lib/wxsqlite3` 的提交哈希 `fb66eb2` 对应于 `v3.4.0`。这两者可以互换使用，但当标签可用时，应使用标签。

现在已经收集到所有所需的信息，可以编写 **Makefile**（仅显示与 GitHub 相关的行）：

```ini
PORTNAME=	moneymanagerex
DISTVERSIONPREFIX=	v
DISTVERSION=	1.3.0

USE_GITHUB=	yes
GH_TUPLE=	utelle:wxsqlite3:v3.4.0:wxsqlite3/lib/wxsqlite3 \
		moneymanagerex:LuaGlue:c51d11a:lua_glue/3rd/LuaGlue \
		moneymanagerex:html-template:cd434ee:html_template/3rd/cgitemplate \
		cesanta:mongoose:2140e59:mongoose/3rd/mongoose \
		[...]
```

## 5.4.4. `USE_GITLAB`

与 GitHub 类似，如果分发文件来自 [gitlab.com](https://gitlab.com/) 或托管 GitLab 软件时，可以使用以下变量，并且可能需要设置它们。

| 变量           | 描述                                                                                                                                                                                                                   | 默认值                   |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- |
| `GL_SITE`    | 托管 GitLab 项目的站点名称                                                                                                                                                                                                    | <https://gitlab.com/> |
| `GL_ACCOUNT` | 托管项目的 GitLab 用户的账户名                                                                                                                                                                                                  | `${PORTNAME}`         |
| `GL_PROJECT` | GitLab 上的项目名称                                                                                                                                                                                                        | `${PORTNAME}`         |
| `GL_COMMIT`  | 要下载的提交哈希值，必须是完整的 160 位、40 字符的十六进制 sha1 哈希值。对于 GitLab，这是一个必需的变量。                                                                                                                                                      | `(none)`              |
| `GL_SUBDIR`  | 当软件需要从 `${WRKSRC}` 中提取额外的分发文件时，可以使用此变量。有关更多信息，请参阅 [从 GitLab 获取多个文件](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-master_sites-gitlab-multiple)。                                            | (none)                |
| `GL_TUPLE`   | `GL_TUPLE` 允许将 `GL_SITE`、`GL_ACCOUNT`、`GL_PROJECT`、`GL_COMMIT` 和 `GL_SUBDIR` 放入一个变量中，格式为 *site*`:`*account*`:`*project*`:`*commit*`:`*group*`/`*subdir*`。其中 *site*`:`和`/\`*subdir* 部分是可选的。当有多个 GitLab 项目需要获取时，它非常有用。 |                       |

**示例 18. 使用 `USE_GITLAB` 的简单示例**

在尝试为来自 gitlab.com 上的 accounts-sso 用户的 libsignon-glib 版本 `1.14` 创建 Port 时，位于 <https://gitlab.com/accounts-sso/libsignon-glib/>，**Makefile** 的内容如下，用于获取分发文件：

```makefile
PORTNAME=	libsignon-glib
DISTVERSION=	1.14

USE_GITLAB=	yes
GL_ACCOUNT=	accounts-sso
GL_COMMIT=	e90302e342bfd27bc8c9132ab9d0ea3d8723fd03
```

它将自动将 `MASTER_SITES` 设置为 [gitlab.com](https://gitlab.com/) 并将 `WRKSRC` 设置为 `${WRKDIR}/libsignon-glib-e90302e342bfd27bc8c9132ab9d0ea3d8723fd03-e90302e342bfd27bc8c9132ab9d0ea3d8723fd03`。

**示例 19. 更完整地使用 `USE_GITLAB`**

如果该 Port 没有版本，并且来自 foo 用户的项目 bar 位于自托管的 GitLab 站点 `https://gitlab.example.com/`，则 **Makefile** 如下：

```makefile
PORTNAME=	foobar
DISTVERSION=	g20170906

USE_GITLAB=	yes
GL_SITE=	https://gitlab.example.com
GL_ACCOUNT=	foo
GL_PROJECT=	bar
GL_COMMIT=	9c1669ce60c3f4f5eb43df874d7314483fb3f8a6
```

它将把 `MASTER_SITES` 设置为 `"https://gitlab.example.com"`，并将 `WRKSRC` 设置为 `${WRKDIR}/bar-9c1669ce60c3f4f5eb43df874d7314483fb3f8a6-9c1669ce60c3f4f5eb43df874d7314483fb3f8a6`。

> **技巧**
>
> `20170906` 是所引用的 `GL_COMMIT` 中提交的日期，而不是编辑 **Makefile** 的日期或提交到 FreeBSD Ports 树的日期。

> **注意**
>
> `GL_SITE` 的协议、端口和网页根目录可以在同一个变量中修改。

### 5.4.4.1. 从 GitLab 获取多个文件

`USE_GITLAB` 框架还支持从 GitLab 和 GitLab 托管站点的不同位置获取多个分发文件。它的工作方式与 [从多个位置获取多个分发文件或补丁文件](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-master-sites-n) 和 [从 GitLab 获取多个文件](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-master_sites-gitlab-multiple) 类似。

可以将多个值添加到 `GL_SITE`、`GL_ACCOUNT`、`GL_PROJECT` 和 `GL_COMMIT` 中。每个不同的值分配一个组，默认值参见 [`USE_GITLAB` 描述](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-master_sites-gitlab-description)。

还可以使用 `GL_TUPLE`，当有许多分发文件时，它有助于将站点、账户、项目、提交和组信息集中在一起。

对于每个组，创建一个 `${WRKSRC_group}` 帮助变量，包含文件被提取到的目录。可以在 `post-extract` 期间使用 `${WRKSRC_group}` 变量来移动目录，或者将其添加到 `CONFIGURE_ARGS`，或者做其他必要的操作，以确保软件正确构建。

> **小心**
>
> `:group` 部分 *必须* 仅用于 *一个* 分发文件。它作为唯一键使用，使用多次将覆盖之前的值。

> **注意**
>
> 由于这只是 `DISTFILES` 和 `MASTER_SITES` 的语法糖，因此组名称必须遵守 [从多个位置获取多个分发文件或补丁文件](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-master-sites-n) 中规定的组名限制。

**示例 20. 使用 `USE_GITLAB` 获取多个分发文件**

有时需要获取多个分发文件。例如，当上游的 git 仓库使用子模块时，可以通过在 `GL_*` 变量中使用组轻松完成此操作：

```makefile
PORTNAME=	foo
DISTVERSION=	1.0.2

USE_GITLAB=	yes
GL_SITE=	https://gitlab.example.com:9434/gitlab:icons
GL_ACCOUNT=	bar:icons,contrib
GL_PROJECT=	foo-icons:icons foo-contrib:contrib
GL_COMMIT=	c189207a55da45305c884fe2b50e086fcad4724b ae7368cab1ca7ca754b38d49da064df87968ffe4:icons 9e4dd76ad9b38f33fdb417a4c01935958d5acd2a:contrib
GL_SUBDIR=	ext/icons:icons

CONFIGURE_ARGS= --with-contrib=${WRKSRC_contrib}
```

这将从 gitlab.com 获取两个分发文件，从 `gitlab.example.com` 托管的 GitLab 获取一个。默认的一个来自 <https://gitlab.com/foo/foo>，提交哈希为 `c189207a55da45305c884fe2b50e086fcad4724b`。第二个，属于 `icons` 组，来自 <https://gitlab.example.com:9434/gitlab/bar/foo-icons>，提交哈希为 `ae7368cab1ca7ca754b38d49da064df87968ffe4`。第三个来自 <https://gitlab.com/bar/foo-contrib>，提交哈希为 `9e4dd76ad9b38f33fdb417a4c01935958d5acd2a`。分发文件的名称分别是 **foo-foo-c189207a55da45305c884fe2b50e086fcad4724b\_GL0.tar.gz**、**bar-foo-icons-ae7368cab1ca7ca754b38d49da064df87968ffe4\_GL0.tar.gz** 和 **bar-foo-contrib-9e4dd76ad9b38f33fdb417a4c01935958d5acd2a\_GL0.tar.gz**。

所有分发文件都将被提取到 `${WRKDIR}` 下的各自子目录中。默认的文件仍然会提取到 `${WRKSRC}` 中，在此案例中为 **${WRKDIR}/foo-c189207a55da45305c884fe2b50e086fcad4724b-c189207a55da45305c884fe2b50e086fcad4724b**。每个额外的分发文件会提取到 `${WRKSRC_group}`。这里，`icons` 组的文件提取到 `${WRKSRC_icons}`，包含 **${WRKDIR}/foo-icons-ae7368cab1ca7ca754b38d49da064df87968ffe4-ae7368cab1ca7ca754b38d49da064df87968ffe4**。属于 `contrib` 组的文件提取到 `${WRKSRC_contrib}`，并包含 `${WRKDIR}/foo-contrib-9e4dd76ad9b38f33fdb417a4c01935958d5acd2a-9e4dd76ad9b38f33fdb417a4c01935958d5acd2a`。

软件的构建系统预计会在其源代码的 **ext/icons** 子目录中找到图标，因此使用了 `GL_SUBDIR`。`GL_SUBDIR` 确保 **ext** 存在，但 **ext/icons** 不会提前存在。然后它会执行以下操作：

```makefile
post-extract:
        @${MV} ${WRKSRC_icons} ${WRKSRC}/ext/icons
```

**示例 21. 使用 `USE_GITLAB` 获取多个分发文件并使用 `GL_TUPLE`**

这个示例与[使用 `USE_GITLAB` 获取多个分发文件](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-master_sites-gitlab-multi) 功能上是等效的，但使用了 `GL_TUPLE`：

```ini
PORTNAME=	foo
DISTVERSION=	1.0.2

USE_GITLAB=	yes
GL_COMMIT=	c189207a55da45305c884fe2b50e086fcad4724b
GL_TUPLE=	https://gitlab.example.com:9434/gitlab:bar:foo-icons:ae7368cab1ca7ca754b38d49da064df87968ffe4:icons/ext/icons \
		bar:foo-contrib:9e4dd76ad9b38f33fdb417a4c01935958d5acd2a:contrib

CONFIGURE_ARGS= --with-contrib=${WRKSRC_contrib}
```

在前面的示例中使用了分组 `bar:icons,contrib`。由于不可能进行分组操作，所以在 `GL_TUPLE` 中出现了一些冗余信息。

## 5.4.5. `EXTRACT_SUFX`

如果只有一个分发文件，并且它使用奇怪的后缀来表示压缩机制，可以设置 `EXTRACT_SUFX`。

例如，如果分发文件的名称是 **foo.tar.gzip** 而不是更常见的 **foo.tar.gz**，可以写：

```makefile
DISTNAME=	foo
EXTRACT_SUFX=	.tar.gzip
```

`USES=tar[:xxx]`、`USES=lha` 或 `USES=zip` 会自动根据需要设置 `EXTRACT_SUFX` 为最常见的归档扩展名，更多信息请参阅[使用 `USES` 宏](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses)。如果没有设置这些，`EXTRACT_SUFX` 默认为 `.tar.gz`。

> **注意**
>
> 由于 `EXTRACT_SUFX` 仅在 `DISTFILES` 中使用，因此只需设置其中之一。

## 5.4.6. `DISTFILES`

有时下载的文件名称与 Port 的名称没有任何关系。例如，它可能被称为 **source.tar.gz** 或类似名称。在其他情况下，应用程序的源代码可能分散在几个不同的归档文件中，所有这些文件都必须下载。

如果是这种情况，可以将 `DISTFILES` 设置为一个由空格分隔的文件列表，列出所有需要下载的文件。

```makefile
DISTFILES=	source1.tar.gz source2.tar.gz
```

如果未明确设置，`DISTFILES` 默认为 `${DISTNAME}${EXTRACT_SUFX}`。

## 5.4.7. `EXTRACT_ONLY`

如果只需要解压部分 `DISTFILES`，例如其中一个是源代码，另一个是未压缩的文档，可以在 `EXTRACT_ONLY` 中列出必须解压的文件名。

```makefile
DISTFILES=	source.tar.gz manual.html
EXTRACT_ONLY=	source.tar.gz
```

当没有 `DISTFILES` 需要解压时，可以将 `EXTRACT_ONLY` 设置为空字符串。

```makefile
EXTRACT_ONLY=
```

## 5.4.8. `PATCHFILES`

如果 Port 需要一些额外的补丁，并且这些补丁可以通过 FTP 或 HTTP 获取，可以将 `PATCHFILES` 设置为补丁文件的名称，`PATCH_SITES` 设置为包含补丁的目录的 URL（格式与 `MASTER_SITES` 相同）。

如果补丁与源代码树的顶部（即 `WRKSRC`）不相关，因为它包含一些额外的路径名，应该相应地设置 `PATCH_DIST_STRIP`。例如，如果补丁中的所有路径名前面都有 `foozolix-1.0/`，则应设置 `PATCH_DIST_STRIP=-p1`。

不必担心补丁是否压缩；如果补丁文件名以 **.Z**、**.gz**、**.bz2** 或 **.xz** 结尾，它们会自动解压。

如果补丁与其他文件（如文档）一起分发，并且这些文件被压缩成一个 tarball，则不能使用 `PATCHFILES`。在这种情况下，将补丁 tarball 的名称和位置添加到 `DISTFILES` 和 `MASTER_SITES` 中。然后，使用 `EXTRA_PATCHES` 指向这些文件，**bsd.port.mk** 会自动应用它们。特别是，不要将补丁文件复制到 **${PATCHDIR}**，该目录可能不可写。

> **技巧**
>
> 如果有多个补丁，并且它们的 `strip` 参数需要不同的值，可以在 `PATCHFILES` 中的补丁名称旁边添加这些值，例如：
>
> ```makefile
> PATCHFILES=	patch1 patch2:-p1
> ```
>
> 这不会与[主站分组功能](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-master-sites-n)冲突，添加分组也同样有效：
>
> ```makefile
> PATCHFILES=	patch2:-p1:source2
> ```

> **注意**
>
> tarball 会与常规源代码一起解压，因此如果它是常规压缩 tarball，就不需要显式地解压它。提取时请特别小心，不要覆盖该目录中已经存在的文件。如果手动提取补丁，记得在 `pre-clean` 目标中添加命令以删除已复制的补丁。

## 5.4.9. 从多个位置下载多个分发文件或补丁

（可以将本节视为一个“高级话题”；对于初学者，建议初次阅读时跳过此部分）。

本节介绍了一种名为 `MASTER_SITES:n` 和 `MASTER_SITES_NN` 的获取机制。我们将这种机制称为 `MASTER_SITES:n`。

首先一些背景知识。OpenBSD 在 `DISTFILES` 和 `PATCHFILES` 中具有一个非常方便的功能，允许在文件和补丁的名称后附加 `:n` 标识符。这里，`n` 可以是任何包含 `[0-9a-zA-Z_]` 的单词，并表示一个组的标识符。例如：

```makefile
DISTFILES=	alpha:0 beta:1
```

在 OpenBSD 中，分发文件 **alpha** 将与变量 `MASTER_SITES0` 关联，而不是我们常见的 `MASTER_SITES`，而 **beta** 将与 `MASTER_SITES1` 关联。

这是一个非常有趣的功能，可以减少不断寻找正确下载站点的麻烦。

试想一下，`DISTFILES` 中有两个文件，`MASTER_SITES` 中有 20 个站点，这些站点慢得要命，其中 **beta** 文件在所有站点上都有，而 **alpha** 文件只能在第 20 个站点找到。如果维护者事先知道这个情况，却还要检查所有站点，岂不是浪费大量时间？这可不是美好周末的好开始！

现在你明白了这个概念，试想更多的 `DISTFILES` 和更多的 `MASTER_SITES`，肯定会让我们的“distfiles 调查专家”对减少网络压力感到轻松。

在接下来的章节中，将介绍 FreeBSD 对这个想法的实现。我们对 OpenBSD 的概念做了一些改进。

> **重要**
>
> 组名称不能包含连字符（`-`），事实上，它们不能包含任何超出 `[a-zA-Z0-9_]` 范围的字符。这是因为，虽然 [make(1)](https://man.freebsd.org/cgi/man.cgi?query=make\&sektion=1\&format=html) 可以接受包含连字符的变量名，但 [sh(1)](https://man.freebsd.org/cgi/man.cgi?query=sh\&sektion=1\&format=html) 不允许。

### 5.4.9.1. 简化信息

本节解释了如何快速准备从不同站点和子目录下载多个分发文件和补丁的精细化获取。我们在这里描述了简化版 `MASTER_SITES:n` 的使用。这对于大多数场景来说已经足够了。更多详细信息请参见 [详细信息](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#ports-master-sites-n-detailed)。

有些应用程序由多个分发文件组成，这些文件必须从多个不同的站点下载。例如，Ghostscript 包含程序的核心部分，还有大量驱动文件，这些驱动文件根据用户的打印机不同而有所不同。部分驱动文件随核心文件一起提供，但许多其他驱动文件必须从不同的站点下载。

为了解决这个问题，`DISTFILES` 中的每个条目可以跟随一个冒号和一个“组名”。然后，`MASTER_SITES` 中列出的每个站点都将跟随一个冒号和该组，表示从该站点下载的分发文件。

例如，考虑一个由两个部分组成的应用程序，**source1.tar.gz** 和 **source2.tar.gz**，这两个文件必须从不同的站点下载。Port 的 **Makefile** 应包括如下内容：

**示例 22. 简化版 `MASTER_SITES:n` 使用（每个站点一个文件）**

```makefile
MASTER_SITES=	ftp://ftp1.example.com/:source1 \
		http://www.example.com/:source2
DISTFILES=	source1.tar.gz:source1 \
		source2.tar.gz:source2
```

多个分发文件可以具有相同的组。继续之前的示例，假设有一个第三个分发文件 **source3.tar.gz**，它从 `www.example.com` 下载。此时，**Makefile** 应写成如下：

**示例 23. 简化版 `MASTER_SITES:n` 使用（每个站点多个文件）**

```makefile
MASTER_SITES=	ftp://ftp.example.com/:source1 \
		http://www.example.com/:source2
DISTFILES=	source1.tar.gz:source1 \
		source2.tar.gz:source2 \
		source3.tar.gz:source2
```

### 5.4.9.2. 详细信息

好的，那么之前的例子没有反映出新的 Port 的需求吗？在这一节中，我们将详细解释细粒度获取机制 `MASTER_SITES:n` 的工作原理以及如何使用它。

1. 元素可以附加 `:n` 后缀，其中 *n* 是 `[^:,]\+`，也就是说，*n* 可以是任何字母数字字符串，但我们目前将其限制为 `[a-zA-Z_][0-9a-zA-Z_]+`。 此外，字符串匹配是区分大小写的；也就是说，`n` 和 `N` 是不同的。

   然而，这些单词不能用于后缀化，因为它们具有特殊含义：`default`、`all` 和 `ALL`（它们在 [ii](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-master-sites-n-what-changes-in-port-targets) 项中被内部使用）。此外，`DEFAULT` 是一个特殊用途的单词（请查看 [3](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-master-sites-n-DEFAULT-group) 项）。
2. 带有 `:n` 后缀的元素属于组 `n`，带有 `:m` 后缀的元素属于组 `m`，依此类推。
3. 没有后缀的元素没有分组，它们都属于特殊组 `DEFAULT`。任何带有 `DEFAULT` 后缀的元素都是冗余的，除非该元素同时属于 `DEFAULT` 和其他组（请参阅 [5](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-master-sites-n-comma-operator) 项）。 这些示例是等效的，但第一个是首选：

   ```makefile
   MASTER_SITES=	alpha
   ```

   ```makefile
   MASTER_SITES=	alpha:DEFAULT
   ```
4. 组不是互斥的，一个元素可以同时属于多个不同的组，一个组可以包含多个不同的元素，也可以没有元素。
5. 当一个元素同时属于多个组时，使用逗号操作符（`,`）。 我们可以一次列出多个组，而不是多次重复每次不同的后缀。例如，`:m,n,o` 表示该元素属于组 `m`、`n` 和 `o`。

   所有这些示例都是等效的，但最后一个是首选：

   ```makefile
   MASTER_SITES=	alpha alpha:SOME_SITE
   ```

   ```makefile
   MASTER_SITES=	alpha:DEFAULT alpha:SOME_SITE
   ```

   ```makefile
   MASTER_SITES=	alpha:SOME_SITE,DEFAULT
   ```

   ```makefile
   MASTER_SITES=	alpha:DEFAULT,SOME_SITE
   ```
6. 给定组内的所有站点按照 `MASTER_SORT_AWK` 排序。所有 `MASTER_SITES` 和 `PATCH_SITES` 中的组也会被排序。
7. 组语义可以在以下变量中使用：`MASTER_SITES`、`PATCH_SITES`、`MASTER_SITE_SUBDIR`、`PATCH_SITE_SUBDIR`、`DISTFILES` 和 `PATCHFILES`，并遵循此语法：
   1. 所有 `MASTER_SITES`、`PATCH_SITES`、`MASTER_SITE_SUBDIR` 和 `PATCH_SITE_SUBDIR` 元素必须以斜杠 `/` 字符结束。如果任何元素属于任何组，则组后缀 `:n` 必须紧随其后。`MASTER_SITES:n` 机制依赖于斜杠 `/` 结束符，以避免混淆那些 `:n` 是元素的有效部分的情况与那些 `:n` 表示组 `n` 的情况。为了兼容性，由于之前在 `MASTER_SITE_SUBDIR` 和 `PATCH_SITE_SUBDIR` 元素中不要求 `/` 结束符，如果紧接在后缀之前的字符不是 `/`，那么 `:n` 将被视为元素的有效部分，而不是组后缀，即使元素带有 `:n` 后缀。请参见 [详细使用 `MASTER_SITES:n` 在 `MASTER_SITE_SUBDIR` 中](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#ports-master-sites-n-example-detailed-use-master-site-subdir) 和 [详细使用 `MASTER_SITES:n` 与逗号操作符](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#ports-master-sites-n-example-detailed-use-complete-example-master-sites)。 **示例 24. 在 `MASTER_SITE_SUBDIR` 中详细使用 `MASTER_SITES:n`**

      ```makefile
      MASTER_SITE_SUBDIR=	old:n new/:NEW
      ```

      * 属于 `DEFAULT` 组的目录 → `old:n`
      * 属于 `NEW` 组的目录 → `new`

      **示例 25. 使用逗号操作符的详细示例，多个文件、多个站点和多个子目录**

      ```makefile
      MASTER_SITES=	http://site1/%SUBDIR%/ http://site2/:DEFAULT \
      		http://site3/:group3 http://site4/:group4 \
      		http://site5/:group5 http://site6/:group6 \
      		http://site7/:DEFAULT,group6 \
      		http://site8/%SUBDIR%/:group6,group7 \
      		http://site9/:group8
      DISTFILES=	file1 file2:DEFAULT file3:group3 \
      		file4:group4,group5,group6 file5:grouping \
      		file6:group7
      MASTER_SITE_SUBDIR=	directory-trial:1 directory-n/:groupn \
      		directory-one/:group6,DEFAULT \
      		directory
      ```

      上述示例的细粒度获取结果如下。站点将按使用顺序列出。

      * **file1** 将从以下站点获取：
        * `MASTER_SITE_OVERRIDE`
        * <http://site1/directory-trial:1/>
        * <http://site1/directory-one/>
        * <http://site1/directory/>
        * <http://site2/>
        * <http://site7/>
        * `MASTER_SITE_BACKUP`
      * **file2** 将与 **file1** 完全相同地获取，因为它们属于相同的组
        * `MASTER_SITE_OVERRIDE`
        * <http://site1/directory-trial:1/>
        * <http://site1/directory-one/>
        * <http://site1/directory/>
        * <http://site2/>
        * <http://site7/>
        * `MASTER_SITE_BACKUP`
      * **file3** 将从以下站点获取：
        * `MASTER_SITE_OVERRIDE`
        * <http://site3/>
        * `MASTER_SITE_BACKUP`
      * **file4** 将从以下站点获取：
        * `MASTER_SITE_OVERRIDE`
        * <http://site4/>
        * <http://site5/>
        * <http://site6/>
        * <http://site7/>
        * <http://site8/directory-one/>
        * `MASTER_SITE_BACKUP`
      * **file5** 将从以下站点获取：
        * `MASTER_SITE_OVERRIDE`
        * `MASTER_SITE_BACKUP`
      * **file6** 将从以下站点获取：
        * `MASTER_SITE_OVERRIDE`
        * <http://site8/>
        * `MASTER_SITE_BACKUP`
8. 如何将 **bsd.sites.mk** 中的某个特殊宏分组，例如 SourceForge (`SF`)？ 这已经尽可能简化。请参见 [详细使用 `MASTER_SITES:n` 与 SourceForge (`SF`)](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#ports-master-sites-n-example-detailed-use-master-site-sourceforge)。

   **示例 26. 详细使用 `MASTER_SITES:n` 与 SourceForge (`SF`)**

   ```makefile
   MASTER_SITES=	http://site1/ SF/something/1.0:sourceforge,TEST
   DISTFILES=	something.tar.gz:sourceforge
   ```

   **something.tar.gz** 将从 SourceForge 中的所有站点获取。
9. 如何与 `PATCH*` 一起使用？ 所有示例都使用了 `MASTER*`，但它们与 `PATCH*` 一样适用，正如在 [简化使用 `MASTER_SITES:n` 与 `PATCH_SITES`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#ports-master-sites-n-example-detailed-use-patch-sites) 中所见。

   **示例 27. 简化使用 `MASTER_SITES:n` 与 `PATCH_SITES`**

   ```makefile
   PATCH_SITES=	http://site1/ http://site2/:test
   PATCHFILES=	patch1:test
   ```

### 5.4.9.3. 对 Ports 的影响：变化与不变之处

1. 所有当前的 Ports 保持不变。只有当存在按上述语法规则附加 `:n` 后缀的元素时，`MASTER_SITES:n` 特性才会被激活，特别是在 [第 7 项](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-master-sites-n-group-semantics) 中显示的那样。
2. Port 目标保持不变：`checksum`、`makesum`、`patch`、`configure`、`build` 等。唯一的例外是 `do-fetch`、`fetch-list`、`master-sites` 和 `patch-sites`。
   * `do-fetch`：部署新分组，并根据其匹配的组元素，在 `MASTER_SITES` 和 `PATCH_SITES` 中分别使用对应的分组元素，同时在 `MASTER_SITE_SUBDIR` 和 `PATCH_SITE_SUBDIR` 中使用匹配的组元素。请查看 [使用逗号操作符的 `MASTER_SITES:n` 的详细用法](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#ports-master-sites-n-example-detailed-use-complete-example-master-sites)。
   * `fetch-list`：与旧的 `fetch-list` 工作方式相同，唯一的区别是它像 `do-fetch` 一样进行分组。
   * `master-sites` 和 `patch-sites`：（与旧版本不兼容）仅返回 `DEFAULT` 组的元素；实际上，它们分别执行 `master-sites-default` 和 `patch-sites-default` 目标。此外，使用 `master-sites-all` 或 `patch-sites-all` 目标来代替直接检查 `MASTER_SITES` 或 `PATCH_SITES` 是更为推荐的方式。直接检查在未来版本中可能无法正常工作。有关这些新 Port 目标的更多信息，请参阅 [第 B 项](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-master-sites-n-new-port-targets-master-sites-all)。
3. 新的 Port 目标：
   1. `master-sites-n` 和 `patch-sites-n` 目标将列出各自组 `n` 中的元素。例如，`master-sites-DEFAULT` 和 `patch-sites-DEFAULT` 将返回 `DEFAULT` 组的元素，`master-sites-test` 和 `patch-sites-test` 将返回 `test` 组的元素，依此类推。
   2. 新的目标 `master-sites-all` 和 `patch-sites-all` 将执行旧的 `master-sites` 和 `patch-sites` 目标的功能。它们返回所有组的元素，就像它们都属于同一个组一样，唯一的不同是，它们列出了与 `DISTFILES` 或 `PATCHFILES` 中定义的组数量相同的 `MASTER_SITE_BACKUP` 和 `MASTER_SITE_OVERRIDE`，分别对应 `master-sites-all` 和 `patch-sites-all`。

## 5.4.10. `DIST_SUBDIR`

不要让 Port 污染 **/usr/ports/distfiles**。如果 Port 需要获取大量文件，或者包含一个可能与其他 Ports 冲突的文件（例如，**Makefile**），请将 `DIST_SUBDIR` 设置为 Port 的名称（`${PORTNAME}` 或 `${PKGNAMEPREFIX}${PORTNAME}` 都可以）。这将把 `DISTDIR` 从默认的 **/usr/ports/distfiles** 改为 **/usr/ports/distfiles/${DIST\_SUBDIR}**，从而将该 Port 所需的所有文件放入该子目录中。

它还会查看备份主站点上具有相同名称的子目录，网址为 [http://distcache.FreeBSD.org](http://distcache.freebsd.org/)（仅在 **Makefile** 中显式设置 `DISTDIR` 是无法实现这一点的，请使用 `DIST_SUBDIR`）。

> **注意**
>
> 这不会影响 **Makefile** 中定义的 `MASTER_SITES`。


# 5.5.维护者（MAINTAINER）

请在这里设置你的邮件地址 *:-)*

只允许使用没有注释部分的单一地址作为 `MAINTAINER` 值。使用的格式为 `user@hostname.domain`。请不要在此条目中包含任何描述性文本（如真实姓名）。这只会让 Ports 基础设施和大多数使用它的工具产生混淆。

维护者负责保持 Port 的更新，并确保其正常工作。如需详细了解 Port 维护者的责任，请参阅 [Port 维护者的挑战](https://docs.freebsd.org/en/articles/contributing/#maintain-port)。

> **注意**
>
> 维护者自愿保持 Port 的正常运行。维护者对其 Port 负主要责任，但并不拥有独占权。Ports 是为了社区的利益而存在的，实际上属于社区。这意味着除了维护者之外，其他人也可以对 Port 进行修改。对 Ports Collection 的重大更改可能需要修改许多 Port。FreeBSD Ports 管理团队或其他团队的成员可能会修改 Port，以解决依赖问题或其他问题，例如更新共享库的版本。
>
> 某些类型的修复获得了 Ports 管理团队 <<portmgr@FreeBSD.org>> 的“普遍批准”，允许任何提交者在任何 Port 上修复这些类别的问题。这些修复不需要维护者的批准。
>
> 对大多数 Port 而言，“普遍批准”适用于基础设施更改，或简单且 *经过测试* 的构建和运行时修复。当前列表可在 [提交者指南的 Ports 部分](https://docs.freebsd.org/en/articles/committers-guide/#ports-qa-misc-blanket-approval) 中查看。

对于 Port 的其他更改，将发送给维护者进行审查和批准，然后再提交。如果维护者在两周内未对更新请求做出回应（不包括主要公共假期），则视为维护者超时，可以在没有维护者明确批准的情况下进行更新。如果维护者在三个月内未作出回应，或连续三次超时，则视为维护者无故缺席，所有其维护的 Port 可以重新分配给其他人。例外情况是由 Ports 管理团队 <portmgr@FreeBSD.org> 或安全官团队 <security-officer@FreeBSD.org> 维护的 Port。对于这些团队维护的 Port，不能进行未经授权的提交。

我们保留在没有提交者或维护者明确批准的情况下，修改维护者提交的内容的权利，以更好地符合现有政策和 Ports Collection 的风格。同时，大型基础设施更改可能导致在没有维护者同意的情况下修改 Port。这类更改永远不会影响 Port 的功能。

Ports 管理团队 <portmgr@FreeBSD.org> 保留因任何原因撤销或覆盖任何人维护权限的权利，安全官团队 <security-officer@FreeBSD.org> 保留因安全原因撤销或覆盖维护权限的权利。


# 5.6.一句话说明（COMMENT）

说明是显示在 `pkg info` 中的 Port 的一行描述。在编写说明时，请遵循以下规则：

1. `COMMENT` 字符串不应超过 70 个字符。
2. 不要包含软件的包名或版本号。
3. 说明应以大写字母开头，且末尾不加句号。
4. 不要以不定冠词（即 A 或 An）开头。
5. Apache、JavaScript 或 Perl 等名称应使用大写字母。
6. 列表中的单词应使用串联逗号：`green, red, and blue`。
7. 检查拼写错误。

示例：

```makefile
COMMENT=	Cat chasing a mouse all over the screen
```

`COMMENT` 变量紧跟在 **Makefile** 中的 `MAINTAINER` 变量后面。


# 5.7.项目网站

每个 Port 应指向提供更多软件信息的网站。

如果可能的话，这应该是由软件开发者维护的官方项目网站。

```makefile
WWW=		https://ffmpeg.org/
```

但它也可以是源代码仓库中的目录或资源：

```makefile
WWW=		https://sourceforge.net/projects/mpd/
```

`WWW` 变量紧跟在 **Makefile** 中的 `COMMENT` 变量后面。

如果相同的内容可以通过 HTTP 和 HTTPS 访问，应使用以 `https://` 开头的 URL。如果 URI 是网站或目录的根目录，则必须以斜杠结尾。

这些信息以前放在 **pkg-descr** 文件的最后一行。现在已将其移至 **Makefile** 以便于维护和处理。**pkg-descr** 文件末尾的 `WWW:` 行已被弃用。


# 5.8.许可证

每个 Port 必须记录其可用的许可证。如果它不是一个 OSI 批准的许可证，则必须记录任何关于再分发的限制。

## 5.8.1. `LICENSE`

许可证的简短名称，如果有多个许可证适用，则列出所有相关许可证。

如果它是 [预定义许可证列表](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#licenses-license-list) 中列出的许可证，则只能设置 `LICENSE_FILE` 和 `LICENSE_DISTFILES` 变量。

如果这是一个在 Ports 框架中尚未定义的许可证（见 [预定义许可证列表](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#licenses-license-list)），则必须设置 `LICENSE_PERMS` 和 `LICENSE_NAME`，并且必须设置 `LICENSE_FILE` 或 `LICENSE_TEXT`。`LICENSE_DISTFILES` 和 `LICENSE_GROUPS` 也可以设置，但不是必需的。

预定义许可证列出在 [预定义许可证列表](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#licenses-license-list) 中。当前列表始终可在 **Mk/bsd.licenses.db.mk** 中找到。

**示例 28. 最简单的用法，预定义许可证**

当某些软件的 **README** 文件中写道“本软件根据自由软件基金会发布的 GNU 较宽松公共许可证（LGPL）条款进行许可；可以选择版本 2.1 或（根据你的选择）任何更高版本。”但没有提供许可证文件时，可以使用以下内容：

```makefile
LICENSE=	LGPL21+
```

当软件提供许可证文件时，使用以下内容：

```makefile
LICENSE=	LGPL21+
LICENSE_FILE=	${WRKSRC}/COPYING
```

对于预定义的许可证，默认权限为 `dist-mirror dist-sell pkg-mirror pkg-sell auto-accept`。

**表 7. 预定义许可证列表**

| 简短名称              | 名称                                                             | 组别                     | 权限                                   |
| ----------------- | -------------------------------------------------------------- | ---------------------- | ------------------------------------ |
| `AGPLv3`          | GNU Affero General Public License 版本 3                         | `FSF GPL OSI`          | （默认）                                 |
| `AGPLv3+`         | GNU Affero General Public License 版本 3（或更高版本）                  | `FSF GPL OSI`          | （默认）                                 |
| `APACHE10`        | Apache License 1.0                                             | `FSF`                  | （默认）                                 |
| `APACHE11`        | Apache License 1.1                                             | `FSF OSI`              | （默认）                                 |
| `APACHE20`        | Apache License 2.0                                             | `FSF OSI`              | （默认）                                 |
| `ART10`           | Artistic License 版本 1.0                                        | `OSI`                  | （默认）                                 |
| `ART20`           | Artistic License 版本 2.0                                        | `FSF GPL OSI`          | （默认）                                 |
| `ARTPERL10`       | Artistic License (perl) 版本 1.0                                 | `OSI`                  | （默认）                                 |
| `BSD`             | BSD 许可证通用版本（弃用）                                                | `FSF OSI COPYFREE`     | （默认）                                 |
| `BSD2CLAUSE`      | BSD 2-clause“简化版”许可证                                           | `FSF OSI COPYFREE`     | （默认）                                 |
| `BSD3CLAUSE`      | BSD 3-clause“新”或“修订版”许可证                                       | `FSF OSI COPYFREE`     | （默认）                                 |
| `BSD4CLAUSE`      | BSD 4-clause“原始”或“旧版”许可证                                       | `FSF`                  | （默认）                                 |
| `BSL`             | Boost 软件许可证                                                    | `FSF OSI COPYFREE`     | （默认）                                 |
| `CC-BY-1.0`       | Creative Commons Attribution 1.0                               |                        | （默认）                                 |
| `CC-BY-2.0`       | Creative Commons Attribution 2.0                               |                        | （默认）                                 |
| `CC-BY-2.5`       | Creative Commons Attribution 2.5                               |                        | （默认）                                 |
| `CC-BY-3.0`       | Creative Commons Attribution 3.0                               |                        | （默认）                                 |
| `CC-BY-4.0`       | Creative Commons Attribution 4.0                               |                        | （默认）                                 |
| `CC-BY-NC-1.0`    | Creative Commons Attribution Non Commercial 1.0                |                        | `dist-mirror pkg-mirror auto-accept` |
| `CC-BY-NC-2.0`    | Creative Commons Attribution Non Commercial 2.0                |                        | `dist-mirror pkg-mirror auto-accept` |
| `CC-BY-NC-2.5`    | Creative Commons Attribution Non Commercial 2.5                |                        | `dist-mirror pkg-mirror auto-accept` |
| `CC-BY-NC-3.0`    | Creative Commons Attribution Non Commercial 3.0                |                        | `dist-mirror pkg-mirror auto-accept` |
| `CC-BY-NC-4.0`    | Creative Commons Attribution Non Commercial 4.0                |                        | `dist-mirror pkg-mirror auto-accept` |
| `CC-BY-NC-ND-1.0` | Creative Commons Attribution Non Commercial No Derivatives 1.0 |                        | `dist-mirror pkg-mirror auto-accept` |
| `CC-BY-NC-ND-2.0` | Creative Commons Attribution Non Commercial No Derivatives 2.0 |                        | `dist-mirror pkg-mirror auto-accept` |
| `CC-BY-NC-ND-2.5` | Creative Commons Attribution Non Commercial No Derivatives 2.5 |                        | `dist-mirror pkg-mirror auto-accept` |
| `CC-BY-NC-ND-3.0` | Creative Commons Attribution Non Commercial No Derivatives 3.0 |                        | `dist-mirror pkg-mirror auto-accept` |
| `CC-BY-NC-ND-4.0` | Creative Commons Attribution Non Commercial No Derivatives 4.0 |                        | `dist-mirror pkg-mirror auto-accept` |
| `CC-BY-NC-SA-1.0` | Creative Commons Attribution Non Commercial Share Alike 1.0    |                        | `dist-mirror pkg-mirror auto-accept` |
| `CC-BY-NC-SA-2.0` | Creative Commons Attribution Non Commercial Share Alike 2.0    |                        | `dist-mirror pkg-mirror auto-accept` |
| `CC-BY-NC-SA-2.5` | Creative Commons Attribution Non Commercial Share Alike 2.5    |                        | `dist-mirror pkg-mirror auto-accept` |
| `CC-BY-NC-SA-3.0` | Creative Commons Attribution Non Commercial Share Alike 3.0    |                        | `dist-mirror pkg-mirror auto-accept` |
| `CC-BY-NC-SA-4.0` | Creative Commons Attribution Non Commercial Share Alike 4.0    |                        | `dist-mirror pkg-mirror auto-accept` |
| `CC-BY-ND-1.0`    | Creative Commons Attribution No Derivatives 1.0                |                        | （默认）                                 |
| `CC-BY-ND-2.0`    | Creative Commons Attribution No Derivatives 2.0                |                        | （默认）                                 |
| `CC-BY-ND-2.5`    | Creative Commons Attribution No Derivatives 2.5                |                        | （默认）                                 |
| `CC-BY-ND-3.0`    | Creative Commons Attribution No Derivatives 3.0                |                        | （默认）                                 |
| `CC-BY-ND-4.0`    | Creative Commons Attribution No Derivatives 4.0                |                        | （默认）                                 |
| `CC-BY-SA-1.0`    | Creative Commons Attribution Share Alike 1.0                   |                        | （默认）                                 |
| `CC-BY-SA-2.0`    | Creative Commons Attribution Share Alike 2.0                   |                        | （默认）                                 |
| `CC-BY-SA-2.5`    | Creative Commons Attribution Share Alike 2.5                   |                        | （默认）                                 |
| `CC-BY-SA-3.0`    | Creative Commons Attribution Share Alike 3.0                   |                        | （默认）                                 |
| `CC-BY-SA-4.0`    | Creative Commons Attribution Share Alike 4.0                   |                        | （默认）                                 |
| `CC0-1.0`         | Creative Commons Zero v1.0 Universal                           | `FSF GPL COPYFREE`     | （默认）                                 |
| `CDDL`            | 通用开发与分发许可证                                                     | `FSF OSI`              | （默认）                                 |
| `CPAL-1.0`        | 通用公共署名许可证                                                      | `FSF OSI`              | （默认）                                 |
| `ClArtistic`      | 明确艺术许可证                                                        | `FSF GPL OSI`          | （默认）                                 |
| `EPL`             | Eclipse 公共许可证                                                  | `FSF OSI`              | （默认）                                 |
| `GFDL`            | GNU 自由文档许可证                                                    | `FSF`                  | （默认）                                 |
| `GMGPL`           | GNAT 修改版通用公共许可证                                                | `FSF GPL OSI`          | （默认）                                 |
| `GPLv1`           | GNU 通用公共许可证版本 1                                                | `FSF GPL OSI`          | （默认）                                 |
| `GPLv1+`          | GNU 通用公共许可证版本 1（或更高版本）                                         | `FSF GPL OSI`          | （默认）                                 |
| `GPLv2`           | GNU 通用公共许可证版本 2                                                | `FSF GPL OSI`          | （默认）                                 |
| `GPLv2+`          | GNU 通用公共许可证版本 2（或更高版本）                                         | `FSF GPL OSI`          | （默认）                                 |
| `GPLv3`           | GNU 通用公共许可证版本 3                                                | `FSF GPL OSI`          | （默认）                                 |
| `GPLv3+`          | GNU 通用公共许可证版本 3（或更高版本）                                         | `FSF GPL OSI`          | （默认）                                 |
| `GPLv3RLE`        | GNU GPL 版本 3 运行时库例外                                            | `FSF GPL OSI`          | （默认）                                 |
| `GPLv3RLE+`       | GNU GPL 版本 3 运行时库例外（或更高版本）                                     | `FSF GPL OSI`          | （默认）                                 |
| `ISCL`            | 网络系统联盟许可证                                                      | `FSF GPL OSI COPYFREE` | （默认）                                 |
| `LGPL20`          | GNU 库通用公共许可证版本 2.0                                             | `FSF GPL OSI`          | （默认）                                 |
| `LGPL20+`         | GNU 库通用公共许可证版本 2.0（或更高版本）                                      | `FSF GPL OSI`          | （默认）                                 |
| `LGPL21`          | GNU 较小型公共许可证版本 2.1                                             | `FSF GPL OSI`          | （默认）                                 |
| `LGPL21+`         | GNU 较小型公共许可证版本 2.1（或更高版本）                                      | `FSF GPL OSI`          | （默认）                                 |
| `LGPL3`           | GNU 较小型公共许可证版本 3                                               | `FSF GPL OSI`          | （默认）                                 |
| `LGPL3+`          | GNU 较小型公共许可证版本 3（或更高版本）                                        | `FSF GPL OSI`          | （默认）                                 |
| `LPPL10`          | LaTeX 项目公共许可证版本 1.0                                            | `FSF OSI`              | `dist-mirror dist-sell`              |
| `LPPL11`          | LaTeX 项目公共许可证版本 1.1                                            | `FSF OSI`              | `dist-mirror dist-sell`              |
| `LPPL12`          | LaTeX 项目公共许可证版本 1.2                                            | `FSF OSI`              | `dist-mirror dist-sell`              |
| `LPPL13`          | LaTeX 项目公共许可证版本 1.3                                            | `FSF OSI`              | `dist-mirror dist-sell`              |
| `LPPL13a`         | LaTeX 项目公共许可证版本 1.3a                                           | `FSF OSI`              | `dist-mirror dist-sell`              |
| `LPPL13b`         | LaTeX 项目公共许可证版本 1.3b                                           | `FSF OSI`              | `dist-mirror dist-sell`              |
| `LPPL13c`         | LaTeX 项目公共许可证版本 1.3c                                           | `FSF OSI`              | `dist-mirror dist-sell`              |
| `MIT`             | MIT 许可证 / X11 许可证                                              | `COPYFREE FSF GPL OSI` | （默认）                                 |
| `MPL10`           | Mozilla 公共许可证版本 1.0                                            | `FSF OSI`              | （默认）                                 |
| `MPL11`           | Mozilla 公共许可证版本 1.1                                            | `FSF OSI`              | （默认）                                 |
| `MPL20`           | Mozilla 公共许可证版本 2.0                                            | `FSF OSI`              | （默认）                                 |
| `NCSA`            | 伊利诺伊大学/NCSA 开源许可证                                              | `COPYFREE FSF GPL OSI` | （默认）                                 |
| `NONE`            | 未指定许可证                                                         |                        | `none`                               |
| `OFL10`           | SIL 开源字体许可证版本 1.0 (<https://scripts.sil.org/OFL/>)             | `FONTS`                | （默认）                                 |
| `OFL11`           | SIL 开源字体许可证版本 1.1 (<https://scripts.sil.org/OFL/>)             | `FONTS`                | （默认）                                 |
| `OWL`             | Open Works 许可证 (owl.apotheon.org)                              | `COPYFREE`             | （默认）                                 |
| `OpenSSL`         | OpenSSL 许可证                                                    | `FSF`                  | （默认）                                 |
| `PD`              | 公有领域                                                           | `GPL COPYFREE`         | （默认）                                 |
| `PHP202`          | PHP 许可证版本 2.02                                                 | `FSF OSI`              | （默认）                                 |
| `PHP30`           | PHP 许可证版本 3.0                                                  | `FSF OSI`              | （默认）                                 |
| `PHP301`          | PHP 许可证版本 3.01                                                 | `FSF OSI`              | （默认）                                 |
| `PSFL`            | Python 软件基金会许可证                                                | `FSF GPL OSI`          | （默认）                                 |
| `PostgreSQL`      | PostgreSQL 许可证                                                 | `FSF GPL OSI COPYFREE` | （默认）                                 |
| `RUBY`            | Ruby 许可证                                                       | `FSF`                  | （默认）                                 |
| `UNLICENSE`       | The Unlicense                                                  | `COPYFREE FSF GPL`     | （默认）                                 |
| `WTFPL`           | 随心所欲公共许可证版本 2                                                  | `GPL FSF COPYFREE`     | （默认）                                 |
| `WTFPL1`          | 随心所欲公共许可证版本 1                                                  | `GPL FSF COPYFREE`     | （默认）                                 |
| `ZLIB`            | zlib 许可证                                                       | `GPL FSF OSI`          | （默认）                                 |
| `ZPL21`           | Zope 公共许可证版本 2.1                                               | `GPL OSI`              | （默认）                                 |

## 5.8.2. `LICENSE_PERMS` 和 `LICENSE_PERMS_NAME_`

权限。如果为空，使用 `none`。

**许可证权限列表**

`dist-mirror` 允许再分发分发文件。分发文件将添加到 FreeBSD `MASTER_SITE_BACKUP` CDN。

`no-dist-mirror` 禁止再分发分发文件。这等同于设置 [`RESTRICTED`](https://docs.freebsd.org/en/books/porters-handbook/special/#porting-restrictions-restricted)。分发文件将 *不会* 添加到 FreeBSD `MASTER_SITE_BACKUP` CDN。

`dist-sell` 允许出售分发文件。分发文件将出现在安装映像中。

`no-dist-sell` 禁止出售分发文件。这等同于设置 [`NO_CDROM`](https://docs.freebsd.org/en/books/porters-handbook/special/#porting-restrictions-no_cdrom)。

`pkg-mirror` 允许自由分发软件包。该软件包将分发到 FreeBSD 软件包 CDN <https://pkg.freebsd.org/>。

`no-pkg-mirror` 禁止自由分发软件包。等同于设置 [`NO_PACKAGE`](https://docs.freebsd.org/en/books/porters-handbook/special/#porting-restrictions-no_package)。该软件包将 *不会* 从 FreeBSD 软件包 CDN <https://pkg.freebsd.org/> 分发。

`pkg-sell` 允许出售软件包。该软件包将出现在安装映像中。

`no-pkg-sell` 禁止出售软件包。这等同于设置 [`NO_CDROM`](https://docs.freebsd.org/en/books/porters-handbook/special/#porting-restrictions-no_cdrom)。该软件包将 *不会* 出现在安装映像中。

`auto-accept` 默认接受许可证。除非用户定义了 `LICENSES_ASK`，否则不会显示接受许可证的提示。除非许可证声明用户必须接受其条款，否则请使用此选项。

`no-auto-accept` 默认不接受许可证。用户将始终被要求确认接受此许可证。如果许可证声明用户必须接受其条款，则必须使用此选项。

当同时存在 `permission` 和 `no-permission` 时，`no-permission` 将取消 `permission`。

当 `permission` 未出现时，视为 `no-permission`。

> **警告**
>
> 某些缺失的权限会导致 Port（以及所有依赖于它的 Port）无法供软件包用户使用：
>
> 没有 `auto-accept` 权限的 Port 将永远不会被构建，所有依赖于它的 Port 将被忽略。
>
> 没有 `pkg-mirror` 权限的 Port（以及任何依赖于它的 Port）将在构建后被删除，确保它们不会被分发。

**示例 29. 非标准许可证**

阅读许可证条款，并使用可用权限进行转换。

```makefile
LICENSE=        UNKNOWN
LICENSE_NAME=   unknown
LICENSE_TEXT=   This program is NOT in public domain.\
                It can be freely distributed for non-commercial purposes only.
LICENSE_PERMS=  dist-mirror no-dist-sell pkg-mirror no-pkg-sell auto-accept
```

**示例 30. 标准和非标准许可证**

阅读许可证条款，并使用可用权限进行表达。如果有疑问，请在 [FreeBSD Ports 邮件列表](https://lists.freebsd.org/subscription/freebsd-ports) 上请求指导。

```makefile
LICENSE=        WARSOW GPLv2
LICENSE_COMB=   multi
LICENSE_NAME_WARSOW=    Warsow Content License
LICENSE_FILE_WARSOW=    ${WRKSRC}/docs/license.txt
LICENSE_PERMS_WARSOW=   dist-mirror pkg-mirror auto-accept
```

当 GPLv2 和 UNKNOWN 许可证的权限混合时，Port 最终会包含 `dist-mirror dist-sell pkg-mirror pkg-sell auto-accept dist-mirror no-dist-sell pkg-mirror no-pkg-sell auto-accept`。`no-*permission*` 会取消 *permission*。最终的权限列表是 *dist-mirror pkg-mirror auto-accept*。分发文件和软件包将不会出现在安装映像中。

## 5.8.3. `LICENSE_GROUPS` 和 `LICENSE_GROUPS_NAME`

许可证所属的组。

**预定义的许可证组列表**

`FSF` Free Software Foundation 批准，见 [FSF Licensing & Compliance Team](https://www.fsf.org/licensing/)。

`GPL` 与 GPL 兼容

`OSI` OSI 批准，见 Open Source Initiative 的 [Open Source Licenses](https://opensource.org/licenses/) 页面。

`COPYFREE` 符合 Copyfree 标准定义，见 [Copyfree Licenses](https://copyfree.org/standard/licenses/) 页面。

`FONTS` 字体许可证

## 5.8.4. `LICENSE_NAME` 和 `LICENSE_NAME_NAME`

许可证的完整名称。

**示例 31. `LICENSE_NAME`**

```makefile
LICENSE=        UNRAR
LICENSE_NAME=   UnRAR License
LICENSE_FILE=   ${WRKSRC}/license.txt
LICENSE_PERMS=  dist-mirror dist-sell pkg-mirror pkg-sell auto-accept
```

## 5.8.5. `LICENSE_FILE` 和 `LICENSE_FILE_NAME`

包含许可证文本的文件的完整路径，通常是 **${WRKSRC}/some/file**。如果文件不在分发文件中，且其内容太长，无法放在 [`LICENSE_TEXT`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#licenses-license_text) 中，请将其放入 **${FILESDIR}** 中的新文件。

**示例 32. `LICENSE_FILE`**

```makefile
LICENSE=	GPLv3+
LICENSE_FILE=	${WRKSRC}/COPYING
```

## 5.8.6. `LICENSE_TEXT` 和 `LICENSE_TEXT_NAME`

作为许可证使用的文本。当许可证不在分发文件中且文本较短时很有用。

**示例 33. `LICENSE_TEXT`**

```makefile
LICENSE=        UNKNOWN
LICENSE_NAME=   unknown
LICENSE_TEXT=   This program is NOT in public domain.\
                It can be freely distributed for non-commercial purposes only,\
                and THERE IS NO WARRANTY FOR THIS PROGRAM.
LICENSE_PERMS=  dist-mirror no-dist-sell pkg-mirror no-pkg-sell auto-accept
```

## 5.8.7. `LICENSE_DISTFILES` 和 `LICENSE_DISTFILES_NAME`

许可证适用的分发文件。默认为所有分发文件。

**示例 34. `LICENSE_DISTFILES`**

当分发文件并非全部适用同一许可证时使用。例如，一个文件有代码许可证，另一个文件包含不能重新分发的艺术作品：

```makefile
MASTER_SITES=   SF/some-game
DISTFILES=      ${DISTNAME}${EXTRACT_SUFX} artwork.zip

LICENSE=        BSD3CLAUSE ARTWORK
LICENSE_COMB=   dual
LICENSE_NAME_ARTWORK=      The game artwork license
LICENSE_TEXT_ARTWORK=      The README says that the files cannot be redistributed
LICENSE_PERMS_ARTWORK=     pkg-mirror pkg-sell auto-accept
LICENSE_DISTFILES_BSD3CLAUSE=   ${DISTNAME}${EXTRACT_SUFX}
LICENSE_DISTFILES_ARTWORK= artwork.zip
```

## 5.8.8. `LICENSE_COMB`

如果所有许可证都适用，则设置为 `multi`。如果任意许可证适用，则设置为 `dual`。默认为 `single`。

**示例 35. 双重许可证**

当一个 Port 声明“此软件可以根据 GNU 通用公共许可证或艺术许可证进行分发”时，表示可以使用其中任何一个许可证。使用如下设置：

```makefile
LICENSE=	ART10 GPLv1
LICENSE_COMB=   dual
```

如果提供了许可证文件，请使用如下设置：

```makefile
LICENSE=	ART10 GPLv1
LICENSE_COMB=   dual
LICENSE_FILE_ART10=     ${WRKSRC}/Artistic
LICENSE_FILE_GPLv1=     ${WRKSRC}/Copying
```

**示例 36. 多个许可证**

当 Port 的一部分使用一个许可证，而另一部分使用不同的许可证时，使用 `multi`：

```makefile
LICENSE=	GPLv2 LGPL21+
LICENSE_COMB=	multi
```


# 5.9.PORTSCOUT

Portscout 是 FreeBSD Ports Collection 的自动化 distfile 检查工具，详细描述见 [Portscout: the FreeBSD Ports Distfile Scanner](https://docs.freebsd.org/en/books/porters-handbook/keeping-up/#distfile-survey)。

`PORTSCOUT` 定义了 Portscout distfile 扫描器受限的特殊条件。

设置 `PORTSCOUT` 时的情况包括：

* 当需要忽略特定版本的 distfile 时。例如，排除版本 *8.2* 和版本 *8.3* 的 distfile 版本检查，因为已知它们存在问题，可以添加：

  ```makefile
  PORTSCOUT=	skipv:8.2,8.3
  ```
* 当需要完全禁用 distfile 版本检查时。例如，如果 Port 永远不会再更新，可以添加：

  ```makefile
  PORTSCOUT=	ignore:1
  ```
* 当必须检查特定版本或特定主次版本的 distfile 时。例如，如果只有版本 *0.6.4* 需要监控，因为较新版本与 FreeBSD 存在兼容性问题，可以添加：

  ```makefile
  PORTSCOUT=	limit:^0\.6\.4
  ```
* 当列出可用版本的 URL 与下载 URL 不同时。例如，限制 distfile 版本检查仅限于 [databases/pgtune](https://cgit.freebsd.org/ports/tree/databases/pgtune/) Port 的下载页面，可以添加：

  ```makefile
  PORTSCOUT=	site:http://www.renpy.org/dl/release/
  ```


# 5.10.依赖

许多 Port 依赖于其他 Port。这是大多数类 Unix 操作系统（包括 FreeBSD）的一项非常方便的功能。多个 Port 可以共享一个共同的依赖，而不是将该依赖项与每个需要它的 Port 或软件包捆绑在一起。有七个变量可以用来确保所有必要的组件都在用户的机器上。此外，还有一些针对常见情况预定义的依赖变量，以及一些其他用于控制依赖行为的变量。

> **重要**
>
> 当软件有额外的依赖项以提供额外的功能时，`*_DEPENDS` 中列出的基础依赖项应该包括那些对大多数用户有益的额外依赖项。基础依赖项不应是“最小”依赖集。目标不是包括所有可能的依赖项，只包括那些对大多数人有益的依赖项。

## 5.10.1. `LIB_DEPENDS`

此变量指定该 Port 依赖的共享库。它是一个 `lib:dir` 元组的列表，其中 `lib` 是共享库的名称，`dir` 是查找该库的目录，以防库不可用。例如：

```makefile
LIB_DEPENDS=   libjpeg.so:graphics/jpeg
```

将检查是否存在任何版本的共享 jpeg 库，如果找不到，将深入 Ports 树的 **graphics/jpeg** 子目录以构建和安装该库。

该依赖项会被检查两次，第一次在 `build` 目标中，第二次在 `install` 目标中。此外，依赖项的名称会被放入软件包中，以便如果用户系统中没有该库，`pkg install`（参见 [pkg-install(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-install\&sektion=8\&format=html)）会自动安装它。

## 5.10.2. `RUN_DEPENDS`

此变量指定该 Port 在运行时依赖的可执行文件或文件。它是一个 `path:dir`\[:`target`] 元组的列表，其中 `path` 是可执行文件或文件的名称，`dir` 是查找它的目录，以防不可用，`target` 是该目录中的目标调用。如果 `path` 以斜杠（`/`）开头，它被视为文件，并使用 `test -e` 测试其是否存在；否则，它被视为可执行文件，并使用 `which -s` 检查程序是否存在于搜索路径中。

例如：

```makefile
RUN_DEPENDS=	${LOCALBASE}/news/bin/innd:news/inn \
		xmlcatmgr:textproc/xmlcatmgr
```

将检查文件或目录 **/usr/local/news/bin/innd** 是否存在，如果不存在，它将深入 Ports 树的 **news/inn** 子目录以构建和安装该文件。它还会检查 `xmlcatmgr` 可执行文件是否存在于搜索路径中，如果不存在，它将深入 Ports 树的 **textproc/xmlcatmgr** 子目录以构建和安装该文件。

> **注意**
>
> 在这种情况下，`innd` 实际上是一个可执行文件；如果可执行文件的位置不在预期的搜索路径中，应使用完整路径名。

> **注意**
>
> 在 Ports 构建集群中使用的官方搜索 `PATH` 是
>
> ```
> /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
> ```

该依赖项会在 `install` 目标中进行检查。此外，依赖项的名称会被放入软件包中，以便如果用户的系统中没有该文件或程序，`pkg install`（参见 [pkg-install(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-install\&sektion=8\&format=html)）会自动安装它。如果 `target` 部分与 `DEPENDS_TARGET` 相同，则可以省略该部分。

常见的情况是，当 `RUN_DEPENDS` 与 `BUILD_DEPENDS` 实际上是一样的，尤其是在移植的软件是用脚本语言编写的，或者它要求相同的构建和运行时环境时。在这种情况下，很自然会想到直接将它们互相赋值：

```makefile
RUN_DEPENDS=	${BUILD_DEPENDS}
```

然而，这种赋值可能会污染运行时依赖项，使其包含原始 `BUILD_DEPENDS` 中未定义的条目。这是因为 [make(1)](https://man.freebsd.org/cgi/man.cgi?query=make\&sektion=1\&format=html) 对变量赋值的惰性求值。考虑一个包含 `USE_*` 的 **Makefile**，这些变量由 **ports/Mk/bsd.\*.mk** 处理，用来增强初始构建依赖项。例如，`USES= gmake` 会将 [devel/gmake](https://cgit.freebsd.org/ports/tree/devel/gmake/) 添加到 `BUILD_DEPENDS` 中。为了防止这些额外的依赖项污染 `RUN_DEPENDS`，可以创建另一个变量，将 `BUILD_DEPENDS` 的当前内容赋值给它，并将其赋给 `BUILD_DEPENDS` 和 `RUN_DEPENDS`：

```makefile
MY_DEPENDS=	some:devel/some \
		other:lang/other
BUILD_DEPENDS=	${MY_DEPENDS}
RUN_DEPENDS=	${MY_DEPENDS}
```

> **重要**
>
> *不要*使用 `:=` 将 `BUILD_DEPENDS` 赋值给 `RUN_DEPENDS` 或反之。所有变量都会立即展开，这是完全错误的做法，几乎总是会失败。

## 5.10.3. `BUILD_DEPENDS`

此变量指定该 Port 构建时所需的可执行文件或文件。与 `RUN_DEPENDS` 类似，它是 `path:dir`\[:`target`] 元组的列表。例如：

```makefile
BUILD_DEPENDS=	unzip:archivers/unzip
```

将检查是否存在名为 `unzip` 的可执行文件，如果找不到，它将深入 **archivers/unzip** 子目录以构建和安装该文件。

> **注意**
>
> 这里的“build”指的是从提取到编译的整个过程。该依赖项会在 `extract` 目标中进行检查。如果 `target` 部分与 `DEPENDS_TARGET` 相同，则可以省略该部分。

## 5.10.4. `FETCH_DEPENDS`

此变量指定该 Port 在获取时所需的可执行文件或文件。与前两个类似，它是 `path:dir`\[:`target`] 元组的列表。例如：

```makefile
FETCH_DEPENDS=	ncftp2:net/ncftp2
```

将检查是否存在名为 `ncftp2` 的可执行文件，如果找不到，它将深入 **net/ncftp2** 子目录以构建和安装该文件。

该依赖项会在 `fetch` 目标中进行检查。如果 `target` 部分与 `DEPENDS_TARGET` 相同，则可以省略该部分。

## 5.10.5. `EXTRACT_DEPENDS`

此变量指定该 Port 在提取时所需的可执行文件或文件。与前面类似，它是 `path:dir`\[:`target`] 元组的列表。例如：

```makefile
EXTRACT_DEPENDS=	unzip:archivers/unzip
```

将检查是否存在名为 `unzip` 的可执行文件，如果找不到，它将深入 **archivers/unzip** 子目录以构建和安装该文件。

该依赖项会在 `extract` 目标中进行检查。如果 `target` 部分与 `DEPENDS_TARGET` 相同，则可以省略该部分。

> **注意**
>
> 仅在提取操作无法正常工作时使用此变量（默认假定使用 `tar`）。如果提取操作无法通过 `USES=tar`、`USES=lha` 或 `USES=zip`（参见 [使用 `USES` 宏](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses)）来解决，则使用此变量。

## 5.10.6. `PATCH_DEPENDS`

此变量指定该 Port 在打补丁时所需的可执行文件或文件。与前面一样，它是 `path:dir`\[:`target`] 元组的列表。例如：

```makefile
PATCH_DEPENDS=	${NONEXISTENT}:java/jfc:extract
```

将深入 **java/jfc** 子目录提取该文件。

该依赖项会在 `patch` 目标中进行检查。如果 `target` 部分与 `DEPENDS_TARGET` 相同，则可以省略该部分。

## 5.10.7. `USES`

可以通过添加参数来定义 Port 使用的不同特性和依赖项。通过在 **Makefile** 中添加以下行来指定：

```makefile
USES= feature[:arguments]
```

有关完整的值列表，请参见 [使用 `USES` 宏](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses)。

> **警告**
>
> `USES` 不能在包含 **bsd.port.pre.mk** 后进行赋值。

## 5.10.8. `USE_*`

有多个变量可以定义许多 Port 共享的常见依赖项。它们是可选的，但有助于减少 Port **Makefile** 中的冗长。每个变量以 `USE_*` 的形式存在。这些变量只能在 Port **Makefile** 和 **ports/Mk/bsd.\*.mk** 中使用。它们不用于用户设置的选项——请使用 `PORT_OPTIONS` 来设置。

> **注意**
>
> 在 **/etc/make.conf** 中设置任何 `USE_*` 是 *始终* 不正确的。例如，设置
>
> ```
> USE_GCC=X.Y
> ```
>
> （其中 X.Y 是版本号）将为每个 Port（包括 `lang/gccXY` 本身）添加对 gccXY 的依赖！

**表 8. `USE_*`**

| 变量        | 说明                                                                                                                                                                                                                                                                                                                                                                                                               |
| --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `USE_GCC` | 该 Port 需要 GCC（`gcc` 或 `g++`）来构建。一些 Port 需要特定的旧版本 GCC，一些 Port 需要现代的、较新的版本。通常设置为 `yes`（意味着始终使用来自 Ports 的稳定、现代 GCC，参见 `Mk/bsd.default-versions.mk` 中的 `GCC_DEFAULT`）。这也是默认值。也可以指定确切版本，例如 `10`。当基本系统的 GCC 满足请求的版本时，使用它，否则会从 Ports 构建合适的编译器，并相应地调整 `CC` 和 `CXX`。版本说明符后面的 `:build` 参数仅为 Port 添加构建时依赖。例如：`USE_GCC=yes`（Port 需要当前版本的 GCC）、`USE_GCC=11:build`（Port 仅在构建时需要 GCC 11）。**注意**：`USE_GCC=any` 弃用，不应在新 Port 中使用。 |

与 gmake 和 **configure** 相关的变量在 [构建机制](https://docs.freebsd.org/en/books/porters-handbook/special/#building) 中有描述，而 autoconf、automake 和 libtool 在 [使用 GNU Autotools](https://docs.freebsd.org/en/books/porters-handbook/special/#using-autotools) 中有描述。与 Perl 相关的变量在 [使用 Perl](https://docs.freebsd.org/en/books/porters-handbook/special/#using-perl) 中有描述。X11 相关的变量列在 [使用 X11](https://docs.freebsd.org/en/books/porters-handbook/special/#using-x11) 中。[使用 GNOME](https://docs.freebsd.org/en/books/porters-handbook/special/#using-gnome) 讨论了 GNOME，而 [使用 KDE](https://docs.freebsd.org/en/books/porters-handbook/special/#using-kde) 讨论了与 KDE 相关的变量。[使用 Java](https://docs.freebsd.org/en/books/porters-handbook/special/#using-java) 记录了 Java 相关变量，而 [Web 应用程序、Apache 和 PHP](https://docs.freebsd.org/en/books/porters-handbook/special/#using-php) 中包含了关于 Apache、PHP 和 PEAR 模块的信息。Python 在 [使用 Python](https://docs.freebsd.org/en/books/porters-handbook/special/#using-python) 中讨论，Ruby 在 [使用 Ruby](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-ruby) 中讨论。[使用 SDL](https://docs.freebsd.org/en/books/porters-handbook/special/#using-sdl) 提供了用于 SDL 应用程序的变量，最后，[使用 Xfce](https://docs.freebsd.org/en/books/porters-handbook/special/#using-xfce) 包含了有关 Xfce 的信息。

## 5.10.9. 依赖项的最低版本

除了 `LIB_DEPENDS` 之外，可以在任何 `*_DEPENDS` 中使用以下语法指定依赖项的最低版本：

```makefile
p5-Spiffy>=0.26:devel/p5-Spiffy
```

第一个字段包含依赖包名称，它必须与软件包数据库中的条目匹配，后跟比较符号和软件包版本。当机器上安装了 p5-Spiffy-0.26 或更高版本时，依赖项即得到满足。

## 5.10.10. 依赖项说明

如上所述，调用依赖项时的默认目标是 `DEPENDS_TARGET`，默认为 `install`。这是一个用户变量；它从不在 Port 的 **Makefile** 中定义。如果 Port 需要以特殊方式处理依赖项，可以使用 `*_DEPENDS` 的 `:target` 部分，而不是重新定义 `DEPENDS_TARGET`。

在运行 `make clean` 时，Port 依赖项也会自动清理。如果不希望这样，可以在环境中定义 `NOCLEANDEPENDS`。如果 Port 的依赖列表中包含需要较长时间重建的内容，如 KDE、GNOME 或 Mozilla，这可能特别有用。

要无条件地依赖另一个 Port，可以在 `BUILD_DEPENDS` 或 `RUN_DEPENDS` 的第一个字段中使用变量 `${NONEXISTENT}`。仅当需要另一个 Port 的源代码时，才使用此方法。通过指定目标也可以节省编译时间。例如：

```makefile
BUILD_DEPENDS=	${NONEXISTENT}:graphics/jpeg:extract
```

这将始终进入 `jpeg` Port 并提取它。

## 5.10.11. 循环依赖是致命的

> **重要**
>
> 不要在 Ports 树中引入任何循环依赖！

Ports 构建技术不容忍循环依赖。如果引入了循环依赖，世界上某处的某个用户的 FreeBSD 安装几乎会立即崩溃，接着许多人会受到影响。这些依赖很难发现。如果有疑虑，在做出更改之前，请确保运行：`cd /usr/ports; make index`。该过程在旧机器上可能会很慢，但它可能会为很多人（包括你自己）节省不少麻烦。

## 5.10.12. 自动依赖引起的问题

依赖项必须显式声明或使用 [OPTIONS 框架](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-options) 声明。使用自动检测等其他方法会使索引变得复杂，从而导致 Port 和软件包管理的问题。

**示例 37. 错误的可选依赖声明**

```makefile
.include <bsd.port.pre.mk>

.if exists(${LOCALBASE}/bin/foo)
LIB_DEPENDS=	libbar.so:foo/bar
.endif
```

自动添加依赖的问题在于，单个 Port 外的文件和设置随时可能发生变化。例如：索引构建完成后，然后安装了一批 Port。但其中一个 Port 安装了所测试的文件。此时，索引变得不正确，因为一个已安装的 Port 突然有了新的依赖项。如果其他 Port 也基于其他文件的存在来确定其依赖性，重建索引后它可能依然是错误的。

**示例 38. 正确的可选依赖声明**

```makefile
OPTIONS_DEFINE=	BAR
BAR_DESC=	Calling cellphones via bar

BAR_LIB_DEPENDS=	libbar.so:foo/bar
```

测试选项变量是正确的方法。只要选项在构建索引之前已定义，就不会导致批量 Port 的索引不一致。然后可以使用简单的脚本来自动化这些 Port 及其软件包的构建、安装和更新。


# 5.11.从属 Port 和 MASTERDIR

如果 Port 需要通过让变量（例如分辨率或纸张大小）取不同的值来构建略有不同版本的软件包，则为每个软件包创建一个子目录，以便用户更容易理解该怎么做，但尽量使尽可能多的文件在 Port 之间共享。通常，通过巧妙使用变量，除了一个目录外，其他目录只需要非常简短的 **Makefile**。在唯一的 **Makefile** 中，使用 `MASTERDIR` 来指定其他文件所在的目录。同时，使用变量作为 [`PKGNAMESUFFIX`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-pkgname) 的一部分，以便使软件包具有不同的名称。

通过一个例子可以更好地展示这一点。以下是 **print/pkfonts300/Makefile** 的一部分：

```makefile
PORTNAME=	pkfonts${RESOLUTION}
PORTVERSION=	1.0
DISTFILES=	pk${RESOLUTION}.tar.gz

PLIST=		${PKGDIR}/pkg-plist.${RESOLUTION}

.if !defined(RESOLUTION)
RESOLUTION=	300
.else
.if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \
	${RESOLUTION} != 300 && ${RESOLUTION} != 360 && \
	${RESOLUTION} != 400 && ${RESOLUTION} != 600
.BEGIN:
	@${ECHO_MSG} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""
	@${ECHO_MSG} "Possible values are: 118, 240, 300, 360, 400 and 600."
	@${FALSE}
.endif
.endif
```

[print/pkfonts300](https://cgit.freebsd.org/ports/tree/print/pkfonts300/) 还包含所有常规的补丁、软件包文件等。在该目录中运行 `make`，它将采用分辨率的默认值（300）并正常构建 Port。

至于其他分辨率，以下是**整个** **print/pkfonts360/Makefile**：

```makefile
RESOLUTION=	360
MASTERDIR=	${.CURDIR}/../pkfonts300

.include	"${MASTERDIR}/Makefile"
```

(**print/pkfonts118/Makefile**、**print/pkfonts600/Makefile**，以及所有其他类似的文件)。`MASTERDIR` 定义告诉 **bsd.port.mk**，像 `FILESDIR` 和 `SCRIPTDIR` 这样的常规子目录位于 **pkfonts300** 下。`RESOLUTION=360` 这一行将覆盖 **pkfonts300/Makefile** 中的 `RESOLUTION=300`，并且该 Port 将以 360 的分辨率进行构建。


# 5.12.man 手册

如果 Port 将其 man 树放置在 `PREFIX` 以外的地方，请使用 `MANDIRS` 来指定这些目录。请注意，手册页对应的文件必须与其他文件一起放置在 **pkg-plist** 中。`MANDIRS` 的目的是启用手册页的自动压缩，因此文件名会以 **.gz** 结尾。


# 5.13.info 文件

如果软件包需要安装 GNU info 文件，请将它们列在 `INFO` 中（不包括 `.info` 后缀），每个文档一项。这些文件假定安装到 **PREFIX/INFO\_PATH**。如果软件包使用不同的位置，请更改 `INFO_PATH`。不过，这并不推荐。这些条目仅包含相对于 **PREFIX/INFO\_PATH** 的路径。例如，[lang/gcc34](https://cgit.freebsd.org/ports/tree/lang/gcc34/) 将 info 文件安装到 **PREFIX/INFO\_PATH/gcc34**，并且 `INFO` 可能如下所示：

```makefile
INFO=	gcc34/cpp gcc34/cppinternals gcc34/g77 ...
```

适当的安装/卸载代码将在包注册之前自动添加到临时的 **pkg-plist** 中。


# 5.14.Makefile 参数

许多应用程序可以通过可选或不同的配置进行构建。示例包括选择自然（人类）语言、图形界面与命令行界面，或支持的数据库类型。用户可能需要不同于默认配置的版本，因此 Ports 系统提供了钩子，Port 作者可以使用这些钩子来控制构建哪种变体。正确支持这些选项能让用户满意，相当于以一个 Port 的代价提供了两个或更多 Port。

## 5.14.1. `OPTIONS`

### 5.14.1.1. 背景

`OPTIONS_*` 向安装 Port 的用户显示对话框，展示可用的选项，然后将这些选项保存到 **${PORT\_DBDIR}/${OPTIONS\_NAME}/options**。下一次构建该 Port 时，将重用这些选项。`PORT_DBDIR` 默认值为 **/var/db/ports**。`OPTIONS_NAME` 是 Port 来源的名称，使用下划线作为空格分隔符，例如，对于 [dns/bind99](https://cgit.freebsd.org/ports/tree/dns/bind99/) 来说，它将是 `dns_bind99`。

当用户运行 `make config`（或首次运行 `make build`）时，框架会检查 **${PORT\_DBDIR}/${OPTIONS\_NAME}/options**。如果该文件不存在，将使用 `OPTIONS_*` 的值，并显示对话框，供用户启用或禁用选项。然后保存 **options**，构建 Port 时使用配置好的变量。

如果新版本的 Port 添加了新的 `OPTIONS`，会向用户展示该对话框，并预填旧 `OPTIONS` 的保存值。

`make showconfig` 显示保存的配置。使用 `make rmconfig` 可以移除保存的配置。

### 5.14.1.2. 语法

`OPTIONS_DEFINE` 包含要使用的 `OPTIONS` 列表。这些选项是独立的，彼此之间没有分组：

```makefile
OPTIONS_DEFINE=	OPT1 OPT2
```

定义后，`OPTIONS` 应该进行描述（可选，但强烈推荐）：

```makefile
OPT1_DESC=	描述 OPT1
OPT2_DESC=	描述 OPT2
OPT3_DESC=	描述 OPT3
OPT4_DESC=	描述 OPT4
OPT5_DESC=	描述 OPT5
OPT6_DESC=	描述 OPT6
```

**ports/Mk/bsd.options.desc.mk** 包含许多常见 `OPTIONS` 的描述。虽然通常有用，但如果描述不充分，可以覆盖这些描述。

> **技巧**
>
> 在描述选项时，要从用户的角度来看待：“它改变了什么功能？”和“为什么我要启用这个？”不要只是重复名称。例如，描述 `NLS` 选项为“包含 NLS 支持”并不能帮助用户，用户已经可以看到选项名称，但可能不知道它是什么意思。描述为“通过 gettext 工具提供本地语言支持”则更加有用。

> **重要**
>
> 选项名称始终使用全大写字母，不能使用混合大小写或小写字母。

`OPTIONS` 可以作为单选组进行分组，每组只能选择一个选项：

```makefile
OPTIONS_SINGLE=		SG1
OPTIONS_SINGLE_SG1=	OPT3 OPT4
```

> **警告**
>
> 要让选项有效，每个 `OPTIONS_SINGLE` 组中必须始终选中一个选项。必须将每个组中的一个选项添加到 `OPTIONS_DEFAULT`。

`OPTIONS` 也可以作为单选组进行分组，每组可以选择零个或一个选项：

```makefile
OPTIONS_RADIO=		RG1
OPTIONS_RADIO_RG1=	OPT7 OPT8
```

`OPTIONS` 还可以作为“多选”列表进行分组，*至少一个* 选项必须启用：

```makefile
OPTIONS_MULTI=		MG1
OPTIONS_MULTI_MG1=	OPT5 OPT6
```

`OPTIONS` 还可以作为“多选”列表进行分组，零个或任意数量的选项可以启用：

```makefile
OPTIONS_GROUP=		GG1
OPTIONS_GROUP_GG1=	OPT9 OPT10
```

默认情况下，`OPTIONS` 未设置，除非它们列在 `OPTIONS_DEFAULT` 中：

```makefile
OPTIONS_DEFAULT=	OPT1 OPT3 OPT6
```

`OPTIONS` 定义必须出现在包含 **bsd.port.options.mk** 之前。`PORT_OPTIONS` 的值只能在包含 **bsd.port.options.mk** 后才能测试。也可以改为包含 **bsd.port.pre.mk**，在引入 **bsd.port.options.mk** 之前编写的 Ports 中这种方式仍广泛使用。但要注意，包含 **bsd.port.pre.mk** 后，某些变量可能无法按预期工作，通常是某些 `USE_*` 标志。

**示例 39. `OPTIONS` 的简单使用**

```makefile
OPTIONS_DEFINE=	FOO BAR
OPTIONS_DEFAULT=FOO

FOO_DESC=	Option foo support
BAR_DESC=	Feature bar support

# 将添加 --with-foo / --without-foo
FOO_CONFIGURE_WITH=	foo
BAR_RUN_DEPENDS=	bar:bar/bar

.include <bsd.port.mk>
```

**示例 40. 检查未设置的 Port `OPTIONS`**

```makefile
.if ! ${PORT_OPTIONS:MEXAMPLES}
CONFIGURE_ARGS+=--without-examples
.endif
```

上述形式不推荐使用。推荐的方法是使用配置选项来真正启用和禁用特性，以匹配选项：

```makefile
# 将添加 --with-examples / --without-examples
EXAMPLES_CONFIGURE_WITH=	examples
```

**示例 41. `OPTIONS` 的实际使用**

```makefile
OPTIONS_DEFINE=		EXAMPLES
OPTIONS_DEFAULT=	PGSQL LDAP SSL

OPTIONS_SINGLE=		BACKEND
OPTIONS_SINGLE_BACKEND=	MYSQL PGSQL BDB

OPTIONS_MULTI=		AUTH
OPTIONS_MULTI_AUTH=	LDAP PAM SSL

EXAMPLES_DESC=		Install extra examples
MYSQL_DESC=		Use MySQL as backend
PGSQL_DESC=		Use PostgreSQL as backend
BDB_DESC=		Use Berkeley DB as backend
LDAP_DESC=		Build with LDAP authentication support
PAM_DESC=		Build with PAM support
SSL_DESC=		Build with OpenSSL support

# 将添加 USE_PGSQL=yes
PGSQL_USE=	pgsql=yes
# 将添加 --enable-postgres / --disable-postgres
PGSQL_CONFIGURE_ENABLE=	postgres

ICU_LIB_DEPENDS=	libicuuc.so:devel/icu

# 将添加 --with-examples / --without-examples
EXAMPLES_CONFIGURE_WITH=	examples

# 检查其他 OPTIONS

.include <bsd.port.mk>
```

### 5.14.1.3. 默认选项

以下选项默认始终开启：

* `DOCS` - 构建并安装文档。
* `NLS` - 本地语言支持。
* `EXAMPLES` - 构建并安装示例。
* `IPV6` - IPv6 协议支持。

> **注意**
>
> 不需要将这些选项添加到 `OPTIONS_DEFAULT` 中。但是，要让它们生效并在选项选择对话框中显示，必须将它们添加到 `OPTIONS_DEFINE` 中。

## 5.14.2. 功能自动激活

在使用 GNU 配置脚本时，注意哪些可选功能是通过自动检测激活的。对于不需要的可选功能，通过在 `CONFIGURE_ARGS` 中添加 `--without-xxx` 或 `--disable-xxx` 来显式禁用。

**示例 42. 错误的选项处理**

```makefile
.if ${PORT_OPTIONS:MFOO}
LIB_DEPENDS+=		libfoo.so:devel/foo
CONFIGURE_ARGS+=	--enable-foo
.endif
```

在上面的示例中，假设系统上安装了 libfoo 库。用户不希望此应用程序使用 libfoo，因此在 `make config` 对话框中关闭了该选项。但应用程序的配置脚本检测到系统中存在该库，并将该库的支持加入到生成的可执行文件中。现在，当用户决定从系统中删除 libfoo 时，Ports 系统不会发出警告（因为没有记录对 libfoo 的依赖），但应用程序会出错。

**示例 43. 正确的选项处理**

```makefile
FOO_LIB_DEPENDS=		libfoo.so:devel/foo
# 将添加 --enable-foo / --disable-foo
FOO_CONFIGURE_ENABLE=	foo
```

> **注意**
>
> 在某些情况下，简写的条件语法可能在复杂构造中引发问题。通常会出现 `Malformed conditional` 错误，可以使用替代语法：
>
> ```makefile
> .if !empty(VARIABLE:MVALUE)
> ```
>
> 作为
>
> ```makefile
> .if ${VARIABLE:MVALUE}
> ```
>
> 的替代。

## 5.14.3. 选项帮助工具

有一些宏可以帮助简化基于选项设置的条件值。为了便于访问，提供了一个全面的列表：

* `PLIST_SUB`, `SUB_LIST` 有关自动生成 `%%OPT%%` 和 `%%NOOPT%%`，请参见 [`OPTIONS_SUB`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options_sub)。

  对于更复杂的用法，请参见 [通用变量替换](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-variables)。
* `CONFIGURE_ARGS` 对于 `--enable-x` 和 `--disable-x`，请参见 [`OPT_CONFIGURE_ENABLE`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-configure_enable)。

  对于 `--with-x` 和 `--without-x`，请参见 [`OPT_CONFIGURE_WITH`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-configure_with)。

  对于所有其他情况，请参见 [`OPT_CONFIGURE_ON` 和 `OPT_CONFIGURE_OFF`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-configure_on)。
* `CMAKE_ARGS` 对于布尔类型的参数（`on`、`off`、`true`、`false`、`0`、`1`），请参见 [`OPT_CMAKE_BOOL` 和 `OPT_CMAKE_BOOL_OFF`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-cmake_bool)。

  对于所有其他情况，请参见 [`OPT_CMAKE_ON` 和 `OPT_CMAKE_OFF`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-cmake_on)。
* `MESON_ARGS` 对于接受 `true` 或 `false` 的参数，参见 [`OPT_MESON_TRUE` 和 `OPT_MESON_FALSE`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-meson_true)。

  对于接受 `yes` 或 `no` 的参数，使用 [`OPT_MESON_YES` 和 `OPT_MESON_NO`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-meson_yes)。

  对于接受 `enabled` 或 `disabled` 的参数，参见 [`OPT_MESON_ENABLED` 和 `OPT_MESON_DISABLED`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-meson_enabled)。

  对于所有其他情况，请使用 [`OPT_MESON_ON` 和 `OPT_MESON_OFF`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-meson_on)。
* `QMAKE_ARGS` 参见 [`OPT_QMAKE_ON` 和 `OPT_QMAKE_OFF`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-qmake_on)。
* `USE_*` 参见 [`OPT_USE` 和 `OPT_USE_OFF`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-use)。
* `*_DEPENDS` 参见 [依赖项](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-dependencies)。
* `*` (任何变量) 最常用的变量有直接的帮助工具，参见 [通用变量替换](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-variables)。

  对于没有特定帮助工具的任何变量，请参见 [`OPT_VARS` 和 `OPT_VARS_OFF`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-vars)。

### 5.14.3.1. `OPTIONS_SUB`

如果将 `OPTIONS_SUB` 设置为 `yes`，那么添加到 `OPTIONS_DEFINE` 中的每个选项都会同时添加到 `PLIST_SUB` 和 `SUB_LIST` 中，例如：

```makefile
OPTIONS_DEFINE=	OPT1
OPTIONS_SUB=	yes
```

等同于：

```makefile
OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
PLIST_SUB+=	OPT1="" NO_OPT1="@comment "
SUB_LIST+=	OPT1="" NO_OPT1="@comment "
.else
PLIST_SUB+=	OPT1="@comment " NO_OPT1=""
SUB_LIST+=	OPT1="@comment " NO_OPT1=""
.endif
```

> **注意**
>
> 框架会忽略 `OPTIONS_SUB` 的值。将其设置为任何值都会为 *所有* 选项添加 `PLIST_SUB` 和 `SUB_LIST` 条目。

### 5.14.3.2. `OPT_USE` 和 `OPT_USE_OFF`

当选中选项 *OPT* 时，对于 `OPT_USE` 中的每个 `key=value` 配对，*value* 会附加到相应的 `USE_KEY` 上。如果 *value* 包含空格，则用逗号替换空格，处理时这些逗号会变回空格。`OPT_USE_OFF` 的工作方式相同，但作用于 *OPT* 未选中的情况。示例：

```makefile
OPTIONS_DEFINE=	OPT1
OPT1_USES=	xorg
OPT1_USE=	mysql=yes xorg=x11,xextproto,xext,xrandr
OPT1_USE_OFF=	openssl=yes
```

等同于：

```makefile
OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
USE_MYSQL=	yes
USES+=		xorg
USE_XORG=	x11 xextproto xext xrandr
.else
USE_OPENSSL=	yes
.endif
```

### 5.14.3.3. `CONFIGURE_ARGS` 帮助工具

#### 5.14.3.3.1. `OPT_CONFIGURE_ENABLE`

当选中选项 *OPT* 时，对于 `OPT_CONFIGURE_ENABLE` 中的每个 *entry*，`--enable-entry` 会附加到 `CONFIGURE_ARGS`。当选项 *OPT* 未选中时，`--disable-entry` 会附加到 `CONFIGURE_ARGS`。可以用 `=` 符号指定可选参数，该参数仅会附加到 `--enable-entry` 配置选项。例如：

```makefile
OPTIONS_DEFINE=	OPT1 OPT2
OPT1_CONFIGURE_ENABLE=	test1 test2
OPT2_CONFIGURE_ENABLE=	test2=exhaustive
```

等同于：

```makefile
OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
CONFIGURE_ARGS+=	--enable-test1 --enable-test2
.else
CONFIGURE_ARGS+=	--disable-test1 --disable-test2
.endif

.if ${PORT_OPTIONS:MOPT2}
CONFIGURE_ARGS+=	--enable-test2=exhaustive
.else
CONFIGURE_ARGS+=	--disable-test2
.endif
```

#### 5.14.3.3.2. `OPT_CONFIGURE_WITH`

当选中选项 *OPT* 时，对于 `OPT_CONFIGURE_WITH` 中的每个 *entry*，`--with-entry` 会附加到 `CONFIGURE_ARGS`。当选项 *OPT* 未选中时，`--without-entry` 会附加到 `CONFIGURE_ARGS`。可以用 `=` 符号指定可选参数，该参数仅会附加到 `--with-entry` 配置选项。例如：

```makefile
OPTIONS_DEFINE=	OPT1 OPT2
OPT1_CONFIGURE_WITH=	test1
OPT2_CONFIGURE_WITH=	test2=exhaustive
```

等同于：

```makefile
OPTIONS_DEFINE=	OPT1 OPT2

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
CONFIGURE_ARGS+=	--with-test1
.else
CONFIGURE_ARGS+=	--without-test1
.endif

.if ${PORT_OPTIONS:MOPT2}
CONFIGURE_ARGS+=	--with-test2=exhaustive
.else
CONFIGURE_ARGS+=	--without-test2
.endif
```

#### 5.14.3.3.3. `OPT_CONFIGURE_ON` 和 `OPT_CONFIGURE_OFF`

当选中选项 *OPT* 时，`OPT_CONFIGURE_ON` 的值（如果已定义）会附加到 `CONFIGURE_ARGS`。`OPT_CONFIGURE_OFF` 的工作方式相同，但作用于 *OPT* 未选中的情况。示例：

```makefile
OPTIONS_DEFINE=	OPT1
OPT1_CONFIGURE_ON=	--add-test
OPT1_CONFIGURE_OFF=	--no-test
```

等同于：

```makefile
OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
CONFIGURE_ARGS+=	--add-test
.else
CONFIGURE_ARGS+=	--no-test
.endif
```

> **技巧**
>
> 大多数情况下，`OPT_CONFIGURE_ENABLE` 和 `OPT_CONFIGURE_WITH` 中的帮助工具提供了更简洁和全面的功能。

### 5.14.3.4. `CMAKE_ARGS` 帮助工具

#### 5.14.3.4.1. `OPT_CMAKE_ON` 和 `OPT_CMAKE_OFF`

当选中选项 *OPT* 时，如果定义了 `OPT_CMAKE_ON`，则该值会附加到 `CMAKE_ARGS`。`OPT_CMAKE_OFF` 的工作方式相同，但作用于 *OPT* 未选中的情况。例如：

```makefile
OPTIONS_DEFINE=	OPT1
OPT1_CMAKE_ON=	-DTEST:BOOL=true -DDEBUG:BOOL=true
OPT1_CMAKE_OFF=	-DOPTIMIZE:BOOL=true
```

等同于：

```makefile
OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
CMAKE_ARGS+=	-DTEST:BOOL=true -DDEBUG:BOOL=true
.else
CMAKE_ARGS+=	-DOPTIMIZE:BOOL=true
.endif
```

> **技巧**
>
> 当值为布尔型时，请参考 [`OPT_CMAKE_BOOL` 和 `OPT_CMAKE_BOOL_OFF`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-cmake_bool) 以获取更简洁的帮助工具。

#### 5.14.3.4.2. `OPT_CMAKE_BOOL` 和 `OPT_CMAKE_BOOL_OFF`

当选中选项 *OPT* 时，对于 `OPT_CMAKE_BOOL` 中的每个 *entry*，`-D_entry_:BOOL=true` 会附加到 `CMAKE_ARGS`。当选项 *OPT* 未选中时，`-D_entry_:BOOL=false` 会附加到 `CMAKE_ARGS`。`OPT_CMAKE_BOOL_OFF` 是相反的，当选中选项时，`-D_entry_:BOOL=false` 会附加到 `CMAKE_ARGS`，而当未选中时，`-D_entry_:BOOL=true` 会附加到 `CMAKE_ARGS`。例如：

```makefile
OPTIONS_DEFINE=	OPT1
OPT1_CMAKE_BOOL=	TEST DEBUG
OPT1_CMAKE_BOOL_OFF=	OPTIMIZE
```

等同于：

```makefile
OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
CMAKE_ARGS+=	-DTEST:BOOL=true -DDEBUG:BOOL=true \
		-DOPTIMIZE:BOOL=false
.else
CMAKE_ARGS+=	-DTEST:BOOL=false -DDEBUG:BOOL=false \
		-DOPTIMIZE:BOOL=true
.endif
```

### 5.14.3.5. `MESON_ARGS` 帮助工具

#### 5.14.3.5.1. `OPT_MESON_ON` 和 `OPT_MESON_OFF`

当选中选项 *OPT* 时，如果定义了 `OPT_MESON_ON`，则该值会附加到 `MESON_ARGS`。`OPT_MESON_OFF` 的工作方式相同，但作用于 *OPT* 未选中的情况。例如：

```makefile
OPTIONS_DEFINE=	OPT1
OPT1_MESON_ON=	-Dopt=1
OPT1_MESON_OFF=	-Dopt=2
```

等同于：

```makefile
OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
MESON_ARGS+=	-Dopt=1
.else
MESON_ARGS+=	-Dopt=2
.endif
```

#### 5.14.3.5.2. `OPT_MESON_TRUE` 和 `OPT_MESON_FALSE`

当选中选项 *OPT* 时，对于 `OPT_MESON_TRUE` 中的每个 *entry*，`-D_entry_=true` 会附加到 `MESON_ARGS`。当选项 *OPT* 未选中时，`-D_entry_=false` 会附加到 `MESON_ARGS`。`OPT_MESON_FALSE` 是相反的，当选中选项时，`-D_entry_=false` 会附加到 `MESON_ARGS`，而当未选中时，`-D_entry_=true` 会附加到 `MESON_ARGS`。例如：

```makefile
OPTIONS_DEFINE=	OPT1
OPT1_MESON_TRUE=	test debug
OPT1_MESON_FALSE=	optimize
```

等同于：

```makefile
OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
MESON_ARGS+=	-Dtest=true -Ddebug=true \
		-Doptimize=false
.else
MESON_ARGS+=	-Dtest=false -Ddebug=false \
		-Doptimize=true
.endif
```

#### 5.14.3.5.3. `OPT_MESON_YES` 和 `OPT_MESON_NO`

当选中选项 *OPT* 时，对于 `OPT_MESON_YES` 中的每个 *entry*，`-D_entry_=yes` 会附加到 `MESON_ARGS`。当选项 *OPT* 未选中时，`-D_entry_=no` 会附加到 `MESON_ARGS`。`OPT_MESON_NO` 是相反的，当选中选项时，`-D_entry_=no` 会附加到 `MESON_ARGS`，而当未选中时，`-D_entry_=yes` 会附加到 `MESON_ARGS`。例如：

```makefile
OPTIONS_DEFINE=	OPT1
OPT1_MESON_YES=	test debug
OPT1_MESON_NO=	optimize
```

等同于：

```makefile
OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
MESON_ARGS+=	-Dtest=yes -Ddebug=yes \
		-Doptimize=no
.else
MESON_ARGS+=	-Dtest=no -Ddebug=no \
		-Doptimize=yes
.endif
```

#### 5.14.3.5.4. `OPT_MESON_ENABLED` 和 `OPT_MESON_DISABLED`

当选中选项 *OPT* 时，对于 `OPT_MESON_ENABLED` 中的每个 *entry*，`-D_entry_=enabled` 会附加到 `MESON_ARGS`。当选项 *OPT* 未选中时，`-D_entry_=disabled` 会附加到 `MESON_ARGS`。`OPT_MESON_DISABLED` 是相反的，当选中选项时，`-D_entry_=disabled` 会附加到 `MESON_ARGS`，而当未选中时，`-D_entry_=enabled` 会附加到 `MESON_ARGS`。例如：

```makefile
OPTIONS_DEFINE=	OPT1
OPT1_MESON_ENABLED=	test
OPT1_MESON_DISABLED=	debug
```

等同于：

```makefile
OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
MESON_ARGS+=	-Dtest=enabled -Ddebug=disabled
.else
MESON_ARGS+=	-Dtest=disabled -Ddebug=enabled
.endif
```

### 5.14.3.6. `OPT_QMAKE_ON` 和 `OPT_QMAKE_OFF`

当选中选项 *OPT* 时，如果定义了 `OPT_QMAKE_ON`，则该值会附加到 `QMAKE_ARGS`。`OPT_QMAKE_OFF` 的工作方式相同，但作用于 *OPT* 未选中的情况。例如：

```makefile
OPTIONS_DEFINE=	OPT1
OPT1_QMAKE_ON=	-DTEST:BOOL=true
OPT1_QMAKE_OFF=	-DPRODUCTION:BOOL=true
```

等同于：

```makefile
OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
QMAKE_ARGS+=	-DTEST:BOOL=true
.else
QMAKE_ARGS+=	-DPRODUCTION:BOOL=true
.endif
```

### 5.14.3.7. `OPT_IMPLIES`

提供了一种在选项之间添加依赖关系的方式。

当选中选项 *OPT* 时，此变量中列出的所有选项也将同时选中。以下是使用之前描述的 [`OPT_CONFIGURE_ENABLE`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-configure_enable) 来举例说明：

```makefile
OPTIONS_DEFINE=	OPT1 OPT2
OPT1_IMPLIES=	OPT2

OPT1_CONFIGURE_ENABLE=	opt1
OPT2_CONFIGURE_ENABLE=	opt2
```

等同于：

```makefile
OPTIONS_DEFINE=	OPT1 OPT2

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
CONFIGURE_ARGS+=	--enable-opt1
.else
CONFIGURE_ARGS+=	--disable-opt1
.endif

.if ${PORT_OPTIONS:MOPT2} || ${PORT_OPTIONS:MOPT1}
CONFIGURE_ARGS+=	--enable-opt2
.else
CONFIGURE_ARGS+=	--disable-opt2
.endif
```

**示例 44. `OPT_IMPLIES` 的简单使用**

这个 Port 有一个 `X11` 选项和一个需要选中 `X11` 选项才能构建的 `GNOME` 选项。

```makefile
OPTIONS_DEFINE=	X11 GNOME
OPTIONS_DEFAULT=	X11

X11_USES=	xorg
X11_USE=	xorg=xi,xextproto
GNOME_USE=	gnome=gtk30
GNOME_IMPLIES=	X11
```

### 5.14.3.8. `OPT_PREVENTS` 和 `OPT_PREVENTS_MSG`

提供了一种在选项之间添加冲突的方式。

当选中选项 *OPT* 时，`OPT_PREVENTS` 中列出的所有选项必须取消选择。如果设置了 `OPT_PREVENTS_MSG` 且触发了冲突，则其内容将显示，解释为什么它们会冲突。例如：

```makefile
OPTIONS_DEFINE=	OPT1 OPT2
OPT1_PREVENTS=	OPT2
OPT1_PREVENTS_MSG=	OPT1 和 OPT2 启用冲突的选项
```

大致等同于：

```makefile
OPTIONS_DEFINE=	OPT1 OPT2

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT2} && ${PORT_OPTIONS:MOPT1}
BROKEN=	Option OPT1 conflicts with OPT2 (select only one)
.endif
```

唯一的区别是，第一个会在运行 `make config` 后输出错误，提示更改所选的选项。

**示例 45. `OPT_PREVENTS` 的简单使用**

这个 Port 有 `X509` 和 `SCTP` 选项。两个选项都添加补丁，但这些补丁彼此冲突，因此不能同时选择。

```makefile
OPTIONS_DEFINE=	X509 SCTP

SCTP_PATCHFILES=	${PORTNAME}-6.8p1-sctp-2573.patch.gz:-p1
SCTP_CONFIGURE_WITH=	sctp

X509_PATCH_SITES=	http://www.roumenpetrov.info/openssh/x509/:x509
X509_PATCHFILES=	${PORTNAME}-7.0p1+x509-8.5.diff.gz:-p1:x509
X509_PREVENTS=		SCTP
X509_PREVENTS_MSG=	X509 和 SCTP 补丁冲突
```

### 5.14.3.9. `OPT_VARS` 和 `OPT_VARS_OFF`

提供了一种通用的方式来设置并追加到变量。

> **警告**
>
> 在使用 `OPT_VARS` 和 `OPT_VARS_OFF` 之前，看看是否已经有更具体的助手可用，详情请见 [通用变量替换](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-variables)。

当选中选项 *OPT* 并定义了 `OPT_VARS` 时，会从 `OPT_VARS` 中求值 `key=value` 和 `key+=value` 配对。`=` 会覆盖 `KEY` 的现有值，而 `+=` 会追加到该值。`OPT_VARS_OFF` 以相同的方式工作，但作用于 *OPT* 未选中的情况。

```makefile
OPTIONS_DEFINE=	OPT1 OPT2 OPT3
OPT1_VARS=	also_build+=bin1
OPT2_VARS=	also_build+=bin2
OPT3_VARS=	bin3_build=yes
OPT3_VARS_OFF=	bin3_build=no

MAKE_ARGS=	ALSO_BUILD="${ALSO_BUILD}" BIN3_BUILD="${BIN3_BUILD}"
```

等同于：

```makefile
OPTIONS_DEFINE=	OPT1 OPT2 OPT3

MAKE_ARGS=	ALSO_BUILD="${ALSO_BUILD}" BIN3_BUILD="${BIN3_BUILD}"

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
ALSO_BUILD+=	bin1
.endif

.if ${PORT_OPTIONS:MOPT2}
ALSO_BUILD+=	bin2
.endif

.if ${PORT_OPTIONS:MOPT3}
BIN3_BUILD=	yes
.else
BIN3_BUILD=	no
.endif
```

> **重要**
>
> 包含空格的值必须用引号括起来：
>
> ```
> OPT_VARS=	foo="bar baz"
> ```
>
> 这是因为 [make(1)](https://man.freebsd.org/cgi/man.cgi?query=make\&sektion=1\&format=html) 变量展开处理空格的方式。当 `OPT_VARS= foo=bar baz` 展开时，变量会包含两个字符串，`foo=bar` 和 `baz`。但提交者可能只希望有一个字符串 `foo=bar baz`。通过引用该值，可以防止空格作为分隔符使用。
>
> 另外，*不要* 在 `var=` 符号和值之间添加额外的空格，这样也会将其分割成两个字符串。*这将不起作用*：
>
> ```makefile
> OPT_VARS=	foo=	bar
> ```

### 5.14.3.10. 依赖关系，`OPT_DEPTYPE` 和 `OPT_DEPTYPE_OFF`

对于以下任何依赖类型：

* `PKG_DEPENDS`
* `EXTRACT_DEPENDS`
* `PATCH_DEPENDS`
* `FETCH_DEPENDS`
* `BUILD_DEPENDS`
* `LIB_DEPENDS`
* `RUN_DEPENDS`

当选中选项 *OPT* 时，如果定义了 `OPT_DEPTYPE`，则其值将追加到 `DEPTYPE`。`OPT_DEPTYPE_OFF` 以相同的方式工作，但作用于 *OPT* 未选中的情况。例如：

```makefile
OPTIONS_DEFINE=	OPT1
OPT1_LIB_DEPENDS=	liba.so:devel/a
OPT1_LIB_DEPENDS_OFF=	libb.so:devel/b
```

等同于：

```makefile
OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
LIB_DEPENDS+=	liba.so:devel/a
.else
LIB_DEPENDS+=	libb.so:devel/b
.endif
```

### 5.14.3.11. 通用变量替换，`OPT_VARIABLE` 和 `OPT_VARIABLE_OFF`

对于以下任意变量：

* `ALL_TARGET`
* `BINARY_ALIAS`
* `BROKEN`
* `CATEGORIES`
* `CFLAGS`
* `CONFIGURE_ENV`
* `CONFLICTS`
* `CONFLICTS_BUILD`
* `CONFLICTS_INSTALL`
* `CPPFLAGS`
* `CXXFLAGS`
* `DESKTOP_ENTRIES`
* `DISTFILES`
* `EXTRACT_ONLY`
* `EXTRA_PATCHES`
* `GH_ACCOUNT`
* `GH_PROJECT`
* `GH_SUBDIR`
* `GH_TAGNAME`
* `GH_TUPLE`
* `GL_ACCOUNT`
* `GL_COMMIT`
* `GL_PROJECT`
* `GL_SITE`
* `GL_SUBDIR`
* `GL_TUPLE`
* `IGNORE`
* `INFO`
* `INSTALL_TARGET`
* `LDFLAGS`
* `LIBS`
* `MAKE_ARGS`
* `MAKE_ENV`
* `MASTER_SITES`
* `PATCHFILES`
* `PATCH_SITES`
* `PLIST_DIRS`
* `PLIST_FILES`
* `PLIST_SUB`
* `PORTDOCS`
* `PORTEXAMPLES`
* `SUB_FILES`
* `SUB_LIST`
* `TEST_TARGET`
* `USES`

当选中选项 *OPT* 时，如果定义了 `OPT_ABOVEVARIABLE`，则其值将追加到 `ABOVEVARIABLE`。`OPT_ABOVEVARIABLE_OFF` 以相同的方式工作，但作用于 *OPT* 未选中的情况。例如：

```makefile
OPTIONS_DEFINE=	OPT1
OPT1_USES=	gmake
OPT1_CFLAGS_OFF=	-DTEST
```

等同于：

```makefile
OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MOPT1}
USES+=		gmake
.else
CFLAGS+=	-DTEST
.endif
```

> **注意**
>
> 某些变量不在此列表中，特别是 `PKGNAMEPREFIX` 和 `PKGNAMESUFFIX`。这是有意为之。Port 在选项集更改时 *不得* 更改其名称。

> **警告**
>
> 其中一些变量，至少 `ALL_TARGET`、`DISTFILES` 和 `INSTALL_TARGET`，它们的默认值是在选项处理后设置的。在 **Makefile** 中使用以下行：
>
> ```makefile
> ALL_TARGET=	all
>
> DOCS_ALL_TARGET=	doc
> ```
>
> 如果启用了 `DOCS` 选项，`ALL_TARGET` 最终值将为 `all doc`；如果该选项禁用，则为 `all`。
>
> 在 **Makefile** 中仅使用选项帮助行：
>
> ```makefile
> DOCS_ALL_TARGET=	doc
> ```
>
> 如果启用了 `DOCS` 选项，`ALL_TARGET` 最终值将为 `doc`；如果该选项禁用，则为 `all`。

### 5.14.3.12. 额外构建目标，`target-OPT-on` 和 `target-OPT-off`

这些 **Makefile** 目标可以接受额外的可选构建目标：

* `pre-fetch`
* `do-fetch`
* `post-fetch`
* `pre-extract`
* `do-extract`
* `post-extract`
* `pre-patch`
* `do-patch`
* `post-patch`
* `pre-configure`
* `do-configure`
* `post-configure`
* `pre-build`
* `do-build`
* `post-build`
* `pre-install`
* `do-install`
* `post-install`
* `post-stage`
* `pre-package`
* `do-package`
* `post-package`

当选中选项 *OPT* 时，如果定义了目标 `TARGET-OPT-on`，则在 `TARGET` 之后执行该目标。`TARGET-OPT-off` 以相同的方式工作，但作用于 *OPT* 未选中的情况。例如：

```makefile
OPTIONS_DEFINE=	OPT1

post-patch-OPT1-on:
	@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${EXAMPLESDIR}/|' ${WRKSRC}/Makefile

post-patch-OPT1-off:
	@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${PREFIX}/bin/|' ${WRKSRC}/Makefile
```

等同于：

```makefile
OPTIONS_DEFINE=	OPT1

.include <bsd.port.options.mk>

post-patch:
.if ${PORT_OPTIONS:MOPT1}
	@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${EXAMPLESDIR}/|' ${WRKSRC}/Makefile
.else
	@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${PREFIX}/bin/|' ${WRKSRC}/Makefile
.endif
```


# 5.15.特殊的工作目录

每个 Port 都会解压到一个工作目录中，该目录必须是可写的。Ports 系统默认将 `DISTFILES` 解压到一个名为 `${DISTNAME}` 的目录中。换句话说，如果 **Makefile** 中有：

```makefile
PORTNAME=	foo
DISTVERSION=	1.0
```

那么该 Port 的分发文件会包含一个顶级目录 **foo-1.0**，其余的文件都位于该目录下。

如果不是这种情况，可以覆盖一些变量。

## 5.15.1. `WRKSRC`

该变量列出了提取时创建的目录名。如果我们之前的例子中，文件解压到了一个名为 **foo** 的目录（而不是 **foo-1.0**），那么可以写：

```makefile
WRKSRC=	${WRKDIR}/foo
```

或者可能是：

```makefile
WRKSRC=	${WRKDIR}/${PORTNAME}
```

## 5.15.2. `WRKSRC_SUBDIR`

如果所需的源文件位于提取的分发文件的子目录中，请将 `WRKSRC_SUBDIR` 设置为该目录。

```makefile
WRKSRC_SUBDIR=	src
```

## 5.15.3. `NO_WRKSUBDIR`

如果 Port 完全没有提取到子目录中，则将 `NO_WRKSUBDIR` 设置为 `yes` 来指示这一点。

```makefile
NO_WRKSUBDIR=	yes
```

> **注意**
>
> 由于 `WRKDIR` 是构建过程中唯一应当可写的目录，并且用于存储记录构建状态的许多文件，因此 Port 的提取会强制放入一个子目录。


# 5.16.解决冲突

有三个不同的变量用于注册包和 Port 之间的冲突：`CONFLICTS`、`CONFLICTS_INSTALL` 和 `CONFLICTS_BUILD`。

> **注意**
>
> 冲突变量会自动设置 `IGNORE` 变量，详细说明请参见 [使用 `BROKEN` 标记 Port 为不可安装](https://docs.freebsd.org/en/books/porters-handbook/porting-dads/#dads-noinstall)。

在删除多个冲突的 Port 之一时，建议在其他 Port 中保留 `CONFLICTS` 变量几个月，以便照顾那些偶尔更新的用户。

`CONFLICTS_INSTALL` 如果包无法与其他包共存（由于文件冲突、运行时不兼容等）。`CONFLICTS_INSTALL` 检查在构建阶段后，安装阶段前进行。

`CONFLICTS_BUILD` 如果 Port 无法在安装了其他特定 Port 的情况下构建。构建冲突不会记录到结果包中。

`CONFLICTS` 如果在某个 Port 已安装的情况下，该 Port 无法构建，且结果包无法与其他包共存。`CONFLICTS` 检查在构建阶段前和安装阶段前进行。

`CONFLICTS*` 变量值中的每个由空格分隔的项都会与包进行匹配，除了正在构建的包，使用的是 shell 通配符规则。这允许列出 Port 的所有 flavor 作为冲突项，而不需要排除正在构建的 flavor。例如，如果安装了 `git-lite`，`CONFLICTS_INSTALL=git git-lite` 将允许执行：

```sh
% make -C devel/git FLAVOR=lite all deinstall install
```

但是以下命令会报告冲突，因为安装的包基础名称是 `git-lite`，而 `git` 将构建，但无法与 `git-lite` 一起安装：

```sh
% make -C devel/git FLAVOR=default all deinstall install
```

如果没有这个功能，Makefile 将需要为每个 flavor 添加一个 `_flavor__CONFLICTS_INSTALL`，列出所有其他 flavor。

这些变量最常见的内容是另一个 Port 的包基础名。包基础名是没有附加版本的包名，可以通过运行 `make -V PKGBASE` 获取。

**示例 46. `CONFLICTS*` 的基本用法**

[dns/bind99](https://cgit.freebsd.org/ports/tree/dns/bind99/) 不能与 [dns/bind910](https://cgit.freebsd.org/ports/tree/dns/bind910/) 一起安装，因为它们安装了相同的文件。首先获取要使用的包基础名：

```sh
% make -C dns/bind99 -V PKGBASE
bind99
% make -C dns/bind910 -V PKGBASE
bind910
```

然后在 [dns/bind99](https://cgit.freebsd.org/ports/tree/dns/bind99/) 的 **Makefile** 中添加：

```makefile
CONFLICTS_INSTALL=	bind910
```

并在 [dns/bind910](https://cgit.freebsd.org/ports/tree/dns/bind910/) 的 **Makefile** 中添加：

```makefile
CONFLICTS_INSTALL=	bind99
```

有时，只有另一个 Port 的某些版本是不兼容的。当发生这种情况时，请使用完整的包名，包括版本。如果有必要，可以使用 shell 通配符，如 `*` 和 `?`，以便匹配所有必要的版本。

**示例 47. 使用通配符的 `CONFLICTS*`**

从 2.0 版本到 **2.4.1\_2** 版本，[deskutils/gnotime](https://cgit.freebsd.org/ports/tree/deskutils/gnotime/) 曾经安装一个捆绑的 [databases/qof](https://cgit.freebsd.org/ports/tree/databases/qof/) 版本。

为了反映这一点，[databases/qof](https://cgit.freebsd.org/ports/tree/databases/qof/) 的 **Makefile** 包含：

```makefile
CONFLICTS_INSTALL=	gnotime-2.[0-3]* \
			gnotime-2.4.0* gnotime-2.4.1 \
			gnotime-2.4.1_[12]
```

第一个条目匹配版本 `2.0` 到 `2.3`，第二个条目匹配所有 `2.4.0` 版本，第三个条目匹配精确的 `2.4.1` 版本，最后一个条目匹配 `2.4.1` 版本的第一个和第二个修订版。

[deskutils/gnotime](https://cgit.freebsd.org/ports/tree/deskutils/gnotime/) 没有任何冲突行，因为它的当前版本与其他任何版本不冲突。

`DISABLE_CONFLICTS` 变量可在执行不受冲突影响的目标时暂时设置。此变量不应在 Port 的 **Makefile** 中设置。

```sh
% make -DDISABLE_CONFLICTS patch
```


# 5.17.安装文件

> **重要**
>
> `install` 阶段对最终用户非常重要，因为它将文件添加到他们的系统中。Port **Makefile** 中的 `*-install` 目标运行的所有附加命令应回显到屏幕上。*不要* 使用 `@` 或 `.SILENT` 来隐藏这些命令。

## 5.17.1. `INSTALL_*` 宏

使用 **bsd.port.mk** 提供的宏来确保在 Port 的 `*-install` 目标中正确设置文件的权限。通过相应的条目（例如 `@(_owner_,_group_,)`、`@owner _owner_` 和 `@group _group_`）在 **pkg-plist** 中直接设置所有权。这些操作符在覆盖之前一直有效，或者直到 **pkg-plist** 的结尾为止，因此请记得在不再需要时重置它们。默认的所有权是 `root:wheel`。有关更多信息，请参见 [Base Keywords](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-keywords-base)。

* `INSTALL_PROGRAM` 是安装二进制可执行文件的命令。
* `INSTALL_SCRIPT` 是安装可执行脚本的命令。
* `INSTALL_LIB` 是安装共享库（但不是静态库）的命令。
* `INSTALL_KLD` 是安装内核可加载模块的命令。有些架构不喜欢将模块去除符号表，因此请使用此命令，而不是 `INSTALL_PROGRAM`。
* `INSTALL_DATA` 是安装可共享数据（包括静态库）的命令。
* `INSTALL_MAN` 是安装手册页和其他文档的命令（它不进行压缩）。

这些变量设置为 [install(1)](https://man.freebsd.org/cgi/man.cgi?query=install\&sektion=1\&format=html) 命令，并根据不同情况使用相应的标志。

> **重要**
>
> 不要使用 `INSTALL_LIB` 来安装静态库，因为去除符号表会使它们变得无用。请改用 `INSTALL_DATA`。

## 5.17.2. 去除二进制文件和共享库的符号表

已安装的二进制文件应该去除符号表。除非绝对必要，否则不要手动去除符号表。`INSTALL_PROGRAM` 宏会同时安装并去除二进制文件的符号表。`INSTALL_LIB` 宏对共享库也执行相同的操作。

当必须去除符号表，但不希望使用 `INSTALL_PROGRAM` 或 `INSTALL_LIB` 宏时，可以使用 `${STRIP_CMD}` 来去除程序或共享库的符号表。这通常是在 `post-install` 目标中执行。例如：

```makefile
post-install:
	${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/xdl
```

当需要去除多个文件的符号表时：

```makefile
post-install:
.for l in geometry media body track world
	${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/lib${PORTNAME}-${l}.so.0
.endfor
```

使用 [file(1)](https://man.freebsd.org/cgi/man.cgi?query=file\&sektion=1\&format=html) 命令可以确定文件是否已去除符号表。[file(1)](https://man.freebsd.org/cgi/man.cgi?query=file\&sektion=1\&format=html) 会将二进制文件报告为 `stripped` 或 `not stripped`。此外，[strip(1)](https://man.freebsd.org/cgi/man.cgi?query=strip\&sektion=1\&format=html) 将检测到已去除符号表的程序，并平稳退出。

> **重要**
>
> 当定义了 `WITH_DEBUG` 时，*不得* 去除 elf 文件的符号表。
>
> 框架提供的变量（如 `STRIP_CMD`、`INSTALL_PROGRAM`、`INSTALL_LIB` 等）和 [`USES`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses) 会自动处理这个问题。
>
> 如果某些软件在其 `LDFLAGS` 中添加了 `-s`，则在这种情况下，要么在设置了 `WITH_DEBUG` 时删除 `-s`，要么无条件地删除它，并在 `post-install` 中使用 `STRIP_CMD`。

## 5.17.3. 安装整个文件树

有时，需要安装大量文件，并保持其层次结构不变。例如，将整个目录树从 `WRKSRC` 复制到 `PREFIX` 下的目标目录。请注意，`PREFIX`、`EXAMPLESDIR`、`DATADIR` 以及其他路径变量必须始终以 `STAGEDIR` 为前缀，以遵循 staging 机制（参见 [Staging](https://docs.freebsd.org/en/books/porters-handbook/special/#staging)）。

针对这种情况，有两个宏。使用这些宏代替 `cp` 的优点是，它们能确保目标文件的正确所有权和权限。第一个宏，`COPYTREE_BIN`，会将所有安装的文件设置为可执行，因此适用于安装到 **PREFIX/bin** 目录下。第二个宏，`COPYTREE_SHARE`，不会为文件设置可执行权限，因此适合安装到 **PREFIX/share** 目标目录下。

```makefile
post-install:
	${MKDIR} ${STAGEDIR}${EXAMPLESDIR}
	(cd ${WRKSRC}/examples && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR})
```

此示例会将供应商分发文件中的 **examples** 目录的内容安装到 Port 的适当示例位置。

```makefile
post-install:
	${MKDIR} ${STAGEDIR}${DATADIR}/summer
	(cd ${WRKSRC}/temperatures && ${COPYTREE_SHARE} "June July August" ${STAGEDIR}${DATADIR}/summer)
```

这个示例会将夏季月份的数据安装到 **DATADIR** 下的 **summer** 子目录。

可以通过 `COPYTREE_*` 宏的第三个参数传递额外的 `find` 参数。例如，要安装来自第一个示例的所有文件，但排除 Makefile，可以使用以下命令：

```makefile
post-install:
	${MKDIR} ${STAGEDIR}${EXAMPLESDIR}
	(cd ${WRKSRC}/examples && \
	${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR} "! -name Makefile")
```

这些宏不会将已安装的文件自动添加到 **pkg-plist** 中。必须手动添加它们。对于可选文档（`PORTDOCS`，参见 [安装附加文档](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#install-documentation)）和示例（`PORTEXAMPLES`），必须在 **pkg-plist** 中的条目前加上 `%%PORTDOCS%%` 或 `%%PORTEXAMPLES%%` 前缀。

## 5.17.4. 安装附加文档

如果软件有除标准 man 页面和 info 页面之外的其他文档，并且对用户有用，可以将其安装到 `DOCSDIR` 下。这可以像前面的示例一样，在 `post-install` 目标中进行。

为 Port 创建一个新目录。该目录名为 `DOCSDIR`，通常等于 `PORTNAME`。但是，如果用户可能希望同时安装不同版本的 Port，则可以使用整个 `PKGNAME`。

由于只有 **pkg-plist** 中列出的文件才会安装，因此始终将文档安装到 `STAGEDIR` 是安全的（参见 [Staging](https://docs.freebsd.org/en/books/porters-handbook/special/#staging)）。因此，`.if` 块仅在安装的文件足够大，可能导致显著的 I/O 开销时才需要。

```makefile
post-install:
	${MKDIR} ${STAGEDIR}${DOCSDIR}
	${INSTALL_DATA} ${WRKSRC}/docs/xvdocs.ps ${STAGEDIR}${DOCSDIR}
```

另一方面，如果 Port 中有 DOCS 选项，则应在 `post-install-DOCS-on` 目标中安装文档。这些目标在 [附加构建目标](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-targets) 中有所描述。

以下是一些有用的变量及其在 **Makefile** 中使用时的默认展开方式：

* `DATADIR` 展开为 **PREFIX/share/PORTNAME**。
* `DATADIR_REL` 展开为 **share/PORTNAME**。
* `DOCSDIR` 展开为 **PREFIX/share/doc/PORTNAME**。
* `DOCSDIR_REL` 展开为 **share/doc/PORTNAME**。
* `EXAMPLESDIR` 展开为 **PREFIX/share/examples/PORTNAME**。
* `EXAMPLESDIR_REL` 展开为 **share/examples/PORTNAME**。

> **注意**
>
> `DOCS` 选项仅控制安装到 `DOCSDIR` 中的附加文档。它不适用于标准的 man 页面和 info 页面。安装到 `EXAMPLESDIR` 中的文件由 `EXAMPLES` 选项控制。

这些变量导出到 `PLIST_SUB` 中。如果可能，它们的值会作为相对 **PREFIX** 的路径出现在那里。也就是说，**share/doc/PORTNAME** 将默认替换 `%%DOCSDIR%%`，以此类推。（有关 **pkg-plist** 替换的更多信息，请参见 [这里](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-sub)。）

所有有条件安装的文档文件和目录都会在 **pkg-plist** 中以 `%%PORTDOCS%%` 前缀列出，例如：

```sh
%%PORTDOCS%%%%DOCSDIR%%/AUTHORS
%%PORTDOCS%%%%DOCSDIR%%/CONTACT
```

作为列出文档文件的替代方法，Port 可以将变量 `PORTDOCS` 设置为文件名和 shell glob 模式的列表，以将其添加到最终的 packing list 中。这些文件名将相对于 `DOCSDIR`。因此，使用 `PORTDOCS` 并使用非默认位置存放文档的 Port 必须相应地设置 `DOCSDIR`。如果目录在 `PORTDOCS` 中列出或通过该变量的 glob 模式匹配，则将整个包含的文件和目录的子树注册到最终的 packing list 中。如果未设置 `DOCS` 选项，则列在 `PORTDOCS` 中的文件和目录将不会安装或添加到 Port 的 packing list 中。安装文档到 `PORTDOCS` 如上所示，仍然由 Port 自身决定。典型的 `PORTDOCS` 使用示例如下：

```makefile
PORTDOCS=	README.* ChangeLog docs/*
```

> **注意**
>
> 安装到 `DATADIR` 和 `EXAMPLESDIR` 下的文件对应的 `PORTDOCS` 变量分别是 `PORTDATA` 和 `PORTEXAMPLES`。
>
> **pkg-message** 中的内容会在安装时显示。有关使用 **pkg-message** 的详细信息，请参见 [pkg-message 部分](https://docs.freebsd.org/en/books/porters-handbook/pkg-files/#porting-message)。**pkg-message** 不需要添加到 **pkg-plist** 中。

## 5.17.5. `PREFIX` 下的子目录

尽量让 Port 将文件放置在 `PREFIX` 的正确子目录下。某些 Port 会将所有内容都放在一个以 Port 名称命名的子目录中，这是不正确的。此外，许多 Port 会将除了二进制文件、头文件和手册页面之外的所有文件都放在 **lib** 的子目录下，但这与 BSD 的理念并不兼容。许多文件必须移动到以下这些目录中的一个：**etc**（设置/配置文件）、**libexec**（内部启动的可执行文件）、**sbin**（供超级用户/管理员使用的可执行文件）、**info**（用于 info 浏览器的文档）或 **share**（与架构无关的文件）。有关详细信息，请参见 [hier(7)](https://man.freebsd.org/cgi/man.cgi?query=hier\&sektion=7\&format=html)；适用于 **/usr** 的规则也适用于 **/usr/local**。唯一的例外是处理 USENET "news" 的 Port，它们可以将文件放置在 **PREFIX/news** 目录中。


# 5.18. 使用 BINARY\_ALIAS 来重命名命令，而不是在编译中打补丁

当定义了 `BINARY_ALIAS` 时，它会在一个目录中创建所给命令的符号链接，并将该目录前置到 `PATH` 中。

使用它可以替换构建阶段依赖的硬编码命令，而无需修补任何构建文件。

**示例 48. 使用 `BINARY_ALIAS` 让 `gsed` 作为 `sed` 使用**

某些 Port 期望 `sed` 行为像 GNU sed，并使用 [sed(1)](https://man.freebsd.org/cgi/man.cgi?query=sed\&sektion=1\&format=html) 不提供的功能。GNU sed 可以通过 [textproc/gsed](https://cgit.freebsd.org/ports/tree/textproc/gsed/) 在 FreeBSD 上获得。

使用 `BINARY_ALIAS` 将 `sed` 替换为 `gsed` 以便在构建期间使用：

```makefile
BUILD_DEPENDS=	gsed:textproc/gsed
...
BINARY_ALIAS=	sed=gsed
```

**示例 49. 使用 `BINARY_ALIAS` 为硬编码的 `python3` 命令提供别名**

如果 Port 在其构建脚本中硬编码了对 `python3` 的引用，则需要在构建时使其在 `PATH` 中可用。使用 `BINARY_ALIAS` 创建一个指向正确 Python 3 二进制文件的别名：

```makefile
USES=	python:3.4+,build
...
BINARY_ALIAS=	python3=${PYTHON_CMD}
```

更多关于 `USES=python` 的信息，请参见 [使用 Python](https://docs.freebsd.org/en/books/porters-handbook/special/#using-python)。

> **注意**
>
> 二进制别名是在处理完 `BUILD_DEPENDS` 和 `LIB_DEPENDS` 提供的依赖关系之后，以及 `configure` 目标之前创建的。这会导致一些限制。例如，通过 `TEST_DEPENDS` 安装的程序不能用于创建二进制别名，因为此方式指定的测试依赖关系是在创建二进制别名之后处理的。


# 第 6 章 特殊情况

本节说明了创建 Port 时需要考虑的最常见事项。

## 6.1. 拆分长文件

有时，Port 的 **Makefile** 可能会非常长。例如，Rust Port 的 `CARGO_CRATES` 列表可能很长，或者 **Makefile** 中可能包含根据架构不同而变化的代码。在这种情况下，将原始的 **Makefile** 拆分成多个文件可能会很方便。**bsd.port.mk** 会自动包含一些类型的 **Makefile** 到主 Port **Makefile** 中。

框架会自动处理以下文件类型（如果发现它们的话）：

* **Makefile.crates**。可以在 [audio/ebur128](https://cgit.freebsd.org/ports/tree/audio/ebur128/) 中找到示例。
* **Makefile.inc**。可以在 [net/ntp](https://cgit.freebsd.org/ports/tree/net/ntp/) 中找到示例。
* **Makefile.${ARCH}-${OPSYS}**
* **Makefile.${OPSYS}**。可以在 [net/cvsup-static](https://cgit.freebsd.org/ports/tree/net/cvsup-static/) 中找到示例。
* **Makefile.${ARCH}**
* **Makefile.local**

通常的做法是，如果包装列表在不同架构之间变化很大，或者依赖于所选的 flavor，那么将 Port 的包装列表拆分成多个文件。在这种情况下，每个架构的 **pkg-plist** 文件命名遵循 **pkg-plist.${ARCH}** 或 **pkg-plist.${FLAVOR}** 的模式。如果存在多个 **pkg-plist** 文件，框架不会自动创建包装列表。Port 作者需要选择适当的 **pkg-plist** 文件并将其分配给 `PLIST` 变量。关于如何处理这个问题的示例可以在 [audio/logitechmediaserver](https://cgit.freebsd.org/ports/tree/audio/logitechmediaserver/) 和 [deskutils/libportal](https://cgit.freebsd.org/ports/tree/deskutils/libportal/) 中找到。

## 6.2. Staging

**bsd.port.mk** 要求 Port 使用 "阶段目录"。这意味着 Port 必须将文件安装到一个单独的目录，而不是直接安装到常规的目标目录（例如，`PREFIX`）。然后从这个阶段目录构建包。在许多情况下，这不需要 root 权限，从而使得可以作为非特权用户构建包。通过 staging，Port 被构建并安装到阶段目录 `STAGEDIR` 中。然后从该目录创建包，并安装到系统中。Automake 工具称这一概念为 `DESTDIR`，但在 FreeBSD 中，`DESTDIR` 有不同的含义（见 [`PREFIX` 和 `DESTDIR`](https://docs.freebsd.org/en/books/porters-handbook/testing/#porting-prefix)）。

> **注意**
>
> 没有任何 Port *真正* 需要 root 权限。通过使用 [`USES=uidfix`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-uidfix) 大多数情况下可以避免。如果 Port 仍然运行像 [chown(8)](https://man.freebsd.org/cgi/man.cgi?query=chown\&sektion=8\&format=html)、[chgrp(1)](https://man.freebsd.org/cgi/man.cgi?query=chgrp\&sektion=1\&format=html)，或者通过 [install(1)](https://man.freebsd.org/cgi/man.cgi?query=install\&sektion=1\&format=html) 强制设置文件的所有者或组，则应使用 [`USES=fakeroot`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-fakeroot) 来伪造这些调用。此时可能需要对 Port 的 **Makefiles** 进行一些补丁。

元 Port（即不安装文件，而是依赖于其他 Port 的 Port）必须避免不必要地将 [mtree(8)](https://man.freebsd.org/cgi/man.cgi?query=mtree\&sektion=8\&format=html) 提取到阶段目录。这是包的基本目录布局，这些空目录会被视为孤立的。为了防止 [mtree(8)](https://man.freebsd.org/cgi/man.cgi?query=mtree\&sektion=8\&format=html) 提取，可以添加这一行：

```makefile
NO_MTREE=	yes
```

> **技巧**
>
> 元 Port 应该使用 [`USES=metaport`](https://docs.freebsd.org/en/books/porters-handbook/special/#uses-metaport)。它为不获取、构建或安装任何东西的 Port 设置默认值。

Staging 通过在 `pre-install`、`do-install` 和 `post-install` 目标中使用 `STAGEDIR` 前缀来启用（参见本书中的示例）。通常，这包括 `PREFIX`、`ETCDIR`、`DATADIR`、`EXAMPLESDIR`、`DOCSDIR` 等。目录应该作为 `post-install` 目标的一部分创建。尽量避免使用绝对路径。

> **技巧**
>
> 安装内核模块的 Port 必须在其目标路径（默认为 **/boot/modules**）前添加 `STAGEDIR`。

### 6.2.1. 处理符号链接

在创建符号链接时，强烈建议使用相对链接。使用 `${RLN}` 可以自动创建相对符号链接。它在后台使用 [install(1)](https://man.freebsd.org/cgi/man.cgi?query=install\&sektion=1\&format=html)，自动计算要创建的相对链接。

**示例 1. 自动创建相对符号链接**

`${RLN}` 使用 [install(1)](https://man.freebsd.org/cgi/man.cgi?query=install\&sektion=1\&format=html) 的相对符号链接功能，使得创建者不必手动计算相对路径。

```sh
${RLN} ${STAGEDIR}${PREFIX}/lib/libfoo.so.42 ${STAGEDIR}${PREFIX}/lib/libfoo.so
${RLN} ${STAGEDIR}${PREFIX}/libexec/foo/bar ${STAGEDIR}${PREFIX}/bin/bar
${RLN} ${STAGEDIR}/var/cache/foo ${STAGEDIR}${PREFIX}/share/foo
```

将生成：

```sh
% ls -lF ${STAGEDIR}${PREFIX}/lib
lrwxr-xr-x  1 nobody  nobody    181 Aug  3 11:27 libfoo.so@ -> libfoo.so.42
-rwxr-xr-x  1 nobody  nobody     15 Aug  3 11:24 libfoo.so.42*
% ls -lF ${STAGEDIR}${PREFIX}/bin
lrwxr-xr-x  1 nobody  nobody    181 Aug  3 11:27 bar@ -> ../libexec/foo/bar
% ls -lF ${STAGEDIRDIR}${PREFIX}/share
lrwxr-xr-x  1 nobody  nobody    181 Aug  3 11:27 foo@ -> ../../../var/cache/foo
```

## 6.3. 捆绑的库

本节解释了为什么捆绑的依赖库被认为是不好的，以及如何处理它们。

### 6.3.1. 为什么捆绑的库不好

一些软件要求开发者找到第三方库并将所需的依赖添加到 Port 中。其他软件则将所有必需的库打包在分发文件中。第二种方法看起来一开始更容易，但存在一些严重的缺点：

以下列表大致基于 [Fedora](https://fedoraproject.org/wiki/Packaging:No_Bundled_Libraries) 和 [Gentoo](https://wiki.gentoo.org/wiki/Why_not_bundle_dependencies) 的维基页面，均由 [CC-BY-SA 3.0](https://creativecommons.org/licenses/by-sa/3.0/) 许可证授权。

**安全性**

如果在上游库中发现漏洞并进行修复，可能不会在与 Port 捆绑的库中修复这些漏洞。一个原因可能是作者没有意识到这个问题。这意味着开发者必须修复它们，或升级到一个无漏洞的版本，并向作者提交补丁。这一过程需要时间，导致软件暴露在漏洞风险中的时间比必要的更长。这反过来使得协调修复变得更加困难，且难以避免不必要地泄漏漏洞信息。

**错误**

这个问题类似于上一段提到的安全问题，但一般不如安全问题严重。

**分叉**

库被捆绑后，作者更容易对上游库进行分叉。虽然从表面上看，这样做更方便，但这意味着代码与上游分叉，使得解决安全问题或其他问题变得更加困难。原因之一是补丁变得更难以应用。

分叉的另一个问题是，由于代码与上游分叉，bug 需要重复解决，而不是集中在一个地方解决。这违背了开源软件的初衷。

**符号冲突**

当系统中已安装了某个库时，它可能会与捆绑版本发生冲突。这可能会导致编译或链接时立即出错，也可能导致运行时错误，后者可能更难追踪。后一种问题可能是因为两个库的版本不兼容。

**许可问题**

当捆绑来自不同来源的项目时，许可问题可能更容易出现，尤其是当许可不兼容时。

**资源浪费**

捆绑的库在多个层面上浪费资源。特别是当这些库已经存在于系统上时，构建实际应用的时间会变得更长。在运行时，它们可能占用不必要的内存，而系统全局库已经被其他程序加载，而捆绑的库却由另一个程序加载。

**努力的浪费**

当某个库需要为 FreeBSD 打补丁时，这些补丁必须再次应用到捆绑库中。这浪费了开发者的时间，因为这些补丁可能无法干净地应用。并且很难发现这些补丁其实是必需的。

### 6.3.2. 如何处理捆绑的库

尽可能使用未捆绑版本的库，通过向 Port 添加 `LIB_DEPENDS` 来指定依赖。如果这种 Port 还不存在，考虑创建一个新的 Port。

仅在上游有良好的安全记录并且使用未捆绑版本会导致过于复杂的补丁时，才使用捆绑库。

> **重要**
>
> 在一些非常特殊的情况下，例如仿真器（如 Wine），Port 必须捆绑库，因为这些库属于不同架构，或者它们已被修改以适应软件的需求。在这种情况下，这些库不应该暴露给其他 Port 进行链接。可以在 Port 的 **Makefile** 中添加 `BUNDLE_LIBS=yes`。这将告诉 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 不计算提供的库。在将此添加到 Port 之前，请始终向 Ports 管理团队 <<portmgr@FreeBSD.org>> 询问。

## 6.4. 共享库

如果 Port 安装一个或多个共享库，定义 `USE_LDCONFIG` make 变量，指示 **bsd.port.mk** 在 `post-install` 目标阶段运行 `${LDCONFIG} -m`，该命令将在新库安装的目录（通常是 **PREFIX/lib**）上运行，以将其注册到共享库缓存中。定义此变量时，它还会在 **pkg-plist** 中添加适当的 `@exec /sbin/ldconfig -m` 和 `@unexec /sbin/ldconfig -R`，以便用户安装软件包后能立即使用共享库，并且卸载时不会让系统仍然认为库存在。

```makefile
USE_LDCONFIG=	yes
```

可以通过将 `USE_LDCONFIG` 设置为共享库安装目录的列表，来覆盖默认目录。例如，如果 Port 将共享库安装到 **PREFIX/lib/foo** 和 **PREFIX/lib/bar**，则在 **Makefile** 中使用以下设置：

```makefile
USE_LDCONFIG=	${PREFIX}/lib/foo ${PREFIX}/lib/bar
```

请仔细检查，通常这并不总是必要的，或者可以通过 `-rpath` 或在链接时设置 `LD_RUN_PATH` 来避免（参见 [lang/mosml](https://cgit.freebsd.org/ports/tree/lang/mosml/) 示例），或者通过像 [www/seamonkey](https://cgit.freebsd.org/ports/tree/www/seamonkey/) 那样的 shell 脚本包装器，先设置 `LD_LIBRARY_PATH` 后再调用二进制文件。

在 64 位系统上安装 32 位库时，使用 `USE_LDCONFIG32`。

如果软件使用 [autotools](https://docs.freebsd.org/en/books/porters-handbook/special/#using-autotools)，特别是 `libtool`，则添加 [`USES=libtool`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-libtool)。

当库的主版本号在新版本 Port 更新时增加时，所有链接到受影响库的其他 Port 必须增加 `PORTREVISION`，以强制使用新库版本重新编译。

## 6.5. 有分发限制或法律问题的 Ports

许可证各不相同，其中一些对应用程序如何打包、是否可以盈利性销售等方面有一定限制。

> **重要**
>
> Port 维护者有责任阅读软件的许可条款，并确保 FreeBSD 项目不会因通过 FTP/HTTP 或 CD-ROM 再分发源代码或已编译的二进制文件而违反许可条款并被追究责任。如果有疑问，请联系 [FreeBSD ports 邮件列表](https://lists.freebsd.org/subscription/freebsd-ports)。

在这种情况下，可以设置下节中说明的变量。

### 6.5.1. `NO_PACKAGE`

此变量表示我们不能生成应用程序的二进制包。例如，许可协议可能禁止二进制再分发，或者可能禁止从修补过的源代码创建的包的分发。

然而，Port 的 `DISTFILES` 可以自由地在 FTP/HTTP 上镜像。它们也可以分发到 CD-ROM（或类似媒体），除非同时设置了 `NO_CDROM`。

如果二进制包没有普遍的用途，并且必须始终从源代码编译应用程序，请使用 `NO_PACKAGE`。例如，如果应用程序在编译时硬编码了与站点特定的配置信息，请设置 `NO_PACKAGE`。

设置 `NO_PACKAGE` 为说明为什么不能生成包的字符串。

### 6.5.2. `NO_CDROM`

仅此变量表示，尽管我们允许生成二进制包，但我们不能将这些包或 Port 的 `DISTFILES` 放到 CD-ROM（或类似媒体）上进行转售。然而，二进制包和 Port 的 `DISTFILES` 仍然可以通过 FTP/HTTP 进行分发。

如果同时设置了 `NO_PACKAGE` 和 `NO_CDROM`，则只有 Port 的 `DISTFILES` 可用，并且仅通过 FTP/HTTP 分发。

设置 `NO_CDROM` 为说明为什么不能在 CD-ROM 上重新分发该 Port 的字符串。例如，如果该 Port 的许可证仅允许“非商业”使用，可以使用此设置。

### 6.5.3. `NOFETCHFILES`

在 `NOFETCHFILES` 中定义的文件不能从任何 `MASTER_SITES` 获取。例如，当文件由供应商提供在 CD-ROM 上时，就是一个这样的文件。

检查这些文件是否在 `MASTER_SITES` 上可用的工具需要忽略这些文件，并且不报告它们的可用性。

### 6.5.4. `RESTRICTED`

如果应用程序的许可既不允许镜像应用程序的 `DISTFILES` 也不允许以任何方式分发二进制包，请单独设置此变量。

不要与 `RESTRICTED` 一起设置 `NO_CDROM` 或 `NO_PACKAGE`，因为后者变量已经包含了前者的含义。

将 `RESTRICTED` 设置为说明为何该 Port 不能再分发的字符串。通常，这表示该 Port 包含专有软件，用户需要手动下载 `DISTFILES`，可能需要在注册软件或同意接受最终用户许可协议（EULA）的条款后进行下载。

### 6.5.5. `RESTRICTED_FILES`

当设置 `RESTRICTED` 或 `NO_CDROM` 时，此变量默认值为 `${DISTFILES} ${PATCHFILES}`，否则为空。如果只有部分分发文件受到限制，可以设置此变量列出它们。

### 6.5.6. `LEGAL_TEXT`

如果 Port 有上述变量未涵盖的法律问题，请将 `LEGAL_TEXT` 设置为解释该问题的字符串。例如，如果 FreeBSD 获得了特别许可来重新分发二进制文件，此变量必须注明这一点。

### 6.5.7. **/usr/ports/LEGAL** 和 `LEGAL`

设置上述任何变量的 Port 必须同时添加到 **/usr/ports/LEGAL**。第一列是匹配受限 `distfiles` 的通配符，第二列是 Port 的来源，第三列是 `make -VLEGAL` 的输出。

### 6.5.8. 示例

声明“此 Port 的 distfiles 必须手动获取”的首选方式如下：

```makefile
.if !exists(${DISTDIR}/${DISTNAME}${EXTRACT_SUFX})
IGNORE=	may not be redistributed because of licensing reasons. Please visit some-website to accept their license and download ${DISTFILES} into ${DISTDIR}
.endif
```

这不仅通知用户，还在用户的机器上设置了适当的元数据，供自动化程序使用。

请注意，此段落必须在包含 **bsd.port.pre.mk** 后添加。

## 6.6. 构建机制

### 6.6.1. 并行构建 Port

FreeBSD 的 Ports 框架支持通过使用多个 `make` 子进程来进行并行构建，这使得 SMP 系统可以利用所有可用的 CPU 功率，从而加快 Port 构建的速度和效果。

这是通过将 `-jX` 标志传递给在供应商代码上运行的 [make(1)](https://man.freebsd.org/cgi/man.cgi?query=make\&sektion=1\&format=html) 来实现的。这是 Port 的默认构建行为。不幸的是，并非所有 Port 都能很好地处理并行构建，因此可能需要显式禁用此功能，方法是添加 `MAKE_JOBS_UNSAFE=yes` 变量。当 Port 因竞争条件而导致间歇性构建失败时，就需要使用这个变量。

> **重要**
>
> 设置 `MAKE_JOBS_UNSAFE` 时，非常重要的一点是在 **Makefile** 中用注释说明，或者至少在提交信息中说明 *为什么* 启用时 Port 无法构建。否则，在以后提交更新时，几乎不可能修复问题或测试问题是否已经解决。

### 6.6.2. `make`、`gmake` 和 `imake`

存在几种不同的 `make` 实现。移植的软件通常需要特定的实现，例如 GNU `make`，在 FreeBSD 中称为 `gmake`。

如果 Port 使用 GNU make，请将 `gmake` 添加到 `USES` 中。

`MAKE_CMD` 可以用来引用 Port 的 **Makefile** 中通过 `USES` 设置配置的特定命令。仅在应用程序 **Makefile** 中的 `WRKSRC` 内部使用 `MAKE_CMD` 来调用移植软件期望的 `make` 实现。

如果 Port 是使用 imake 来从 **Imakefile** 生成 **Makefile** 的 X 应用程序，则应设置 `USES= imake`。有关更多详细信息，请参阅 [使用 `USES` 宏](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses)中的 [`USES=imake`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-imake) 部分。

如果 Port 的源 **Makefile** 具有不同于 `all` 的主要构建目标，请相应地设置 `ALL_TARGET`。同样，`install` 和 `INSTALL_TARGET` 也应该如此。

### 6.6.3. `configure` 脚本

如果 Port 使用 `configure` 脚本从 **Makefile.in** 生成 **Makefile**，请设置 `GNU_CONFIGURE=yes`。要为 `configure` 脚本提供额外的参数（默认参数为 `--prefix=${PREFIX} --infodir=${PREFIX}/${INFO_PATH} --mandir=${PREFIX}/man --build=${CONFIGURE_TARGET}`），请在 `CONFIGURE_ARGS` 中设置这些额外的参数。可以使用 `CONFIGURE_ENV` 传递额外的环境变量。

| 变量                 | 含义                                                        |
| ------------------ | --------------------------------------------------------- |
| `GNU_CONFIGURE`    | Port 使用 `configure` 脚本进行构建准备。                             |
| `HAS_CONFIGURE`    | 与 `GNU_CONFIGURE` 相同，只是默认的配置目标没有添加到 `CONFIGURE_ARGS` 中。   |
| `CONFIGURE_ARGS`   | 传递给 `configure` 脚本的额外参数。                                  |
| `CONFIGURE_ENV`    | 为 `configure` 脚本运行设置的额外环境变量。                              |
| `CONFIGURE_TARGET` | 重写默认的配置目标。默认值为 `${MACHINE_ARCH}-portbld-freebsd${OSREL}`。 |

### 6.6.4. 使用 `cmake`

对于使用 CMake 的 Port，定义 `USES= cmake`。

| 变量                  | 含义                                                                                                                                                                  |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CMAKE_ARGS`        | 传递给 `cmake` 二进制文件的 Port 特定 CMake 标志。                                                                                                                                |
| `CMAKE_ON`          | 对于 `CMAKE_ON` 中的每个条目，都会将启用的布尔值添加到 `CMAKE_ARGS` 中。请参见 [`CMAKE_ON` 和 `CMAKE_OFF`](https://docs.freebsd.org/en/books/porters-handbook/special/#using-cmake-example2)。  |
| `CMAKE_OFF`         | 对于 `CMAKE_OFF` 中的每个条目，都会将禁用的布尔值添加到 `CMAKE_ARGS` 中。请参见 [`CMAKE_ON` 和 `CMAKE_OFF`](https://docs.freebsd.org/en/books/porters-handbook/special/#using-cmake-example2)。 |
| `CMAKE_BUILD_TYPE`  | 构建类型（CMake 预定义的构建配置）。默认值为 `Release`，如果设置了 `WITH_DEBUG`，则为 `Debug`。                                                                                                  |
| `CMAKE_SOURCE_PATH` | 源目录的路径。默认值为 `${WRKSRC}`。                                                                                                                                            |
| `CONFIGURE_ENV`     | 为 `cmake` 二进制文件设置的额外环境变量。                                                                                                                                           |

**表 3. 用户可以为 `cmake` 构建定义的变量**

| 变量              | 说明                                                 |
| --------------- | -------------------------------------------------- |
| `CMAKE_NOCOLOR` | 禁用彩色构建输出。默认未设置，除非设置了 `BATCH` 或 `PACKAGE_BUILDING`。 |

CMake 支持以下构建配置：`Debug`、`Release`、`RelWithDebInfo` 和 `MinSizeRel`。`Debug` 和 `Release` 配置会遵循系统 `*FLAGS`，`RelWithDebInfo` 和 `MinSizeRel` 会分别将 `CFLAGS` 设置为 `-O2 -g` 和 `-Os -DNDEBUG`。`CMAKE_BUILD_TYPE` 的小写值会导出到 `PLIST_SUB`，并且如果 Port 安装 **\*.cmake** 依赖于构建类型（参见 [devel/kf5-kcrash](https://cgit.freebsd.org/ports/tree/devel/kf5-kcrash/) 示例），必须使用该值。请注意，一些项目可能会定义自己的构建配置和/或通过在 **CMakeLists.txt** 中设置 `CMAKE_BUILD_TYPE` 强制特定的构建类型。为了让这样的项目的 Port 尊重 `CFLAGS` 和 `WITH_DEBUG`，必须删除这些文件中的 `CMAKE_BUILD_TYPE` 定义。

大多数基于 CMake 的项目支持源外构建方法。Port 的源外构建是默认设置。可以通过使用 `:insource` 后缀请求源内构建。在源外构建中，`CONFIGURE_WRKSRC`、`BUILD_WRKSRC` 和 `INSTALL_WRKSRC` 会被设置为 `${WRKDIR}/.build`，并且该目录将用于存放在配置和构建阶段生成的所有文件，保持源代码目录完好。

**示例 2. `USES= cmake` 示例**

该片段演示了如何在 Port 中使用 CMake。通常不需要设置 `CMAKE_SOURCE_PATH`，但当源代码不在顶层目录中，或者 Port 只打算构建项目的一部分时，可以设置该值。

```makefile
USES=			cmake
CMAKE_SOURCE_PATH=	${WRKSRC}/subproject
```

**示例 3. `CMAKE_ON` 和 `CMAKE_OFF`**

当向 `CMAKE_ARGS` 添加布尔值时，使用 `CMAKE_ON` 和 `CMAKE_OFF` 变量更为简便。例如：

```makefile
CMAKE_ON=	VAR1 VAR2
CMAKE_OFF=	VAR3
```

等同于：

```makefile
CMAKE_ARGS=	-DVAR1:BOOL=TRUE -DVAR2:BOOL=TRUE -DVAR3:BOOL=FALSE
```

> **重要**
>
> 这仅适用于 `CMAKE_ARGS` 的默认值。 [`OPT_CMAKE_BOOL` 和 `OPT_CMAKE_BOOL_OFF`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options-cmake_bool) 中说明的辅助工具使用相同的语义，但适用于可选值。

### 6.6.5. 使用 `scons`

如果 Port 使用 SCons，请定义 `USES=scons`。

为了让第三方 **SConstruct** 尊重传递给 SCons 的所有环境变量（即最重要的 `CC/CXX/CFLAGS/CXXFLAGS`），请修改 **SConstruct**，使得构建 `Environment` 如下构建：

```
env = Environment(**ARGUMENTS)
```

之后，可以使用 `env.Append` 和 `env.Replace` 进行修改。

### 6.6.6. 使用 `cargo` 构建 Rust 应用程序

对于使用 Cargo 的 Port，定义 `USES=cargo`。

**表 4. 用户可以为 `cargo` 构建定义的变量**

| 变量                   | 默认值                      | 说明                                                                                                                                                                                                                                                                                      |
| -------------------- | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CARGO_CRATES`       |                          | Port 依赖的 crate 列表。每个条目需要具有 `cratename-semver` 的格式，例如 `libc-0.2.40`。Port 维护者可以通过 `make cargo-crates` 从 **Cargo.lock** 生成此列表。手动更新 crate 版本是可能的，但要注意传递依赖。如果 `make cargo-crates` 生成的列表很大，建议将其放在顶层 Port 目录中的 `Makefile.crates` 文件中。如果存在，该文件会自动被 Ports 框架引入。这有助于保持主 Port **Makefile** 的可管理大小。 |
| `CARGO_FEATURES`     |                          | 要构建的应用程序功能列表（以空格分隔）。要停用所有默认功能，请将特殊标记 `--no-default-features` 添加到 `CARGO_FEATURES`。不需要手动将其传递给 `CARGO_BUILD_ARGS`、`CARGO_INSTALL_ARGS` 和 `CARGO_TEST_ARGS`。                                                                                                                               |
| `CARGO_CARGOTOML`    | `${WRKSRC}/Cargo.toml`   | 使用的 **Cargo.toml** 的路径。                                                                                                                                                                                                                                                                 |
| `CARGO_CARGOLOCK`    | `${WRKSRC}/Cargo.lock`   | 用于 `make cargo-crates` 的 **Cargo.lock** 的路径。必要时，可以指定多个锁定文件。                                                                                                                                                                                                                             |
| `CARGO_ENV`          |                          | 要传递给 Cargo 的环境变量列表，类似于 `MAKE_ENV`。                                                                                                                                                                                                                                                      |
| `RUSTFLAGS`          |                          | 传递给 Rust 编译器的标志。                                                                                                                                                                                                                                                                        |
| `CARGO_CONFIGURE`    | `yes`                    | 使用默认的 `do-configure`。                                                                                                                                                                                                                                                                   |
| `CARGO_UPDATE_ARGS`  |                          | 在配置阶段传递给 Cargo 的额外参数。有效的参数可以通过 `cargo update --help` 查找。                                                                                                                                                                                                                                |
| `CARGO_BUILDDEP`     | `yes`                    | 添加对 [lang/rust](https://cgit.freebsd.org/ports/tree/lang/rust/) 的构建依赖。                                                                                                                                                                                                                  |
| `CARGO_CARGO_BIN`    | `${LOCALBASE}/bin/cargo` | `cargo` 二进制文件的位置。                                                                                                                                                                                                                                                                       |
| `CARGO_BUILD`        | `yes`                    | 使用默认的 `do-build`。                                                                                                                                                                                                                                                                       |
| `CARGO_BUILD_ARGS`   |                          | 在构建阶段传递给 Cargo 的额外参数。有效的参数可以通过 `cargo build --help` 查找。                                                                                                                                                                                                                                 |
| `CARGO_INSTALL`      | `yes`                    | 使用默认的 `do-install`。                                                                                                                                                                                                                                                                     |
| `CARGO_INSTALL_ARGS` |                          | 在安装阶段传递给 Cargo 的额外参数。有效的参数可以通过 `cargo install --help` 查找。                                                                                                                                                                                                                               |
| `CARGO_INSTALL_PATH` | `.`                      | 要安装的 crate 的路径。这通过 `--path` 参数传递给 `cargo install`。当指定多个路径时，会多次运行 `cargo install`。                                                                                                                                                                                                       |
| `CARGO_TEST`         | `yes`                    | 使用默认的 `do-test`。                                                                                                                                                                                                                                                                        |
| `CARGO_TEST_ARGS`    |                          | 在测试阶段传递给 Cargo 的额外参数。有效的参数可以通过 `cargo test --help` 查找。                                                                                                                                                                                                                                  |
| `CARGO_TARGET_DIR`   | `${WRKDIR}/target`       | Cargo 输出目录的位置。                                                                                                                                                                                                                                                                          |
| `CARGO_DIST_SUBDIR`  | **rust/crates**          | 相对于 `DISTDIR` 的目录，存储 crate 分发文件。                                                                                                                                                                                                                                                        |
| `CARGO_VENDOR_DIR`   | `${WRKSRC}/cargo-crates` | 存放所有 crate 解压目录的供应商目录的位置。请尽量将其放在 `PATCH_WRKSRC` 下，以便于应用补丁。                                                                                                                                                                                                                              |
| `CARGO_USE_GITHUB`   | `no`                     | 启用通过 `GH_TUPLE` 从 GitHub 获取锁定到特定 Git 提交的 crates。这将尝试修补 `WRKDIR` 下的所有 **Cargo.toml**，以便指向离线源，而不是在构建期间从 Git 仓库获取它们。                                                                                                                                                                       |
| `CARGO_USE_GITLAB`   | `no`                     | 与 `CARGO_USE_GITHUB` 相同，但适用于 GitLab 实例和 `GL_TUPLE`。                                                                                                                                                                                                                                     |

**示例 4. 创建一个简单的 Rust 应用程序 Port**

创建一个基于 Cargo 的 Port 是一个三阶段的过程。首先，我们需要提供一个 Port 模板来获取应用程序分发文件：

```makefile
PORTNAME=	tokei
DISTVERSIONPREFIX=	v
DISTVERSION=	7.0.2
CATEGORIES=	devel

MAINTAINER=	tobik@FreeBSD.org
COMMENT=	Display statistics about your code
WWW=		https://github.com/XAMPPRocky/tokei/

USES=		cargo
USE_GITHUB=	yes
GH_ACCOUNT=	Aaronepower

.include <bsd.port.mk>
```

生成初始的 **distinfo**：

```makefile
% make makesum
=> Aaronepower-tokei-v7.0.2_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://codeload.github.com/Aaronepower/tokei/tar.gz/v7.0.2?dummy=/Aaronepower-tokei-v7.0.2_GH0.tar.gz
fetch: https://codeload.github.com/Aaronepower/tokei/tar.gz/v7.0.2?dummy=/Aaronepower-tokei-v7.0.2_GH0.tar.gz: size of remote file is not known
Aaronepower-tokei-v7.0.2_GH0.tar.gz                     45 kB  239 kBps 00m00s
```

现在，分发文件已经准备好使用，我们可以继续从捆绑的 **Cargo.lock** 中提取 crate 依赖：

```makefile
% make cargo-crates
CARGO_CRATES=   aho-corasick-0.6.4 \
                ansi_term-0.11.0 \
                arrayvec-0.4.7 \
                atty-0.2.9 \
                bitflags-1.0.1 \
                byteorder-1.2.2 \
                [...]
```

此命令的输出需要直接粘贴到 Makefile 中：

```makefile
PORTNAME=	tokei
DISTVERSIONPREFIX=	v
DISTVERSION=	7.0.2
CATEGORIES=	devel

MAINTAINER=	tobik@FreeBSD.org
COMMENT=	Display statistics about your code
WWW=		https://github.com/XAMPPRocky/tokei/

USES=		cargo
USE_GITHUB=	yes
GH_ACCOUNT=	Aaronepower

CARGO_CRATES=   aho-corasick-0.6.4 \
                ansi_term-0.11.0 \
                arrayvec-0.4.7 \
                atty-0.2.9 \
                bitflags-1.0.1 \
                byteorder-1.2.2 \
                [...]

.include <bsd.port.mk>
```

需要重新生成 **distinfo** 以包含所有的 crate 分发文件：

```sh
% make makesum
=> rust/crates/aho-corasick-0.6.4.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://crates.io/api/v1/crates/aho-corasick/0.6.4/download?dummy=/rust/crates/aho-corasick-0.6.4.tar.gz
rust/crates/aho-corasick-0.6.4.tar.gz         100% of   24 kB 6139 kBps 00m00s
=> rust/crates/ansi_term-0.11.0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://crates.io/api/v1/crates/ansi_term/0.11.0/download?dummy=/rust/crates/ansi_term-0.11.0.tar.gz
rust/crates/ansi_term-0.11.0.tar.gz           100% of   16 kB   21 MBps 00m00s
=> rust/crates/arrayvec-0.4.7.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://crates.io/api/v1/crates/arrayvec/0.4.7/download?dummy=/rust/crates/arrayvec-0.4.7.tar.gz
rust/crates/arrayvec-0.4.7.tar.gz             100% of   22 kB 3237 kBps 00m00s
=> rust/crates/atty-0.2.9.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://crates.io/api/v1/crates/atty/0.2.9/download?dummy=/rust/crates/atty-0.2.9.tar.gz
rust/crates/atty-0.2.9.tar.gz                 100% of 5898  B   81 MBps 00m00s
=> rust/crates/bitflags-1.0.1.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
[...]
```

该 Port 现在已准备好进行测试构建，并可以像正常情况一样进行进一步的调整，例如创建 plist、编写说明、添加许可信息、选项等。

如果你没有在像 poudriere 这样的干净环境中测试 Port，记得在任何测试之前运行 `make clean`。

**示例 5. 启用额外的应用程序功能**

一些应用程序在其 **Cargo.toml** 中定义了额外的功能。可以通过在 Port 中设置 `CARGO_FEATURES` 来编译它们。

在这里，我们启用 Tokei 的 `json` 和 `yaml` 功能：

```makefile
CARGO_FEATURES=	json yaml
```

**示例 6. 将应用程序功能编码为 Port 选项**

**Cargo.toml** 中的一个 `[features]` 部分可能如下所示：

```makefile
[features]
pulseaudio_backend = ["librespot-playback/pulseaudio-backend"]
portaudio_backend = ["librespot-playback/portaudio-backend"]
default = ["pulseaudio_backend"]
```

`pulseaudio_backend` 是默认功能，它总是启用的，除非我们显式地通过将 `--no-default-features` 添加到 `CARGO_FEATURES` 来关闭默认功能。这里，我们将 `portaudio_backend` 和 `pulseaudio_backend` 功能转化为 Port 选项：

```makefile
CARGO_FEATURES=	--no-default-features

OPTIONS_DEFINE=	PORTAUDIO PULSEAUDIO

PORTAUDIO_VARS=		CARGO_FEATURES+=portaudio_backend
PULSEAUDIO_VARS=	CARGO_FEATURES+=pulseaudio_backend
```

**示例 7. 列出 Crate 许可证**

每个 Crate 都有自己的许可证。在为 Port 添加 `LICENSE` 块时，了解它们非常重要（参见 [许可证](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#licenses)）。辅助目标 `cargo-crates-licenses` 将尝试列出 `CARGO_CRATES` 中定义的所有 Crate 的许可证。

```makefile
% make cargo-crates-licenses
aho-corasick-0.6.4  Unlicense/MIT
ansi_term-0.11.0    MIT
arrayvec-0.4.7      MIT/Apache-2.0
atty-0.2.9          MIT
bitflags-1.0.1      MIT/Apache-2.0
byteorder-1.2.2     Unlicense/MIT
[...]
```

> **注意**
>
> `make cargo-crates-licenses` 输出的许可证名称是 SPDX 2.1 许可证表达式，可能与 Ports 框架中定义的许可证名称不匹配。需要将它们翻译为 [预定义许可证列表](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#licenses-license-list) 中的名称。

### 6.6.7. 使用 `meson`

对于使用 Meson 的 Port，请定义 `USES=meson`。

**表 5. 使用 `meson` 的 Port 变量**

| 变量                | 说明                                    |
| ----------------- | ------------------------------------- |
| `MESON_ARGS`      | 要传递给 `meson` 二进制文件的 Port 特定 Meson 标志。 |
| `MESON_BUILD_DIR` | 相对于 `WRKSRC` 的构建目录路径。默认是 `_build`。    |

**示例 8. `USES=meson` 示例**

此代码片段演示了在 Port 中使用 Meson。

```makefile
USES=		meson
MESON_ARGS=	-Dfoo=enabled
```

### 6.6.8. 构建 Go 应用程序

对于使用 Go 的 Port，定义 `USES=go`。请参考 [`go`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-go) 获取可以设置的变量列表，以控制构建过程。

**示例 9. 创建一个基于 Go 模块的应用程序 Port**

在大多数情况下，将 `GO_MODULE` 变量设置为 `go.mod` 中 `module` 指令指定的值就足够了：

```makefile
PORTNAME=       hey
DISTVERSIONPREFIX=	v
DISTVERSION=    0.1.4
CATEGORIES=     benchmarks

MAINTAINER=     dmgk@FreeBSD.org
COMMENT=        Tiny program that sends some load to a web application
WWW=            https://github.com/rakyll/hey/

LICENSE=        APACHE20
LICENSE_FILE=   ${WRKSRC}/LICENSE

USES=           go:modules
GO_MODULE=      github.com/rakyll/hey

PLIST_FILES=    bin/hey

.include <bsd.port.mk>
```

如果“简易”方法不适用，或者需要对依赖项进行更多控制，下面描述完整的移植过程。

创建基于 Go 的 Port 是一个五阶段的过程。首先，我们需要提供一个 Port 模板来获取应用程序分发文件：

```makefile
PORTNAME=	ghq
DISTVERSIONPREFIX=	v
DISTVERSION=	0.12.5
CATEGORIES=	devel

MAINTAINER=	tobik@FreeBSD.org
COMMENT=	Remote repository management made easy
WWW=		https://github.com/x-motemen/ghq/

USES=		go:modules
USE_GITHUB=	yes
GH_ACCOUNT=	motemen

.include <bsd.port.mk>
```

生成初步的 **distinfo** 文件：

```sh
% make makesum
===>  License MIT accepted by the user
=> motemen-ghq-v0.12.5_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://codeload.github.com/motemen/ghq/tar.gz/v0.12.5?dummy=/motemen-ghq-v0.12.5_GH0.tar.gz
fetch: https://codeload.github.com/motemen/ghq/tar.gz/v0.12.5?dummy=/motemen-ghq-v0.12.5_GH0.tar.gz: size of remote file is not known
motemen-ghq-v0.12.5_GH0.tar.gz                          32 kB  177 kBps    00s
```

现在，分发文件已经准备好使用，我们可以提取所需的 Go 模块依赖项。此步骤需要安装 [ports-mgmt/modules2tuple](https://cgit.freebsd.org/ports/tree/ports-mgmt/modules2tuple/)：

```sh
% make gomod-vendor
[...]
GH_TUPLE=	\
		Songmu:gitconfig:v0.0.2:songmu_gitconfig/vendor/github.com/Songmu/gitconfig \
		daviddengcn:go-colortext:186a3d44e920:daviddengcn_go_colortext/vendor/github.com/daviddengcn/go-colortext \
		go-yaml:yaml:v2.2.2:go_yaml_yaml/vendor/gopkg.in/yaml.v2 \
		golang:net:3ec191127204:golang_net/vendor/golang.org/x/net \
		golang:sync:112230192c58:golang_sync/vendor/golang.org/x/sync \
		golang:xerrors:3ee3066db522:golang_xerrors/vendor/golang.org/x/xerrors \
		motemen:go-colorine:45d19169413a:motemen_go_colorine/vendor/github.com/motemen/go-colorine \
		urfave:cli:v1.20.0:urfave_cli/vendor/github.com/urfave/cli
```

该命令的输出需要直接粘贴到 **Makefile** 中：

```makefile
PORTNAME=	ghq
DISTVERSIONPREFIX=	v
DISTVERSION=	0.12.5
CATEGORIES=	devel

MAINTAINER=	tobik@FreeBSD.org
COMMENT=	Remote repository management made easy
WWW=		https://github.com/x-motemen/ghq/

USES=		go:modules
USE_GITHUB=	yes
GH_ACCOUNT=	motemen
GH_TUPLE=	Songmu:gitconfig:v0.0.2:songmu_gitconfig/vendor/github.com/Songmu/gitconfig \
		daviddengcn:go-colortext:186a3d44e920:daviddengcn_go_colortext/vendor/github.com/daviddengcn/go-colortext \
		go-yaml:yaml:v2.2.2:go_yaml_yaml/vendor/gopkg.in/yaml.v2 \
		golang:net:3ec191127204:golang_net/vendor/golang.org/x/net \
		golang:sync:112230192c58:golang_sync/vendor/golang.org/x/sync \
		golang:xerrors:3ee3066db522:golang_xerrors/vendor/golang.org/x/xerrors \
		motemen:go-colorine:45d19169413a:motemen_go_colorine/vendor/github.com/motemen/go-colorine \
		urfave:cli:v1.20.0:urfave_cli/vendor/github.com/urfave/cli

.include <bsd.port.mk>
```

**distinfo** 需要重新生成，以包含所有分发文件：

```sh
% make makesum
=> Songmu-gitconfig-v0.0.2_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://codeload.github.com/Songmu/gitconfig/tar.gz/v0.0.2?dummy=/Songmu-gitconfig-v0.0.2_GH0.tar.gz
fetch: https://codeload.github.com/Songmu/gitconfig/tar.gz/v0.0.2?dummy=/Songmu-gitconfig-v0.0.2_GH0.tar.gz: size of remote file is not known
Songmu-gitconfig-v0.0.2_GH0.tar.gz                    5662  B  936 kBps    00s
=> daviddengcn-go-colortext-186a3d44e920_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
=> Attempting to fetch https://codeload.github.com/daviddengcn/go-colortext/tar.gz/186a3d44e920?dummy=/daviddengcn-go-colortext-186a3d44e920_GH0.tar.gz
fetch: https://codeload.github.com/daviddengcn/go-colortext/tar.gz/186a3d44e920?dummy=/daviddengcn-go-colortext-186a3d44e920_GH0.tar.gz: size of remote file is not known
daviddengcn-go-colortext-186a3d44e920_GH0.tar.        4534  B 1098 kBps    00s
[...]
```

现在，Port 已准备好进行测试构建，并可进行进一步调整，如创建 plist、编写说明、添加许可证信息、选项等，像平常一样进行。

如果你没有在像 poudriere 这样的干净环境中测试 Port，请记得在任何测试之前运行 `make clean`。

**示例 10. 设置输出二进制名称或安装路径**

有些 Port 需要将生成的二进制文件安装到不同的名称或路径下，而不是默认的 `${PREFIX}/bin`。可以通过使用 `GO_TARGET` 元组语法来实现，例如：

```makefile
GO_TARGET=  ./cmd/ipfs:ipfs-go
```

这将把 `ipfs` 二进制文件安装为 `${PREFIX}/bin/ipfs-go`，而

```makefile
GO_TARGET=  ./dnscrypt-proxy:${PREFIX}/sbin/dnscrypt-proxy
```

将把 `dnscrypt-proxy` 安装到 `${PREFIX}/sbin`。

**示例 11. 在模块模式下覆盖 go.mod**

在获取阶段，模块感知模式（即 `USES=go:modules`）通过获取 Port 的 **go.mod** 来获取依赖包的源代码，然后立即对其运行 `go mod download`。由于获取阶段发生在补丁应用之前很久，**files/** 中的常规补丁应用得太晚，无法影响这些依赖解析和获取步骤。

虽然目前无法通过修补上游 **go.mod** 来更改依赖项，但仍然可以通过将另一个 **go.mod** 列为第二个分发文件来 *覆盖* 它。

```makefile
PORTNAME=	miller
DISTVERSIONPREFIX=	v
DISTVERSION=	6.17.0
CATEGORIES=	textproc
MASTER_SITES=	https://raw.githubusercontent.com/johnkerl/${PORTNAME}/${DISTVERSIONFULL}/:gomod

DISTFILES=	go.mod:gomod
```

要同时覆盖 **go.sum**，只需将其添加到 `DISTFILES` 中：

```makefile
DISTFILES=	go.mod:gomod go.sum:gomod
```

### 6.6.9. 使用 `cabal` 构建 Haskell 应用程序

对于使用 Cabal 的 Ports，构建系统定义了 `USES=cabal`。参阅 [`cabal`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-cabal) 获取可以设置的变量列表，以控制构建过程。

**示例 12. 创建一个 Hackage 托管的 Haskell 应用程序的 Port**

在准备一个 Haskell Cabal Port 时，必须先安装 [devel/hs-cabal-install](https://cgit.freebsd.org/ports/tree/devel/hs-cabal-install/) 和 [ports-mgmt/hs-cabal2tuple](https://cgit.freebsd.org/ports/tree/ports-mgmt/hs-cabal2tuple/) 程序。首先，我们需要定义一些常见的 Port 变量，以便 cabal-install 获取包的分发文件：

```makefile
PORTNAME=	ShellCheck
DISTVERSION=	0.6.0
CATEGORIES=	devel

MAINTAINER=	haskell@FreeBSD.org
COMMENT=	Shell script analysis tool
WWW=		https://www.shellcheck.net/

USES=		cabal

.include <bsd.port.mk>
```

这个最简 **Makefile** 使用 `cabal-extract` 辅助目标来获取分发文件：

```sh
% make cabal-extract
[...]
Downloading the latest package list from hackage.haskell.org
cabal get ShellCheck-0.6.0
Downloading  ShellCheck-0.6.0
Downloaded   ShellCheck-0.6.0
Unpacking to ShellCheck-0.6.0/
```

现在，我们已经在 `${WRKSRC}` 下得到了 ShellCheck.cabal 包说明文件，可以使用 `cabal-configure` 生成构建计划：

```sh
% make cabal-configure
[...]
Resolving dependencies...
Build profile: -w ghc-8.10.7 -O1
In order, the following would be built (use -v for more details):
 - Diff-0.4.1 (lib) (requires download & build)
 - OneTuple-0.3.1 (lib) (requires download & build)
[...]
```

完成后，可以生成所需依赖关系的列表：

```sh
% make make-use-cabal
USE_CABAL=	QuickCheck-2.12.6.1 \
		hashable-1.3.0.0 \
		integer-logarithms-1.0.3 \
[...]
```

Haskell 包可能包含版本修订，就像 FreeBSD 的 Port 一样。修订仅影响 **.cabal** 文件。请注意 `_` 后面的附加版本号。将新生成的 `USE_CABAL` 列表替换旧的。

最后，需要重新生成 **distinfo** 以包含所有分发文件：

```sh
% make makesum
=> ShellCheck-0.6.0.tar.gz doesn't seem to exist in /usr/local/poudriere/ports/git/distfiles/cabal.
=> Attempting to fetch https://hackage.haskell.org/package/ShellCheck-0.6.0/ShellCheck-0.6.0.tar.gz
ShellCheck-0.6.0.tar.gz                                136 kB  642 kBps    00s
=> QuickCheck-2.12.6.1/QuickCheck-2.12.6.1.tar.gz doesn't seem to exist in /usr/local/poudriere/ports/git/distfiles/cabal.
=> Attempting to fetch https://hackage.haskell.org/package/QuickCheck-2.12.6.1/QuickCheck-2.12.6.1.tar.gz
QuickCheck-2.12.6.1/QuickCheck-2.12.6.1.tar.gz          65 kB  361 kBps    00s
[...]
```

现在，Port 已准备好进行测试构建，并可像平常一样进行进一步调整，如创建 plist、编写说明、添加许可证信息、选项等。

如果你没有在像 poudriere 这样的干净环境中测试 Port，请记得在任何测试前运行 `make clean`。

某些 Haskell Port 会将各种数据文件安装到 `share/${PORTNAME}` 下。对于此类情况，Port 侧需要进行特殊处理。Port 应定义 `CABAL_WRAPPER_SCRIPTS` 变量，列出将使用数据文件的每个可执行文件。此外，在少数情况下，被移植的程序使用其他 Haskell 包的数据文件，此时 `FOO_DATADIR_VARS` 变量会派上用场。

**示例 13. 处理 Haskell Port 中的数据文件**

`devel/hs-profiteur` 是一个 Haskell 应用程序，它生成一个包含内容的单页 HTML。

```makefile
PORTNAME=	profiteur

[...]

USES=		cabal

USE_CABAL=	OneTuple-0.3.1_2 \
		QuickCheck-2.14.2 \
		[...]

.include <bsd.port.mk>
```

它将 HTML 模板安装到 `share/profiteur` 下，因此我们需要添加 `CABAL_WRAPPER_SCRIPTS` 选项：

```makefile
[...]

USE_CABAL=	OneTuple-0.3.1_2 \
		QuickCheck-2.14.2 \
		[...]


CABAL_WRAPPER_SCRIPTS=		${CABAL_EXECUTABLES}

.include <bsd.port.mk>
```

该程序还尝试访问 `jquery.js` 文件，这是 Haskell 包 `js-jquery-3.3.1` 的一部分。为了能够找到该文件，我们需要使包装脚本也在 `share/profiteur` 中查找 `js-jquery` 数据文件。我们使用 `profiteur_DATADIR_VARS` 来实现这一点：

```makefile
[...]

CABAL_WRAPPER_SCRIPTS=		${CABAL_EXECUTABLES}
profiteur_DATADIR_VARS=		js-jquery

.include <bsd.port.mk>
```

现在，该 Port 将把实际的二进制文件安装到 `libexec/cabal/profiteur`，并将脚本安装到 `bin/profiteur`。

除了运行程序并检查一切是否正常工作外，没有简单的方法来确定 `FOO_DATADIR_VARS` 选项的正确值。幸运的是，使用 `FOO_DATADIR_VARS` 的情况非常少见。

另一个在移植复杂的 Haskell 程序时可能遇到的特殊情况是 `cabal.project` 文件中存在 VCS 依赖项。

**示例 14. 移植具有 VCS 依赖项的 Haskell 应用程序**

`net-p2p/cardano-node` 是一个非常复杂的软件。在它的 `cabal.project` 中，有很多类似这样的块：

```ini
[...]
source-repository-package
  type: git
  location: https://github.com/input-output-hk/cardano-crypto
  tag: f73079303f663e028288f9f4a9e08bcca39a923e
[...]
```

`source-repository-package` 类型的依赖项会在构建过程中自动由 `cabal` 拉取。不幸的是，这使得在 `fetch` 阶段之后需要使用网络。这是 Ports 框架不允许的。因此，这些源需要在 Port 的 **Makefile** 中列出。`make-use-cabal` 辅助目标可以使 GitHub 上托管的包更容易处理。在常规的 `cabal-extract` 和 `cabal-configure` 后运行这个目标，不仅会生成 `USE_CABAL` 选项，还会生成 `GH_TUPLE`：

```sh
% make make-use-cabal
USE_CABAL=	Diff-0.4.1 \
		Glob-0.10.2_3 \
		HUnit-1.6.2.0 \
		[...]

GH_TUPLE=		input-output-hk:cardano-base:0f3a867493059e650cda69e20a5cbf1ace289a57:cardano_base/dist-newstyle/src/cardano-b_-c8db9876882556ed \
		input-output-hk:cardano-crypto:f73079303f663e028288f9f4a9e08bcca39a923e:cardano_crypto/dist-newstyle/src/cardano-c_-253fd88117badd8f \
		[...]
```

将 `make-use-cabal` 生成的 `GH_TUPLE` 条目与其他条目分开可能会更有用，这样可以方便地更新 Port：

```
GH_TUPLE=	input-output-hk:cardano-base:0f3a867493059e650cda69e20a5cbf1ace289a57:cardano_base/dist-newstyle/src/cardano-b_-c8db9876882556ed \
		input-output-hk:cardano-crypto:f73079303f663e028288f9f4a9e08bcca39a923e:cardano_crypto/dist-newstyle/src/cardano-c_-253fd88117badd8f \
		[...]

GH_TUPLE+=	bitcoin-core:secp256k1:ac83be33d0956faf6b7f61a60ab524ef7d6a473a:secp
```

对于具有 VCS 依赖项的 Haskell Port，目前还需要以下变通方法：

```ini
BINARY_ALIAS=	git=true
```

## 6.7. 使用 GNU Autotools

如果一个 Port 需要任何 GNU Autotools 软件，添加 `USES=autoreconf`。有关更多信息，请参阅 [`autoreconf`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-autoreconf)。

## 6.8. 使用 GNU `gettext`

### 6.8.1. 基本用法

如果 Port 需要 `gettext`，请设置 `USES=gettext`，该 Port 将继承来自 [devel/gettext](https://cgit.freebsd.org/ports/tree/devel/gettext/) 的 **libintl.so** 依赖项。有关 `gettext` 用法的其他值，请参阅 [`USES=gettext`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-gettext)。

一个比较常见的情况是 Port 使用 `gettext` 和 `configure`。通常，GNU `configure` 应该能够自动定位 `gettext`。

```makefile
USES=	gettext
GNU_CONFIGURE=	yes
```

如果自动定位失败，可以通过 `CPPFLAGS` 和 `LDFLAGS` 传递 `gettext` 的位置，使用 `localbase` 如下：

```makefile
USES=	gettext localbase:ldflags
GNU_CONFIGURE=	yes
```

### 6.8.2. 可选用法

一些软件产品允许禁用 NLS。例如，通过向 `configure` 传递 `--disable-nls`。在这种情况下，Port 必须根据 `NLS` 选项的状态有条件地使用 `gettext`。对于低到中等复杂度的 Port，可以使用以下惯用法：

```makefile
GNU_CONFIGURE=		yes

OPTIONS_DEFINE=		NLS
OPTIONS_SUB=		yes

NLS_USES=		gettext
NLS_CONFIGURE_ENABLE=	nls

.include <bsd.port.mk>
```

或者使用较旧的选项方法：

```makefile
GNU_CONFIGURE=		yes

OPTIONS_DEFINE=		NLS

.include <bsd.port.options.mk>

.if ${PORT_OPTIONS:MNLS}
USES+=			gettext
PLIST_SUB+=		NLS=""
.else
CONFIGURE_ARGS+=	--disable-nls
PLIST_SUB+=		NLS="@comment "
.endif

.include <bsd.port.mk>
```

接下来需要做的工作是安排使消息目录文件条件地包含在打包列表中。**Makefile** 部分的这个任务已经由惯用法提供。它在 [高级 **pkg-plist** 实践](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-sub) 部分中进行了说明。简而言之，**pkg-plist** 中每个出现的 `%%NLS%%` 将在 NLS 被禁用时替换为 "`@comment`"，或者在 NLS 启用时替换为空字符串。因此，如果 NLS 关闭，以 `%%NLS%%` 为前缀的行将在最终的打包列表中变成注释；否则，前缀将直接被省略。然后，在 **pkg-plist** 中每个消息目录文件路径之前插入 `%%NLS%%`。例如：

```sh
%%NLS%%share/locale/fr/LC_MESSAGES/foobar.mo
%%NLS%%share/locale/no/LC_MESSAGES/foobar.mo
```

在高复杂度的情况下，可能需要更高级的技术，例如 [动态打包列表生成](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-dynamic)。

### 6.8.3. 处理消息目录所在目录

有一点需要注意的是，安装消息目录文件时，目标目录必须位于 **LOCALBASE/share/locale** 下，并且这些目录不应由 Port 创建或删除。最常见的语言有各自的目录列在 **PORTSDIR/Templates/BSD.local.dist** 中。许多其他语言的目录由 [devel/gettext](https://cgit.freebsd.org/ports/tree/devel/gettext/) Port 管理。请查阅其 **pkg-plist** 并查看该 Port 是否会为独特的语言安装消息目录文件。

## 6.9. 使用 Perl

如果 `MASTER_SITES` 设置为 `CPAN`，通常会自动选择正确的子目录。如果默认子目录错误，可以使用 `CPAN/Module` 来更改它。`MASTER_SITES` 也可以设置为旧的 `MASTER_SITE_PERL_CPAN`，然后 `MASTER_SITE_SUBDIR` 的首选值是顶级层次名称。例如，推荐的 `p5-Module-Name` 的值是 `Module`。可以在 [cpan.org](https://cpan.org/modules/by-module/) 上查看顶级层次结构。这会在模块的作者更改时保持 Port 的正常工作。

这个规则的例外情况是相关目录不存在，或者该目录中没有 distfile。在这种情况下，允许使用作者的 ID 作为 `MASTER_SITE_SUBDIR`。可以使用 `CPAN:AUTHOR` 宏，它将转换为哈希作者目录。例如，`CPAN:AUTHOR` 将转换为 `authors/id/A/AU/AUTHOR`。

当 Port 需要 Perl 支持时，必须设置 `USES=perl5`，并根据 [perl5 USES 说明](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-perl5) 使用可选的 `USE_PERL5`。

**表 6. 使用 Perl 的 Port 只读变量**

| 只读变量           | 说明                                                                                                                                                                                 |
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `PERL`         | Perl 5 解释器的完整路径，无论是系统自带的还是从 Port 安装的，但不带版本号。当软件需要 Perl 解释器的路径时使用此变量。要替换脚本中的 "`#!`" 行，请使用 [`shebangfix`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-shebangfix)。 |
| `PERL_VERSION` | 安装的 Perl 的完整版本（例如，`5.8.9`）。                                                                                                                                                        |
| `PERL_LEVEL`   | 安装的 Perl 版本，形式为 `MNNNPP` 的整数（例如，`500809`）。                                                                                                                                         |
| `PERL_ARCH`    | Perl 存储架构相关库的位置。默认为 `${ARCH}-freebsd`。                                                                                                                                             |
| `PERL_PORT`    | 已安装的 Perl Port 的名称（例如，`perl5`）。                                                                                                                                                    |
| `SITE_PERL`    | 存放特定于站点的 Perl 包的目录名称。此值会被添加到 `PLIST_SUB` 中。                                                                                                                                        |

> **注意**
>
> 没有官方网站的 Perl 模块 Port 必须在 **Makefile** 的 WWW 行中链接到 `cpan.org`。推荐的 URL 形式是 `https://search.cpan.org/dist/Module-Name/`（包括尾部斜杠）。

> **注意**
>
> 不要在依赖声明中使用 `${SITE_PERL}`。这样做假设已经包含了 **perl5.mk**，但并非总是如此。如果 Port 的文件在升级过程中被移动，依赖于该 Port 的其他 Port 可能会有错误的依赖关系。正确声明 Perl 模块依赖关系的方法如下所示。

**示例 15. Perl 依赖示例**

```sh
p5-IO-Tee>=0.64:devel/p5-IO-Tee
```

对于安装手册页的 Perl Port，可以在 **pkg-plist** 中使用宏 `PERL5_MAN3` 和 `PERL5_MAN1`。例如，

```sh
lib/perl5/5.14/man/man1/event.1.gz
lib/perl5/5.14/man/man3/AnyEvent::I3.3.gz
```

可以替换为

```sh
%%PERL5_MAN1%%/event.1.gz
%%PERL5_MAN3%%/AnyEvent::I3.3.gz
```

> **注意**
>
> 对于其他部分（`2` 和 `4` 到 `9`）没有 `PERL5_MAN_x_` 宏，因为这些文件会安装到常规目录中。

**示例 16. 仅在构建时需要 Perl 的 Port**

由于默认的 USE\_PERL5 值为 `build` 和 `run`，应设置为：

```makefile
USES=		perl5
USE_PERL5=	build
```

**示例 17. 还需要 Perl 进行补丁处理的 Port**

有时，使用 [sed(1)](https://man.freebsd.org/cgi/man.cgi?query=sed\&sektion=1\&format=html) 进行补丁处理不足以满足要求。当使用 [perl(1)](https://man.freebsd.org/cgi/man.cgi?query=perl\&sektion=1\&format=html) 更加简便时，使用：

```makefile
USES=		perl5
USE_PERL5=	patch build run
```

**示例 18. 需要 `ExtUtils::MakeMaker` 来构建的 Perl 模块**

大多数 Perl 模块带有 **Makefile.PL** 配置脚本。在这种情况下，设置：

```makefile
USES=		perl5
USE_PERL5=	configure
```

**示例 19. 需要 `Module::Build` 来构建的 Perl 模块**

当 Perl 模块带有 **Build.PL** 配置脚本时，它可能需要 `Module::Build`，此时设置：

```makefile
USES=		perl5
USE_PERL5=	modbuild
```

如果它需要的是 `Module::Build::Tiny`，设置：

```makefile
USES=		perl5
USE_PERL5=	modbuildtiny
```

## 6.10. 使用 X11

### 6.10.1. X.Org 组件

在 Ports 中提供的 X11 实现是 X.Org。如果应用程序依赖于 X 组件，添加 `USES= xorg` 并设置 `USE_XORG` 为所需的组件列表。完整的组件列表可以在 [`xorg`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-xorg) 中找到。

Mesa 项目旨在提供免费的 OpenGL 实现。要指定对该项目的不同组件的依赖，使用 `USES= gl` 和 `USE_GL`。有关可用组件的完整列表，请参见 [`gl`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-gl)。为了向后兼容性，`yes` 的值会映射为 `glu`。

**示例 20. `USE_XORG` 示例**

```makefile
USES=		gl xorg
USE_GL=		glu
USE_XORG=	xrender xft xkbfile xt xaw
```

| 变量            | 说明                                            |
| ------------- | --------------------------------------------- |
| `USES= imake` | 该 Port 使用 `imake`。                            |
| `XMKMF`       | 如果 `xmkmf` 不在 `PATH` 中，设置为其路径。默认为 `xmkmf -a`。 |

**示例 21. 使用 X11 相关变量**

```makefile
# 使用一些 X11 库
USES=		xorg
USE_XORG=	x11 xpm
```

### 6.10.2. 需要 Motif 的 Port

如果 Port 需要 Motif 库，在 **Makefile** 中定义 `USES= motif`。默认的 Motif 实现是 [x11-toolkits/open-motif](https://cgit.freebsd.org/ports/tree/x11-toolkits/open-motif/)。用户可以通过在 **make.conf** 中设置 `WANT_LESSTIF` 来选择 [x11-toolkits/lesstif](https://cgit.freebsd.org/ports/tree/x11-toolkits/lesstif/) 作为替代实现。同样，用户也可以通过设置 `WANT_OPEN_MOTIF_DEVEL` 来选择 [x11-toolkits/open-motif-devel](https://cgit.freebsd.org/ports/tree/x11-toolkits/open-motif-devel/)。

`MOTIFLIB` 将由 **motif.mk** 设置，指向合适的 Motif 库。请修改 Port 的源代码，以便在原始 **Makefile** 或 **Imakefile** 中引用 Motif 库的位置时使用 `${MOTIFLIB}`。

有两种常见情况：

* 如果 Port 在其 **Makefile** 或 **Imakefile** 中引用 Motif 库为 `-lXm`，请将其替换为 `${MOTIFLIB}`。
* 如果 Port 在其 **Imakefile** 中使用 `XmClientLibs`，请将其替换为 `${MOTIFLIB} ${XTOOLLIB} ${XLIB}`。

请注意，`MOTIFLIB`（通常）会展开为 `-L/usr/local/lib -lXm -lXp` 或 `/usr/local/lib/libXm.a`，因此无需在前面加上 `-L` 或 `-l`。

### 6.10.3. X11 字体

如果 Port 安装了 X Window System 字体，请将它们放置在 **LOCALBASE/lib/X11/fonts/local** 中。

### 6.10.4. 使用 Xvfb 获取虚拟 `DISPLAY`

某些应用程序需要一个工作的 X11 显示器来成功编译。这对于没有图形界面的机器来说是一个问题。当使用此变量时，构建基础设施将启动虚拟帧缓冲 X 服务器。然后，工作 `DISPLAY` 会传递给构建过程。有关可能的参数，请参见 [`USES=display`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-display)。

```makefile
USES=	display
```

### 6.10.5. 桌面条目

桌面条目（[Freedesktop 标准](https://standards.freedesktop.org/desktop-entry-spec/latest/)）提供了一种在安装新程序时自动调整桌面功能的方法，无需用户干预。例如，新安装的程序会自动出现在兼容的桌面环境的应用程序菜单中。桌面条目起源于 GNOME 桌面环境，但现在已经成为标准，并且可以与 KDE 和 Xfce 一起使用。这种自动化功能对用户来说是一个真正的便利，建议可以在桌面环境中使用的应用程序采用桌面条目。

#### 6.10.5.1. 使用预定义的 **.desktop** 文件

包含预定义 **\*.desktop** 文件的 Port 必须在 **pkg-plist** 中包含这些文件，并将它们安装到 **$LOCALBASE/share/applications** 目录中。[`INSTALL_DATA` 宏](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#install-macros) 可以用来安装这些文件。

#### 6.10.5.2. 更新桌面数据库

如果 Port 的 **portname.desktop** 中包含 MimeType 条目，安装和卸载后必须更新桌面数据库。为此，定义 `USES= desktop-file-utils`。

#### 6.10.5.3. 使用 `DESKTOP_ENTRIES` 创建桌面条目

可以通过使用 `DESKTOP_ENTRIES` 来轻松为应用程序创建桌面条目。一个名为 **name.desktop** 的文件将自动创建、安装，并添加到 **pkg-plist** 中。语法如下：

```makefile
DESKTOP_ENTRIES=	"NAME" "COMMENT" "ICON" "COMMAND" "CATEGORY" StartupNotify
```

可用的类别列表可以在 [Freedesktop 网站](https://standards.freedesktop.org/menu-spec/latest/apa.html) 上找到。`StartupNotify` 表示该应用程序是否支持启动通知。启动通知通常是一个图形指示器，如出现在鼠标指针、菜单或面板上的时钟，表示程序正在启动。兼容启动通知的程序在启动后会清除指示器，而不兼容的程序则永远不会清除该指示器（可能会让用户困惑和恼火），因此必须将 `StartupNotify` 设置为 `false`，以便根本不显示该指示器。

**示例：**

```makefile
DESKTOP_ENTRIES=	"ToME" "基于 JRR Tolkien 作品的 Roguelike 游戏" \
			"${DATADIR}/xtra/graf/tome-128.png" \
			"tome -v -g" "Application;Game;RolePlaying;" \
			false
```

`DESKTOP_ENTRIES` 会安装到由 `DESKTOPDIR` 变量指向的目录中。`DESKTOPDIR` 默认值为 **${PREFIX}/share/applications**

## 6.11. 使用 GNOME

### 6.11.1. 介绍

本章解释了 Port 中使用的 GNOME 框架。该框架可以大致分为基础组件、GNOME 桌面组件和一些简化 Port 维护者工作的特殊宏。

### 6.11.2. 使用 `USE_GNOME`

将此变量添加到 Port 中，允许使用在 **bsd.gnome.mk** 中定义的宏和组件。**bsd.gnome.mk** 中的代码会添加所需的构建时、运行时或库依赖项，或者处理特殊文件。在 FreeBSD 中，GNOME 应用程序使用 `USE_GNOME` 基础设施。包括所有所需的组件，作为以空格分隔的列表。`USE_GNOME` 组件分为以下几个虚拟列表：基本组件、GNOME 3 组件和遗留组件。如果 Port 只需要 GTK3 库，这是定义它的最简便方式：

```makefile
USE_GNOME=	gtk30
```

`USE_GNOME` 组件会自动添加它们所需的依赖项。有关所有 `USE_GNOME` 组件的详细列表，以及它们暗含的其他组件和依赖项，请参阅 [GNOME 组件](https://docs.freebsd.org/en/books/porters-handbook/special/#gnome-components)。

以下是一个使用了本文件中概述的许多技术的 GNOME Port 的 **Makefile** 示例。请将其作为创建新 Port 的指南。

```makefile
PORTNAME=	regexxer
DISTVERSION=	0.10
CATEGORIES=	devel textproc gnome
MASTER_SITES=	GNOME

MAINTAINER=	kwm@FreeBSD.org
COMMENT=	Interactive tool for performing search and replace operations
WWW=		http://regexxer.sourceforge.net/

USES=		gettext gmake localbase:ldflags pathfix pkgconfig tar:xz
GNU_CONFIGURE=	yes
USE_GNOME=	gnomeprefix intlhack gtksourceviewmm3

GLIB_SCHEMAS=	org.regexxer.gschema.xml

.include <bsd.port.mk>
```

> **注意**
>
> `USE_GNOME` 宏没有任何参数时不会向 Port 添加任何依赖项。`USE_GNOME` 不能在 **bsd.port.pre.mk** 之后设置。

### 6.11.3. 变量

本节解释了哪些宏是可用的，以及如何使用它们。就像在上述示例中使用的那样。更多关于 GNOME 组件的详细说明可以在 [GNOME Components](https://docs.freebsd.org/en/books/porters-handbook/special/#gnome-components) 中找到。必须设置 `USE_GNOME` 才能使这些宏生效。

`GLIB_SCHEMAS` 列出 Port 安装的所有 glib 模式文件。该宏会将文件添加到 Port 的 **pkg-plist** 中，并在安装和卸载时处理这些文件的注册。

glib 模式文件以 XML 格式编写，并以 **gschema.xml** 扩展名结尾。它们安装在 **share/glib-2.0/schemas/** 目录下。这些模式文件包含所有应用程序配置值及其默认设置。实际由应用程序使用的数据库是通过 glib-compile-schema 构建的，该工具由 `GLIB_SCHEMAS` 宏运行。

```sh
GLIB_SCHEMAS=foo.gschema.xml
```

> **注意**
>
> 不要将 glib 模式文件添加到 **pkg-plist** 中。如果它们列在 **pkg-plist** 中，则不会被注册，应用程序可能无法正常工作。

`GCONF_SCHEMAS` 列出所有 gconf 模式文件。该宏会将模式文件添加到 Port 的 **pkg-plist** 中，并在安装和卸载时处理这些文件的注册。

GConf 是几乎所有 GNOME 应用程序用于存储设置的基于 XML 的数据库。这些文件安装在 **etc/gconf/schemas** 目录下。该数据库由已安装的模式文件定义，这些文件用于生成 **%gconf.xml** 键文件。每个由 Port 安装的模式文件都必须在 **Makefile** 中有一个条目：

```sh
GCONF_SCHEMAS=my_app.schemas my_app2.schemas my_app3.schemas
```

> **注意**
>
> GConf 模式文件应该列在 `GCONF_SCHEMAS` 宏中，而不是 **pkg-plist** 中。如果它们列在 **pkg-plist** 中，则不会被注册，应用程序可能无法正常工作。

## 6.12. GNOME 组件

要获得更多有关 GNOME Port 的帮助，可以参考一些 [现有的 Port](https://ports.freebsd.org/) 示例。如果需要更多帮助，访问 [FreeBSD GNOME 页面](https://www.freebsd.org/gnome/) 查找联系信息。这些组件分为当前正在使用的 GNOME 组件和旧版组件。如果组件支持参数，它们将列在说明中的括号中。第一个参数为默认值。如果组件默认添加到构建和运行依赖项中，则会显示“同时用于构建和运行”。

| 组件                      | 相关程序                            | 说明                                                                                                                     |
| ----------------------- | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| `atk`                   | accessibility/atk               | 辅助工具包 (ATK)                                                                                                            |
| `atkmm`                 | accessibility/atkmm             | atk 的 C++ 绑定                                                                                                           |
| `cairo`                 | graphics/cairo                  | 支持跨设备输出的矢量图形库                                                                                                          |
| `cairomm`               | graphics/cairomm                | cairo 的 C++ 绑定                                                                                                         |
| `dconf`                 | devel/dconf                     | 配置数据库系统（同时用于构建和运行）                                                                                                     |
| `evolutiondataserver3`  | databases/evolution-data-server | Evolution 集成邮件/PIM 套件的数据后端                                                                                             |
| `gdkpixbuf2`            | graphics/gdk-pixbuf2            | GTK+ 图形库                                                                                                               |
| `glib20`                | devel/glib20                    | GNOME 核心库 `glib20`                                                                                                     |
| `glibmm`                | devel/glibmm                    | glib20 的 C++ 绑定                                                                                                        |
| `gnomecontrolcenter3`   | sysutils/gnome-control-center   | GNOME 3 控制中心                                                                                                           |
| `gnomedesktop3`         | x11/gnome-desktop               | GNOME 3 桌面 UI 库                                                                                                        |
| `gsound`                | audio/gsound                    | 用于播放系统声音的 GObject 库（同时用于构建和运行）                                                                                         |
| `gtk-update-icon-cache` | graphics/gtk-update-icon-cache  | 来自 Gtk+ 工具包的 Gtk-update-icon-cache 工具                                                                                  |
| `gtk20`                 | x11-toolkits/gtk20              | Gtk+ 2 工具包                                                                                                             |
| `gtk30`                 | x11-toolkits/gtk30              | Gtk+ 3 工具包                                                                                                             |
| `gtkmm20`               | x11-toolkits/gtkmm20            | gtk20 工具包的 C++ 绑定 2.0                                                                                                  |
| `gtkmm24`               | x11-toolkits/gtkmm24            | gtk20 工具包的 C++ 绑定 2.4                                                                                                  |
| `gtkmm30`               | x11-toolkits/gtkmm30            | gtk30 工具包的 C++ 绑定 3.0                                                                                                  |
| `gtksourceview2`        | x11-toolkits/gtksourceview2     | 为 GtkTextView 添加语法高亮的组件                                                                                                |
| `gtksourceview3`        | x11-toolkits/gtksourceview3     | 为 GtkTextView 组件添加语法高亮的文本组件                                                                                            |
| `gtksourceviewmm3`      | x11-toolkits/gtksourceviewmm3   | gtksourceview3 库的 C++ 绑定                                                                                               |
| `gvfs`                  | devel/gvfs                      | GNOME 虚拟文件系统                                                                                                           |
| `intltool`              | textproc/intltool               | 国际化工具（另见 intlhack）                                                                                                     |
| `introspection`         | devel/gobject-introspection     | 基本的 introspection 绑定和生成 introspection 绑定的工具。大多数时候 `:build` 足够了，`:both`/`:run` 仅在应用程序使用 introspection 绑定时需要。（同时用于构建和运行） |
| `libgda5`               | databases/libgda5               | 提供对不同数据源的统一访问                                                                                                          |
| `libgda5-ui`            | databases/libgda5-ui            | 来自 libgda5 库的 UI 库                                                                                                     |
| `libgdamm5`             | databases/libgdamm5             | libgda5 库的 C++ 绑定                                                                                                      |
| `libgsf`                | devel/libgsf                    | 处理结构化文件格式的可扩展 I/O 抽象                                                                                                   |
| `librsvg2`              | graphics/librsvg2               | 用于解析和渲染 SVG 矢量图形文件的库                                                                                                   |
| `libsigc++20`           | devel/libsigc++20               | C++ 的回调框架                                                                                                              |
| `libxml++26`            | textproc/libxml++26             | libxml2 库的 C++ 绑定                                                                                                      |
| `libxml2`               | textproc/libxml2                | XML 解析库（同时用于构建和运行）                                                                                                     |
| `libxslt`               | textproc/libxslt                | XSLT C 库（同时用于构建和运行）                                                                                                    |
| `metacity`              | x11-wm/metacity                 | GNOME 的窗口管理器                                                                                                           |
| `nautilus3`             | x11-fm/nautilus                 | GNOME 文件管理器                                                                                                            |
| `pango`                 | x11-toolkits/pango              | 用于国际化文本的布局和渲染的开源框架                                                                                                     |
| `pangomm`               | x11-toolkits/pangomm            | pango 库的 C++ 绑定                                                                                                        |
| `py3gobject3`           | devel/py3-gobject3              | Python 3，GObject 3.0 绑定                                                                                                |
| `pygobject3`            | devel/py-gobject3               | Python 2，GObject 3.0 绑定                                                                                                |
| `vte3`                  | x11-toolkits/vte3               | 带有改进的可访问性和国际化支持的终端组件                                                                                                   |

### 6.12.1. GNOME 宏组件

| 组件              | 说明                                                                |
| --------------- | ----------------------------------------------------------------- |
| `gnomeprefix`   | 为 `configure` 提供一些默认的路径。                                          |
| `intlhack`      | 与 intltool 相同，但进行了修补，以确保使用 **share/locale/**。仅在 `intltool` 不足时使用。 |
| `referencehack` | 该宏用于帮助将 API 或参考文档拆分为自己的 Port。                                     |

### 6.12.2. GNOME 旧版组件

| 组件                   | 相关程序                            | 说明                             |
| -------------------- | ------------------------------- | ------------------------------ |
| `atspi`              | accessibility/at-spi            | 辅助技术服务提供者接口                    |
| `esound`             | audio/esound                    | Enlightenment 声音包              |
| `gal2`               | x11-toolkits/gal2               | 来自 GNOME 2 gnumeric 的组件        |
| `gconf2`             | devel/gconf2                    | GNOME 2 的配置数据库系统               |
| `gconfmm26`          | devel/gconfmm26                 | gconf2 的 C++ 绑定                |
| `gdkpixbuf`          | graphics/gdk-pixbuf             | GTK+ 图形库                       |
| `glib12`             | devel/glib12                    | glib 1.2 核心库                   |
| `gnomedocutils`      | textproc/gnome-doc-utils        | GNOME 文档工具                     |
| `gnomemimedata`      | misc/gnome-mime-data            | GNOME 2 的 MIME 和应用程序数据库        |
| `gnomesharp20`       | x11-toolkits/gnome-sharp20      | GNOME 2 接口，用于 .NET 运行时         |
| `gnomespeech`        | accessibility/gnome-speech      | GNOME 2 的语音合成 API              |
| `gnomevfs2`          | devel/gnome-vfs                 | GNOME 2 虚拟文件系统                 |
| `gtk12`              | x11-toolkits/gtk12              | Gtk+ 1.2 工具包                   |
| `gtkhtml3`           | www/gtkhtml3                    | 轻量级 HTML 渲染/打印/编辑引擎            |
| `gtkhtml4`           | www/gtkhtml4                    | 轻量级 HTML 渲染/打印/编辑引擎            |
| `gtksharp20`         | x11-toolkits/gtk-sharp20        | 用于 .NET 运行时的 GTK+ 和 GNOME 2 接口 |
| `gtksourceview`      | x11-toolkits/gtksourceview      | 为 GtkTextView 添加语法高亮的组件        |
| `libartgpl2`         | graphics/libart\_lgpl           | 高性能 2D 图形库                     |
| `libbonobo`          | devel/libbonobo                 | GNOME 2 的组件和复合文档系统             |
| `libbonoboui`        | x11-toolkits/libbonoboui        | GNOME 2 libbonobo 组件的 GUI 前端   |
| `libgda4`            | databases/libgda4               | 提供对不同数据源的统一访问                  |
| `libglade2`          | devel/libglade2                 | GNOME 2 glade 库                |
| `libgnome`           | x11/libgnome                    | GNOME 2 库，GNU 桌面环境             |
| `libgnomecanvas`     | graphics/libgnomecanvas         | GNOME 2 图形库                    |
| `libgnomekbd`        | x11/libgnomekbd                 | GNOME 2 键盘共享库                  |
| `libgnomeprint`      | print/libgnomeprint             | GNOME 2 打印支持库                  |
| `libgnomeprintui`    | x11-toolkits/libgnomeprintui    | GNOME 2 打印支持库                  |
| `libgnomeui`         | x11-toolkits/libgnomeui         | GNOME 2 GUI 库，GNU 桌面环境         |
| `libgtkhtml`         | www/libgtkhtml                  | 轻量级 HTML 渲染/打印/编辑引擎            |
| `libgtksourceviewmm` | x11-toolkits/libgtksourceviewmm | GtkSourceView 的 C++ 绑定         |
| `libidl`             | devel/libIDL                    | 用于创建 CORBA IDL 文件树的库           |
| `libsigc++12`        | devel/libsigc++12               | C++ 的回调框架                      |
| `libwnck`            | x11-toolkits/libwnck            | 用于编写分页器和任务列表的库                 |
| `libwnck3`           | x11-toolkits/libwnck3           | 用于编写分页器和任务列表的库                 |
| `orbit2`             | devel/ORBit2                    | 高性能 CORBA ORB，支持 C 语言          |
| `pygnome2`           | x11-toolkits/py-gnome2          | GNOME 2 的 Python 绑定            |
| `pygobject`          | devel/py-gobject                | Python 2，GObject 2.0 绑定        |
| `pygtk2`             | x11-toolkits/py-gtk2            | GTK+ 的 Python 绑定               |
| `pygtksourceview`    | x11-toolkits/py-gtksourceview   | GtkSourceView 2 的 Python 绑定    |
| `vte`                | x11-toolkits/vte                | 带有改进的可访问性和国际化支持的终端组件           |

**表 11. 废弃组件：请勿使用**

| 组件              | 说明                                    |
| --------------- | ------------------------------------- |
| `pangox-compat` | `pangox-compat` 已被废弃，并从 pango 包中分离出来。 |

## 6.13. 使用 Qt

> **注意**
>
> 有关 Qt 本身的一些 Port，请参阅 [`qt-dist`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-qt-dist)。

### 6.13.1. 需要 Qt 的 Port

Ports 提供了对 Qt 5 和 Qt 6 的支持，分别通过 `USES+=qt:5` 和 `USES+=qt:6`。将 `USE_QT` 设置为所需的 Qt 组件（库、工具、插件）列表。

Qt 框架导出了一些可以供 Port 使用的变量，下面列出了一些：

**表 12. 使用 Qt 的 Port 提供的变量**

| 变量             | 说明                  |
| -------------- | ------------------- |
| `QMAKE`        | `qmake` 可执行文件的完整路径。 |
| `LRELEASE`     | `lrelease` 工具的完整路径。 |
| `MOC`          | `moc` 的完整路径。        |
| `RCC`          | `rcc` 的完整路径。        |
| `UIC`          | `uic` 的完整路径。        |
| `QT_INCDIR`    | Qt 的包含目录。           |
| `QT_LIBDIR`    | Qt 的库路径。            |
| `QT_PLUGINDIR` | Qt 的插件路径。           |

### 6.13.2. 组件选择

每个 Qt 工具和库的依赖必须在 `USE_QT` 中指定。每个组件可以加上 `_build` 或 `_run` 后缀，后缀表示该组件的依赖是在构建时还是运行时。如果没有后缀，表示该组件在构建时和运行时都会依赖。通常，库组件没有后缀，工具组件通常带有 `_build` 后缀，而插件组件带有 `_run` 后缀。常用的组件如下所示（所有可用组件列在 `_USE_QT_ALL` 中，该变量由 **/usr/ports/Mk/Uses/qt.mk** 中的 `_USE_QT_COMMON` 和 `_USE_QT[56]_ONLY` 生成）：

**表 13. 可用的 Qt 库组件**

| 名称                 | 说明                                      |
| ------------------ | --------------------------------------- |
| `3d`               | Qt3D 模块                                 |
| `5compat`          | Qt 5 兼容模块，用于 Qt 6                       |
| `assistant`        | Qt 5 文档浏览器                              |
| `base`             | Qt 6 基础模块                               |
| `canvas3d`         | Qt canvas3d 模块                          |
| `charts`           | Qt 5 图表模块                               |
| `concurrent`       | Qt 多线程模块                                |
| `connectivity`     | Qt 连接性（蓝牙/NFC）模块                        |
| `core`             | Qt 核心非图形模块                              |
| `datavis3d`        | Qt 5 3D 数据可视化模块                         |
| `dbus`             | Qt D-Bus 进程间通信模块                        |
| `declarative`      | Qt 声明式框架，用于动态用户界面                       |
| `designer`         | Qt 5 图形用户界面设计器                          |
| `diag`             | 用于报告 Qt 及其环境的诊断信息的工具                    |
| `doc`              | Qt 5 文档                                 |
| `examples`         | Qt 5 示例源代码                              |
| `gamepad`          | Qt 5 游戏手柄模块                             |
| `graphicaleffects` | Qt Quick 图形效果                           |
| `gui`              | Qt 图形用户界面模块                             |
| `help`             | Qt 在线帮助集成模块                             |
| `l10n`             | Qt 本地化消息                                |
| `languageserver`   | Qt 6 语言服务器协议实现                          |
| `linguist`         | Qt 5 翻译工具                               |
| `location`         | Qt 位置模块                                 |
| `lottie`           | Qt 6 QML API，用于渲染图形和动画                  |
| `multimedia`       | Qt 音频、视频、广播和相机支持模块                      |
| `network`          | Qt 网络模块                                 |
| `networkauth`      | Qt 网络认证模块                               |
| `opengl`           | Qt 5 兼容的 OpenGL 支持模块                    |
| `paths`            | QStandardPaths 的命令行客户端                  |
| `phonon4`          | KDE 多媒体框架                               |
| `pixeltool`        | Qt 5 屏幕放大镜                              |
| `plugininfo`       | Qt 5 插件元数据转储工具                          |
| `positioning`      | Qt 6 定位 API，支持卫星、WiFi 或文本文件等数据源         |
| `printsupport`     | Qt 打印支持模块                               |
| `qdbus`            | Qt D-Bus 命令行接口                          |
| `qdbusviewer`      | Qt 5 D-Bus 图形界面                         |
| `qdoc`             | Qt 文档生成器                                |
| `qdoc-data`        | QDoc 配置文件                               |
| `qev`              | Qt QWidget 事件分析工具                       |
| `qmake`            | Qt Makefile 生成工具                        |
| `quickcontrols`    | 构建完整界面的 Qt Quick 控件                     |
| `quickcontrols2`   | 构建完整界面的 Qt Quick 控件                     |
| `remoteobjects`    | Qt 5 SXCML 模块                           |
| `script`           | Qt 4 兼容的脚本模块                            |
| `scripttools`      | Qt 脚本附加组件                               |
| `scxml`            | Qt 5 SXCML 模块                           |
| `sensors`          | Qt 传感器模块                                |
| `serialbus`        | Qt 功能，用于访问工业总线系统                        |
| `serialport`       | Qt 功能，用于访问串口                            |
| `shadertools`      | Qt 6 跨平台 Qt 着色器管道工具                     |
| `speech`           | Qt 5 辅助功能模块                             |
| `sql`              | Qt SQL 数据库集成模块                          |
| `sql-ibase`        | Qt InterBase/Firebird 数据库插件             |
| `sql-mysql`        | Qt MySQL 数据库插件                          |
| `sql-odbc`         | Qt Open Database Connectivity 插件        |
| `sql-pgsql`        | Qt PostgreSQL 数据库插件                     |
| `sql-sqlite2`      | Qt SQLite 2 数据库插件                       |
| `sql-sqlite3`      | Qt SQLite 3 数据库插件                       |
| `sql-tds`          | Qt TDS 数据库连接插件                          |
| `svg`              | Qt SVG 支持模块                             |
| `testlib`          | Qt 单元测试模块                               |
| `tools`            | Qt 6 各种工具                               |
| `translations`     | Qt 6 翻译模块                               |
| `uiplugin`         | Qt Designer 的自定义 Qt 控件插件接口              |
| `uitools`          | Qt Designer UI 表单支持模块                   |
| `virtualkeyboard`  | Qt 5 虚拟键盘模块                             |
| `wayland`          | Qt 5 Wayland 包装器                        |
| `webchannel`       | Qt 5 用于将 C++/QML 与 HTML/js 客户端集成的库      |
| `webengine`        | Qt 5 用于渲染 Web 内容的库                      |
| `webkit`           | QtWebKit，具有更现代的 WebKit 代码库              |
| `websockets`       | Qt WebSocket 协议实现                       |
| `websockets-qml`   | Qt WebSocket 协议实现（QML 绑定）               |
| `webview`          | Qt 组件，用于显示 Web 内容                       |
| `widgets`          | Qt C++ 控件模块                             |
| `x11extras`        | Qt 为 X11 系统提供的特定平台功能                    |
| `xml`              | Qt SAX 和 DOM 实现                         |
| `xmlpatterns`      | Qt 对 XPath、XQuery、XSLT 和 XML Schema 的支持 |

要确定应用程序依赖的库，在成功编译后对主可执行文件运行 `ldd`。

**表 14. 可用的 Qt 工具组件**

| 名称              | 说明                              |
| --------------- | ------------------------------- |
| `buildtools`    | 构建工具（`moc`，`rcc`），几乎每个 Qt 应用都需要 |
| `linguisttools` | 本地化工具：`lrelease`，`lupdate`      |
| `qmake`         | Makefile 生成工具/构建工具              |

**表 15. 可用的 Qt 插件组件**

| 名称             | 说明                        |
| -------------- | ------------------------- |
| `imageformats` | 支持 TGA、TIFF 和 MNG 图像格式的插件 |

**示例 22. 选择 Qt 5 组件**

在这个示例中，移植的应用程序使用 Qt 5 图形用户界面库、Qt 5 核心库、所有 Qt 5 代码生成工具以及 Qt 5 的 Makefile 生成器。由于 `gui` 库已经暗示了对核心库的依赖，因此不需要单独指定 `core`。Qt 5 代码生成工具 `moc`、`uic` 和 `rcc`，以及 Makefile 生成器 `qmake` 只在构建时需要，因此它们被指定为带有 `_build` 后缀：

```makefile
USES=	qt:5
USE_QT=	gui buildtools_build qmake_build
```

### 6.13.3. 使用 `qmake`

如果应用程序提供了 qmake 项目文件（**\*.pro**），则定义 `USES= qmake` 和 `USE_QT`。`USES= qmake` 已经隐含了对 `qmake` 的构建依赖，因此可以省略 `USE_QT` 中的 qmake 组件。类似于 [CMake](https://docs.freebsd.org/en/books/porters-handbook/special/#using-cmake)，qmake 支持源代码外构建，可以通过指定 `outsource` 参数来启用（参见 [`USES= qmake` 示例](https://docs.freebsd.org/en/books/porters-handbook/special/#using-qmake-example)）。另请参见 [`USES qmake` 的可能参数](https://docs.freebsd.org/en/books/porters-handbook/special/#using-qmake-arguments)。

**表 16. `USES= qmake` 的可能参数**

| 变量             | 说明                                                                                                            |
| -------------- | ------------------------------------------------------------------------------------------------------------- |
| `no_configure` | 不添加配置目标。这由 `HAS_CONFIGURE=yes` 和 `GNU_CONFIGURE=yes` 隐含。当构建仅需要通过 `USES= qmake` 设置环境，但其他时候自行运行 `qmake` 时需要此参数。 |
| `no_env`       | 禁止修改配置和构建环境。仅当 `qmake` 用于配置软件且构建无法理解 `USES= qmake` 设置的环境时才需要。                                                 |
| `norecursive`  | 不向 `qmake` 传递 `-recursive` 参数。                                                                                |
| `outsource`    | 执行源代码外构建。                                                                                                     |

**表 17. 使用 `qmake` 的 Ports 变量**

| 变量                  | 说明                                                        |
| ------------------- | --------------------------------------------------------- |
| `QMAKE_ARGS`        | 传递给 `qmake` 二进制文件的 Port 特定 `qmake` 标志。                    |
| `QMAKE_ENV`         | 设置给 `qmake` 二进制文件的环境变量。默认值为 `${CONFIGURE_ENV}`。           |
| `QMAKE_SOURCE_PATH` | qmake 项目文件（**.pro**）的路径。如果请求源代码外构建，默认值为 `${WRKSRC}`，否则为空。 |

使用 `USES= qmake` 时，将应用以下设置：

```makefile
CONFIGURE_ARGS+=	--with-qt-includes=${QT_INCDIR} \
			--with-qt-libraries=${QT_LIBDIR} \
			--with-extra-libs=${LOCALBASE}/lib \
			--with-extra-includes=${LOCALBASE}/include

CONFIGURE_ENV+=	QTDIR="${QT_PREFIX}" QMAKE="${QMAKE}" \
		MOC="${MOC}" RCC="${RCC}" UIC="${UIC}" \
		QMAKESPEC="${QMAKESPEC}"

PLIST_SUB+=	QT_INCDIR=${QT_INCDIR_REL} \
		QT_LIBDIR=${QT_LIBDIR_REL} \
		QT_PLUGINDIR=${QT_PLUGINDIR_REL}
```

某些配置脚本不支持上述参数。要禁止修改 `CONFIGURE_ENV` 和 `CONFIGURE_ARGS`，请设置 `USES= qmake:no_env`。

**示例 23. `USES= qmake` 示例**

这个示例展示了如何在 Qt 5 Port 中使用 `qmake`：

```makefile
USES=	qmake:outsource qt:5
USE_QT=	buildtools_build
```

Qt 应用程序通常是跨平台编写的，很多时候 X11/Unix 并不是它们的开发平台，这会导致一些问题，比如：

* *缺少附加的包含路径*。许多应用程序都支持系统托盘图标，但却没有在 X11 目录中查找包含文件和/或库。为了通过命令行将目录添加到 `qmake` 的包含和库搜索路径中，可以使用：

  ```makefile
  QMAKE_ARGS+=	INCLUDEPATH+=${LOCALBASE}/include \
  		LIBS+=-L${LOCALBASE}/lib
  ```
* *错误的安装路径*。有时一些数据（如图标或 `.desktop` 文件）默认安装到 XDG 兼容应用程序不会扫描的目录中。[editors/texmaker](https://cgit.freebsd.org/ports/tree/editors/texmaker/) 就是一个例子 - 查看该 Port 中 **files** 目录下的 **patch-texmaker.pro** 文件，了解如何在 `qmake` 项目文件中直接修复此问题。

## 6.14. 使用 KDE

### 6.14.1. KDE 变量定义

如果应用程序依赖于 KDE，请设置 `USES+=kde:5` 并将 `USE_KDE` 设置为所需组件的列表。可以使用 `_build` 和 `_run` 后缀来强制指定组件的依赖类型（例如，`baseapps_run`）。如果没有设置后缀，则会使用默认的依赖类型。要强制两种类型的依赖，可以添加该组件两次（例如，`ecm_build ecm_run`）。可用的组件列出在以下位置（最新的组件也列在 **/usr/ports/Mk/Uses/kde.mk**）：

**表 18. 可用的 KDE 组件**

| 名称                            | 说明                                  |
| ----------------------------- | ----------------------------------- |
| `activities`                  | KF5 运行时和库，用于在不同活动中组织工作              |
| `activities-stats`            | KF5 活动统计                            |
| `activitymanagerd`            | 管理用户活动、跟踪使用模式的系统服务                  |
| `akonadi`                     | KDE-Pim 的存储服务器                      |
| `akonadicalendar`             | Akonadi 日历集成                        |
| `akonadiconsole`              | Akonadi 管理和调试控制台                    |
| `akonadicontacts`             | 实现 Akonadi 联系人管理的库和守护进程             |
| `akonadiimportwizard`         | 从其他邮件客户端导入数据到 KMail                 |
| `akonadimime`                 | 实现基本电子邮件处理的库和守护进程                   |
| `akonadinotes`                | 用于访问 MBox 格式的邮件存储的 KDE 库            |
| `akonadisearch`               | 实现 Akonadi 中搜索功能的库和守护进程             |
| `akregator`                   | KDE 的 Feed 阅读器                      |
| `alarmcalendar`               | KDE 用于 KAlarm 提醒的 API               |
| `apidox`                      | KF5 API 文档工具                        |
| `archive`                     | KF5 提供处理归档格式的类库                     |
| `attica`                      | KDE5 版本的开放协作服务 API 库                |
| `attica5`                     | KDE5 版本的开放协作服务 API 库                |
| `auth`                        | KF5 对系统策略和认证功能的抽象                   |
| `baloo`                       | KF5 框架，用于搜索和管理用户元数据                 |
| `baloo-widgets`               | BalooWidgets 库                      |
| `baloo5`                      | KF5 框架，用于搜索和管理用户元数据                 |
| `blog`                        | KDE API 用于博客访问                      |
| `bookmarks`                   | KF5 书签和 XBEL 格式库                    |
| `breeze`                      | Plasma5 的 Breeze 视觉样式艺术品、样式和资产      |
| `breeze-gtk`                  | Plasma5 Breeze 视觉样式的 Gtk 版          |
| `breeze-icons`                | KDE 的 Breeze 图标主题                   |
| `calendarcore`                | KDE 日历访问库                           |
| `calendarsupport`             | KDEPim 日历支持库                        |
| `calendarutils`               | KDE 用于访问日历的实用程序和用户界面功能              |
| `codecs`                      | KF5 字符串操作库                          |
| `completion`                  | KF5 文本自动完成帮助程序和小部件                  |
| `config`                      | KF5 配置对话框小部件                        |
| `configwidgets`               | KF5 配置对话框小部件                        |
| `contacts`                    | KDE API 管理联系人信息                     |
| `coreaddons`                  | KF5 对 QtCore 的附加功能                  |
| `crash`                       | KF5 库，用于处理应用程序崩溃分析和错误报告             |
| `dbusaddons`                  | KF5 对 QtDBus 的附加功能                  |
| `decoration`                  | Plasma5 用于创建窗口装饰的库                  |
| `designerplugin`              | KF5 在 Qt Designer/Creator 中集成框架小部件  |
| `discover`                    | Plasma5 包管理工具                       |
| `dnssd`                       | KF5 对系统 DNSSD 功能的抽象                 |
| `doctools`                    | KF5 从 docbook 生成文档的工具               |
| `drkonqi`                     | Plasma5 崩溃处理程序                      |
| `ecm`                         | CMake 的额外模块和脚本                      |
| `emoticons`                   | KF5 库，用于转换表情符号                      |
| `eventviews`                  | KDEPim 事件视图库                        |
| `filemetadata`                | KF5 库，用于提取文件元数据                     |
| `frameworkintegration`        | KF5 工作区和跨框架集成插件                     |
| `gapi`                        | 基于 KDE 的库，用于访问谷歌服务                  |
| `globalaccel`                 | KF5 库，用于添加对全局工作区快捷键的支持              |
| `grantlee-editor`             | Grantlee 主题的编辑器                     |
| `grantleetheme`               | KDE PIM Grantlee 主题                 |
| `gravatar`                    | Gravatar 支持库                        |
| `guiaddons`                   | KF5 对 QtGui 的附加功能                   |
| `holidays`                    | KDE 日历假期库                           |
| `hotkeys`                     | Plasma5 热键库                         |
| `i18n`                        | KF5 高级国际化框架                         |
| `iconthemes`                  | KF5 库，用于处理应用程序中的图标                  |
| `identitymanagement`          | KDE PIM 身份管理                        |
| `idletime`                    | KF5 库，用于监控用户活动                      |
| `imap`                        | KDE API 用于 IMAP 支持                  |
| `incidenceeditor`             | KDEPim 事件编辑器库                       |
| `infocenter`                  | Plasma5 提供系统信息的实用工具                 |
| `init`                        | KF5 进程启动器，用于加速 KDE 应用程序启动           |
| `itemmodels`                  | KF5 用于 Qt 模型/视图系统的模型                |
| `itemviews`                   | KF5 用于 Qt 模型/视图的小部件附加功能             |
| `jobwidgets`                  | KF5 小部件，用于跟踪 KJob 实例                |
| `js`                          | KF5 提供 ECMAScript 解释器的库             |
| `jsembed`                     | KF5 库，用于将 JavaScript 对象绑定到 QObjects |
| `kaddressbook`                | KDE 联系人管理器                          |
| `kalarm`                      | 个人提醒调度程序                            |
| `kalarm`                      | 个人提醒调度程序                            |
| `kate`                        | KDE 系统的基本编辑器框架                      |
| `kcmutils`                    | KF5 用于处理 KCModules 的实用程序            |
| `kde-cli-tools`               | Plasma5 非交互式系统工具                    |
| `kde-gtk-config`              | Plasma5 GTK2 和 GTK3 配置器             |
| `kdeclarative`                | KF5 提供 QML 和 KDE 框架集成的库             |
| `kded`                        | KF5 可扩展的守护进程，用于提供系统级服务              |
| `kdelibs4support`             | KF5 用于从 KDELibs4 迁移的支持              |
| `kdepim-addons`               | KDE PIM 附加功能                        |
| `kdepim-apps-libs`            | KDE PIM 邮件相关库                       |
| `kdepim-runtime5`             | KDE PIM 工具和服务                       |
| `kdeplasma-addons`            | Plasma5 改善 Plasma 体验的附加功能           |
| `kdesu`                       | KF5 与 `su` 集成，以获取提升的权限              |
| `kdewebkit`                   | KF5 提供 QtWebKit 集成的库                |
| `kgamma5`                     | Plasma5 显示器的伽玛设置                    |
| `khtml`                       | KF5 KTHML 渲染引擎                      |
| `kimageformats`               | KF5 库，用于支持额外的图像格式                   |
| `kio`                         | KF5 资源和网络访问抽象                       |
| `kirigami2`                   | 基于 QtQuick 的组件集                     |
| `kitinerary`                  | 用于旅行预订信息的数据模型和提取系统                  |
| `kmail`                       | KDE 邮件客户端                           |
| `kmail`                       | KDE 邮件客户端                           |
| `kmail-account-wizard`        | KDE 邮件帐户向导                          |
| `kmenuedit`                   | Plasma5 菜单编辑器                       |
| `knotes`                      | 弹出便签                                |
| `kontact`                     | KDE 个人信息管理器                         |
| `kontact`                     | KDE 个人信息管理器                         |
| `kontactinterface`            | 将 KParts 嵌入到 Kontact 中的 KDE 粘合剂     |
| `korganizer`                  | 日历和调度程序                             |
| `kpimdav`                     | 实现 DAV 协议的 KJobs                    |
| `kpkpass`                     | 处理 Apple Wallet pass 文件的库           |
| `kross`                       | KF5 多语言应用程序脚本                       |
| `kscreen`                     | Plasma5 屏幕管理库                       |
| `kscreenlocker`               | Plasma5 安全锁屏架构                      |
| `ksmtp`                       | 基于作业的库，用于通过 SMTP 服务器发送邮件            |
| `ksshaskpass`                 | Plasma5 ssh-add 前端                  |
| `ksysguard`                   | Plasma5 用于跟踪和控制正在运行进程的实用工具          |
| `kwallet-pam`                 | Plasma5 KWallet PAM 集成              |
| `kwayland-integration`        | 用于基于 Wayland 桌面的集成插件                |
| `kwin`                        | Plasma5 窗口管理器                       |
| `kwrited`                     | Plasma5 守护进程，用于监听墙和写消息              |
| `ldap`                        | KDE LDAP 访问 API                     |
| `libkcddb`                    | KDE CDDB 库                          |
| `libkcompactdisc`             | 用于与音频 CD 接口的 KDE 库                  |
| `libkdcraw`                   | 用于 KDE 的 LibRaw 接口                  |
| `libkdegames`                 | KDE 游戏使用的库                          |
| `libkdepim`                   | KDE PIM 库                           |
| `libkeduvocdocument`          | 读取和写入词汇文件的库                         |
| `libkexiv2`                   | 用于 KDE 的 Exiv2 库接口                  |
| `libkipi`                     | KDE 图像插件接口                          |
| `libkleo`                     | KDE 证书管理器                           |
| `libksane`                    | KDE 用于 SANE 库的接口                    |
| `libkscreen`                  | Plasma5 屏幕管理库                       |
| `libksieve`                   | KDEPim 的 Sieve 库                    |
| `libksysguard`                | Plasma5 库，用于跟踪和控制正在运行的进程            |
| `mailcommon`                  | KDEPim 的通用库                         |
| `mailimporter`                | 将 mbox 文件导入到 KMail                  |
| `mailtransport`               | 用于管理邮件传输的 KDE 库                     |
| `marble`                      | KDE 的虚拟地球和世界地图                      |
| `mbox`                        | 用于访问 MBox 格式邮件存储的 KDE 库             |
| `mbox-importer`               | 将 mbox 文件导入到 KMail                  |
| `mediaplayer`                 | KF5 媒体播放器功能的插件接口                    |
| `messagelib`                  | 处理消息的库                              |
| `milou`                       | Plasma5 用于搜索的 Plasmoid              |
| `mime`                        | 处理 MIME 数据的库                        |
| `newstuff`                    | KF5 库，用于从网络下载应用程序资产                 |
| `notifications`               | KF5 系统通知的抽象                         |
| `notifyconfig`                | 用于 KNotify 的 KF5 配置系统               |
| `okular`                      | KDE 通用文档查看器                         |
| `oxygen`                      | Plasma5 Oxygen 样式                   |
| `oxygen-icons5`               | KDE 的 Oxygen 图标主题                   |
| `package`                     | 用于加载和安装包的 KF5 库                     |
| `parts`                       | KF5 面向文档的插件系统                       |
| `people`                      | 提供访问联系人功能的 KF5 库                    |
| `pim-data-exporter`           | 导入和导出 KDE PIM 设置                    |
| `pimcommon`                   | KDEPim 的通用库                         |
| `pimtextedit`                 | 用于 PIM 特定文本编辑的 KDE 库                |
| `plasma-browser-integration`  | Plasma5 组件，用于将浏览器集成到桌面              |
| `plasma-desktop`              | Plasma5 Plasma 桌面                   |
| `plasma-framework`            | 用于编写用户界面的 KF5 插件基础 UI 运行时           |
| `plasma-integration`          | 为 Plasma 工作区提供 Qt 平台主题集成插件          |
| `plasma-pa`                   | Plasma5 的 PulseAudio 混音器            |
| `plasma-sdk`                  | 用于 Plasma 开发的 Plasma5 应用程序          |
| `plasma-workspace`            | Plasma5 Plasma 工作空间                 |
| `plasma-workspace-wallpapers` | Plasma5 壁纸                          |
| `plotting`                    | KF5 轻量级绘图框架                         |
| `polkit-kde-agent-1`          | 提供 Polkit 认证 UI 的 Plasma5 守护进程      |
| `powerdevil`                  | Plasma5 用于管理电源消耗设置的工具               |
| `prison`                      | 用于生成条形码的 API                        |
| `pty`                         | KF5 pty 抽象                          |
| `purpose`                     | 提供特定目的的可用操作                         |
| `qqc2-desktop-style`          | 用于 KDE 的 Qt QuickControl2 样式        |
| `runner`                      | KF5 并行化查询系统                         |
| `service`                     | KF5 高级插件和服务内省                       |
| `solid`                       | KF5 硬件集成和检测                         |
| `sonnet`                      | 基于插件的 KF5 拼写检查库                     |
| `syndication`                 | KDE RSS 源处理库                        |
| `syntaxhighlighting`          | KF5 结构化文本和代码的语法高亮引擎                 |
| `systemsettings`              | Plasma5 系统设置                        |
| `texteditor`                  | 可嵌入的 KF5 高级文本编辑器                    |
| `textwidgets`                 | KF5 高级文本编辑小部件                       |
| `threadweaver`                | KF5 QtDBus 的附加组件                    |
| `tnef`                        | KDE API 用于处理 TNEF 数据                |
| `unitconversion`              | KF5 单位转换库                           |
| `user-manager`                | Plasma5 用户管理器                       |
| `wallet`                      | KF5 安全且统一的用户密码容器                    |
| `wayland`                     | KF5 Wayland 客户端和服务器库封装              |
| `widgetsaddons`               | KF5 QtWidgets 的附加组件                 |
| `windowsystem`                | KF5 用于访问窗口系统的库                      |
| `xmlgui`                      | KF5 用户可配置的主窗口                       |
| `xmlrpcclient`                | KF5 与 XMLRPC 服务的交互                  |

**示例 24. `USE_KDE` 示例**

这是一个简单的 KDE Port 示例。`USES= cmake` 指示 Port 使用 CMake，CMake 是一个被 KDE 项目广泛使用的配置工具（详细用法请参见 [使用 `cmake`](https://docs.freebsd.org/en/books/porters-handbook/special/#using-cmake)）。`USE_KDE` 会引入对 KDE 库的依赖。所需的 KDE 组件和其他依赖项可以通过配置日志来确定。`USE_KDE` 并不意味着 `USE_QT`。如果 Port 需要一些 Qt 组件，请在 `USE_QT` 中指定它们。

```makefile
USES=		cmake kde:5 qt:5
USE_KDE=	ecm
USE_QT=		core buildtools_build qmake_build
```

## 6.15. 使用 LXQt

依赖 LXQt 的应用程序应设置 `USES+= lxqt` 并将 `USE_LXQT` 设置为所需组件的列表，如下表所示。

**表 19. 可用的 LXQt 组件**

| 名称           | 说明                            |
| ------------ | ----------------------------- |
| `buildtools` | 用于额外 CMake 模块的辅助工具            |
| `libfmqt`    | Libfm Qt 绑定                   |
| `lxqt`       | LXQt 核心库                      |
| `qtxdg`      | freedesktop.org XDG 规范的 Qt 实现 |

**示例 25. `USE_LXQT` 示例**

这是一个简单的示例，`USE_LXQT` 会添加 LXQt 库的依赖。所需的 LXQt 组件和其他依赖项可以通过配置日志来确定。

```
USES=	cmake lxqt qt:5 tar:xz
USE_QT=		core dbus widgets buildtools_build qmake_build
USE_LXQT=	buildtools libfmqt
```

## 6.16. 使用 Java

### 6.16.1. 变量定义

如果 Port 需要 Java™ 开发工具包（JDK™）来构建、运行或甚至提取 distfile，则需要定义 `USE_JAVA`。

Ports 中有多个 JDK，来自不同的供应商，并且有多个版本。如果 Port 必须使用特定版本，请使用 `JAVA_VERSION` 变量指定它。当前版本是 [java/openjdk25](https://cgit.freebsd.org/ports/tree/java/openjdk25/)，同时还提供有 [java/openjdk24](https://cgit.freebsd.org/ports/tree/java/openjdk24/)、[java/openjdk23](https://cgit.freebsd.org/ports/tree/java/openjdk23/)、[java/openjdk22](https://cgit.freebsd.org/ports/tree/java/openjdk22/)、[java/openjdk21](https://cgit.freebsd.org/ports/tree/java/openjdk21/)、[java/openjdk17](https://cgit.freebsd.org/ports/tree/java/openjdk17/)、[java/openjdk11](https://cgit.freebsd.org/ports/tree/java/openjdk11/) 和 [java/openjdk8](https://cgit.freebsd.org/ports/tree/java/openjdk8/) 可用。

**表 20. 使用 Java 的 Ports 可以设置的变量**

| 变量             | 含义                                                                                         |
| -------------- | ------------------------------------------------------------------------------------------ |
| `USE_JAVA`     | 定义后，其他变量才会生效                                                                               |
| `JAVA_VERSION` | 空格分隔的适用于该 Port 的 Java 版本列表。可选的 `+` 表示版本范围（允许值：`8[+] 11[+] 17[+] 18[+] 19[+] 20[+] 21[+]`）。 |
| `JAVA_OS`      | 空格分隔的适用于该 Port 的 JDK 操作系统列表（允许值：`native linux`）。                                           |
| `JAVA_VENDOR`  | 空格分隔的适用于该 Port 的 JDK 供应商列表（允许值：`openjdk oracle`）。                                          |
| `JAVA_BUILD`   | 设置后，将选定的 JDK Port 添加到构建依赖项中。                                                               |
| `JAVA_RUN`     | 设置后，将选定的 JDK Port 添加到运行时依赖项中。                                                              |
| `JAVA_EXTRACT` | 设置后，将选定的 JDK Port 添加到提取依赖项中。                                                               |

下面是设置 `USE_JAVA` 后，Port 将接收到的所有设置列表。

**表 21. 使用 Java 的 Ports 提供的变量**

| 变量                             | 值                                                                                                   |
| ------------------------------ | --------------------------------------------------------------------------------------------------- |
| `JAVA_PORT`                    | JDK Port 的名称（例如，`java/openjdk6`）。                                                                   |
| `JAVA_PORT_VERSION`            | JDK Port 的完整版本（例如，`1.6.0`）。只需要该版本号的前两位数字，使用 `${JAVA_PORT_VERSION:C/^([0-9])\.([0-9])(.*)$/\1.\2/}`。 |
| `JAVA_PORT_OS`                 | JDK Port 使用的操作系统（例如，`'native'`）。                                                                    |
| `JAVA_PORT_VENDOR`             | JDK Port 的供应商（例如，`'openjdk'`）。                                                                      |
| `JAVA_PORT_OS_DESCRIPTION`     | JDK Port 使用的操作系统说明（例如，`'Native'`）。                                                                  |
| `JAVA_PORT_VENDOR_DESCRIPTION` | JDK Port 供应商的说明（例如，`'OpenJDK BSD Porting Team'`）。                                                   |
| `JAVA_HOME`                    | JDK 安装目录的路径（例如，**'/usr/local/openjdk6'**）。                                                          |
| `JAVAC`                        | 要使用的 Java 编译器路径（例如，**'/usr/local/openjdk6/bin/javac'**）。                                            |
| `JAR`                          | 要使用的 `jar` 工具的路径（例如，**'/usr/local/openjdk6/bin/jar'** 或 **'/usr/local/bin/fastjar'**）。              |
| `APPLETVIEWER`                 | `appletviewer` 工具的路径（例如，**'/usr/local/openjdk6/bin/appletviewer'**）。                                |
| `JAVA`                         | `java` 可执行文件的路径。用于执行 Java 程序（例如，**'/usr/local/openjdk6/bin/java'**）。                                |
| `JAVADOC`                      | `javadoc` 工具程序的路径。                                                                                  |
| `JAVAH`                        | `javah` 程序的路径。                                                                                      |
| `JAVAP`                        | `javap` 程序的路径。                                                                                      |
| `JAVA_KEYTOOL`                 | `keytool` 工具程序的路径。                                                                                  |
| `JAVA_N2A`                     | `native2ascii` 工具的路径。                                                                               |
| `JAVA_POLICYTOOL`              | `policytool` 程序的路径。                                                                                 |
| `JAVA_SERIALVER`               | `serialver` 工具程序的路径。                                                                                |
| `RMIC`                         | RMI 存根/骨架生成器 `rmic` 的路径。                                                                            |
| `RMIREGISTRY`                  | RMI 注册程序 `rmiregistry` 的路径。                                                                         |
| `RMID`                         | RMI 守护程序 `rmid` 的路径。                                                                                |
| `JAVA_CLASSES`                 | 包含 JDK 类文件的存档路径，**${JAVA\_HOME}/jre/lib/rt.jar**。                                                   |

使用 `java-debug` make 目标可以获取调试 Port 所需的信息。它将显示之前列出的许多变量的值。

此外，定义了这些常量，以便所有 Java Port 可以一致地安装：

**表 22. 为使用 Java 的 Ports 定义的常量**

| 常量             | 值                                                               |
| -------------- | --------------------------------------------------------------- |
| `JAVASHAREDIR` | 与 Java 相关的所有内容的基本目录。默认值：**${PREFIX}/share/java**。               |
| `JAVAJARDIR`   | 安装 JAR 文件的目录。默认值：**${JAVASHAREDIR}/classes**。                   |
| `JAVALIBDIR`   | 其他 Port 安装的 JAR 文件所在目录。默认值：**${LOCALBASE}/share/java/classes**。 |

相关条目在 `PLIST_SUB`（文档参见 [基于 Make 变量修改 pkg-plist](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-sub)）和 `SUB_LIST` 中定义。

### 6.16.2. 使用 Ant 构建

当 Port 需要使用 Apache Ant 构建时，它必须定义 `USE_ANT`。Ant 被认为是子构建命令。当 Port 未定义 `do-build` 目标时，系统将设置一个默认的目标，该目标根据 `MAKE_ENV`、`MAKE_ARGS` 和 `ALL_TARGET` 运行 Ant。这与 [构建机制](https://docs.freebsd.org/en/books/porters-handbook/special/#building) 中文档说明的 `USES= gmake` 机制类似。

### 6.16.3. 最佳实践

在移植 Java 库时，Port 需要将 JAR 文件安装到 **${JAVAJARDIR}**，并将其他所有内容安装到 **${JAVASHAREDIR}/${PORTNAME}** 目录下（文档除外，见下文）。为了减小打包文件的大小，应在 **Makefile** 中直接引用 JAR 文件。可以使用如下语句（其中 **myport.jar** 是 Port 安装的 JAR 文件名称）：

```makefile
PLIST_FILES+=	${JAVAJARDIR}/myport.jar
```

在移植 Java 应用程序时，Port 通常会将所有内容安装到单一目录下（包括其 JAR 依赖项）。在这种情况下，强烈推荐使用 **${JAVASHAREDIR}/${PORTNAME}**。具体是否将额外的 JAR 依赖项安装到此目录下，还是使用已经安装的 JAR（来自 **${JAVAJARDIR}**），由移植者决定。

当移植需要应用服务器（如 [www/tomcat7](https://cgit.freebsd.org/ports/tree/www/tomcat7/)）来运行服务的 Java™ 应用程序时，供应商通常会分发一个 **.war** 文件。**.war** 是 Web 应用程序存档文件，在应用程序调用时会被解压。避免将 **.war** 添加到 **pkg-plist** 中，这不是最佳实践。应用服务器会展开 war 存档，但如果 Port 被移除，它不会正确清理该存档。更好的做法是先解压存档文件，再安装文件，最后将这些文件添加到 **pkg-plist** 中。

```makefile
TOMCATDIR=	${LOCALBASE}/apache-tomcat-7.0
WEBAPPDIR=	myapplication

post-extract:
	@${MKDIR} ${WRKDIR}/${PORTDIRNAME}
	@${TAR} xf ${WRKDIR}/myapplication.war -C ${WRKDIR}/${PORTDIRNAME}

do-install:
	cd ${WRKDIR} && \
	${INSTALL} -d -o ${WWWOWN} -g ${WWWGRP} ${TOMCATDIR}/webapps/${PORTDIRNAME}
	cd ${WRKDIR}/${PORTDIRNAME} && ${COPYTREE_SHARE} \* ${WEBAPPDIR}/${PORTDIRNAME}
```

无论 Port 是库还是应用程序，额外的文档都会安装在与其他 Port 相同的位置。`javadoc` 工具已知会根据所使用的 JDK 版本生成不同的文件集。因此，对于不强制使用特定 JDK 的 Port，指定打包清单（**pkg-plist**）是一个复杂的任务。这也是为什么强烈建议移植者使用 `PORTDOCS` 的原因之一。此外，即使可以预测由 `javadoc` 生成的文件集，生成的 **pkg-plist** 的大小也支持使用 `PORTDOCS`。

`DATADIR` 的默认值是 **${PREFIX}/share/${PORTNAME}**。对于 Java Port，最好将 `DATADIR` 重写为 **${JAVASHAREDIR}/${PORTNAME}**。确实，`DATADIR` 会自动添加到 `PLIST_SUB` 中（文档参见 [基于 Make 变量修改 pkg-plist](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-sub)），因此可以在 **pkg-plist** 中直接使用 `%%DATADIR%%`。

至于从源代码构建 Java Port 还是直接从二进制分发安装，在撰写本文时，尚无明确的政策。然而，来自 [FreeBSD Java 项目](https://www.freebsd.org/java/) 的成员建议移植者在任务简单时从源代码构建他们的 Port。

本节介绍的所有功能都在 **bsd.java.mk** 中实现。如果 Port 需要更复杂的 Java 支持，请首先查看 [bsd.java.mk Git 日志](https://cgit.freebsd.org/ports/tree/Mk/bsd.java.mk)，因为通常需要一些时间才能记录最新功能。然后，如果缺少的支持对许多其他 Java Port 有益，请随时在 freebsd-java 上讨论。

尽管存在一个 `java` 类别用于 PR，但它指的是来自 FreeBSD Java 项目的 JDK 移植工作。因此，除非问题与 JDK 实现或 **bsd.java.mk** 相关，否则应像处理其他 Port 一样，在 `ports` 类别中提交 Java Port。

类似地，对于 Java Port 的 `CATEGORIES`，有一个定义明确的政策，详情请见 [分类](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-categories)。

## 6.17. Web 应用程序、Apache 和 PHP

### 6.17.1. Apache

| 变量                 | 说明                                                                                                                                                                                  |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `USE_APACHE`       | Port 需要 Apache。可能的值：`yes`（获取任意版本），`22`，`24`，`22-24`，`22+` 等。默认的 Apache 版本是 `22`。更多细节请参见 **ports/Mk/bsd.apache.mk** 以及 [wiki.freebsd.org/Apache/](https://wiki.freebsd.org/Apache/)。 |
| `APXS`             | `apxs` 可执行文件的完整路径，可以在 Port 中覆盖。                                                                                                                                                     |
| `HTTPD`            | `httpd` 可执行文件的完整路径，可以在 Port 中覆盖。                                                                                                                                                    |
| `APACHE_VERSION`   | 当前安装的 Apache 版本（只读变量）。该变量只有在包含 **bsd.port.pre.mk** 后才能使用。可能的值：`22`，`24`。                                                                                                            |
| `APACHEMODDIR`     | Apache 模块的目录。此变量会在 **pkg-plist** 中自动展开。                                                                                                                                             |
| `APACHEINCLUDEDIR` | Apache 头文件的目录。此变量会在 **pkg-plist** 中自动展开。                                                                                                                                            |
| `APACHEETCDIR`     | Apache 配置文件的目录。此变量会在 **pkg-plist** 中自动展开。                                                                                                                                           |

### 6.17.2. Web 应用程序

Web 应用程序必须安装到 **PREFIX/www/appname** 目录下。这个路径可以在 **Makefile** 和 **pkg-plist** 中作为 `WWWDIR` 使用，相对于 `PREFIX` 的路径可以在 **Makefile** 中作为 `WWWDIR_REL` 使用。

Web 服务器进程的用户和组信息可以通过 `WWWOWN` 和 `WWWGRP` 获取，以便在需要更改某些文件的所有权时使用。两者的默认值为 `www`。如果 Port 需要不同的值，可以使用 `WWWOWN?= myuser` 和 `WWWGRP?= mygroup`。这允许用户轻松地覆盖这些值。

> **重要**
>
> 谨慎使用 `WWWOWN` 和 `WWWGRP`。请记住，Web 服务器可以写入的每个文件都是一个潜在的安全风险。

除非 Web 应用程序明确需要 Apache，否则不要依赖 Apache。请尊重用户可能希望在 Apache 以外的 Web 服务器上运行 Web 应用程序。

### 6.17.3. PHP

PHP Web 应用程序通过 `USES=php` 声明对 PHP 的依赖。更多信息请参考 [`php`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-php)。

### 6.17.4. PEAR 模块

移植 PEAR 模块是一个非常简单的过程。

在 Port 的 **Makefile** 中添加 `USES=pear`。该框架将把相关文件安装到正确的位置，并在安装时自动生成 plist。

**示例 26. PEAR 类的 Makefile 示例**

```makefile
PORTNAME=       Date
DISTVERSION=	1.4.3
CATEGORIES=	devel www pear

MAINTAINER=	someone@example.org
COMMENT=	PEAR Date and Time Zone Classes
WWW=		https://pear.php.net/package/Date/

USES=	pear

.include <bsd.port.mk>
```

> **技巧**
>
> PEAR 模块将使用 [PHP flavors](https://docs.freebsd.org/en/books/porters-handbook/flavors/#flavors-auto-php) 自动进行 flavor 化。

> **注意**
>
> 如果使用非默认的 `PEAR_CHANNEL`，则构建时和运行时的依赖项将自动添加。

> **重要**
>
> PEAR 模块不需要定义 `PKGNAMESUFFIX`，该值会自动使用 `PEAR_PKGNAMEPREFIX` 填充。如果 Port 需要添加 `PKGNAMEPREFIX`，则必须同时使用 `PEAR_PKGNAMEPREFIX` 来区分不同的 flavor。

#### 6.17.4.1. Horde 模块

同样，移植 Horde 模块是一个简单的过程。

在 Port 的 **Makefile** 中添加 `USES=horde`。该框架将把相关文件安装到正确的位置，并在安装时自动生成 plist。

`USE_HORDE_BUILD` 和 `USE_HORDE_RUN` 变量可以用于添加构建时和运行时对其他 Horde 模块的依赖。有关可用模块的完整列表，请参见 **Mk/Uses/horde.mk**。

**示例 27. Horde 模块的 Makefile 示例**

```makefile
PORTNAME=	Horde_Core
DISTVERSION=	2.14.0
CATEGORIES=	devel www pear

MAINTAINER=	horde@FreeBSD.org
COMMENT=	Horde Core Framework libraries
WWW=		https://pear.horde.org/

OPTIONS_DEFINE=	KOLAB SOCKETS
KOLAB_DESC=	Enable Kolab server support
SOCKETS_DESC=	Depend on sockets PHP extension

USES=	horde
USE_PHP=	session

USE_HORDE_BUILD=	Horde_Role
USE_HORDE_RUN=	Horde_Role Horde_History Horde_Pack \
		Horde_Text_Filter Horde_View

KOLAB_USE=	HORDE_RUN=Horde_Kolab_Server,Horde_Kolab_Session
SOCKETS_USE=	PHP=sockets

.include <bsd.port.mk>
```

> **技巧**
>
> 由于 Horde 模块也是 PEAR 模块，它们将使用 [PHP flavors](https://docs.freebsd.org/en/books/porters-handbook/flavors/#flavors-auto-php) 自动进行 flavor 化。

## 6.18. 使用 Python

Ports 支持多个 Python 版本的并行安装。Port 必须根据用户可设置的 `PYTHON_VERSION` 使用正确的 `python` 解释器。最重要的是，这意味着将脚本中的 `python` 可执行文件路径替换为 `PYTHON_CMD` 的值。

将文件安装到 `PYTHON_SITELIBDIR` 下的 Port 必须使用 `pyXY-` 包名前缀，这样它们的包名就包含了 Python 的版本号。

```makefile
PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}
```

**表 25. 使用 Python 的 Port 最有用的变量**

| `USES=python`             | 该 Port 需要 Python。可以通过类似 `3.10+` 的值指定最小要求的版本。也可以通过使用短横线分隔两个版本号来指定版本范围，如 `USES=python:3.8-3.9`。请注意，`USES=python` *不* 包含 Python 2.7，需明确要求使用 `USES=python:2.7+`。                           |
| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `USE_PYTHON=distutils`    | 使用 Python distutils 进行配置、编译和安装。当 Port 带有 **setup.py** 时，必需设置此选项。这会覆盖 `do-build` 和 `do-install` 目标，并且如果没有定义 `GNU_CONFIGURE`，也可能会覆盖 `do-configure`。此外，它还暗示 `USE_PYTHON=flavors`。         |
| `USE_PYTHON=autoplist`    | 自动创建打包清单。此选项还需要设置 `USE_PYTHON=distutils`。                                                                                                                                              |
| `USE_PYTHON=concurrent`   | 该 Port 将使用独特的前缀，通常是 `PYTHON_PKGNAMEPREFIX`，用于某些目录，如 `EXAMPLESDIR` 和 `DOCSDIR`，并且将为二进制文件和脚本添加一个后缀，即 `PYTHON_VER` 中的 Python 版本号。这样可以同时安装多个 Python 版本的 Port，避免冲突文件的安装。                    |
| `USE_PYTHON=flavors`      | 该 Port 不使用 distutils，但仍然支持多个 Python 版本。`FLAVORS` 将被设置为支持的 Python 版本。有关更多信息，请参见 [使用 Python 和 Flavors](https://docs.freebsd.org/en/books/porters-handbook/flavors/#flavors-auto-python)。 |
| `USE_PYTHON=optsuffix`    | 如果当前 Python 版本不是默认版本，则该 Port 将获得 `PKGNAMESUFFIX=${PYTHON_PKGNAMESUFFIX}`。仅在使用 flavors 时有用。                                                                                             |
| `USE_PYTHON=pep517`       | 支持按照 PEP-517 标准构建和安装 wheel 包。                                                                                                                                                          |
| `PYTHON_PKGNAMEPREFIX`    | 用作 `PKGNAMEPREFIX` 来区分不同 Python 版本的包。例如：`py27-`。                                                                                                                                       |
| `PYTHON_SITELIBDIR`       | 站点包树的位置，包含 Python 的安装路径（通常是 `LOCALBASE`）。在安装 Python 模块时，`PYTHON_SITELIBDIR` 非常有用。                                                                                                      |
| `PYTHONPREFIX_SITELIBDIR` | `PYTHON_SITELIBDIR` 的 PREFIX 清理版本。始终在 **pkg-plist** 中使用 `%%PYTHON_SITELIBDIR%%`。`%%PYTHON_SITELIBDIR%%` 的默认值为 `lib/python%%PYTHON_VERSION%%/site-packages`。                            |
| `PYTHON_CMD`              | Python 解释器命令行，包括版本号。                                                                                                                                                                   |

**表 26. Python 模块依赖帮助程序**

| `PYNUMERIC`      | 数值扩展的依赖项                                                                                              |
| ---------------- | ----------------------------------------------------------------------------------------------------- |
| `PYNUMPY`        | 新的数值扩展 numpy 的依赖项。（`PYNUMERIC` 已被上游供应商废弃）。                                                            |
| `PYXML`          | XML 扩展的依赖项（对于 Python 2.0 及更高版本，因其也在基础发行版中，故不需要）。                                                      |
| `PY_ENUM34`      | 根据 Python 版本，条件依赖于 [devel/py-enum34](https://cgit.freebsd.org/ports/tree/devel/py-enum34/)。           |
| `PY_ENUM_COMPAT` | 根据 Python 版本，条件依赖于 [devel/py-enum-compat](https://cgit.freebsd.org/ports/tree/devel/py-enum-compat/)。 |
| `PY_PATHLIB`     | 根据 Python 版本，条件依赖于 [devel/py-pathlib](https://cgit.freebsd.org/ports/tree/devel/py-pathlib/)。         |
| `PY_IPADDRESS`   | 根据 Python 版本，条件依赖于 [net/py-ipaddress](https://cgit.freebsd.org/ports/tree/net/py-ipaddress/)。         |
| `PY_FUTURES`     | 根据 Python 版本，条件依赖于 [devel/py-futures](https://cgit.freebsd.org/ports/tree/devel/py-futures/)。         |

完整的可用变量列表可以在 **/usr/ports/Mk/Uses/python.mk** 中找到。

> **重要**
>
> 所有使用 [Python flavors](https://docs.freebsd.org/en/books/porters-handbook/flavors/#flavors-auto-python) 的 Python Port 的依赖项（无论是使用 `USE_PYTHON=distutils` 还是 `USE_PYTHON=flavors`）都必须使用 `@${PY_FLAVOR}` 将 Python flavor 添加到它们的 origin 中。请参见 [简单的 Python 模块 Makefile](https://docs.freebsd.org/en/books/porters-handbook/special/#python-Makefile)。

**示例 28. 简单 Python 模块的 Makefile**

```makefile
PORTNAME=	sample
DISTVERSION=	1.2.3
CATEGORIES=	devel

MAINTAINER=	fred.bloggs@example.com
COMMENT=	Python sample module
WWW=		https://example.com/project/sample/

RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}six>0:devel/py-six@${PY_FLAVOR}

USES=		python
USE_PYTHON=	autoplist distutils

.include <bsd.port.mk>
```

一些 Python 应用程序声称支持 `DESTDIR`（这是 staging 所需的），但实际上它是破损的（例如，Mailman 版本 2.1.16 之前的版本）。可以通过重新编译脚本来解决此问题。可以在 `post-build` 目标中实现这一点。例如，假设 Python 脚本应该安装到 `PYTHONPREFIX_SITELIBDIR`，则可以应用以下解决方案：

```makefile
(cd ${STAGEDIR}${PREFIX} \
  && ${PYTHON_CMD} ${PYTHON_LIBDIR}/compileall.py \
   -d ${PREFIX} -f ${PYTHONPREFIX_SITELIBDIR:S;${PREFIX}/;;})
```

这将使用相对于阶段目录的路径重新编译源代码，并通过 `-d` 选项将 `PREFIX` 的值添加到字节编译输出文件的文件名中。需要使用 `-f` 强制重新编译，`:S;${PREFIX}/;;` 将 `PYTHONPREFIX_SITELIBDIR` 的前缀去除，使其相对于 `PREFIX`。

## 6.19. 使用 Tcl/Tk

Ports 支持多个 Tcl/Tk 版本的并行安装。Ports 应该至少支持默认的 Tcl/Tk 版本和更高版本，可以通过 `USES=tcl` 来指定。也可以通过附加版本号 `:_xx_` 来指定所需的 `tcl` 版本，例如 `USES=tcl:85`。

**表 27. 使用 Tcl/Tk 的 Ports 最有用的只读变量**

| `TCL_VER`              | 选择的 Tcl 版本号（主.次版本） |
| ---------------------- | ------------------ |
| `TCLSH`                | Tcl 解释器的完整路径       |
| `TCL_LIBDIR`           | Tcl 库文件的路径         |
| `TCL_INCLUDEDIR`       | Tcl C 头文件的路径       |
| `TCL_PKG_LIB_PREFIX`   | 库前缀，按 TIP595 标准    |
| `TCL_PKG_STUB_POSTFIX` | Stub 库后缀           |
| `TK_VER`               | 选择的 Tk 版本号（主.次版本）  |
| `WISH`                 | Tk 解释器的完整路径        |
| `TK_LIBDIR`            | Tk 库文件的路径          |
| `TK_INCLUDEDIR`        | Tk C 头文件的路径        |

有关这些变量的完整说明，请参阅 [`USES=tcl`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-tcl) 和 [`USES=tk`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-tk) 以及 [使用 `USES` 宏](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses)。这些变量的完整列表可在 **/usr/ports/Mk/Uses/tcl.mk** 中找到。

## 6.20. 使用 SDL

`USE_SDL` 用于自动配置使用 SDL 基础库的 Ports，例如 [devel/sdl12](https://cgit.freebsd.org/ports/tree/devel/sdl12/) 和 [graphics/sdl\_image](https://cgit.freebsd.org/ports/tree/graphics/sdl_image/)。

SDL 1.2 版本的这些库被识别：

* sdl: [devel/sdl12](https://cgit.freebsd.org/ports/tree/devel/sdl12/)
* console: [devel/sdl\_console](https://cgit.freebsd.org/ports/tree/devel/sdl_console/)
* gfx: [graphics/sdl\_gfx](https://cgit.freebsd.org/ports/tree/graphics/sdl_gfx/)
* image: [graphics/sdl\_image](https://cgit.freebsd.org/ports/tree/graphics/sdl_image/)
* mixer: [audio/sdl\_mixer](https://cgit.freebsd.org/ports/tree/audio/sdl_mixer/)
* mm: [devel/sdlmm](https://cgit.freebsd.org/ports/tree/devel/sdlmm/)
* net: [net/sdl\_net](https://cgit.freebsd.org/ports/tree/net/sdl_net/)
* pango: [x11-toolkits/sdl\_pango](https://cgit.freebsd.org/ports/tree/x11-toolkits/sdl_pango/)
* sound: [audio/sdl\_sound](https://cgit.freebsd.org/ports/tree/audio/sdl_sound/)
* ttf: [graphics/sdl\_ttf](https://cgit.freebsd.org/ports/tree/graphics/sdl_ttf/)

SDL 2.0 版本的这些库被识别：

* sdl: [devel/sdl20](https://cgit.freebsd.org/ports/tree/devel/sdl20/)
* gfx: [graphics/sdl2\_gfx](https://cgit.freebsd.org/ports/tree/graphics/sdl2_gfx/)
* image: [graphics/sdl2\_image](https://cgit.freebsd.org/ports/tree/graphics/sdl2_image/)
* mixer: [audio/sdl2\_mixer](https://cgit.freebsd.org/ports/tree/audio/sdl2_mixer/)
* net: [net/sdl2\_net](https://cgit.freebsd.org/ports/tree/net/sdl2_net/)
* ttf: [graphics/sdl2\_ttf](https://cgit.freebsd.org/ports/tree/graphics/sdl2_ttf/)

因此，如果一个 Port 依赖于 [net/sdl\_net](https://cgit.freebsd.org/ports/tree/net/sdl_net/) 和 [audio/sdl\_mixer](https://cgit.freebsd.org/ports/tree/audio/sdl_mixer/)，其语法为：

```makefile
USE_SDL=	net mixer
```

依赖项 [devel/sdl12](https://cgit.freebsd.org/ports/tree/devel/sdl12/)，这是 [net/sdl\_net](https://cgit.freebsd.org/ports/tree/net/sdl_net/) 和 [audio/sdl\_mixer](https://cgit.freebsd.org/ports/tree/audio/sdl_mixer/) 所必需的，将会自动添加。

使用 `USE_SDL` 配置 SDL 1.2 时，它会自动：

* 将对 sdl12-config 的依赖添加到 `BUILD_DEPENDS`；
* 将变量 `SDL_CONFIG` 添加到 `CONFIGURE_ENV`；
* 将所选库的依赖项添加到 `LIB_DEPENDS`。

使用 `USE_SDL` 配置 SDL 2.0 时，它会自动：

* 将对 sdl2-config 的依赖添加到 `BUILD_DEPENDS`；
* 将变量 `SDL2_CONFIG` 添加到 `CONFIGURE_ENV`；
* 将所选库的依赖项添加到 `LIB_DEPENDS`。

## 6.21. 使用 wxWidgets

本节介绍了 wxWidgets 库在 Ports 树中的状态以及与 Ports 系统的集成。

### 6.21.1. 介绍

wxWidgets 库有多个版本，它们之间存在冲突（安装的文件同名）。在 Ports 树中，这个问题通过为每个版本使用版本号后缀来解决，使每个版本以不同的名称安装。

显而易见的缺点是每个应用程序都需要修改，以找到预期的版本。幸运的是，大多数应用程序会调用 `wx-config` 脚本来确定所需的编译器和链接器标志。该脚本的名称在每个可用版本中都是不同的。大多数应用程序会尊重环境变量，或接受配置参数来指定要调用的 `wx-config` 脚本。否则，它们必须进行补丁处理。

### 6.21.2. 版本选择

为了让 Port 使用特定版本的 wxWidgets，提供了两个可供定义的变量（如果只定义了其中一个，另一个将设置为默认值）：

**表 28. 选择 wxWidgets 版本的变量**

| 变量           | 说明             | 默认值    |
| ------------ | -------------- | ------ |
| `USE_WX`     | Port 可以使用的版本列表 | 所有可用版本 |
| `USE_WX_NOT` | Port 不能使用的版本列表 | 无      |

可用的 wxWidgets 版本及其在树中的对应 Port 如下：

**表 29. 可用的 wxWidgets 版本**

| 版本    | Port                                                                              |
| ----- | --------------------------------------------------------------------------------- |
| `2.8` | [x11-toolkits/wxgtk28](https://cgit.freebsd.org/ports/tree/x11-toolkits/wxgtk28/) |
| `3.0` | [x11-toolkits/wxgtk30](https://cgit.freebsd.org/ports/tree/x11-toolkits/wxgtk30/) |

[选择 wxWidgets 版本的变量](https://docs.freebsd.org/en/books/porters-handbook/special/#wx-ver-sel-table)可以设置为一个或多个组合，组合之间用空格分隔：

**表 30. wxWidgets 版本规范**

| 说明          | 示例        |
| ----------- | --------- |
| 单一版本        | `2.8`     |
| 升序范围        | `2.8+`    |
| 降序范围        | `3.0-`    |
| 完整范围（必须是升序） | `2.8-3.0` |

还有一些变量用于从可用版本中选择首选版本。它们可以设置为一个版本列表，列表中靠前的版本将具有更高的优先级。

**表 31. 选择首选 wxWidgets 版本的变量**

| 名称            | 适用对象 |
| ------------- | ---- |
| `WANT_WX_VER` | Port |
| `WITH_WX_VER` | 用户   |

### 6.21.3. 组件选择

还有一些应用程序，尽管不是 wxWidgets 库，但与它们相关。这些应用程序可以在 `WX_COMPS` 中指定。可用的组件如下：

**表 32. 可用的 wxWidgets 组件**

| 名称        | 说明                  | 版本限制      |
| --------- | ------------------- | --------- |
| `wx`      | 主库                  | 无         |
| `contrib` | 贡献的库                | 无         |
| `python`  | wxPython（Python 绑定） | `2.8-3.0` |

每个组件的依赖类型可以通过添加后缀来选择，后缀与组件名称之间用分号分隔。如果没有指定后缀，则会使用默认类型（请参见 [默认 wxWidgets 依赖类型](https://docs.freebsd.org/en/books/porters-handbook/special/#wx-def-dep-types)）。可用的依赖类型如下：

**表 33. 可用的 wxWidgets 依赖类型**

| 名称      | 说明                          |
| ------- | --------------------------- |
| `build` | 组件用于构建，相当于 `BUILD_DEPENDS`  |
| `run`   | 组件用于运行，相当于 `RUN_DEPENDS`    |
| `lib`   | 组件用于构建和运行，相当于 `LIB_DEPENDS` |

组件的默认依赖类型在下表中列出：

**表 34. 默认 wxWidgets 依赖类型**

| 组件        | 依赖类型  |
| --------- | ----- |
| `wx`      | `lib` |
| `contrib` | `lib` |
| `python`  | `run` |
| `mozilla` | `lib` |
| `svg`     | `lib` |

**示例 29. 选择 wxWidgets 组件**

以下片段对应一个使用 wxWidgets 版本 `2.4` 及其贡献库的 Port：

```makefile
USE_WX=		2.8
WX_COMPS=	wx contrib
```

### 6.21.4. 检测已安装的版本

要检测已安装的版本，可以定义 `WANT_WX`。如果没有设置为特定版本，则组件将带有版本后缀。检测后，`HAVE_WX` 将会被填充。

**示例 30. 检测已安装的 wxWidgets 版本和组件**

此片段可以用于一个使用 wxWidgets 的 Port，如果它已安装，或者选择了某个选项。

```makefile
WANT_WX=	yes

.include <bsd.port.pre.mk>

.if defined(WITH_WX) || !empty(PORT_OPTIONS:MWX) || !empty(HAVE_WX:Mwx-2.8)
USE_WX=			2.8
CONFIGURE_ARGS+=	--enable-wx
.endif
```

此片段可以用于一个启用 wxPython 支持的 Port，如果 wxPython 已安装或者选中了相关选项，此外还有 wxWidgets，两者均为版本 `2.8`。

```makefile
USE_WX=		2.8
WX_COMPS=	wx
WANT_WX=	2.8

.include <bsd.port.pre.mk>

.if defined(WITH_WXPYTHON) || !empty(PORT_OPTIONS:MWXPYTHON) || !empty(HAVE_WX:Mpython)
WX_COMPS+=		python
CONFIGURE_ARGS+=	--enable-wxpython
.endif
```

### 6.21.5. 已定义的变量

这些变量可以在 Port 中使用（在定义了 [选择 wxWidgets 版本的变量](https://docs.freebsd.org/en/books/porters-handbook/special/#wx-ver-sel-table) 后）。

**表 35. 为使用 wxWidgets 的 Ports 定义的变量**

| 名称           | 说明                                     |
| ------------ | -------------------------------------- |
| `WX_CONFIG`  | wxWidgets 的 `wx-config` 脚本的路径（具有不同的名称） |
| `WXRC_CMD`   | wxWidgets 的 `wxrc` 程序的路径（具有不同的名称）      |
| `WX_VERSION` | 将使用的 wxWidgets 版本（例如，`2.6`）            |

### 6.21.6. 在 **bsd.port.pre.mk** 中的处理

定义 `WX_PREMK` 以便在包含 **bsd.port.pre.mk** 后可以使用这些变量。

> **重要**
>
> 当定义了 `WX_PREMK`，则版本、依赖、组件和定义的变量在修改 wxWidgets Port 变量 *后* 包含 **bsd.port.pre.mk** 时不会发生变化。

**示例 31. 在命令中使用 wxWidgets 变量**

此片段展示了如何通过运行 `wx-config` 脚本来获取完整的版本字符串，将其分配给变量并传递给程序，使用 `WX_PREMK`。

```makefile
USE_WX=		2.8
WX_PREMK=	yes

.include <bsd.port.pre.mk>

.if exists(${WX_CONFIG})
VER_STR!=	${WX_CONFIG} --release

PLIST_SUB+=	VERSION="${VER_STR}"
.endif
```

> **注意**
>
> 当 wxWidgets 变量位于目标中时，无需使用 `WX_PREMK`，可以安全地在命令中使用这些变量。

### 6.21.7. 额外的 `configure` 参数

一些 GNU `configure` 脚本仅通过设置 `WX_CONFIG` 环境变量无法找到 wxWidgets，可能需要额外的参数。可以使用 `WX_CONF_ARGS` 提供这些参数。

**表 36. `WX_CONF_ARGS` 的合法值**

| 可能的值       | 结果参数                                                     |
| ---------- | -------------------------------------------------------- |
| `absolute` | `--with-wx-config=${WX_CONFIG}`                          |
| `relative` | `--with-wx=${LOCALBASE} --with-wx-config=${WX_CONFIG:T}` |

## 6.22. 使用 Lua

本节介绍了 Lua 库在 Ports 树中的状态及其与 Ports 系统的集成。

### 6.22.1. 引言

Lua 库和对应的解释器有多个版本，它们之间存在冲突（以相同的名称安装文件）。在 Ports 树中，通过使用版本号后缀将每个版本安装为不同的名称来解决这个问题。

显而易见的缺点是，每个应用程序都需要修改以找到期望的版本。但是，可以通过向编译器和链接器添加一些额外的标志来解决此问题。

使用 Lua 的应用程序通常应仅为一个版本构建。然而，针对 Lua 的可加载模块会为其支持的每个 Lua 版本构建单独的 flavor，并且依赖这些模块的 Port 应该通过在 Port 源上使用 `@${LUA_FLAVOR}` 后缀来指定 flavor。

### 6.22.2. 版本选择

使用 Lua 的 Port 应该有以下形式的行：

```makefile
USES=	lua
```

如果需要特定版本的 Lua 或版本范围，可以按 `XY`（可以多次使用）、`XY+`、`-XY` 或 `XY-ZA` 的格式指定。如果 `DEFAULT_VERSIONS` 设置的默认 Lua 版本位于请求的范围内，则将使用它，否则将使用与默认版本最接近的请求版本。例如：

```makefile
USES=	lua:52-53
```

请注意，版本选择不会尝试基于已安装的 Lua 版本进行调整。

> **注意**
>
> 使用 `XY+` 格式的版本指定应谨慎使用；Lua 的 API 在每个版本中都会有所变化，配置工具如 CMake 或 Autoconf 在未来的 Lua 版本上通常无法正常工作，直到它们被更新为支持这些版本。

### 6.22.3. 配置和编译器标志

使用 Lua 的软件可能已经编写为自动检测正在使用的 Lua 版本。通常，Port 应该覆盖这一假设，强制使用如上所述选择的特定 Lua 版本。根据正在移植的软件，这可能需要以下任何或所有操作：

* 使用 `LUA_VER` 作为参数的一部分，通过 `CONFIGURE_ARGS` 或 `CONFIGURE_ENV`（或其他构建系统的等效项）传递给软件的配置脚本；
* 向 `CFLAGS`、`LDFLAGS` 和 `LIBS` 分别添加 `-I${LUA_INCDIR}`、`-L${LUA_LIBDIR}` 和 `-llua-${LUA_VER}`；
* 修补软件的配置或构建文件，以选择正确的版本。

### 6.22.4. 版本 flavor

一个安装 Lua 模块的 Port（而不是仅仅使用 Lua 的应用程序）应该为每个支持的 Lua 版本构建一个单独的 flavor。这可以通过添加 `module` 参数来完成：

```makefile
USES=	lua:module
```

也可以指定版本号或版本范围；使用逗号分隔多个参数。

由于每个 flavor 必须有不同的包名，因此提供了变量 `LUA_PKGNAMEPREFIX`，该变量将被设置为适当的值；其预期用法为：

```makefile
PKGNAMEPREFIX=	${LUA_PKGNAMEPREFIX}
```

模块 Port 通常只应安装文件到 `LUA_MODLIBDIR`、`LUA_MODSHAREDIR`、`LUA_DOCSDIR` 和 `LUA_EXAMPLESDIR`，所有这些目录都已设置为引用特定版本的子目录。安装任何其他文件必须小心，以避免版本之间的冲突。

一个希望为每个 Lua 版本构建单独包的 Port（而不是 Lua 模块）应该使用 `flavors` 参数：

```makefile
USES=	lua:flavors
```

这与上述说明的 `module` 参数的工作方式相同，但不假设包应该作为 Lua 模块来记录（因此默认情况下不定义 `LUA_DOCSDIR` 和 `LUA_EXAMPLESDIR`）。不过，Port 可以选择定义 `LUA_DOCSUBDIR` 作为合适的子目录名称（通常是 Port 的 `PORTNAME`，只要它不与任何模块的 `PORTNAME` 冲突），在这种情况下，框架将定义 `LUA_DOCSDIR` 和 `LUA_EXAMPLESDIR`。

与模块 Port 一样，flavor Port 应避免安装可能在版本之间冲突的文件。通常通过将 `LUA_VER_STR` 作为程序名称的后缀来完成此操作（例如使用 [`uniquefiles`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-uniquefiles)），并在其他文件或子目录中使用 `LUA_VER` 或 `LUA_VER_STR`，这些文件或子目录位于 `LUA_MODLIBDIR` 和 `LUA_MODSHAREDIR` 之外。

### 6.22.5. 定义的变量

在 Port 中可以使用以下变量。

**表 37. 使用 Lua 的 Port 中定义的变量**

| 名称                   | 说明                               |
| -------------------- | -------------------------------- |
| `LUA_VER`            | 将使用的 Lua 版本（例如，`5.4`）            |
| `LUA_VER_STR`        | 不带点的 Lua 版本（例如，`54`）             |
| `LUA_FLAVOR`         | 对应所选 Lua 版本的 flavor 名称，用于指定依赖    |
| `LUA_BASE`           | 用于定位已安装的 Lua（和组件）的前缀             |
| `LUA_PREFIX`         | 该 Port 将安装 Lua（和组件）的位置前缀         |
| `LUA_INCDIR`         | 安装 Lua 头文件的目录                    |
| `LUA_LIBDIR`         | 安装 Lua 库的目录                      |
| `LUA_REFMODLIBDIR`   | 已安装的 Lua 模块库（**.so**）的目录         |
| `LUA_REFMODSHAREDIR` | 已安装的 Lua 模块（**.lua**）的目录         |
| `LUA_MODLIBDIR`      | 该 Port 将安装 Lua 模块库（**.so**）的位置目录 |
| `LUA_MODSHAREDIR`    | 该 Port 将安装 Lua 模块（**.lua**）的位置目录 |
| `LUA_PKGNAMEPREFIX`  | Lua 模块使用的包名称前缀                   |
| `LUA_CMD`            | Lua 解释器的名称（例如，`lua54`）           |
| `LUAC_CMD`           | Lua 编译器的名称（例如，`luac54`）          |

对于指定了 `module` 参数的 Port，还有以下附加变量：

**表 38. Lua 模块 Port 中定义的变量**

| 名称                | 说明             |
| ----------------- | -------------- |
| `LUA_DOCSDIR`     | 模块文档应安装到的目录。   |
| `LUA_EXAMPLESDIR` | 模块示例文件应安装到的目录。 |

### 6.22.6. 示例

**示例 32. 使用 Lua 的应用程序 Makefile**

此示例展示了如何引用运行时所需的 Lua 模块。请注意，引用必须指定一个 flavor。

```makefile
PORTNAME=	sample
DISTVERSION=	1.2.3
CATEGORIES=	whatever

MAINTAINER=	fred.bloggs@example.com
COMMENT=	Sample
WWW=		https://example.com/lua_sample/sample/

RUN_DEPENDS=	${LUA_REFMODLIBDIR}/lpeg.so:devel/lua-lpeg@${LUA_FLAVOR}

USES=		lua

.include <bsd.port.mk>
```

**示例 33. 简单 Lua 模块的 Makefile**

```makefile
PORTNAME=	sample
DISTVERSION=	1.2.3
CATEGORIES=	whatever
PKGNAMEPREFIX=	${LUA_PKGNAMEPREFIX}

MAINTAINER=	fred.bloggs@example.com
COMMENT=	Sample
WWW=		https://example.com/lua_sample/sample/

USES=		lua:module

DOCSDIR=	${LUA_DOCSDIR}

.include <bsd.port.mk>
```

## 6.23. 使用 Guile

本节介绍了 Guile 在 Ports 树中的状态以及它与 Ports 系统的集成。

### 6.23.1. 介绍

Guile 库和相应的解释器有多个版本，它们之间存在冲突（以相同的名称安装文件）。在 Ports 树中，通过使用版本号后缀将每个版本安装为不同的名称来解决这个问题。在大多数情况下，应用程序应该通过提供的配置变量检测正确的版本，并使用 `pkg-config` 来确定名称和相关路径。然而，一些应用程序（尤其是那些使用自己配置规则的应用程序，如 `cmake` 或 `meson`）将始终尝试使用最新版本。在这种情况下，要么修补 Port，要么声明构建冲突（见下文的 `conflicts` 选项），以确保在非 poudriere 构建时生成正确的依赖项。

使用 Guile 的应用程序通常应该仅为一个版本构建，最好是 `DEFAULT_VERSIONS` 中指定的版本，或者如果不支持该版本，则为它们支持的最新版本。然而，Guile 或 Scheme 库，或 Guile 的扩展模块，会为它们支持的每个 Guile 版本分别构建一个 flavor，并且这些模块的依赖关系应该通过在 Port 源上使用 `@${GUILE_FLAVOR}` 后缀来指定 flavor。

### 6.23.2. 版本选择

使用 Guile 的 Port 应该定义 `USES=guile:arg,arg…`，并根据以下参数选择适当的值：

**表 39. 使用 Guile 的 Ports 定义的参数**

| 名称          | 说明                                                                                         |
| ----------- | ------------------------------------------------------------------------------------------ |
| `X.Y`       | 声明与 Guile 版本 `X.Y` 的兼容性。目前可用的版本为 `1.8`（废弃）、`2.2` 和 `3.0`。可以指定多个版本。                         |
| `flavors`   | 为每个指定的 Guile 版本创建一个 flavor。由 `DEFAULT_VERSIONS` 指定的版本将成为默认 flavor。flavor 名称的格式为 `guileXY`。 |
| `build`     | 仅将 Guile 解释器添加为构建依赖项，而不是库依赖项。可以同时指定 `build` 和 `run`。                                       |
| `run`       | 仅将 Guile 解释器添加为运行时依赖项，而不是库依赖项。可以同时指定 `build` 和 `run`。                                      |
| `alias`     | 为解释器和工具添加 `BINARY_ALIAS` 值。                                                                |
| `conflicts` | 为比选定版本更新的 Guile 版本声明 `CONFLICTS_BUILD`。当 Port 无法配置为使用特定版本的 Guile 时，使用此选项。                  |

有一些额外的参数可用于处理特殊情况；详细信息请参见 `Mk/Uses/guile.mk`。

除非指定了 `build` 或 `run`，否则 `LIB_DEPENDS` 会同时接收 `libguile` 库依赖项以及 Guile 版本所需的其他依赖项，例如 `libgc`。通常情况下，Port 不需要与其使用 Guile 相关的其他依赖项。

### 6.23.3. 配置标志

使用 Guile 的软件应使用 `pkg-config` 机制来获取编译器和链接器标志。一些较旧或特殊的 Port 可能仍在使用 `guile-config` 或直接从 `guile` 获取值，这些方法也应该有效（在某些情况下，`alias` 参数可能会有帮助）。

框架会尝试通过以下方式通知 Port 所需的 Guile 版本：

* `GUILE_EFFECTIVE_VERSION` 被添加到 `CONFIGURE_ENV` 中；
* Guile 二进制文件的完整路径被指定在 `CONFIGURE_ENV` 和 `MAKE_ENV` 中的 `GUILE` 变量；
* 如果使用了 `alias` 选项，则所需 Guile 版本的二进制文件是别名文件；
* 如果没有使用 `alias` 选项，则所需 Guile 版本的工具路径（如 `guild`、`guile-config` 等）将作为变量 `GUILD`、`GUILE_CONFIG` 等被添加到 `CONFIGURE_ENV` 和 `MAKE_ENV` 中。

对于某些 Port，可能需要通过其他方式指定版本，例如通过 `CONFIGURE_ARGS` 或 `MESON_ARGS`，具体取决于 Port。

如果这些方法都无法在存在其他版本的情况下使 Port 选择指定的 Guile 版本，最好是修补 Port 以实现此目的。如果不可行，则应指定 `conflicts` 选项，以防止在错误版本被检测到的情况下构建 Port。

### 6.23.4. 版本 flavor

安装 Guile 扩展或库的 Port，或为 Guile 预编译的 Scheme 库，应为每个支持的 Guile 版本构建一个单独的 flavor。通过添加 `flavors` 选项来实现此目的。

由于每个 flavor 必须具有不同的包名称，因此这些 Port 必须设置 `PKGNAMESUFFIX`，通常为：

```makefile
PKGNAMESUFFIX=	-${FLAVOR}
```

这些 Port 必须将 Scheme 文件安装到 `GUILE_SITE_DIR`，而不是 `GUILE_GLOBAL_SITE_DIR`，即使这些文件不是版本特定的。这通常需要修补 Port。

此外，如果此类 Port 安装 `.pc` 文件，则必须将其放置在 `GUILE_PKGCONFIG_PATH` 中，而不是放入全局 `pkgconfig` 目录。这允许依赖的 Port 为正在使用的特定 Guile 版本找到正确的配置。

如果 Guile 扩展 Port 安装 `.so` 文件，则通常必须将其放置在与 Guile 版本相关的 `extensions` 目录中。通常不应使用 `USE_LDCONFIG`。

任何由 flavor Port 安装的其他文件也必须位于版本特定的目录中，或使用版本特定的文件名。对于文档和示例，`GUILE_DOCS_DIR` 和 `GUILE_EXAMPLES_DIR` 指定了适合的位置，在这些位置 Port 应创建子目录，详见下文。

### 6.23.5. 已定义的变量

这些变量在 Port 中可用。

**表 40. 使用 Guile 的 Port 所定义的变量**

| 名称                                                                | 值                                          | 说明                                               |
| ----------------------------------------------------------------- | ------------------------------------------ | ------------------------------------------------ |
| `GUILE_VER`                                                       | `3.0`                                      | 正在使用的 Guile 版本。                                  |
| `GUILE_SFX`                                                       | `3`                                        | 用于某些名称的短后缀。仅谨慎使用；可能不是唯一的，或将来可能会改变。               |
| `GUILE_FLAVOR`                                                    | `guile30`                                  | 与所选版本对应的 flavor 名称。                              |
| `GUILE_PORT`                                                      | `lang/guile3`                              | 指定的 Guile 版本的 Port 来源。                           |
| `GUILE_PREFIX`                                                    | `${PREFIX}`                                | 用于安装的目录前缀。                                       |
| `GUILE_CMD`                                                       | `guile-3.0`                                | 带有版本后缀的 Guile 解释器名称。                             |
| `GUILE_CMDPATH`                                                   | `${LOCALBASE}/bin/guile-3.0`               | Guile 解释器的完整路径。                                  |
| `GUILD_CMD`                                                       | `guild-3.0`                                | 带有版本后缀的 Guild 工具名称。                              |
| `GUILD_CMDPATH`                                                   | `${LOCALBASE}/bin/guild-3.0`               | Guild 工具的完整路径。                                   |
| <p><code>GUILE\_**CMD</code><br><code>GUILE**\_CMDPATH</code></p> |                                            | 类似于 `GUILE_CMD` 和 `GUILE_CMDPATH`，但适用于其他工具二进制文件。 |
| `GUILE_PKGCONFIG_PATH`                                            | `${LOCALBASE}/libdata/pkgconfig/guile/3.0` | 使用 `flavors` 的 Port 应将 `.pc` 文件安装到此位置。           |
| `GUILE_INFO_PATH`                                                 | `share/info/guile3`                        | 对于使用 `flavors` 选项的 Port，`INFO_PATH` 的合适值。        |

### 6.23.6. 路径替代

以下内容定义了作为变量和 `PLIST_SUB` 条目的路径替代。变量形式以 `_DIR` 作为后缀，并且是完整路径（以 `GUILE_PREFIX` 为前缀）。

**表 41. 使用 Guile 的 Port 定义的路径替代**

| 名称                  | 值                           | 说明                          |
| ------------------- | --------------------------- | --------------------------- |
| `GUILE_GLOBAL_SITE` | `share/guile/site`          | 所有 Guile 版本共享的站点目录；通常不建议使用。 |
| `GUILE_SITE`        | `share/guile/3.0/site`      | 选定的 Guile 版本的站点目录。          |
| `GUILE_SITE_CCACHE` | `lib/guile/3.0/site-ccache` | 编译字节码文件的目录。                 |
| `GUILE_DOCS`        | `share/doc/guile30`         | 版本特定文档的父目录。                 |
| `GUILE_EXAMPLES`    | `share/examples/guile30`    | 版本特定示例的父目录。                 |

### 6.23.7. 示例

**示例 34. 使用 Guile 的应用程序 Makefile**

此示例展示了如何在构建和运行时引用所需的 Guile 库。请注意，引用必须指定一个 flavor。此示例假设应用程序使用 `pkg-config` 来定位依赖项。

```makefile
PORTNAME=	sample
DISTVERSION=	1.2.3
CATEGORIES=	whatever

MAINTAINER=	fred.bloggs@example.com
COMMENT=	Sample
WWW=		https://example.com/guile_sample/sample/

BUILD_DEPENDS=	guile-lib-${GUILE_FLAVOR}>=0.2.5:devel/guile-lib@${GUILE_FLAVOR}
RUN_DEPENDS=	guile-lib-${GUILE_FLAVOR}>=0.2.5:devel/guile-lib@${GUILE_FLAVOR}

USES=		guile:2.2,3.0 pkgconfig

.include <bsd.port.mk>
```

## 6.24. 使用 `iconv`

FreeBSD 操作系统自带了本地的 `iconv`。

对于需要 `iconv` 的软件，定义 `USES=iconv`。

当一个 Port 定义了 `USES=iconv` 时，以下变量将可用：

| 变量名                    | 目的                               | Port `iconv`（使用 WCHAR\_T 或 //TRANSLIT 扩展时） | 基础 `iconv`         |
| ---------------------- | -------------------------------- | ------------------------------------------ | ------------------ |
| `ICONV_CMD`            | `iconv` 二进制文件所在的目录               | `${LOCALBASE}/bin/iconv`                   | **/usr/bin/iconv** |
| `ICONV_LIB`            | 链接到 **libiconv** 的 `ld` 参数（如果需要） | `-liconv`                                  | （空）                |
| `ICONV_PREFIX`         | `iconv` 实现所在的目录（对配置脚本有用）         | `${LOCALBASE}`                             | **/usr**           |
| `ICONV_CONFIGURE_ARG`  | 为配置脚本预构建的配置参数                    | `--with-libiconv-prefix=${LOCALBASE}`      | （空）                |
| `ICONV_CONFIGURE_BASE` | 为配置脚本预构建的配置参数                    | `--with-libiconv=${LOCALBASE}`             | （空）                |

这两个示例自动为使用 [converters/libiconv](https://cgit.freebsd.org/ports/tree/converters/libiconv/) 或本地 `iconv` 的系统填充正确的变量值：

**示例 35. 简单的 `iconv` 使用**

```makefile
USES=		iconv
LDFLAGS+=	-L${LOCALBASE}/lib ${ICONV_LIB}
```

**示例 36. 使用 `iconv` 配置**

```makefile
USES=		iconv
CONFIGURE_ARGS+=${ICONV_CONFIGURE_ARG}
```

如上所示，当存在本地 `iconv` 时，`ICONV_LIB` 为空。这可以用来检测本地 `iconv` 并作出适当响应。

有时，程序的 **Makefile** 或配置脚本中会硬编码 `ld` 参数或搜索路径。可以通过以下方法解决此问题：

**示例 37. 修复硬编码的 `-liconv`**

```makefile
USES=		iconv

post-patch:
	@${REINPLACE_CMD} -e 's/-liconv/${ICONV_LIB}/' ${WRKSRC}/Makefile
```

在某些情况下，可能需要根据是否存在本地 `iconv` 来设置备用值或执行操作。必须在测试 `ICONV_LIB` 的值之前包含 **bsd.port.pre.mk**：

**示例 38. 检查本地 `iconv` 可用性**

```makefile
USES=		iconv

.include <bsd.port.pre.mk>

post-patch:
.if empty(ICONV_LIB)
	# 检测到本地 iconv
	@${REINPLACE_CMD} -e 's|iconv||' ${WRKSRC}/Config.sh
.endif

.include <bsd.port.post.mk>
```

## 6.25. 使用 Xfce

需要 Xfce 库或应用程序的 Port 应设置 `USES=xfce`。

特定的 Xfce 库和应用程序依赖项通过赋值给 `USE_XFCE` 来设置。它们定义在 **/usr/ports/Mk/Uses/xfce.mk** 文件中。可用的值如下：

**`USE_XFCE` 的值**

|         |                                                                                           |
| ------- | ----------------------------------------------------------------------------------------- |
| garcon  | [sysutils/garcon](https://cgit.freebsd.org/ports/tree/sysutils/garcon/)                   |
| libexo  | [x11/libexo](https://cgit.freebsd.org/ports/tree/x11/libexo/)                             |
| libgui  | [x11-toolkits/libxfce4gui](https://cgit.freebsd.org/ports/tree/x11-toolkits/libxfce4gui/) |
| libmenu | [x11/libxfce4menu](https://cgit.freebsd.org/ports/tree/x11/libxfce4menu/)                 |
| libutil | [x11/libxfce4util](https://cgit.freebsd.org/ports/tree/x11/libxfce4util/)                 |
| panel   | [x11-wm/xfce4-panel](https://cgit.freebsd.org/ports/tree/x11-wm/xfce4-panel/)             |
| thunar  | [x11-fm/thunar](https://cgit.freebsd.org/ports/tree/x11-fm/thunar/)                       |
| xfconf  | [x11/xfce4-conf](https://cgit.freebsd.org/ports/tree/x11/xfce4-conf/)                     |

**示例 39. `USES=xfce` 示例**

```makefile
USES=		xfce
USE_XFCE=	libmenu
```

**示例 40. 使用 Xfce 的 GTK2 小部件**

在此示例中，Port 化的应用程序使用 GTK2 特定的小部件 [x11/libxfce4menu](https://cgit.freebsd.org/ports/tree/x11/libxfce4menu/) 和 [x11/xfce4-conf](https://cgit.freebsd.org/ports/tree/x11/xfce4-conf/)。

```makefile
USES=		xfce:gtk2
USE_XFCE=	libmenu xfconf
```

> **提示**
>
> Xfce 组件通过这种方式包含时，会自动包括它们所需的任何依赖项。现在不再需要列出整个依赖列表。如果 Port 仅需要 [x11-wm/xfce4-panel](https://cgit.freebsd.org/ports/tree/x11-wm/xfce4-panel/)，只需使用以下配置：
>
> ```makefile
> USES=		xfce
> USE_XFCE=	panel
> ```
>
> 不需要像这样列出 [x11-wm/xfce4-panel](https://cgit.freebsd.org/ports/tree/x11-wm/xfce4-panel/) 所需的组件：
>
> ```makefile
> USES=		xfce
> USE_XFCE=	libexo libmenu libutil panel
> ```
>
> 但是，Xfce 组件和 Port 的非 Xfce 依赖项必须显式包含。不要指望某个 Xfce 组件会为主 Port 提供除了它本身之外的子依赖项。

## 6.26. 使用 Budgie

依赖于 Budgie 桌面的应用程序或库应设置 `USES=budgie` 并将 `USE_BUDGIE` 设置为所需组件的列表。

| 名称            | 说明                      |
| ------------- | ----------------------- |
| `libbudgie`   | 桌面核心（库）                 |
| `libmagpie`   | Budgie 的 X11 窗口管理器和合成器库 |
| `raven`       | 用于访问不同应用程序小部件的面板一体化中心   |
| `screensaver` | 桌面特定的屏幕保护程序             |

> **注意**
>
> 所有应用程序小部件通过 **org.budgie\_desktop.Raven** 服务进行通信。默认的依赖项是库和运行时，可以通过 `:build` 或 `:run` 来更改。例如：
>
> ```makefile
> USES=		budgie
> USE_BUDGIE=	screensaver:build
> ```

**示例 41. `USE_BUDGIE` 示例**

```makefile
USES=		budgie gettext gnome meson pkgconfig
USE_BUDGIE=	libbudgie
```

## 6.27. 使用数据库

使用以下 `USES` 宏之一来添加数据库依赖项，具体参考 [Database `USES` Macros](https://docs.freebsd.org/en/books/porters-handbook/special/#using-databases-uses)。

**数据库 `USES` 宏**

| 数据库                     | `USES` 宏                                                                         |
| ----------------------- | -------------------------------------------------------------------------------- |
| Berkeley DB             | [`bdb`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-bdb)       |
| MariaDB, MySQL, Percona | [`mysql`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-mysql)   |
| PostgreSQL              | [`pgsql`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-pgsql)   |
| SQLite                  | [`sqlite`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-sqlite) |

**示例 42. 使用 Berkeley DB 6**

```makefile
USES=	bdb:6
```

详见 [`bdb`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-bdb)。

**示例 43. 使用 MySQL**

当 Port 需要 MySQL 客户端库时，添加：

```makefile
USES=	mysql
```

详见 [`mysql`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-mysql)。

**示例 44. 使用 PostgreSQL**

当 Port 需要 PostgreSQL 9.6 或更高版本的服务器时，添加：

```makefile
USES=		pgsql:9.6+
WANT_PGSQL=	server
```

详见 [`pgsql`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-pgsql)。

**示例 45. 使用 SQLite 3**

```makefile
USES=	sqlite:3
```

详见 [`sqlite`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-sqlite)。

## 6.28. 启动和停止服务（`rc` 脚本）

**rc.d** 脚本用于在系统启动时启动服务，并为管理员提供一种标准的方式来停止、启动和重新启动服务。Port 集成到系统 **rc.d** 框架中。有关其用法的详细信息，可以参见 [rc.d Handbook 章节](https://docs.freebsd.org/en/books/handbook/#configtuning-rcd)。有关可用命令的详细解释，请参见 [rc(8)](https://man.freebsd.org/cgi/man.cgi?query=rc\&sektion=8\&format=html) 和 [rc.subr(8)](https://man.freebsd.org/cgi/man.cgi?query=rc.subr\&sektion=8\&format=html)。此外，还有一篇关于 **rc.d** 脚本实践方面的 [文章](https://docs.freebsd.org/en/articles/rc-scripting/)。

假设有一个名为 *doorman* 的虚拟 Port，需要启动 *doormand* 守护进程。在 **Makefile** 中添加以下内容：

```makefile
USE_RC_SUBR=	doormand
```

可以列出多个脚本，它们将被安装。脚本必须放在 **files** 子目录中，并且文件名必须添加 `.in` 后缀。标准的 `SUB_LIST` 展开将会应用到这个文件上。强烈建议使用 `%%PREFIX%%` 和 `%%LOCALBASE%%` 展开。有关 `SUB_LIST` 的更多信息，请参见 [相关章节](https://docs.freebsd.org/en/books/porters-handbook/pkg-files/#using-sub-files)。

自 FreeBSD 6.1-RELEASE 以来，本地的 **rc.d** 脚本（包括 Port 安装的）已包含在基本系统的 [rcorder(8)](https://man.freebsd.org/cgi/man.cgi?query=rcorder\&sektion=8\&format=html) 中。

这是一个简单的 **rc.d** 脚本示例，用于启动 *doormand* 守护进程：

```sh
#!/bin/sh

# PROVIDE: doormand
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
# 添加以下行到 /etc/rc.conf.local 或 /etc/rc.conf 来启用此服务：
#
# doormand_enable (bool): 默认为 NO。 设置为 YES 启用 doormand。
# doormand_config (path): 默认为 %%PREFIX%%/etc/doormand/doormand.cf

. /etc/rc.subr

name=doormand
rcvar=doormand_enable

load_rc_config $name

: ${doormand_enable:="NO"}
: ${doormand_config="%%PREFIX%%/etc/doormand/doormand.cf"}

command=%%PREFIX%%/sbin/${name}
pidfile=/var/run/${name}.pid

command_args="-p $pidfile -f $doormand_config"

run_rc_command "$1"
```

除非有非常充分的理由需要更早启动服务，或者服务以特定用户（非 root）身份运行，所有 Port 脚本必须使用：

```sh
REQUIRE: LOGIN
```

如果启动脚本启动了必须在系统关闭时停止的守护进程，以下设置将触发服务在系统关闭时停止：

```sh
KEYWORD: shutdown
```

如果脚本启动的不是持久化服务，则不需要此设置。

对于可选的配置元素，最好使用 `=` 风格的默认变量赋值，而不是 `:=` 风格，因为前者仅在变量未设置时设置默认值，而后者则会在变量未设置 *或* 为空时设置默认值。例如，用户可能在 **rc.conf.local** 中包含如下内容：

```sh
doormand_flags=""
```

使用 `:=` 的变量替换会不适当地覆盖用户的意图。`_enable` 变量是不可选的，必须使用 `:` 来设置默认值。

> **重要**
>
> Port *不能* 在安装和卸载时启动和停止其服务。不要滥用 [@preexec 命令、@postexec 命令、@preunexec 命令、@postunexec 命令](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-keywords-base-exec) 中说明的 **plist** 关键字，通过运行修改当前运行系统的命令，包括启动或停止服务。

### 6.28.1. 提交前检查清单

在提交一个包含 **rc.d** 脚本的 Port 之前，尤其是提交之前，请查阅以下检查清单，以确保它已经准备好。

[devel/rclint](https://cgit.freebsd.org/ports/tree/devel/rclint/) Port 可以检查其中的大部分内容，但它不能替代适当的代码审查。

1. 如果这是一个新文件，它是否具有 **.sh** 扩展名？如果是的话，必须将其更改为 **file.in**，因为 **rc.d** 文件不能以该扩展名结尾。
2. 文件名（去掉 **.in** 后），`PROVIDE` 行和 `$` *name* 是否匹配？文件名与 `PROVIDE` 匹配可以使调试变得更容易，特别是对于 [rcorder(8)](https://man.freebsd.org/cgi/man.cgi?query=rcorder\&sektion=8\&format=html) 问题。匹配文件名和 `$` *name* 可以更容易地弄清楚哪些变量在 **rc.conf\[.local]** 中是相关的。这也是所有新脚本的政策，包括基本系统中的脚本。
3. `REQUIRE` 行是否设置为 `LOGIN`？这是运行为非 root 用户的脚本的强制要求。如果它以 root 身份运行，是否有充分的理由让它在 `LOGIN` 之前运行？如果没有，它必须在后面运行，以便本地脚本可以大致分组到 [rcorder(8)](https://man.freebsd.org/cgi/man.cgi?query=rcorder\&sektion=8\&format=html) 中大多数基础服务已启动后的位置。
4. 脚本是否启动了一个持久性服务？如果是的话，必须添加 `KEYWORD: shutdown`。
5. 确保没有 `KEYWORD: FreeBSD`。多年来这已经不必要也不可取了。这也是新脚本可能是从旧脚本复制/粘贴的一个迹象，因此审查时必须格外小心。
6. 如果脚本使用像 `perl`、`python` 或 `ruby` 这样的解释性语言，请确保 `command_interpreter` 设置得当，例如，对于 Perl，添加 `PERL=${PERL}` 到 `SUB_LIST` 并使用 `%%PERL%%`。否则，

   ```sh
   # service name stop
   ```

   可能无法正确工作。请参阅 [service(8)](https://man.freebsd.org/cgi/man.cgi?query=service\&sektion=8\&format=html) 获取更多信息。
7. 所有 **/usr/local** 的出现是否都已被替换为 `%%PREFIX%%`？
8. 默认变量赋值是否出现在 `load_rc_config` 之后？
9. 是否有默认的空字符串赋值？它们应该被删除，但请再次确认该选项是否在文件顶部的注释中有所记录。
10. 脚本中设置的变量是否被实际使用？
11. 默认的 `name_flags` 中列出的选项是否确实是必须的？如果是，它们必须在 `command_args` 中。`-d` 是这里的一个警告标志（请原谅这个双关语），因为它通常是“守护进程化”过程的选项，因此实际上是必须的。
12. `_name__flags` 绝不能出现在 `command_args` 中（反之亦然，尽管这种错误较少见）。
13. 脚本是否无条件执行任何代码？这是不被推荐的。通常这些事情必须通过 `start_precmd` 进行处理。
14. 所有布尔测试必须使用 `checkyesno` 函数。不要手动编写 `[Yy][Ee][Ss]` 等测试。
15. 如果有一个循环（例如，等待某些东西启动），是否有一个计数器来终止该循环？如果出现错误，我们不希望引导过程永远卡住。
16. 脚本是否创建了需要特定权限的文件或目录，例如需要由运行该进程的用户拥有的 **pid**？与传统的 [touch(1)](https://man.freebsd.org/cgi/man.cgi?query=touch\&sektion=1\&format=html)/[chown(8)](https://man.freebsd.org/cgi/man.cgi?query=chown\&sektion=8\&format=html)/[chmod(1)](https://man.freebsd.org/cgi/man.cgi?query=chmod\&sektion=1\&format=html) 例程不同，考虑使用 [install(1)](https://man.freebsd.org/cgi/man.cgi?query=install\&sektion=1\&format=html) 并提供适当的命令行参数，一步完成整个过程。

## 6.29. 添加用户和组

一些 Ports 需要特定的用户帐户，通常用于以该用户身份运行的守护进程。对于这些 Ports，请从 50 到 999 中选择一个 *唯一* 的 UID，并在 **ports/UIDs**（用于用户）和 **ports/GIDs**（用于组）中注册它。用户和组的唯一标识符应当相同。

当需要为 Port 创建新用户或组时，请包括这两个文件的补丁。

然后在 **Makefile** 中使用 `USERS` 和 `GROUPS`，用户将在安装该 Port 时自动创建。

```makefile
USERS=	pulse
GROUPS=	pulse pulse-access pulse-rt
```

当前保留的 UID 和 GID 列表可以在 **ports/UIDs** 和 **ports/GIDs** 中找到。

## 6.30. 依赖内核源代码的 Ports

一些 Ports（例如内核加载模块）需要内核源代码文件，以便能够编译。正确的判断用户是否已安装这些文件的方法如下：

```makefile
USES=	kmod
```

除了这个检查，`kmod` 特性会处理这些 Ports 需要考虑的大部分事项。

## 6.31. Go 库

Ports 不得打包或安装 Go 库或源代码。Go Ports 必须在正常的获取阶段获取所需的依赖项，并且只应安装用户所需要的程序和内容，而不是 Go 开发人员需要的内容。

Ports 应该（按优先顺序）：

* 使用与包源一起提供的供应依赖项。
* 获取上游指定的依赖版本（如果使用 go.mod、vendor.json 或类似文件）。
* 作为最后的手段（如果没有包含依赖或未明确指定版本）获取上游开发/发布时可用的依赖版本。

## 6.32. Haskell 库

与 Go 语言一样，Ports 不得打包或安装 Haskell 库。Haskell Ports 必须静态链接它们的依赖，并在获取阶段获取所有的分发文件。

## 6.33. Shell 完成文件

许多现代 shell（包括 bash、fish、tcsh 和 zsh）都支持参数和/或选项的 Tab 补全。这种支持通常来自完成文件，这些文件包含如何为某个命令工作进行 Tab 补全的定义。Ports 有时会附带自己的完成文件，或者 Port 维护者可能已经自己创建了它们。

如果有可用的完成文件，应该始终安装它们。没有必要为此创建选项。如果使用了选项，则始终在 `OPTIONS_DEFAULT` 中启用它。

**表 43. 完整的 shell 完成文件名**

| `bash` | **${PREFIX}/etc/bash\_completion.d** 或 **${PREFIX}/share/bash-completion/completions** | （这些文件夹中的任何唯一文件名） |
| ------ | -------------------------------------------------------------------------------------- | ---------------- |
| `fish` | **${PREFIX}/share/fish/completions/${PORTNAME}.fish**                                  |                  |
| `zsh`  | **${PREFIX}/share/zsh/site-functions/\_${PORTNAME}**                                   |                  |

不要注册对 shell 本身的任何依赖。


# 7.1.Flavors 简介

Flavors 是让一个 Port 拥有多种变体的一种方式。该 Port 会被构建多次，每次使用不同的变体。

例如，一个 Port 可以有一个带有许多功能和相当多依赖的普通版本，也可以有一个只包含基本功能和最少依赖的轻量级“lite”版本。

另一个例子是，一个 Port 可以有 GTK flavor 和 QT flavor，取决于它使用的是哪种工具包。


# 7.2.使用 FLAVORS

要声明一个具有多个 flavor 的 Port，需要在其 **Makefile** 中添加 `FLAVORS`。`FLAVORS` 中的第一个 flavor 是默认的 flavor。

> **技巧**
>
> 同时定义 `FLAVOR` 为 `FLAVOR?= ${FLAVORS:[1]}` 有助于简化 **Makefile** 的逻辑。

> **重要**
>
> 为了将 flavor 与总是使用大写字母的选项区分开来，flavor 名称*只能*包含小写字母、数字和下划线 `_`。

**示例 1：基本的 Flavors 用法**

如果某个 Port 有一个“精简版”从属 Port，那么可以移除该从属 Port，并将该 Port 转换为 flavors，如下所示：

```sh
FLAVORS=	default lite
lite_PKGNAMESUFFIX=	-lite
[...]
.if ${FLAVOR:U} != lite
[启用非 lite 功能]
.endif
```

**示例 2：另一种基本的 Flavors 用法**

如果某个 Port 有一个 `-nox11` 从属 Port，那么可以移除该从属 Port，并将该 Port 转换为 flavors，如下所示：

```sh
FLAVORS=	x11 nox11
FLAVOR?=	${FLAVORS:[1]}
nox11_PKGNAMESUFFIX=	-nox11
[...]
.if ${FLAVOR} == x11
[启用 x11 功能]
.endif
```

**示例 3. 更复杂的 Flavors 用法**

以下是经过略微修改的 [devel/libpeas](https://cgit.freebsd.org/ports/tree/devel/libpeas/) 的一段内容节选，这是一个使用了 [Python flavors](https://docs.freebsd.org/en/books/porters-handbook/flavors/#flavors-auto-python) 的 Port。由于默认的 Python 2 和 3 版本是 2.7 和 3.6，它会自动获得 `FLAVORS=py27 py36`

```makefile
USES=		gnome python
USE_PYTHON=	flavors

.if ${FLAVOR:Upy27:Mpy2*}
USE_GNOME=	pygobject3

CONFIGURE_ARGS+=	--enable-python2 --disable-python3

BUILD_WRKSRC=	${WRKSRC}/loaders/python
INSTALL_WRKSRC=	${WRKSRC}/loaders/python
.else # py3*
USE_GNOME+=	py3gobject3

CONFIGURE_ARGS+=	--disable-python2 --enable-python3 \
			ac_cv_path_PYTHON3_CONFIG=${LOCALBASE}/bin/python${PYTHON_VER}-config

BUILD_WRKSRC=	${WRKSRC}/loaders/python3
INSTALL_WRKSRC=	${WRKSRC}/loaders/python3
.endif

py34_PLIST=	${.CURDIR}/pkg-plist-py3
py35_PLIST=	${.CURDIR}/pkg-plist-py3
py36_PLIST=	${.CURDIR}/pkg-plist-py3
```

这个 Port 没有使用 `USE_PYTHON=distutils`，但仍然需要 Python flavors。为了防止 `FLAVOR` 为空（这会导致 [make(1)](https://man.freebsd.org/cgi/man.cgi?query=make\&sektion=1\&format=html) 出错），应在字符串比较中使用 `${FLAVOR:U}` 而不是 `${FLAVOR}`。Gnome 的 Python gobject3 绑定在 Python 2 和 Python 3 中名称不同，分别为 pygobject3 和 py3gobject3。虽然 `configure` 脚本必须在 **${WRKSRC}** 中运行，但我们只关心构建和安装 Python 2 或 Python 3 部分，因此需要相应地设置构建和安装的基础目录。此外，还提示了正确的 Python 3 config 脚本路径名。使用 Python 3 构建时的软件包列表是不同的，由于可能有三个 Python 3 版本，因此要使用 [辅助机制](https://docs.freebsd.org/en/books/porters-handbook/flavors/#flavors-using-helpers) 为这三个版本设置 `PLIST`。

## 7.2.1. Flavors 辅助机制

为了简化 **Makefile** 的编写，提供了一些 flavors 的辅助机制。

以下这些辅助机制会**设置**对应变量的值：

* `flavor_PKGNAMEPREFIX`
* `flavor_PKGNAMESUFFIX`
* `flavor_PLIST`
* `flavor_DESCR`

以下这些辅助机制会**追加**到对应变量中：

* `flavor_CONFLICTS`
* `flavor_CONFLICTS_BUILD`
* `flavor_CONFLICTS_INSTALL`
* `flavor_PKG_DEPENDS`
* `flavor_EXTRACT_DEPENDS`
* `flavor_PATCH_DEPENDS`
* `flavor_FETCH_DEPENDS`
* `flavor_BUILD_DEPENDS`
* `flavor_LIB_DEPENDS`
* `flavor_RUN_DEPENDS`
* `flavor_TEST_DEPENDS`

**示例 4：为特定 flavor 设置 `PKGNAME`**

由于所有的包必须具有不同的包名，因此 flavors 必须修改各自的包名，使用 `flavor_PKGNAMEPREFIX` 和 `flavor_PKGNAMESUFFIX` 可以轻松实现：

```makefile
FLAVORS=	normal lite
lite_PKGNAMESUFFIX=	-lite
```


# 7.3.USES=php 和 Flavors

当使用 [`php`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-php) 并带有以下参数之一：`phpize`、`ext`、`zend` 或 `pecl` 时，该 Port 会自动填充 `FLAVORS`，其中包含它支持的 PHP 版本。

**示例 5. 简单的 `USES=php` 扩展**

以下写法将为所有支持的版本生成包：

```makefile
PORTNAME=	some-ext
PORTVERSION=	0.0.1
PKGNAMEPREFIX=	${PHP_PKGNAMEPREFIX}

USES=		php:ext
```

以下写法将为所有支持的版本生成包，但排除 7.2：

```makefile
PORTNAME=	some-ext
PORTVERSION=	0.0.1
PKGNAMEPREFIX=	${PHP_PKGNAMEPREFIX}

USES=		php:ext
IGNORE_WITH_PHP=	72
```

## 7.3.1. 带 PHP 应用的 PHP Flavors

PHP 应用也可以支持 flavor。

这样可以为所有 PHP 版本生成包，方便用户在其服务器上使用所需的 PHP 版本。

> **重要**
>
> 支持 flavor 的 PHP 应用*必须*在其包名中追加 `PHP_PKGNAMESUFFIX`。

**示例 6：为 PHP 应用添加 Flavors 支持**

为 PHP 应用添加 flavor 支持非常简单：

```makefile
PKGNAMESUFFIX=	${PHP_PKGNAMESUFFIX}

USES=	php:flavors
```

> **技巧**
>
> 当添加对支持 PHP flavor 的 Port 的依赖时，使用 `@${PHP_FLAVOR}`。*绝不要*直接使用 `FLAVOR`。


# 7.4.USES=python 和 Flavors

当使用 [`python`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-python) 并设置了 `USE_PYTHON=distutils` 时，Port 会自动填充 `FLAVORS`，其中包含它所支持的 Python 版本。

**示例 7. 简单的 `USES=python`**

假设当前支持的 Python 版本是 2.7、3.4、3.5 和 3.6，且默认的 Python 2 和 Python 3 版本分别是 2.7 和 3.6，那么以下写法：

```makefile
USES=	python
USE_PYTHON=	distutils
```

将获得这些 flavor：`py27` 和 `py36`。

```makefile
USES=	python
USE_PYTHON=	distutils allflavors
```

将获得这些 flavor：`py27`、`py34`、`py35` 和 `py36`。

**示例 8：带版本要求的 `USES=python`**

假设当前支持的 Python 版本是 2.7、3.4、3.5 和 3.6，且默认的 Python 2 和 Python 3 版本分别是 2.7 和 3.6，那么以下写法：

```makefile
USES=	python:-3.5
USE_PYTHON=	distutils
```

将获得这个 flavor：`py27`。

```makefile
USES=	python:-3.5
USE_PYTHON=	distutils allflavors
```

将获得这些 flavor：`py27`、`py34` 和 `py35`。

```makefile
USES=	python:3.4+
USE_PYTHON=	distutils
```

将获得这个 flavor：`py36`。

```makefile
USES=	python:3.4+
USE_PYTHON=	distutils allflavors
```

将获得这些 flavor：`py34`、`py35` 和 `py36`。

可以使用 `PY_FLAVOR` 来依赖正确版本的 Python 模块。所有对支持 flavor 的 Python Port 的依赖都应使用 `PY_FLAVOR`，而不是直接使用 `FLAVOR`。

**示例 9. 适用于未使用 `distutils` 的 Port**

如果默认的 Python 3 版本是 3.6，以下写法将把 `PY_FLAVOR` 设置为 `py36`：

```makefile
RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}mutagen>0:audio/py-mutagen@${PY_FLAVOR}

USES=	python:3.5+
```


# 7.5.USES=lua 和 Flavors

当使用 [`lua:module`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-lua) 或 [`lua:flavors`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-lua) 时，Port 会自动填充 `FLAVORS`，其中包含它所支持的 Lua 版本。不过，普通的应用程序（而不是 Lua 模块）通常不应使用这个功能；大多数嵌入或使用 Lua 的应用程序只需简单地使用 `USES=lua`。

`LUA_FLAVOR` 是可用的（并且必须使用）变量，用于依赖正确版本的依赖项，无论该 Port 是否使用了 `flavors` 或 `module` 参数。

有关更多信息，请参见 [使用 Lua](https://docs.freebsd.org/en/books/porters-handbook/special/#using-lua)。


# 7.6.USES=guile 和 Flavors

当使用 [`guile:flavors`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-guile) 时，Port 会自动填充 `FLAVORS`，其中包含它所支持的 Guile 版本。不过，普通的应用程序通常不应使用这个功能；它主要用于库和扩展，例如 `guile-lib` 或 `guile-cairo`。

`GUILE_FLAVOR` 是可用的（并且必须使用）变量，用于依赖正确版本的、带 flavor 的依赖项，无论该 Port 是否使用了 `flavors` 参数。

有关更多信息，请参见 [使用 Guile](https://docs.freebsd.org/en/books/porters-handbook/special/#using-guile)。


# 8.1.根据 make 变量对 pkg-plist 进行修改

某些 Port，尤其是以 `p5-` 开头的 Port，需要根据配置的选项（或 `p5-` Port 中 `perl` 的版本）更改其 **pkg-plist**。为简化此操作，**pkg-plist** 中出现的 `%%OSREL%%`、`%%PERL_VER%%` 和 `%%PERL_VERSION%%` 会被自动替换为适当的值。`%%OSREL%%` 的值是操作系统的数字版本（例如 `4.9`）；`%%PERL_VERSION%%` 和 `%%PERL_VER%%` 是 `perl` 的完整版本号（例如 `5.8.9`）。还有其他一些与 Port 文档文件相关的 `%%_VARS_%%` 替换项，在[相关章节](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#install-documentation)中有说明。

要进行自定义替换，可以在 **Makefile** 中设置 `PLIST_SUB` 为 *VAR=VALUE* 形式的列表，**pkg-plist** 中出现的 `%%_VAR_%%` 就会被替换为 *VALUE*。

例如，如果一个 Port 在按版本划分的子目录中安装了多个文件，可以使用占位符表示版本号，这样 Port 升级时就无需每次都重新生成 **pkg-plist**。可以这样设置：

```makefile
OCTAVE_VERSION=	${PORTREVISION}
PLIST_SUB=	OCTAVE_VERSION=${OCTAVE_VERSION}
```

然后在 **pkg-plist** 中使用 `%%OCTAVE_VERSION%%` 来代表版本号出现的位置。这样当 Port 升级时，就无需编辑数十（在某些情况下，数百）行 **pkg-plist**。

如果文件的安装取决于 Port 的选项设置，则常见的处理方法是在 **pkg-plist** 行前加上 `%%OPT%%`（表示启用该选项时需要安装该文件），或 `%%NO_OPT%%`（表示禁用该选项时需要安装该文件），并在 **Makefile** 中添加 `OPTIONS_SUB=yes`。详见 [`OPTIONS_SUB`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options_sub)。

例如，如果有些文件只在启用了 `X11` 选项时才安装，并且 **Makefile** 中有：

```makefile
OPTIONS_DEFINE=	X11
OPTIONS_SUB=	yes
```

则在 **pkg-plist** 中，应在仅在启用该选项时才安装的行前加上 `%%X11%%`，例如：

```sh
%%X11%%bin/foo-gui
```

这种替换是在 `pre-install` 和 `do-install` 目标之间完成的，通过读取 **PLIST** 并写入 **TMPPLIST**（默认为 **WRKDIR/.PLIST.mktmp**）。因此，如果 Port 是动态构建 **PLIST**，则必须在 `pre-install` 或之前完成此操作。如果需要修改生成后的文件，应在 `post-install` 中对 **TMPPLIST** 文件进行操作。

另一种修改 Port 软件包列表的方式是设置变量 `PLIST_FILES` 和 `PLIST_DIRS`。它们的值被视为路径列表，将连同 **PLIST** 内容一并写入 **TMPPLIST**。尽管这些名称同样支持 `%%_VAR_%%` 替换，但建议直接使用 `${_VAR_}`。除此之外，`PLIST_FILES` 中的名称会原样出现在最终的软件包列表中，而 `PLIST_DIRS` 中的名称前会加上 `@dir`。这两个变量必须在写入 **TMPPLIST** 之前设置，也就是要在 `pre-install` 或更早的时候设置。

有时，仅使用 `OPTIONS_SUB` 并不够。在这些情况下，可以在 **Makefile** 的 `PLIST_SUB` 中为某个特定 *TAG* 设置特殊值 `@comment`，从而使打包工具忽略对应的行。例如，某些文件只在启用了 `X11` 且架构为 `i386` 时才会被安装，可以这样设置：

```makefile
.include <bsd.port.pre.mk>

.if ${PORT_OPTIONS:MX11} && ${ARCH} == "i386"
PLIST_SUB+=	X11I386=""
.else
PLIST_SUB+=	X11I386="@comment "
.endif
```


# 8.2.空目录

## 8.2.1. 清理空目录

在卸载 Port 时，必须删除它所创建的空目录。大多数目录会被 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 自动删除，但对于在 **${PREFIX}** 之外创建的目录或本身为空的目录，则需要额外处理。通常通过为这些目录添加 `@dir` 行来实现。删除时必须先删除子目录，再删除父目录。

```sh
[...]
@dir /var/games/oneko/saved-games
@dir /var/games/oneko
```

## 8.2.2. 创建空目录

Port 安装过程中创建的空目录需要特别注意。在生成软件包时，这些目录必须存在。如果 Port 的代码没有自动创建这些目录，就需要在 **Makefile** 中显式创建：

```makefile
post-install:
	${MKDIR} ${STAGEDIR}${PREFIX}/some/directory
```

像对待其他条目一样将该目录添加进 **pkg-plist**，例如：

```sh
@dir some/directory
```


# 8.3.配置文件

如果 Port 将配置文件安装到 **PREFIX/etc**（或其他目录），**不要**在 **pkg-plist** 中列出这些文件。这样做会导致 `pkg delete` 删除用户精心编辑过的文件，而重新安装时也会将其覆盖。

正确做法是安装带有 **filename.sample** 扩展名的示例文件。`@sample` 宏可以自动完成这一过程，详见 [用关键词扩展软件包列表](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-keywords-sample)。对于每个示例文件，在 **pkg-plist** 中添加如下行：

```sh
@sample etc/orbit.conf.sample
```

如果确有充分理由不默认安装一个可用的配置文件，仅在 **pkg-plist** 中列出示例文件名，不添加 `@sample` 前缀，并添加 [消息提示](https://docs.freebsd.org/en/books/porters-handbook/pkg-files/#porting-message)，告知用户必须手动复制并编辑该文件以使软件正常工作。

> **技巧**
>
> 如果 Port 的配置文件安装在 **${PREFIX}/etc** 的某个子目录中，应使用 `ETCDIR`。该变量默认值为 `${PREFIX}/etc/${PORTNAME}`，如果 Port 惯例上使用其他目录，可以在 Port 的 **Makefile** 中覆盖此默认值。在 **pkg-plist** 中用 `%%ETCDIR%%` 来代替路径。

> **注意**
>
> 示例配置文件应始终使用 **.sample** 后缀。如果出于历史原因无法使用标准后缀，或示例文件位于其他目录中，可以使用如下格式：
>
> ```sh
> @sample etc/orbit.conf-dist etc/orbit.conf
> ```
>
> 或
>
> ```sh
> @sample %%EXAMPLESDIR%%/orbit.conf etc/orbit.conf
> ```
>
> 格式为 `@sample _sample-file actual-config-file_`。


# 8.4.动态与静态软件包列表

静态软件包列表是指在 Ports Collection 中可用的软件包列表，可以是 **pkg-plist**（无论是否使用变量替换）或通过 `PLIST_FILES` 和 `PLIST_DIRS` 嵌入在 **Makefile** 中。即使内容是在提交者将其加入 Ports Collection 之前，通过工具或 Makefile 中的目标自动生成的（例如，使用 `make makeplist`），它仍然被视为静态列表，因为在不下载或编译源文件的情况下，可以检查其内容。

动态软件包列表是指在编译 Port 时根据安装的文件和目录生成的软件包列表。在下载和编译源代码之前，或在运行 `make clean` 之后，都无法检查它。

尽管使用动态软件包列表并不被禁止，但维护者应尽可能使用静态软件包列表，因为这样可以使用户通过 [grep(1)](https://man.freebsd.org/cgi/man.cgi?query=grep\&sektion=1\&format=html) 查询现有 Port，从而发现例如哪些 Port 安装了某个特定的文件。动态软件包列表主要应当用于复杂的 Port（其软件包列表会根据 Port 的可选特性发生重大变化，因此维护静态软件包列表不可行），或软件包列表会根据所使用的依赖软件版本发生变化的 Port。例如，生成 Javadoc 文档的 Port。


# 8.5.自动创建软件包列表

首先，确保 Port 几近完工，仅缺失 **pkg-plist**。运行 `make makeplist` 会显示 **pkg-plist** 的示例。`makeplist` 的输出必须仔细检查其正确性，因为它会自动猜测一些内容，可能会出错。

用户配置文件应该安装为 **filename.sample**，如 [配置文件](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-config) 中所述。**info/dir** 不能列出，并且必须按照 [info 文件](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-info) 部分的说明添加适当的 **install-info** 行。Port 安装的任何库必须按 [共享库](https://docs.freebsd.org/en/books/porters-handbook/special/#porting-shlibs) 部分的说明列出。

### 8.5.1. 使用正则表达式扩展 `PLIST_SUB`

有时要替换的字符串需要非常具体，以避免不必要的替换。对于较短的值，这是一个常见问题。

为了解决这个问题，可以为每个 *PLACEHOLDER*=*value* 设置 `PLACEHOLDER_regex=regex`，其中 *regex* 部分会更精确地匹配 *value*。

**示例 1. 使用正则表达式的 PLIST\_SUB**

Perl Port 可以在特定的树中安装依赖于架构的文件。在 FreeBSD 上，为了简化 Port 移植，这个树叫做 `mach`。例如，一个安装文件路径中包含 `mach` 的 Port，可能会错误地替换路径字符串中的一部分。考虑以下 **Makefile**：

```makefile
PORTNAME=	Machine-Build
DISTVERSION=	1
CATEGORIES=	devel perl5
MASTER_SITES=	CPAN
PKGNAMEPREFIX=	p5-

MAINTAINER=	perl@FreeBSD.org
COMMENT=	Building machine
WWW=		https://search.cpan.org/dist/Machine-Build

USES=		perl5
USE_PERL5=	configure

PLIST_SUB=	PERL_ARCH=mach
```

该 Port 安装的文件如下：

```sh
/usr/local/bin/machine-build
/usr/local/lib/perl5/site_perl/man/man1/machine-build.1.gz
/usr/local/lib/perl5/site_perl/man/man3/Machine::Build.3.gz
/usr/local/lib/perl5/site_perl/Machine/Build.pm
/usr/local/lib/perl5/site_perl/mach/5.20/Machine/Build/Build.so
```

运行 `make makeplist` 错误地生成：

```sh
bin/%%PERL_ARCH%%ine-build
%%PERL5_MAN1%%/%%PERL_ARCH%%ine-build.1.gz
%%PERL5_MAN3%%/Machine::Build.3.gz
%%SITE_PERL%%/Machine/Build.pm
%%SITE_PERL%%/%%PERL_ARCH%%/%%PERL_VER%%/Machine/Build/Build.so
```

将 **Makefile** 中的 `PLIST_SUB` 行更改为：

```makefile
PLIST_SUB=	PERL_ARCH=mach \
		PERL_ARCH_regex=\bmach\b
```

现在 `make makeplist` 正确生成：

```sh
bin/machine-build
%%PERL5_MAN1%%/machine-build.1.gz
%%PERL5_MAN3%%/Machine::Build.3.gz
%%SITE_PERL%%/Machine/Build.pm
%%SITE_PERL%%/%%PERL_ARCH%%/%%PERL_VER%%/Machine/Build/Build.so
```


# 8.6.用关键词扩展软件包列表

所有关键字也可以带有可选的括号参数。这些参数是所有者、组和模式。该参数应用于所引用的文件或目录。要更改配置文件的所有者、组和模式，请使用：

```sh
@sample(games,games,640) etc/config.sample
```

这些参数是可选的。如果只需要更改组和模式，请使用：

```sh
@sample(,games,660) etc/config.sample
```

> **警告**
>
> 如果关键字用于 [可选](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-options) 条目，必须在帮助器之后添加：
>
> ```sh
> %%FOO%%@sample etc/orbit.conf.sample
> ```
>
> 这是因为选项 plist 帮助器用于注释该行，因此它们需要放在前面。有关更多信息，请参见 [`OPTIONS_SUB`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#options_sub)。

## 8.6.1. `@desktop-file-utils`

安装和卸载后将运行 `update-desktop-database -q`。*永远*不要直接使用，应该在 **Makefile** 中添加 [`USES=desktop-file-utils`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-desktop-file-utils)。

## 8.6.2. `@fc` *directory*

为作为参数传递的目录添加一个 `@dir` 条目，并在安装和卸载后对该目录运行 `fc-cache -fs` 命令。

## 8.6.3. `@fontsdir` *directory*

为作为参数传递的目录添加一个 `@dir` 条目，并在安装和卸载后对该目录运行 `mkfontscale` 和 `mkfontdir` 命令。此外，在卸载时，如果 **fonts.scale** 和 **fonts.dir** 缓存文件为空，还会将其删除。

## 8.6.4. `@info` *file*

将作为参数传递的文件添加到 plist，并在安装和卸载时更新 info 文档索引。此外，在卸载时，如果索引为空，还会删除该索引。永远不要手动使用此项，而应该通过 `INFO` 使用。有关更多信息，请参见 [info 文件](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-info)。

## 8.6.5. `@kld` *directory*

在安装和卸载时对该目录运行 `kldxref`。此外，在卸载时，如果目录为空，还会删除该目录。

## 8.6.6. `@rmtry` *file*

在卸载时删除该文件，如果文件不存在，则不报错。

## 8.6.7. `@sample` *file* \[*file*]

用于通过软件包中捆绑的示例文件处理配置文件的安装。非示例文件（实际文件）是第二个文件名（如果存在），或者是第一个文件名去掉 **.sample** 后缀的版本。

此关键字执行三项操作。首先，将作为参数传递的第一个文件（示例文件）添加到 plist。然后，在安装时，如果找不到实际文件，则将示例文件复制到实际文件。最后，在卸载时，如果实际文件没有被修改，则删除该文件。有关更多信息，请参见 [配置文件](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-config)。

## 8.6.8. `@shared-mime-info` *directory*

在安装和卸载时对该目录运行 `update-mime-database`。

## 8.6.9. `@shell` *file*

将作为参数传递的文件添加到 plist 中。

在安装时，将 *file* 的完整路径添加到 **/etc/shells** 中，同时确保不会重复添加。卸载时，将其从 **/etc/shells** 中移除。

## 8.6.10. `@terminfo`

不要单独使用。如果 Port 安装了 **\*.terminfo** 文件，请在其 **Makefile** 中添加 [`USES=terminfo`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-terminfo)。

在安装和卸载时，如果 `tic` 存在，则从 **${PREFIX}/shared/misc** 中的 **\*.terminfo** 文件刷新 **${PREFIX}/shared/misc/terminfo.db**。

## 8.6.11. 基本关键字

有一些硬编码的关键字，并且在 [pkg-create(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg-create\&sektion=8\&format=html) 中有详细文档。为了完整性，本文也会记录这些关键字。

### 8.6.11.1. `@` \[*file*]

空关键字是一个占位符，用于在需要更改文件的所有者、组或模式时使用。例如，要将文件的组设置为 `games` 并添加 setgid 位，请添加：

```sh
@(,games,2755) sbin/daemon
```

### 8.6.11.2. `@preexec` *command*, `@postexec` *command*, `@preunexec` *command*, `@postunexec` *command*

在包安装或卸载过程中执行 *command*。

`@preexec` *command* 在 **pre-install** 脚本中执行 *command*。

`@postexec` *command* 在 **post-install** 脚本中执行 *command*。

`@preunexec` *command* 在 **pre-deinstall** 脚本中执行 *command*。

`@postunexec` *command* 在 **post-deinstall** 脚本中执行 *command*。

如果 *command* 中包含以下任一序列，它们会被内联展开。假设 `@cwd` 被设置为 **/usr/local**，且最后提取的文件是 **bin/emacs**。

`%F` 展开为最后提取的文件名（如所指定）。在此例中为 **bin/emacs**。

`%D` 展开为当前目录前缀，如通过 `@cwd` 设置的。在此例中为 **/usr/local**。

`%B` 展开为完全限定文件名的基本目录部分，即当前目录前缀加上最后的文件路径，去掉尾部文件名。在此例中为 **/usr/local/bin**。

`%f` 展开为完全限定名称中的文件名部分，或者是 `%B` 的反向操作。在此例中为 **emacs**。

> **重要**
>
> 这些关键字旨在帮助你设置包，以使其尽可能准备好使用。它们 *不得* 被滥用来启动服务、停止服务或运行任何其他修改当前系统的命令。

### 8.6.11.3. `@mode` *mode*

设置所有随后提取文件的默认权限为 *mode*。格式与 [chmod(1)](https://man.freebsd.org/cgi/man.cgi?query=chmod\&sektion=1\&format=html) 使用的格式相同。使用时若不带参数，则设置为默认权限（打包时文件的权限模式）。

> **重要**
>
> 这必须是数字模式，例如 `644`、`4755` 或 `600`。不能是相对模式，例如 `u+s`。

### 8.6.11.4. `@owner` *user*

为所有后续文件设置默认所有者为 *user*。若不带参数，则设置为默认所有者（`root`）。

### 8.6.11.5. `@group` *group*

为所有后续文件设置默认组所有权为 *group*。若不带参数，则设置为默认组所有权（`wheel`）。

### 8.6.11.6. `@comment` *string*

此行在打包时会被忽略。

### 8.6.11.7. `@dir` *directory*

声明目录名称。默认情况下，在 `PREFIX` 下由包安装创建的目录会在卸载时自动删除。若需要在 `PREFIX` 下创建一个空目录，或该目录需要有非默认的所有者、组或权限，则使用此项。`PREFIX` 以外的目录需要注册。例如，**/var/db/${PORTNAME}** 需要有一个 `@dir` 条目，而 **${PREFIX}/shared/${PORTNAME}** 如果包含文件或使用默认所有者、组和权限，则不需要。

### 8.6.11.8. `@exec` *command*, `@unexec` *command*（已弃用）

在安装或卸载过程中执行 *command*。请改用 [`@preexec` *command*、`@postexec` *command*、`@preunexec` *command*、`@postunexec` *command*](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-keywords-base-exec)。

### 8.6.11.9. `@dirrm` *directory*（已弃用）

声明要在卸载时删除的目录名称。默认情况下，在 `PREFIX` 下由包安装创建的目录会在包卸载时被删除。

### 8.6.11.10. `@dirrmtry` *directory*（已弃用）

声明要删除的目录名称，类似于 `@dirrm`，但如果无法删除目录，则不会发出警告。

## 8.6.12. 创建新关键字

通过在 **${PORTSDIR}/Keywords** 目录中定义的关键字，可以扩展软件包列表文件。每个关键字的设置存储在一个名为 **keyword.ucl** 的 UCL 文件中。该文件必须至少包含以下一个部分：

* `attributes`
* `action`
* `pre-install`
* `post-install`
* `pre-deinstall`
* `post-deinstall`
* `pre-upgrade`
* `post-upgrade`

### 8.6.12.1. `attributes`

更改关键字使用的所有者、组或模式。包含一个关联数组，其中可能的键是 `owner`、`group` 和 `mode`。值分别为用户名、组名和文件模式。例如：

```sh
attributes: { owner: "games", group: "games", mode: 0555 }
```

### 8.6.12.2. `action`

定义关键字的参数会发生什么。包含一个数组，其中可能的值有：

`setprefix` 设置下一个 plist 条目的前缀。

`dir` 注册一个在安装时创建并在卸载时删除的目录。

`dirrm` 注册一个在卸载时删除的目录。已弃用。

`dirrmtry` 注册一个在卸载时尝试删除的目录。已弃用。

`file` 注册一个文件。

`setmode` 设置下一个 plist 条目的模式。

`setowner` 设置下一个 plist 条目的所有者。

`setgroup` 设置下一个 plist 条目的组。

`comment` 不执行任何操作，相当于不输入 `action` 部分。

`ignore_next` 忽略 plist 中的下一个条目。

### 8.6.12.3. `arguments`

如果设置为 `true`，则添加参数处理，将整个行 `%@` 拆分为编号的参数 `%1`、`%2` 等。例如，对于以下行：

```sh
@foo some.content other.content
```

`%1` 和 `%2` 将分别包含：

```sh
some.content
other.content
```

它还会影响 [`action`](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-keywords-action) 条目的工作方式。当有多个参数时，必须指定参数的编号。例如：

```sh
actions: [file(1)]
```

### 8.6.12.4. `pre-install`、`post-install`、`pre-deinstall`、`post-deinstall`、`pre-upgrade`、`post-upgrade`

这些关键字包含一个 [sh(1)](https://man.freebsd.org/cgi/man.cgi?query=sh\&sektion=1\&format=html) 脚本，在安装、卸载或升级包之前或之后执行。除了通常的 `@exec %`*foo* 占位符（如 [`@preexec` *command*、`@postexec` *command*、`@preunexec` *command*、`@postunexec` *command*](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-keywords-base-exec) 中描述的）外，还有一个新占位符 `%@`，它表示该关键字的参数。

### 8.6.12.5. 自定义关键字示例

**示例 2. `@dirrmtryecho` 关键字示例**

此关键字执行两项操作：它向软件包列表添加一个 `@dirrmtry` *directory* 行，并在卸载包时回显删除该目录的消息。

```sh
actions: [dirrmtry]
post-deinstall: <<EOD
  echo "Directory %D/%@ removed."
EOD
```

**示例 3. 真实示例，如何实现 `@sample`**

此关键字执行三项操作：它将第一个作为参数传递给 `@sample` 的 *filename* 添加到软件包列表中；它将指令添加到 `post-install` 脚本中，以便在实际配置文件不存在时，将示例文件复制到实际配置文件中；它将指令添加到 `post-deinstall` 脚本中，在配置文件未被修改的情况下删除该配置文件。

```sh
actions: [file(1)]
arguments: true
post-install: <<EOD
  case "%1" in
  /*) sample_file="%1" ;;
  *) sample_file="%D/%1" ;;
  esac
  target_file="${sample_file%.sample}"
  set -- %@
  if [ $# -eq 2 ]; then
      target_file=${2}
  fi
  case "${target_file}" in
  /*) target_file="${target_file}" ;;
  *) target_file="%D/${target_file}" ;;
  esac
  if ! [ -f "${target_file}" ]; then
    /bin/cp -p "${sample_file}" "${target_file}" && \
      /bin/chmod u+w "${target_file}"
  fi
EOD
pre-deinstall: <<EOD
  case "%1" in
  /*) sample_file="%1" ;;
  *) sample_file="%D/%1" ;;
  esac
  target_file="${sample_file%.sample}"
  set -- %@
  if [ $# -eq 2 ]; then
      set -- %@
      target_file=${2}
  fi
  case "${target_file}" in
  /*) target_file="${target_file}" ;;
  *) target_file="%D/${target_file}" ;;
  esac
  if cmp -s "${target_file}" "${sample_file}"; then
    rm -f "${target_file}"
  else
    echo "You may need to manually remove ${target_file} if it is no longer needed."
  fi
EOD
```


# 9.1.pkg-message（安装二进制包时显示的消息文件）

还有一些关于 **pkg-\*** 文件的技巧尚未提及，它们有时会派上用场。

为了在安装包时显示一条消息，可以将消息放在 **pkg-message** 文件中。此功能通常用于显示在 `pkg install` 或 `pkg upgrade` 之后需要采取的额外安装步骤。

***

> **重要**
>
> * **pkg-message** 必须只包含对 FreeBSD 设置和操作至关重要的信息，并且该信息必须是特定于该 Port 的。
> * 设置信息应仅在首次安装时显示。升级说明应仅在从相关版本升级时显示。
> * 请勿用空格或符号行（如 `----------`、`**********` 或 `==========`）包围消息。将格式设置交给 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html)。
> * 提交者有权使用 UCL 格式规范将现有消息限制为安装或升级范围。
> * 请务必参考处理服务的正确工具。
>   * 使用 `service name start` 启动服务，而不是使用 **/usr/local/etc/rc.d/name** `start`。
>   * 使用 `sysrc name_enable=YES` 修改 **rc.conf** 中的选项。

**pkg-message** 支持两种格式：

* **raw** 普通的纯文本文件。其消息仅在安装时显示。
* **UCL** 如果文件以 `[` 开头，则它会被视为 UCL 文件。UCL 格式的详细说明请参见 [libucl 的 GitHub 页面](https://github.com/vstakhov/libucl)。

> **注意**
>
> 请不要在 **pkg-plist** 中添加 **pkg-message** 的条目。

## 9.1.1. pkg-message 中的 UCL

该格式如下。它应为对象的数组。每个对象可以包含以下关键字：

* `message` 要显示的实际消息。此关键字是强制性的。
* `type` 消息应显示的时机。
* `maximum_version` 仅在 `type` 为 `upgrade` 时使用。当从严格低于指定版本的版本升级时显示。
* `minimum_version` 仅在 `type` 为 `upgrade` 时使用。当从严格高于指定版本的版本升级时显示。

`maximum_version` 和 `minimum_version` 可以组合使用。

`type` 关键字可以有三种值：

* `install` 仅在安装包时显示该消息。
* `remove` 仅在删除包时显示该消息。
* `upgrade` 仅在升级包时显示该消息。

> **重要**
>
> 为了与非 UCL 格式的 **pkg-message** 文件保持兼容，UCL **pkg-message** 的第一行 *必须是* 单独的 `[`，最后一行 *必须是* 单独的 `]`。

**示例 1. UCL 短字符串**

消息由双引号 `"` 分隔，用于简单的单行字符串：

```ini
[
{ type: install
  message: "Simple message"
}
]
```

**示例 2. UCL 多行字符串**

多行字符串使用标准的 here 文档语法。多行定界符 *必须* 紧跟在 `<<` 符号后，没有任何空格，并且 *必须* 只包含大写字母。要结束多行字符串，在单独的一行中添加定界符字符串，不带任何空格。来自 [UCL 短字符串](https://docs.freebsd.org/en/books/porters-handbook/pkg-files/#porting-message-ucl-short-ex) 的消息可以写成：

```ini
[
{ type: install
  message: <<EOM
Simple message
EOM
}
]
```

**示例 3. 在安装/卸载时显示消息**

当消息仅需要在安装或卸载时显示时，设置 `type`：

```ini
[
{
  type: remove
  message: "package being removed."
}
{ type: install, message: "package being installed."}
]
```

**示例 4. 显示升级时的消息**

当升级 Port 时，显示的消息可以更加符合 Port 的需要。

```ini
[
{
  type: upgrade
  message: "Package is being upgraded."
}
{
  type: upgrade
  maximum_version: "1.0"
  message: "Upgrading from before 1.0 need to do this."
}
{
  type: upgrade
  minimum_version: "1.0"
  message: "Upgrading from after 1.0 should do that."
}
{
  type: upgrade
  maximum_version: "3.0"
  minimum_version: "1.0"
  message: "Upgrading from > 1.0 and < 3.0 remove that file."
}
]
```

> **重要**
>
> 当显示升级时的消息时，限制向用户显示的时机非常重要。大多数情况下，当需要执行特定操作时，使用 `maximum_version` 将消息限制为仅在从特定版本之前的版本升级时显示。


# 9.2.pkg-install、pkg-pre-install 和 pkg-post-install（安装二进制包时执行的脚本文件）

如果 Port 需要在通过 `pkg add` 或 `pkg install` 安装二进制包时执行命令，可以使用 **pkg-install**。`pkg` 会执行两次此脚本，第一次是 `${SH} pkg-install ${PKGNAME} PRE-INSTALL`，在包安装之前，第二次是 `${SH} pkg-install ${PKGNAME} POST-INSTALL`，在包安装之后。可以测试 `$2` 来确定脚本正在以哪种模式运行。`PKG_PREFIX` 环境变量设置为包的安装目录。

如果使用 **pkg-pre-install** 或 **pkg-post-install**，脚本仅运行一次（在安装包之前或之后），并且带有一个参数 `${PKGNAME}`。如果使用 **pkg-pre-install.lua** 或 **pkg-post-install.lua**，则会运行 Lua 脚本而不是 shell 脚本。通过 `pkg` 运行的 Lua 脚本提供了一些扩展功能和一些限制，这些都在 [pkg-lua-script(5)](https://man.freebsd.org/cgi/man.cgi?query=pkg-lua-script\&sektion=5\&format=html) 中进行了说明。

> **注意**
>
> 推荐使用 **pkg-pre-install**（或 **pkg-pre-install.lua**）和 **pkg-post-install**（或 **pkg-post-install.lua**），而不是使用 **pkg-install**。

这些脚本会自动添加到软件包列表中。

> **重要**
>
> 这些脚本用于简化包安装后的配置。*不能* 滥用它们来启动服务、停止服务或运行任何其他会修改当前运行系统的命令。


# 9.3.pkg-deinstall、pkg-pre-deinstall 和 pkg-post-deinstall（卸载时执行的脚本文件）

这些脚本在包被移除时执行。

**pkg-deinstall** 脚本由 `pkg delete` 执行两次。第一次是 `${SH} pkg-deinstall ${PKGNAME} DEINSTALL`，在 Port 被卸载之前，第二次是 `${SH} pkg-deinstall ${PKGNAME} POST-DEINSTALL`，在 Port 被卸载之后。可以测试 `$2` 来确定脚本正在以哪种模式运行。`PKG_PREFIX` 环境变量设置为包的安装目录。

如果使用 **pkg-pre-deinstall** 或 **pkg-post-deinstall**，脚本仅运行一次（在卸载包之前或之后），并且带有一个参数 `${PKGNAME}`。如果使用 **pkg-pre-deinstall.lua** 或 **pkg-post-deinstall.lua**，则会运行 Lua 脚本而不是 shell 脚本。通过 `pkg` 运行的 Lua 脚本提供了一些扩展功能和一些限制，这些都在 [pkg-lua-script(5)](https://man.freebsd.org/cgi/man.cgi?query=pkg-lua-script\&sektion=5\&format=html) 中进行了说明。

> **注意**
>
> 推荐使用 **pkg-pre-deinstall**（或 **pkg-pre-deinstall.lua**）和 **pkg-post-deinstall**（或 **pkg-post-deinstall.lua**），而不是使用 **pkg-deinstall**。

这些脚本会自动添加到软件包列表中。

> **重要**
>
> 这些脚本用于简化包卸载后的清理工作。*不能* 滥用它们来启动服务、停止服务或运行任何其他会修改当前运行系统的命令。


# 9.4.修改 pkg-\* 文件的名字

所有的 **pkg-\*** 文件名都使用变量定义，如果需要，可以在 **Makefile** 中更改这些变量。这对于在多个 Port 之间共享相同的 **pkg-\*** 文件或当需要写入其中一个文件时特别有用。请参见 [写入 `WRKDIR` 之外的地方](https://docs.freebsd.org/en/books/porters-handbook/porting-dads/#porting-wrkdir)，了解为什么直接写入包含 **pkg-\*** 文件的目录是不好的做法。

以下是变量名及其默认值的列表。（`PKGDIR` 默认为 `${MASTERDIR}`。）

| 变量                 | 默认值                            |
| ------------------ | ------------------------------ |
| `DESCR`            | `${PKGDIR}/pkg-descr`          |
| `PLIST`            | `${PKGDIR}/pkg-plist`          |
| `PKGINSTALL`       | `${PKGDIR}/pkg-install`        |
| `PKGPREINSTALL`    | `${PKGDIR}/pkg-pre-install`    |
| `PKGPOSTINSTALL`   | `${PKGDIR}/pkg-post-install`   |
| `PKGDEINSTALL`     | `${PKGDIR}/pkg-deinstall`      |
| `PKGPREDEINSTALL`  | `${PKGDIR}/pkg-pre-deinstall`  |
| `PKGPOSTDEINSTALL` | `${PKGDIR}/pkg-post-deinstall` |
| `PKGMESSAGE`       | `${PKGDIR}/pkg-message`        |


# 9.5.使用 SUB\_FILES 和 SUB\_LIST

`SUB_FILES` 和 `SUB_LIST` 是用于在 Port 文件中动态插入值的工具，例如在 **pkg-message** 中插入安装的 `PREFIX`。

`SUB_FILES` 指定一个文件列表，这些文件会被自动修改。`SUB_FILES` 列表中的每个文件必须在 `FILESDIR` 中有对应的 **file.in** 文件。修改后的文件将创建在 **${WRKDIR}/file** 中。定义为 `USE_RC_SUBR` 值的文件会自动添加到 `SUB_FILES` 中。对于文件 **pkg-message**、**pkg-install** 和 **pkg-deinstall**，相应的 **Makefile** 变量会自动设置为指向处理过的版本。

`SUB_LIST` 是一组 `VAR=VALUE` 键值对。对于每一对，`SUB_FILES` 列出的每个文件中的 `%%VAR%%` 都会被替换为 `VALUE`。几个常见的键值对会自动定义：`PREFIX`、`LOCALBASE`、`DATADIR`、`DOCSDIR`、`EXAMPLESDIR`、`WWWDIR` 和 `ETCDIR`。任何以 `@comment` 开头并后跟空格的行，在变量替换后将从结果文件中删除。

以下示例在 **pkg-message** 中将 `%%ARCH%%` 替换为系统架构：

```makefile
SUB_FILES=	pkg-message
SUB_LIST=	ARCH=${ARCH}
```

注意：在这个例子中，**pkg-message.in** 必须存在于 `FILESDIR` 中。

一个良好的 **pkg-message.in** 示例：

```sh
Now it is time to configure this package.
Copy %%PREFIX%%/shared/examples/putsy/%%ARCH%%.conf into your home directory
as .putsy.conf and edit it.
```


# 10.1.运行 make describe

FreeBSD 的一些 Port 维护工具，例如 [portupgrade(1)](https://man.freebsd.org/cgi/man.cgi?query=portupgrade\&sektion=1\&format=html)，依赖于一个名为 **/usr/ports/INDEX** 的数据库，该数据库跟踪诸如 Port 依赖关系等信息。**INDEX** 是通过顶层的 **ports/Makefile** 使用 `make index` 命令生成的，它会进入每个 Port 子目录并在那里执行 `make describe`。因此，如果 `make describe` 在任何 Port 中失败，就无法生成 **INDEX**，这会导致许多人很快变得不快。

> **注意**
>
> 能够生成此文件非常重要，无论 **make.conf** 中设置了哪些选项，因此请避免在某些情况下使用 `.error` 语句（例如，当某个依赖项未满足时）。(参见 [Avoid Use of the `.error` Construct](https://docs.freebsd.org/en/books/porters-handbook/porting-dads/#dads-dot-error)。)

如果 `make describe` 输出一个字符串而不是错误信息，通常意味着一切正常。具体字符串的含义可以参考 **bsd.port.mk**。

还要注意，运行较新的 `portlint`（如下一节所述）将自动触发 `make describe` 的执行。


# 10.2.运行 make test

即使 Port 构建正常，确保软件正确执行其预期功能也是一个好主意。如果原始上游项目随软件一起提供了测试，最好运行这些测试并检查一切是否按预期工作。

Port 可以通过使用 `TEST_TARGET` 变量自动启用测试。设置该变量时，它包含 Port 的测试目标名称。通常为 `test`，但也可以是其他名称，例如 `tests`、`check`，或者在特定情况下类似 `run_tests.py` 之类的名称。

除了 `TEST_TARGET` 变量，框架还提供了以下变量来控制测试的执行：

* `TEST_WRKSRC` 是进行测试的目录。
* `TEST_ENV` 包含在测试阶段传递的附加变量。
* `TEST_ARGS` 包含传递给测试阶段的任何额外参数。

这些变量的使用示例可以在 [cad/xyce](https://cgit.freebsd.org/ports/tree/cad/xyce/)、[www/libjwt](https://cgit.freebsd.org/ports/tree/www/libjwt/) 等 Port 中找到。

> **注意**
>
> 请确保在更新 Port 时测试不会出现故障。


# 10.3.Portclippy / Portfmt

这些工具来自 [ports-mgmt/portfmt](https://cgit.freebsd.org/ports/tree/ports-mgmt/portfmt/)。

Portclippy 是一款代码检查工具，用于检查 **Makefile** 中的变量是否按照 [Port Makefiles 中变量的顺序](https://docs.freebsd.org/en/books/porters-handbook/order/#porting-order) 正确排列。

Portfmt 是一款自动格式化 **Makefile** 的工具。


# 10.4.Portlint

在提交之前，请使用 [`portlint`](https://docs.freebsd.org/en/books/porters-handbook/quick-porting/#porting-portlint) 检查该 Port。`portlint` 会对许多常见的错误发出警告，包括功能性和风格上的问题。对于新 Port，`portlint -A` 是最全面的；对于现有 Port，`portlint -C` 足矣。

由于 `portlint` 使用启发式方法来检测错误，它可能会产生误报。此外，有时标记为问题的内容由于 Port 框架的限制，无法以其他方式解决。如果有疑问，最好的做法是向 [FreeBSD ports 邮件列表](https://lists.freebsd.org/subscription/freebsd-ports) 提问。


# 10.5.Port 工具

[ports-mgmt/porttools](https://cgit.freebsd.org/ports/tree/ports-mgmt/porttools/) 程序是 Ports Collection 的一部分。

`port` 是前端脚本，能帮助简化测试工作。每当需要测试新的 Port 或更新现有 Port 时，可以使用 `port test` 来进行测试，包括 [`portlint`](https://docs.freebsd.org/en/books/porters-handbook/testing/#testing-portlint) 检查。此命令还会检测并列出任何未在 **pkg-plist** 中列出的文件。例如：

```sh
# port test /usr/ports/net/csup
```


# 10.6.PREFIX 和 DESTDIR

`PREFIX` 决定了 Port 的安装位置。默认情况下，它是 **/usr/local**，但用户可以设置为自定义路径，如 **/opt**。Port 必须遵守该变量的值。

`DESTDIR` 如果由用户设置，决定了完整的替代环境，通常是 jail 或挂载在 **/** 之外的已安装系统。Port 实际上会安装到 **DESTDIR/PREFIX**，并在 **DESTDIR/var/db/pkg** 中注册到包数据库。`DESTDIR` 由 Ports 基础设施通过 [chroot(8)](https://man.freebsd.org/cgi/man.cgi?query=chroot\&sektion=8\&format=html) 自动处理。无需修改或额外注意编写 `DESTDIR` 合规的 Ports。

`PREFIX` 的值将被设置为 `LOCALBASE`（默认值为 **/usr/local**）。如果设置了 `USE_LINUX_PREFIX`，`PREFIX` 将是 `LINUXBASE`（默认值为 **/compat/linux**）。

避免在源代码中硬编码 **/usr/local** 路径，可以使 Port 更加灵活，能够满足其他站点的需求。通常可以通过将 Port 中各种 **Makefile** 中的 **/usr/local** 替换为 `${PREFIX}` 来实现这一点。这个变量会自动传递到构建和安装过程的每个阶段。

确保应用程序没有将文件安装到 **/usr/local** 而不是 `PREFIX`。一种快速检查硬编码路径的方法是：

```sh
% make clean; make package PREFIX=/var/tmp/`make -V PORTNAME`
```

如果安装了任何不在 `PREFIX` 中的文件，包创建过程将提示找不到这些文件。

此外，还值得检查使用阶段目录支持（见 [Staging](https://docs.freebsd.org/en/books/porters-handbook/special/#staging)）的情况：

```sh
% make stage && make check-plist && make stage-qa && make package
```

* `check-plist` 检查 plist 中缺少的文件以及 Port 未安装但出现在 plist 中的文件。
* `stage-qa` 检查常见问题，如错误的 shebang、指向阶段目录外的符号链接、setuid 文件以及未剥离的库文件等。

这些测试不会发现 Port 文件中硬编码的路径，也不会验证 `LOCALBASE` 是否被正确使用以引用其他 Port 中的文件。必须测试临时安装在 **/var/tmp/**`make -V PORTNAME` 中的 Port 是否正常运行，以确保路径没有问题。

`PREFIX` 不得在 Port 的 **Makefile** 中显式设置。安装 Port 的用户可能已将 `PREFIX` 设置为自定义位置，Port 必须遵守该设置。

通过上述变量引用其他 Port 的程序和文件，而不是使用显式的路径。例如，如果 Port 需要宏 `PAGER` 来获取 `less` 的完整路径名，不能使用 **/usr/local/bin/less** 的字面路径。应改为使用 `${LOCALBASE}`：

```sh
-DPAGER=\"${LOCALBASE}/bin/less\"
```

使用 `LOCALBASE` 的路径在管理员将整个 **/usr/local** 树移动到其他地方时，更有可能仍然有效。

> **技巧**
>
> 所有这些测试都在运行 `poudriere testport` 或 `poudriere bulk -t` 时自动完成。强烈建议每个 Port 贡献者安装并用其测试自己的 Port。有关更多信息，请参见 [poudriere](https://docs.freebsd.org/en/books/porters-handbook/testing/#testing-poudriere)。


# 10.7.Poudriere

对于 Port 贡献者来说，poudriere 是最重要且最有用的测试和构建工具之一。它的主要功能包括：

* 批量构建整个 Ports 树、Ports 树的特定子集或单个 Port 及其依赖项
* 自动打包构建结果
* 每个 Port 的构建日志文件生成
* 提供签名的 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 仓库
* 在向 FreeBSD bug 跟踪器提交补丁或向 Ports 树提交前测试 Port 构建
* 测试不同选项下 Port 构建的成功与否

由于 poudriere 在干净的 [jail(8)](https://man.freebsd.org/cgi/man.cgi?query=jail\&sektion=8\&format=html) 环境中执行构建并使用 [zfs(8)](https://man.freebsd.org/cgi/man.cgi?query=zfs\&sektion=8\&format=html) 功能，因此相比传统的主机系统测试，它具有以下几个优势：

* 不污染主机环境：没有残留文件，没有意外删除，没有现有配置文件的更改。
* 验证 **pkg-plist** 是否有缺失或多余的条目
* Ports 提交者有时会要求在提交补丁时附上 poudriere 日志，以评估补丁是否准备好集成到 Ports 树中

poudriere 的设置和使用也非常简单，它没有依赖关系，并且可以在任何受支持的 FreeBSD 版本上运行。本节将展示如何作为 Ports 贡献者日常工作流程的一部分安装、配置和使用 poudriere。

本节中的示例显示的是 FreeBSD 中的默认文件布局，请根据需要替换任何本地更改。Ports 树（由 `${PORTSDIR}` 表示）位于 **/usr/ports**。默认情况下，`${LOCALBASE}` 和 `${PREFIX}` 都是 **/usr/local**。

## 10.7.1. 安装 poudriere

可以在 Ports 树中的 [ports-mgmt/poudriere](https://cgit.freebsd.org/ports/tree/ports-mgmt/poudriere/) 中找到 poudriere。可以通过 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 或从 Ports 安装：

```sh
# pkg install poudriere
```

或者

```sh
# make -C /usr/ports/ports-mgmt/poudriere install clean
```

还有一个开发中的版本，最终将成为下个发布版。可在 [ports-mgmt/poudriere-devel](https://cgit.freebsd.org/ports/tree/ports-mgmt/poudriere-devel/) 中找到它。这个开发版本用于官方的 FreeBSD 包构建，因此经过了充分的测试，并且通常包含更新的有趣功能。Ports 提交者会希望使用开发版本，因为它是用于生产环境的，并且拥有所有新的功能，能够确保一切完全正确。贡献者不一定需要这些功能，因为最重要的修复会回溯到发布版本。使用开发版本构建官方包的主要原因是它更快，在高端 32 CPU 服务器和 128GB 内存的情况下，完整构建时间将从 18 小时缩短到 17 小时。而这些优化在桌面机器上构建 Ports 时影响不大。

## 10.7.2. 设置 poudriere

该程序安装了默认的配置文件 **/usr/local/etc/poudriere.conf**。每个参数在配置文件中都有文档说明。

以下是最简配置文件示例：

```sh
ZPOOL=zroot
BASEFS=/usr/local/poudriere
DISTFILES_CACHE=/usr/ports/distfiles
RESOLV_CONF=/etc/resolv.conf
```

`ZPOOL` poudriere 要使用的 ZFS 存储池的名称。必须在 `zpool status` 的输出中列出。

`BASEFS` poudriere 文件系统的根挂载点。此条目将导致 poudriere 将 `tank/poudriere` 挂载到 `/poudriere`。

`DISTFILES_CACHE` 定义存储 distfiles 的位置。在这个示例中，poudriere 和主机共享 distfiles 存储目录。这可以避免重新下载已存在于系统中的 tarballs。如果该目录尚未存在，请创建它，以便 poudriere 可以找到它。

`RESOLV_CONF` 在 jail 内部使用主机的 **/etc/resolv.conf** 进行 DNS 解析。这是为了使 jail 在下载 distfiles 时能够解析 URL。当使用代理时不需要此项。请参考默认配置文件中的代理配置。

## 10.7.3. 创建 poudriere Jail

创建 poudriere 将用于构建的基础 jail：

```sh
# poudriere jail -c -j 143Ramd64 -v 14.3-RELEASE -a amd64
```

从 **poudriere.conf** 中 `FREEBSD_HOST` 指定的 HTTPS 服务器获取 `14.3-RELEASE` 版本的 `amd64`，创建 ZFS 文件系统 `tank/poudriere/jails/143Ramd64`，将其挂载到 **/poudriere/jails/143Ramd64**，并将 `14.3-RELEASE` 的 tarballs 提取到该文件系统中。

```sh
# poudriere jail -c -j 13i386 -v stable/13 -a i386 -m git+https
```

创建 `tank/poudriere/jails/13i386`，将其挂载到 **/poudriere/jails/13i386**，然后从 **poudriere.conf** 中指定的 `GIT_HOST` 或默认的 `git.freebsd.org` 获取 `FreeBSD-13-STABLE` 的 Git 分支的最新代码，检出到 **/poudriere/jails/13i386/usr/src**，然后完成 `buildworld` 并将其安装到 **/poudriere/jails/13i386** 中。

> **注意**
>
> 尽管可以在较旧的版本上构建较新的 FreeBSD 版本，但大多数情况下它无法运行。例如，如果需要 `stable/14` jail，则主机也必须运行 `stable/14`，仅运行 `14.3-RELEASE` 不够。

> **注意**
>
> 要为 `16.0-CURRENT` 创建 poudriere jail：
>
> ```sh
> # poudriere jail -c -j 16amd64 -v main -a amd64 -m git+https
> ```
>
> 要运行 `16.0-CURRENT` 的 poudriere jail，主机必须运行 `16.0-CURRENT`。通常情况下，较新的内核可以构建并运行较旧的 jails。例如，`16.0-CURRENT` 内核可以构建并运行 `14.3-STABLE`，前提是已编译 `COMPAT_FREEBSD14` 内核选项（默认启用，`16.0-CURRENT` 的 GENERIC 内核配置中已启用）。

可以使用 `poudriere jail -l` 显示当前 poudriere 知道的 jail 列表：

```sh
# poudriere jail -l
JAILNAME             VERSION              ARCH    METHOD
143Ramd64            14.3-RELEASE         amd64   http
13i386               13.5-STABLE          i386    git+https
```

## 10.7.4. 保持 poudriere Jail 更新

管理更新非常简单。使用以下命令：

```sh
# poudriere jail -u -j JAILNAME
```

该命令会将指定的 jail 更新到最新版本。对于 FreeBSD 发布版本，可以使用 [freebsd-update(8)](https://man.freebsd.org/cgi/man.cgi?query=freebsd-update\&sektion=8\&format=html) 更新到最新的补丁级别。对于从源代码构建的 FreeBSD 版本，可以更新到分支中的最新 git 修订版。

> **技巧**
>
> 对于采用 `git+*` 方法的 jail，添加 `-J NumberOfParallelBuildJobs` 有助于通过增加并行编译作业数来加速构建。例如，如果构建机器有 6 个 CPU，使用：
>
> ```sh
> # poudriere jail -u -J 6 -j JAILNAME
> ```

## 10.7.5. 为 poudriere 设置 Ports Trees

在 poudriere 中使用 Ports Trees 有多种方法。最直接的方法是让 poudriere 为自己创建一个默认的 ports tree，使用 [Git](https://docs.freebsd.org/en/books/handbook/mirrors/#git)：

```sh
# poudriere ports -c -m git+https -B main
```

这些命令会创建 `tank/poudriere/ports/default`，将其挂载到 **/poudriere/ports/default**，并使用 Git 填充它。之后，它会被包括在已知的 ports trees 列表中：

```sh
# poudriere ports -l
PORTSTREE METHOD    TIMESTAMP           PATH
default   git+https 2025-07-20 04:23:56 /poudriere/ports/default
```

> **注意**
>
> 请注意，“default” ports tree 是特殊的。除非明确指定，否则后续解释的所有构建命令将隐式使用此 ports tree。如果要使用其他树，可以在命令中添加 `-p treename`。

对于 Port 贡献者来说，处理本地修改的最佳方法是使用 [Git](https://docs.freebsd.org/en/books/handbook/mirrors/#git)。与创建 jail 类似，可以使用不同的方法来创建 ports tree。为了测试本地修改和开发 Port，最好通过 git 检出树（如上所述）来添加额外的 ports tree。

## 10.7.6. 使用手动管理的 Ports Trees 与 poudriere

根据工作流的不同，使用手动维护的 ports trees 可能非常有用。例如，如果有一个位于 **/work/ports** 的本地 ports tree，可以将 poudriere 指向该位置：

```sh
# poudriere ports -c -m null -M /work/ports -p development
```

这将会在已知树的表格中列出：

```sh
# poudriere ports -l
PORTSTREE   METHOD    TIMESTAMP           PATH
development null      2025-07-20 05:06:33 /work/ports
```

> **注意**
>
> `METHOD` 列中的破折号或 `null` 表示 poudriere 永远不会更新或更改该 ports tree。用户完全负责维护此树，包括所有用于测试新 Port 和提交补丁的本地修改。

## 10.7.7. 保持 poudriere Ports Trees 更新

更新 ports 与上述 jail 更新一样简单：

```sh
# poudriere ports -u -p PORTSTREE
```

该命令会将指定的 *PORTSTREE*（由 `poudriere -l` 输出的树）更新到官方服务器上最新的修订版。

> **注意**
>
> 没有指定更新方式的 ports trees，参见 [使用手动管理的 Ports 与 poudriere](https://docs.freebsd.org/en/books/porters-handbook/testing/#testing-poudriere-ports-tree-manual)，无法像这样更新，必须由维护者手动更新。

## 10.7.8. 测试 Ports

在设置好 jails 和 ports trees 后，可以测试贡献者对 ports tree 的修改。

例如，本地修改位于 **/work/ports/www/firefox** 的 [www/firefox](https://cgit.freebsd.org/ports/tree/www/firefox/) Port，可以在之前创建的 14.3-RELEASE jail 中进行测试：

```sh
# poudriere testport -j 143Ramd64 -p development -o www/firefox
```

这将构建 Firefox 的所有依赖项。如果某个依赖项已构建并且仍是最新的，则会安装预构建的包。如果依赖项没有最新的包，poudriere 将在 jail 中使用默认选项构建该依赖项。然后会构建 Firefox 本身。

每个 Port 的完整构建过程会记录在 **/poudriere/data/logs/bulk/143Ri386-development/build-time/logs** 中。

目录名 `143Ri386-development` 是根据 `-j` 和 `-p` 参数生成的。为了方便起见，还维护了一个符号链接 **/poudriere/data/logs/bulk/143Ri386-development/latest**，该链接指向最新的 *build-time* 目录。该目录中还有一个 **index.html**，可以通过网页浏览器观察构建过程。

默认情况下，poudriere 会清理 jails 并将日志文件保留在上述目录中。为了便于调查，可以通过在 `testport` 命令中添加 `-i` 来保持 jail 在构建后继续运行：

```sh
# poudriere testport -j 143Ramd64 -p development -i -o www/firefox
```

构建完成后，无论是否成功，都会提供一个 shell 进入 jail。可以使用该 shell 进一步调查。poudriere 可以通过 `-I` 选项在构建完成后保持 jail 运行。poudriere 会显示不再需要 jail 时运行的命令。此时可以使用 [jexec(8)](https://man.freebsd.org/cgi/man.cgi?query=jexec\&sektion=8\&format=html) 进入 jail：

```sh
# poudriere testport -j 143Ramd64 -p development -I -o www/firefox
[...]
====>> Installing local Pkg repository to /usr/local/etc/pkg/repos
====>> Leaving jail 143Ramd64-development-n running, mounted at /poudriere/data/.m/143Ramd64-development/ref for interactive run testing
====>> To enter jail: jexec 143Ramd64-development-n env -i TERM=$TERM /usr/bin/login -fp root
====>> To stop jail: poudriere jail -k -j 143Ramd64 -p development
# jexec 143Ramd64-development-n env -i TERM=$TERM /usr/bin/login -fp root
# [在 jail 中做一些操作]
# exit
# poudriere jail -k -j 143Ramd64 -p development
====>> Umounting file systems
```

FreeBSD ports 构建基础设施的一个重要组成部分是能够根据个人喜好调整 Port 的选项。也可以使用 poudriere 测试这些选项。添加 `-c` 选项：

```sh
# poudriere testport -j 143Ramd64 -c -o www/firefox
```

这会在构建 Port 之前显示 Port 配置对话框。`-o` 后面以 `_category_/_portname_` 格式给出的 Port 将使用指定的选项，所有依赖项将使用默认选项。可以使用集合测试带有非默认选项的依赖 Port，参见 [使用集合](https://docs.freebsd.org/en/books/porters-handbook/testing/#testing-poudriere-sets)。

> **技巧**
>
> 当在构建过程中根据所选选项修改 **pkg-plist** 时，建议进行两次测试运行：一次选中所有选项，*另一次* 不选任何选项。

## 10.7.9. 使用 Sets

对于所有涉及构建的操作，可以使用 `-z <setname>` 指定一个所谓的 *set*。set 表示一个完全独立的构建。例如，这允许在依赖 Port 使用非标准选项时，使用 `testport`。

为了使用 sets，poudriere 需要一个类似于 `PORT_DBDIR`（默认为 **/var/db/ports**）的现有目录结构，该结构位于其配置目录中。然后，该目录会通过 [nullfs(5)](https://man.freebsd.org/cgi/man.cgi?query=nullfs\&sektion=5\&format=html) 挂载到构建 Port 及其依赖项的 jails 中。通常，可以通过递归复制现有的 `PORT_DBDIR` 到 **/usr/local/etc/poudriere.d/jailname-portname-setname-options** 来获得合适的起始点。详情请见 [poudriere(8)](https://man.freebsd.org/cgi/man.cgi?query=poudriere\&sektion=8\&format=html)。例如，要在名为 `devset` 的特定 set 中测试 [www/firefox](https://cgit.freebsd.org/ports/tree/www/firefox/)，只需在 `testport` 命令中添加 `-z devset` 参数：

```sh
# poudriere testport -j 143Ramd64 -p development -z devset -o www/firefox
```

poudriere 将按以下顺序查找这些目录的存在：

* **/usr/local/etc/poudriere.d/143Ramd64-development-devset-options**
* **/usr/local/etc/poudriere.d/143Ramd64-devset-options**
* **/usr/local/etc/poudriere.d/143Ramd64-development-options**
* **/usr/local/etc/poudriere.d/devset-options**
* **/usr/local/etc/poudriere.d/development-options**
* **/usr/local/etc/poudriere.d/143Ramd64-options**
* **/usr/local/etc/poudriere.d/options**

从这个列表中，poudriere 会 [nullfs(5)](https://man.freebsd.org/cgi/man.cgi?query=nullfs\&sektion=5\&format=html) 挂载 *第一个存在* 的目录树到构建 jail 中的 **/var/db/ports** 目录。因此，所有自定义选项将用于此运行中的所有 Port。

提供 set 的目录结构后，可以更改特定 Port 的选项。例如：

```sh
# poudriere options -c www/firefox -z devset
```

这将显示 [www/firefox](https://cgit.freebsd.org/ports/tree/www/firefox/) 的配置对话框，并可以编辑选项。所选选项将保存到 `devset` set 中。

> **注意**
>
> poudriere 在选项配置方面非常灵活。poudriere 可以针对特定的 jails、ports trees 以及多个 Port 通过一个命令进行设置。有关详情，请参见 [poudriere(8)](https://man.freebsd.org/cgi/man.cgi?query=poudriere\&sektion=8\&format=html)。

## 10.7.10. 提供自定义 **make.conf** 文件

与使用 sets 类似，poudriere 还可以使用提供的自定义 **make.conf** 文件。如果提供了该文件，则无需特殊的命令行参数。相反，poudriere 会根据命令行中的名称模式查找现有文件。例如：

```sh
# poudriere testport -j 143Ramd64 -p development -z devset -o www/firefox
```

这将导致 poudriere 按以下顺序查找这些文件的存在：

* **/usr/local/etc/poudriere.d/make.conf**
* **/usr/local/etc/poudriere.d/devset-make.conf**
* **/usr/local/etc/poudriere.d/development-make.conf**
* **/usr/local/etc/poudriere.d/143Ramd64-make.conf**
* **/usr/local/etc/poudriere.d/143Ramd64-development-make.conf**
* **/usr/local/etc/poudriere.d/143Ramd64-devset-make.conf**
* **/usr/local/etc/poudriere.d/143Ramd64-development-devset-make.conf**

与 sets 不同，所有找到的文件将 *按顺序* 追加到构建 jails 中的一个 **make.conf** 文件中。因此，可以在 **/usr/local/etc/poudriere.d/make.conf** 中设置影响所有构建的通用 make 变量。特定 jails 或 sets 的特殊变量可以在专用的 **make.conf** 文件中进行设置，例如 **/usr/local/etc/poudriere.d/143Ramd64-development-devset-make.conf**。

**示例 1. 使用 `make.conf` 更改默认 Perl 版本**

例如，要使用名为 `perl5-20` 的 set 构建一个非默认的 Perl 版本 `5.20`，可以创建一个 **perl5-20-make.conf** 文件，并添加以下内容：

```sh
DEFAULT_VERSIONS+= perl=5.20
```

> **注意**
>
> 注意使用 `+=`，这样即使该变量在默认 **make.conf** 中已设置，其内容也不会被覆盖。

## 10.7.11. 清理不再需要的 distfiles

poudriere 提供了一种内建机制，用于删除不再被任何 Port 使用的过时 distfiles。使用以下命令：

```sh
# poudriere distclean -p portstree
```

该命令将扫描 **poudriere.conf** 中的 `DISTFILES_CACHE` 文件夹，并与通过 `-p <portstree>` 参数指定的 Ports 树进行对比，提示删除那些不再使用的 distfiles。如果希望跳过提示，直接无条件删除所有未使用的文件，可以添加 `-y` 参数：

```sh
# poudriere distclean -p portstree -y
```


# 10.8.调试 port

有时，程序在运行时会出现问题，导致 Port 失败。框架提供了一些辅助工具来帮助调试 Ports。这些工具的功能是有限的，因为调试 Port 的方式很大程度上取决于使用的技术。以下变量有助于调试 Ports：

* `WITH_DEBUG`：如果设置此变量，Ports 将会在构建时包含调试符号。
* `WITH_DEBUG_PORTS`：指定要使用 `WITH_DEBUG` 选项构建的 Ports 列表。
* `DEBUG_FLAGS`：用于指定要添加到 `CFLAGS` 的附加标志，默认值为 `-g`。

当 `WITH_DEBUG` 被设置时，无论是全局设置还是针对某些 Ports 设置，生成的二进制文件都不会被剥离调试信息。

这些变量可以在 **make.conf** 或命令行中指定：

```sh
# cd category/port && make -DWITH_DEBUG DEBUG_FLAGSS="-g -O0"
```

> **注意**
>
> 如果使用 [ports-mgmt/poudriere](https://cgit.freebsd.org/ports/tree/ports-mgmt/poudriere/) 构建 Port，调试变量必须在 poudriere 的 **make.conf** 中指定，而不是在 **/etc/make.conf** 中指定。有关详细信息，请参阅 [ports-mgmt/poudriere](https://cgit.freebsd.org/ports/tree/ports-mgmt/poudriere/) 文档。

有关更多调试工具的信息，请参阅 [Developer’s Handbook](https://docs.freebsd.org/en/books/developers-handbook/tools#debugging)。


# 11.1.使用 Git 制作补丁

当某 Port 不是作者发布的最新版本时，请更新本地工作副本 **/usr/ports**。该 Port 可能已经被更新到新版本。

如果要处理多个 Port，使用 Git 来保持整个 Ports 最新可能会更加方便，正如在 [Using the Ports Collection](https://docs.freebsd.org/en/books/handbook/ports#ports-using) 中所描述的。这还可以跟踪所有 Port 的依赖项。

接下来的步骤是检查是否已经有一个更新待处理。为此，有两种方法。可以通过可搜索的界面访问 [FreeBSD 问题报告（PR）或 bug 数据库](https://bugs.freebsd.org/search/)，在 `Product` 的多选菜单中选择 `Ports & Packages`，然后在 `Summary` 字段中输入 Port 的名称。

如果没有待处理的 PR，接下来的步骤是向 Port 的维护者发送电子邮件，如通过 `make maintainer` 显示的那样。维护者可能已经在进行升级，或者有不升级该 Port 的理由（例如新版本可能存在稳定性问题），这时就没有必要重复他们的工作。注意，未维护的 Ports 会列出 `ports@FreeBSD.org` 作为维护者，这是一个通用的 Ports 邮件列表，因此在这种情况下发送邮件可能没有帮助。

如果维护者要求你进行升级，或者该 Port 没有维护者，那么可以帮助 FreeBSD 准备更新！可以使用基本系统中的 [diff(1)](https://man.freebsd.org/cgi/man.cgi?query=diff\&sektion=1\&format=html) 命令来完成。

要为单个补丁创建合适的 `diff`，将需要修补的文件复制为 **something.orig**，保存更改为 **something**，然后创建补丁：

```sh
% diff -u something.orig something > something.diff
```

否则，可以使用 `git diff` 方法（请参阅 [Using Git to Make Patches](https://docs.freebsd.org/en/books/porters-handbook/upgrading/#git-diff)）或者将 Port 的内容复制到另一个目录，并使用新的和旧的 Port 目录的递归 [diff(1)](https://man.freebsd.org/cgi/man.cgi?query=diff\&sektion=1\&format=html) 输出结果（例如，如果修改过的 Port 目录称为 **superedit**，原目录为 **superedit.bak**，则保存 `diff -ruN superedit.bak superedit` 的结果）。统一或上下文 diff 都可以，但 Port 提交者通常更喜欢统一格式的 diff。注意使用 `-N` 选项——这是处理新文件添加或旧文件删除的标准方法。在提交 diff 之前，请检查输出，确保所有更改都合理。（特别是，确保首先使用 `make clean` 清理工作目录。）

> **注意**
>
> 如果有文件被添加、复制、移动或删除，请将此信息添加到问题报告中，以便提交补丁的提交者知道需要执行哪些 [git(1)](https://man.freebsd.org/cgi/man.cgi?query=git\&sektion=1\&format=html) 命令。

为了简化常见的补丁操作，可以使用 `make makepatch`，如在 [Patching](https://docs.freebsd.org/en/books/porters-handbook/slow-porting/#slow-patch) 中所述。还可以使用其他工具，如 **/usr/ports/Tools/scripts/patchtool.py**。在使用之前，请阅读 **/usr/ports/Tools/scripts/README.patchtool**。

如果该 Port 没有维护者，并且你正在积极使用它，请考虑自愿成为它的维护者。FreeBSD 有超过 4000 个没有维护者的 Ports，这是一个总是需要更多志愿者的领域。（有关维护者职责的详细描述，请参阅 [Developer’s Handbook](https://docs.freebsd.org/en/books/developers-handbook/#POLICIES-MAINTAINER) 章节。）

要提交 diff，请使用 [bug 提交表单](https://bugs.freebsd.org/submit/)（产品 `Ports & Packages`，组件 `Individual Port(s)`）。始终包含类别和 Port 名称，后接冒号，以及问题的简要描述。例如：`category/portname: add FOO option`；`category/portname: Update to X.Y`。请在消息中提到任何添加或删除的文件，因为在提交时需要明确指定这些文件给 [git(1)](https://man.freebsd.org/cgi/man.cgi?query=git\&sektion=1\&format=html)。不要压缩或编码 diff。

在提交问题报告之前，请查看 [Writing the problem report](https://docs.freebsd.org/en/articles/problem-reports/#pr-writing) 章节中的问题报告编写指南。它包含了有关如何编写有用问题报告的更多信息。

> **重要**
>
> 如果升级是出于安全考虑或当前提交的 Port 存在严重缺陷，请通知 Ports 管理团队 <<portmgr@FreeBSD.org>>，以请求立即重新构建和重新分发该 Port 的包。否则，毫不知情的 `pkg` 用户将在几周内继续通过 `pkg install` 安装旧版本。

> **注意**
>
> 请使用 [diff(1)](https://man.freebsd.org/cgi/man.cgi?query=diff\&sektion=1\&format=html) 或 `git diff` 来创建现有 Ports 的更新。其他格式可能包括整个文件，使得无法仅查看更改内容。当没有包含 diff 时，整个更新可能会被忽略。

完成这些工作后，请阅读 [Keeping Up](https://docs.freebsd.org/en/books/porters-handbook/keeping-up/#keeping-up) 中关于如何保持更新的内容。

***

如果可能，请提交 [git(1)](https://man.freebsd.org/cgi/man.cgi?query=git\&sektion=1\&format=html) 补丁或 diff。相比于“新旧”目录之间的 diff，它们更容易处理。这样更容易看到变更内容，并且如果在开始工作后 Ports 集合中有所修改，或者提交者要求修复某些内容，可以更容易地更新 diff。此外，使用 [git-format-patch(1)](https://man.freebsd.org/cgi/man.cgi?query=git-format-patch\&sektion=1\&format=html) 或 [git-diff(1)](https://man.freebsd.org/cgi/man.cgi?query=git-diff\&sektion=1\&format=html) 生成的补丁，可以通过 [git-am(1)](https://man.freebsd.org/cgi/man.cgi?query=git-am\&sektion=1\&format=html) 或 [git-apply(1)](https://man.freebsd.org/cgi/man.cgi?query=git-apply\&sektion=1\&format=html) 轻松应用，并节省提交者的一些时间。最后，通过 [git-format-patch(1)](https://man.freebsd.org/cgi/man.cgi?query=git-format-patch\&sektion=1\&format=html) 生成的 Git 补丁包含你的作者信息和提交消息。这些信息将记录在仓库的日志中，这是提交更改的推荐方式。

```sh
% git clone https://git.FreeBSD.org/ports.git ~/my_wrkdir  ①②
% cd ~/my_wrkdir
```

* ① 当然，这个路径可以是任何位置。构建 Ports 并不限于 **/usr/ports/**。
* ② [git.FreeBSD.org](https://git.freebsd.org/) 是 FreeBSD 的公共 Git 服务器。有关更多信息，请参阅 [FreeBSD Git Repository URL Table](https://docs.freebsd.org/en/books/handbook/mirrors#git-url-table)。

在 Port 目录中，进行必要的更改。如果是添加、移动或删除文件，请使用 `git` 来跟踪这些更改：

```sh
% git add new_file
% git mv old_name new_name
% git rm deleted_file
```

确保使用 [Testing the Port](https://docs.freebsd.org/en/books/porters-handbook/quick-porting/#porting-testing) 和 [Checking the Port with `portlint`](https://docs.freebsd.org/en/books/porters-handbook/quick-porting/#porting-portlint) 中的检查清单来检查该 Port。

同时，使用 `make makesum` 更新 distinfo 中的校验和引用。

在制作补丁之前，获取最新的仓库并将更改 rebase 到其之上。仔细观察并跟踪输出。如果有任何文件 rebase 失败，意味着在你编辑同一个文件时，源文件发生了变化，需要手动解决冲突。

```sh
% git fetch origin main
% git rebase origin/main
```

检查待提交的更改：

```sh
% git status
% git diff --staged
```

最后一步是生成统一的 diff 或补丁：

要使用 [git-format-patch(1)](https://man.freebsd.org/cgi/man.cgi?query=git-format-patch\&sektion=1\&format=html) 生成补丁：

```sh
% git checkout -b my_branch
% git commit
% git format-patch main
```

这将生成一个类似于 `0001-foo.patch` 的补丁文件。这是推荐的方式，因为它包含了作者身份信息，而且当你进行一系列不打算合并在一起的更改时也更方便。

另外，要使用 [git-diff(1)](https://man.freebsd.org/cgi/man.cgi?query=git-diff\&sektion=1\&format=html) 生成统一的 diff，可以执行：

```sh
% git diff --staged > ../`make -VPKGNAME`.diff
```

这将生成一个类似于 `foo-1.2.3.diff` 的 diff 文件，其中 `foo` 替换为提交消息的第一行，即提交消息的主题。

补丁创建完成后，你可以切换回主分支开始其他开发工作。

```sh
% git checkout main
```

补丁被接受并合并后，你可以删除本地开发分支（如果你想的话）：

```sh
% git branch -D my_branch
```

> **注意**
>
> 如果文件已添加、移动或删除，请包含使用的 [git(1)](https://man.freebsd.org/cgi/man.cgi?query=git\&sektion=1\&format=html) `add`、`mv` 和 `rm` 命令。必须在补丁应用之前运行 `git mv`。应用补丁后，必须运行 `git add` 或 `git rm`。

按照 [问题报告提交指南](https://docs.freebsd.org/en/articles/problem-reports/#pr-writing) 提交补丁。


# 11.2.UPDATING 和 MOVED

## 11.2.1. /usr/ports/UPDATING

如果升级 Port 需要特定步骤，例如更改配置文件或运行特定程序，必须在此文件中记录。文件中的条目格式如下：

```sh
YYYYMMDD:
  AFFECTS: users of portcategory/portname
  AUTHOR: 你的名字 <你的电子邮箱地址>

  特殊说明
```

> **技巧**
>
> 在包含确切的 portmaster、portupgrade、pkg 指令时，请确保正确处理 shell 转义。例如，*不要* 使用：
>
> ```sh
> # pkg delete -g -f docbook-xml* docbook-sk* docbook[2345]??-* docbook-4*
> ```
>
> 如上所示，此命令仅在 Bourne Shell 下有效。请改用如下形式，该形式在 Bourne Shell 和 C-Shell 下均可正常工作：
>
> ```sh
> # pkg delete -g -f docbook-xml\* docbook-sk\* docbook\[2345\]\?\?-\* docbook-4\*
> ```

> **注意**
>
> 推荐 `AFFECTS` 行包含一个匹配所有受此条目影响的 Port 的 glob，以便自动化工具可以尽可能轻松地解析它。如果更新涉及所有现有的 BIND 9 版本，则 `AFFECTS` 内容应为 `users of dns/bind9*`，而不应为 `users of BIND 9`。

## 11.2.2. /usr/ports/MOVED

此文件用于列出被移动或删除的 Ports。文件中的每一行由 Port 的名称、该 Port 移动到的位置、移动日期以及原因组成。如果 Port 被删除，可以将移动位置部分留空。每个部分必须用 `|`（管道）字符分隔，如下所示：

```sh
old name|new name (blank for deleted)|date of move|reason
```

日期必须以 `YYYY-MM-DD` 的形式输入。新条目会被添加到列表的末尾，以保持按时间顺序排列，最旧的条目位于顶部。

如果某个 Port 被删除但后来又恢复了，删除该文件中记录其被删除的行。

如果某个 Port 被重命名后又恢复为原名称，需添加一个从中间名称到原名称的新条目，并删除旧条目以避免形成循环。

> **注意**
>
> 任何更改都必须通过 `Tools/scripts/MOVEDlint.awk` 进行验证。如果使用的是 **/usr/ports** 以外的 Ports 目录，使用以下命令：
>
> ```sh
> % cd /home/user/ports
> % env PORTSDIR=$PWD Tools/scripts/MOVEDlint.awk
> ```


# 12.1.安全为何如此重要

软件中偶尔会引入 bug。可以说，其中最危险的是那些会引发安全漏洞的 bug。从技术角度来看，这类漏洞需要通过消除导致它们的 bug 来关闭。然而，处理普通 bug 和安全漏洞的政策是非常不同的。

一个典型的小 bug 只影响那些启用了某些选项组合的用户，这些选项触发了该 bug。开发者最终会发布一个修复补丁，然后发布一个新的软件版本，修复了该 bug，但大多数用户不会立即升级，因为该 bug 从未困扰过他们。一个可能导致数据丢失的严重 bug 代表了更严重的问题。然而，谨慎的用户知道，除了软件 bug，很多可能的事故也有可能导致数据丢失，因此他们会备份重要数据；此外，严重 bug 很快就会被发现。

安全漏洞则完全不同。首先，它可能多年未被发现，因为它通常不会导致软件故障。其次，恶意方可以利用它获得对易受攻击系统的未经授权的访问，销毁或更改敏感数据；在最坏的情况下，用户甚至不会注意到造成的损害。第三，暴露易受攻击的系统通常会帮助攻击者入侵其他本来无法突破的系统。因此，仅修复漏洞是不够的：需要以最清晰、最全面的方式通知受众，让他们评估风险并采取适当的行动。


# 12.2.修复安全漏洞

在谈到 Ports 和包时，安全漏洞可能最初出现在原始发行版或 Port 文件中。在前一种情况下，原始软件开发者可能会立即发布补丁或新版本。请根据作者的修复及时更新 Port。如果由于某种原因修复被延迟，你可以[标记该 Port 为 `FORBIDDEN`](https://docs.freebsd.org/en/books/porters-handbook/porting-dads/#dads-noinstall) 或向 Port 引入补丁文件。如果 Port 本身存在漏洞，请尽快修复该 Port。在这两种情况下，除非有权直接提交到 Ports 树，否则应遵循[提交更改的标准流程](https://docs.freebsd.org/en/books/porters-handbook/port-upgrading/#port-upgrading)。

> **重要**
>
> 成为 Ports 提交者并不足以随意提交 Port。切记，Port 通常有各自维护者，必须尊重他们。

请确保在漏洞修复后，尽快更新该 Port 的版本号。这样，定期升级已安装包的用户就能看到他们需要运行更新。此外，新的包将通过 FTP 和 WWW 镜像重新构建并分发，替换掉易受攻击的版本。如果修复漏洞过程中 `DISTVERSION` 没有变化，则增加 `PORTREVISION`。也就是说，如果向 Port 添加了补丁文件，则增加 `PORTREVISION`，但如果更新 Port 到最新软件版本并已修改 `DISTVERSION`，则不增加它。更多信息请参考[相关部分](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-naming-revepoch)。


# 12.3.向社区通报情况

## 12.3.1. VuXML 数据库

在发现安全漏洞后，尽早通知 Port 用户社区是非常重要且紧急的步骤。这样的通知有两个目的。首先，如果风险真的很严重，最好立即采取临时解决方案。例如，停止受影响的网络服务，或者在漏洞修复前完全卸载该 Port。其次，很多用户通常只偶尔升级已安装的包。他们会从通知中得知，一旦有修复版本发布，就必须立即更新包。

鉴于 Ports 树中 Port 数量庞大，不能在每个事件发生时都发布安全公告，这样会造成信息泛滥，导致受众对真正严重的事件失去关注。因此，在 Ports 中发现的安全漏洞会被记录在 [FreeBSD VuXML 数据库](https://vuxml.freebsd.org/) 中。安全官员团队成员也会监视它，处理需要他们干预的问题。

提交者可以自己更新 VuXML 数据库，协助安全官员团队，并更快速地向社区提供关键信息。对于那些不是提交者，或者发现了特别严重的漏洞的人，应当毫不犹豫地直接联系安全官员团队，联系方式可以在 [FreeBSD 安全信息](https://www.freebsd.org/security/#how) 页面上找到。

VuXML 数据库是一个 XML 文档。其源文件 **vuln.xml** 保存在 Port [security/vuxml](https://cgit.freebsd.org/ports/tree/security/vuxml/) 中。因此，该文件的完整路径将是 **PORTSDIR/security/vuxml/vuln.xml**。每当在 Port 中发现安全漏洞时，请为该漏洞在此文件中添加一个条目。在熟悉 VuXML 之前，最好先找到一个符合当前情况的现有条目，然后复制它并用作模板。

## 12.3.2. VuXML 简介

完整的 XML 格式非常复杂，超出了本书的范围。然而，要基本了解 VuXML 条目的结构，只需要了解标签的概念。XML 标签名称用尖括号括起来。每个打开的 `<tag>` 必须有一个匹配的关闭标签 `</tag>`。标签可以嵌套。如果是嵌套的，必须先关闭内部标签，再关闭外部标签。标签有层次结构，即更复杂的嵌套规则。这与 HTML 类似。主要的区别在于，XML 是 **eX**tensible（可扩展的），即基于定义自定义标签。由于 XML 的固有结构，它将原本无序的数据整理成形。VuXML 特别为标记安全漏洞描述而设计。

现在考量一个实际的 VuXML 条目：

```xml
<vuln vid="f4bc80f4-da62-11d8-90ea-0004ac98a7b9"> ①
  <topic>Several vulnerabilities found in Foo</topic> ②
  <affects>
    <package>
      <name>foo</name> ③
      <name>foo-devel</name>
      <name>ja-foo</name>
      <range><ge>1.6</ge><lt>1.9</lt></range> ④
      <range><ge>2.*</ge><lt>2.4_1</lt></range>
      <range><eq>3.0b1</eq></range>
    </package>
    <package>
      <name>openfoo</name> ⑤
      <range><lt>1.10_7</lt></range> ⑥
      <range><ge>1.2,1</ge><lt>1.3_1,1</lt></range>
    </package>
  </affects>
  <description>
    <body xmlns="http://www.w3.org/1999/xhtml">
      <p>J. Random Hacker reports:</p> ⑦
      <blockquote
        cite="http://j.r.hacker.com/advisories/1">
        <p>Several issues in the Foo software may be exploited
          via carefully crafted QUUX requests.  These requests will
          permit the injection of Bar code, mumble theft, and the
          readability of the Foo administrator account.</p>
      </blockquote>
    </body>
  </description>
  <references> ⑧
    <freebsdsa>SA-10:75.foo</freebsdsa> ⑨
    <freebsdpr>ports/987654</freebsdpr> ⑩
    <cvename>CVE-2023-48795</cvename> ⑪
    <certvu>740169</certvu> ⑫
    <uscertta>SA10-99A</uscertta> ⑬
    <mlist msgid="201075606@hacker.com">http://marc.theaimsgroup.com/?l=bugtraq&amp;m=203886607825605</mlist> ⑭
    <url>http://j.r.hacker.com/advisories/1</url> ⑮
  </references>
  <dates>
    <discovery>2010-05-25</discovery> ⑯
    <entry>2010-07-13</entry> ⑰
    <modified>2010-09-17</modified> ⑱
  </dates>
</vuln>
```

标签名称应该是不言自明的，因此我们只详细说明需要填写的字段：

* ① 这是 VuXML 条目的顶层标签。它有一个必需的属性 `vid`，指定该条目的通用唯一标识符（UUID，用引号括起来）。每个新的 VuXML 条目都应生成一个 UUID（并且不要忘记用其替换模板 UUID，除非是从头编写条目）。使用 [uuidgen(1)](https://man.freebsd.org/cgi/man.cgi?query=uuidgen\&sektion=1\&format=html) 来生成 VuXML UUID。
* ② 这是所发现问题的一行描述。
* ③ 这里列出受影响的包名称。可以列出多个名称，因为多个包可能基于同一个主 Port 或软件产品。这可能包括稳定版和开发版、本地化版本，以及具有不同重要构建配置选项的从属 Port。
* ④ 这里以一个或多个范围形式指定受影响包的版本，使用 `<lt>`、`<le>`、`<eq>`、`<ge>` 和 `<gt>` 元素的组合。请检查给出的版本范围是否没有重叠。在范围说明中，`\*`（星号）表示最小的版本号。特别地，`2.*` 小于 `2.a`。因此可以使用星号来匹配所有可能的 `alpha`、`beta` 和 `RC` 版本。例如，`<ge>2.*</ge><lt>3.*</lt>` 会选择性地匹配每个 `2.x` 版本，而 `<ge>2.0</ge><lt>3.0</lt>` 不会，因为它跳过了 `2.r3` 并匹配了 `3.b`。上述示例表示受影响的版本包括从 `1.6` 到 `1.9`（不包括 `1.9`）、`2.x` 版本中小于 `2.4_1` 的部分，以及版本 `3.0b1`。
* ⑤ 在 `<affected>` 区块中可以列出若干相关包组（本质上是 Ports）。当多个软件产品（比如 FooBar、FreeBar 和 OpenBar）源自同一代码库并共享其漏洞时可使用此方式。请注意这与在单个 `<package>` 区块中列出多个名称的不同。
* ⑥ 版本范围必须考虑 `PORTEPOCH` 和 `PORTREVISION`（如适用）。请记住，根据排序规则，带有非零 `PORTEPOCH` 的版本大于任何没有 `PORTEPOCH` 的版本，例如，`3.0,1` 大于 `3.1`，甚至大于 `8.9`。
* ⑦ 这是问题的摘要说明。本字段使用 XHTML。至少要出现包裹内容的 `<p>` 和 `</p>` 标签。可以使用更复杂的标记，但仅限于准确性和清晰性的目的：请勿添加视觉效果装饰。
* ⑧ 本节包含相关文档的引用。建议尽可能多地提供适用的引用。
* ⑨ 这是一个 [FreeBSD 安全公告](https://www.freebsd.org/security/#adv)。
* ⑩ 这是一个 [FreeBSD 问题报告](https://www.freebsd.org/support/)。
* ⑪ 这是一个 [MITRE CVE](https://cve.mitre.org/) 标识符。
* ⑫ 这是一个 [US-CERT](https://www.kb.cert.org/vuls/) 漏洞说明。
* ⑬ 这是一个 [US-CERT](https://www.cisa.gov/news-events/cybersecurity-advisories) 技术网络安全警报。
* ⑭ 这是邮件列表中存档帖子的 URL。可选属性 `msgid` 可用于指定该帖子的消息 ID。
* ⑮ 这是一个通用 URL，仅在其他引用类别都不适用时才使用。
* ⑯ 这是问题公开披露的日期（*YYYY-MM-DD*）。
* ⑰ 这是该条目添加的日期（*YYYY-MM-DD*）。
* ⑱ 这是该条目中任意信息最后一次修改的日期（*YYYY-MM-DD*）。新条目不得包含该字段。仅在编辑现有条目时添加。

## 12.3.3. 测试对 VuXML 数据库的更改

本例描述了一个关于 `dropbear` 包的新漏洞条目，该漏洞在版本 `dropbear-2013.59` 中已修复。

前提是安装最新版的 [security/vuxml](https://cgit.freebsd.org/ports/tree/security/vuxml/) Port。

首先检查是否已有该漏洞的条目。如果已有，该条目应能匹配该包的前一个版本 `2013.58`：

```sh
% pkg audit dropbear-2013.58
```

如果未找到匹配条目，则为此漏洞添加一个新条目：

```sh
% cd ${PORTSDIR}/security/vuxml
% make newentry
```

如果该漏洞具有 [MITRE CVE](https://cve.mitre.org/) 标识符，可以使用以下命令代替：

```sh
% cd ${PORTSDIR}/security/vuxml
% make newentry CVE_ID=CVE-YYYY-XXXXX
```

其中 `CVE-YYYYY-XXXX` 是有效的 CVE 标识符。

如果该漏洞是 FreeBSD 安全公告，可使用以下命令代替：

```sh
% cd ${PORTSDIR}/security/vuxml
% make newentry SA_ID=FreeBSD-SA-YY-XXXXXX.asc
```

其中 `FreeBSD-SA-YY-XXXXXX.asc` 是已发布的 [FreeBSD 安全公告](https://www.freebsd.org/security/advisories/)。

验证语法和格式是否正确：

```sh
% make validate
```

上述命令会生成 **vuln-flat.xml** 文件，也可以使用以下命令生成：

```sh
% make vuln-flat.xml
```

> **注意**
>
> 至少需要安装以下其中一个包：[textproc/libxml2](https://cgit.freebsd.org/ports/tree/textproc/libxml2/)、[textproc/jade](https://cgit.freebsd.org/ports/tree/textproc/jade/)。

验证条目中的 `<affected>` 区块是否能匹配正确的包版本：

```sh
% pkg audit -f ${PORTSDIR}/security/vuxml/vuln-flat.xml dropbear-2013.58
```

确保该条目不会错误地匹配不受影响的版本。

现在检查是否匹配正确的版本范围：

```sh
% pkg audit -f ${PORTSDIR}/security/vuxml/vuln-flat.xml dropbear-2013.58 dropbear-2013.59
dropbear-2012.58 is vulnerable:
dropbear -- exposure of sensitive information, DoS
CVE: CVE-2013-4434
CVE: CVE-2013-4421
WWW: https://portaudit.FreeBSD.org/8c9b48d1-3715-11e3-a624-00262d8b701d.html

1 problem(s) in the installed packages found.
```

前者能匹配，而后者不会。

## 12.3.4. VuXML 新条目检查清单

* 检查 Port 的名称。有时上游项目名称与 Port 名称并不完全相同。
* 添加所有 flavor。当 Port 有 flavor 时，所有包名称都需要作为 `<package>` 添加到条目中。使用以下脚本生成所有带 flavor 的包名称：

  ```sh
  % for flavor in $(make -V FLAVORS); do FLAVOR="${flavor}" make -VPKGNAME;done
  ```
* 检查 Port 是否有 `PORTEPOCH`。上面的脚本片段可以帮助确认。如果 Port 使用 `PORTEPOCH`，则必须将其添加到 `<range>` 标签中。
* 仔细检查范围。对于两端都有限制的范围，确保 `<ge>` 和 `<lt>` 元素位于同一个 `<range>` 标签内。否则条目可能最终会定义重叠的范围。
* 交叉检查衍生项目。检查 Ports 树中是否包含该项目的衍生版本或分支，并确认它们是否也受影响。例如，如果在 [www/firefox](https://cgit.freebsd.org/ports/tree/www/firefox/) 中发现漏洞，应评估类似的衍生项目，如 [www/librewolf](https://cgit.freebsd.org/ports/tree/www/librewolf/)、[www/waterfox](https://cgit.freebsd.org/ports/tree/www/waterfox/) 或其他类似项目是否也存在相同漏洞。请在 VuXML 条目中列出所有受影响的衍生项目，以确保这些 Ports 的用户也能获知相关信息。同时检查树中是否存在同一 Port 的 Linux 版本。例如，[databases/sqlite3](https://cgit.freebsd.org/ports/tree/databases/sqlite3/) 的漏洞很可能也会影响 [databases/linux-c7-sqlite3](https://cgit.freebsd.org/ports/tree/databases/linux-c7-sqlite3/) 等包。
* 在未先运行 `make validate` 之前，不要提交条目。


# 第 13 章 该做什么和不该做什么

## 13.1. 介绍

以下是移植过程中常见的一些注意事项和禁忌。请对照本清单检查 Port，同时也请查看其他人提交到 [PR 数据库](https://bugs.freebsd.org/search/) 中的 Ports。根据 [Bug Reports and General Commentary](https://docs.freebsd.org/en/articles/contributing/#CONTRIB-GENERAL) 中的说明提交对 Ports 的任何意见。检查 PR 数据库中的 Ports 不仅可以加快我们提交的速度，还可以证明你知道自己在做什么。

## 13.2. `WRKDIR`

不要向 `WRKDIR` 之外的文件写入任何内容。`WRKDIR` 是构建 Port 过程中唯一保证可写的地方（参见 [从光盘安装 Ports](https://docs.freebsd.org/en/books/handbook/#PORTS-CD) 中只读树构建 Ports 的示例）。**pkg-\*** 文件可以通过 [重新定义变量](https://docs.freebsd.org/en/books/porters-handbook/pkg-files/#pkg-names) 的方式修改，而不是直接覆盖文件。

## 13.3. `WRKDIRPREFIX`

确保 Port 遵守 `WRKDIRPREFIX`。大多数 Ports 不需要关心这一点。尤其是在引用其他 Port 的 `WRKDIR` 时，应注意正确的位置是 **${WRKDIRPREFIX}${PORTSDIR}/subdir/name/work**，而不是 **${PORTSDIR}/subdir/name/work** 或 **${.CURDIR}/../../subdir/name/work** 或类似路径。

## 13.4. 区分操作系统及其版本

某些代码需要根据所运行的 FreeBSD Unix 版本进行修改或条件编译。区分 FreeBSD 版本的推荐方式是使用定义在 [sys/param.h](https://cgit.freebsd.org/src/tree/sys/sys/param.h) 中的 `__FreeBSD_version` 和 `__FreeBSD__` 宏。如果未包含该文件，请在对应的 **.c** 文件中添加如下代码：

```c
#include <sys/param.h>
```

`__FreeBSD__` 在所有版本的 FreeBSD 中都定义为其主版本号。例如，在 FreeBSD 9.x 中，`__FreeBSD__` 被定义为 `9`。

```c
#if __FreeBSD__ >= 9
#  if __FreeBSD_version >= 901000
	 /* 9.1+ 版本特有的代码 */
#  endif
#endif
```

`__FreeBSD_version` 的完整值列表可参考 [`__FreeBSD_version` 值](https://docs.freebsd.org/en/books/porters-handbook/versions/#versions)。

## 13.5. 在 bsd.port.mk 之后写内容

不要在 `.include <bsd.port.mk>` 这一行之后写任何内容。通常可以通过在 **Makefile** 中部引入 **bsd.port.pre.mk**，在末尾引入 **bsd.port.post.mk** 来避免这种情况。

> **重要**
>
> 要么使用 **bsd.port.pre.mk**/**bsd.port.post.mk** 配对，要么只使用 **bsd.port.mk**；请不要混用这两种方式。

**bsd.port.pre.mk** 只定义了一些变量，可以在 **Makefile** 中进行判断使用，而 **bsd.port.post.mk** 定义其余变量。

下面是一些 **bsd.port.pre.mk** 定义的重要变量（不是完整列表，完整内容请参考 **bsd.port.mk**）：

| 变量名         | 描述                                                                                                             |
| ----------- | -------------------------------------------------------------------------------------------------------------- |
| `ARCH`      | 架构类型，`uname -p` 返回的结果（例如，`i386`）                                                                               |
| `OPSYS`     | 操作系统类型，`uname -s` 返回的结果（例如，`FreeBSD`）                                                                          |
| `OSREL`     | 操作系统的发布版本（例如，`2.1.5` 或 `2.2.7`）                                                                                |
| `OSVERSION` | 操作系统的数字版本；与 [`__FreeBSD_version`](https://docs.freebsd.org/en/books/porters-handbook/versions/#versions) 相同    |
| `LOCALBASE` | “本地”目录的根目录（例如，**/usr/local**）                                                                                  |
| `PREFIX`    | Port 安装的位置（详见 [关于 `PREFIX` 的更多信息](https://docs.freebsd.org/en/books/porters-handbook/testing/#porting-prefix)） |

> **注意**
>
> 如果需要使用 `MASTERDIR`，务必在包含 **bsd.port.pre.mk** 之前定义它。

以下是一些可以在 **bsd.port.pre.mk** 之后添加的示例：

```c
# 如果系统中已有 perl5，就无需编译 lang/perl5
.if ${OSVERSION} > 300003
BROKEN=	perl is in system
.endif
```

`BROKEN=` 后请始终使用 tab 而不是空格。

## 13.6. 在封装脚本中使用 `exec` 语句

如果 Port 安装了一个 shell 脚本，而该脚本的目的是启动另一个程序，并且启动该程序是脚本执行的最后一步，那么请务必使用 `exec` 语句来启动该程序，例如：

```sh
#!/bin/sh
exec %%LOCALBASE%%/bin/java -jar %%DATADIR%%/foo.jar "$@"
```

`exec` 语句会将当前 shell 进程替换为指定程序。如果省略 `exec`，则 shell 进程在程序运行期间仍会驻留在内存中，造成系统资源的无谓浪费。

## 13.7. 理性地处理问题

**Makefile** 应该以简单合理的方式完成任务。使其更简洁或更易读总是更好的做法。示例包括使用 make 的 `.if` 结构代替 shell 的 `if` 结构；如果只需重定义 `EXTRACT*` 就足够了，就不要重定义 `do-extract`；使用 `GNU_CONFIGURE` 而不是 `CONFIGURE_ARGS += --prefix=${PREFIX}`。

如果为了实现某个功能需要添加大量新代码，很可能在 **bsd.port.mk** 中已经有相关实现。虽然 **bsd.port.mk** 难以阅读，但它为许多看似复杂的问题提供了简洁的解决方案。

## 13.8. 遵守 `CC` 和 `CXX`

Port 必须遵守 `CC` 和 `CXX`。这意味着不能直接覆盖这两个变量的值，而应在已有值的基础上追加所需内容。这样做可以确保影响所有 Ports 的构建选项能被全局设置。

如果 Port 没有遵守这些变量，请在 **Makefile** 中添加 `NO_PACKAGE=ignores either cc or cxx`。

以下是一个遵守 `CC` 和 `CXX` 的 **Makefile** 示例。注意 `?=` 的使用：

```makefile
CC?= gcc
```

```makefile
CXX?= g++
```

以下是不遵守的示例：

```makefile
CC= gcc
```

```makefile
CXX= g++
```

在 FreeBSD 系统中，`CC` 和 `CXX` 可以在 **/etc/make.conf** 中定义。第一个示例仅在变量未被预先定义时赋值，保留了系统范围的定义；而第二个示例则会覆盖已有定义。

## 13.9. 遵守 `CFLAGS`

Port 必须遵守 `CFLAGS`。这意味着不能直接覆盖该变量的值，而应在已有值的基础上追加所需内容。这样可以确保影响所有 Ports 的构建选项能被全局设置。

如果未遵守，请在 **Makefile** 中添加 `NO_PACKAGE=ignores cflags`。

以下是一个遵守 `CFLAGS` 的 **Makefile** 示例。注意 `+=` 的使用：

```makefile
CFLAGS+= -Wall -Werror
```

以下是不遵守的示例：

```makefile
CFLAGS= -Wall -Werror
```

`CFLAGS` 在 FreeBSD 系统中定义于 **/etc/make.conf**。第一个示例将额外参数附加到已有的 `CFLAGS` 上，保留系统级定义；而第二个示例会覆盖原有定义。

请从第三方 **Makefile** 中移除优化标志。系统的 `CFLAGS` 已包含系统范围的优化选项。以下是未修改的 **Makefile** 中的示例：

```makefile
CFLAGS= -O3 -funroll-loops -DHAVE_SOUND
```

使用系统优化标志后的 **Makefile** 应类似如下：

```makefile
CFLAGS+= -DHAVE_SOUND
```

## 13.10. 显示详细构建日志

请确保 Port 的构建系统在构建阶段显示所有执行的命令。完整的构建日志对于调试 Port 问题至关重要。

信息量不足的构建日志示例（错误）：

```sh
  CC     source1.o
  CC     source2.o
  CCLD   someprogram
```

详细的构建日志示例（正确）：

```sh
cc -O2 -pipe -I/usr/local/include -c -o source1.o source1.c
cc -O2 -pipe -I/usr/local/include -c -o source2.o source2.c
cc -o someprogram source1.o source2.o -L/usr/local/lib -lsomelib
```

某些构建系统（如 CMake、ninja 和 GNU configure）在 Ports 框架中已经配置为显示详细日志。其他情况下，Port 可能需要单独调整。

## 13.11. 反馈

请将相关的更改和补丁提交给上游维护者，以便在下一版本中包含这些更改。这样有助于简化后续版本的更新过程。

## 13.12. README.html

**README.html** 并不是 Port 的一部分，而是通过执行 `make readme` 生成的。请勿将此文件包含在补丁或提交中。

> **注意**
>
> 如果 `make readme` 失败，请确认 Port 未修改 `ECHO_MSG` 的默认值。

## 13.13. 使用 `BROKEN`、`FORBIDDEN` 或 `IGNORE` 标记不可安装的 Port

在某些情况下，必须阻止用户安装某个 Port。可以在 Port 的 **Makefile** 中使用几个变量来告诉用户该 Port 无法安装。这些 make 变量的值将作为 Port 拒绝安装的原因显示给用户。请使用正确的 make 变量。每个变量在语义上截然不同，不仅对用户如此，对依赖 **Makefile** 的自动化系统（如 [Ports 构建集群](https://docs.freebsd.org/en/books/porters-handbook/keeping-up/#build-cluster) 和 [FreshPorts](https://docs.freebsd.org/en/books/porters-handbook/keeping-up/#freshports)）也是如此。

### 13.13.1. 各变量说明

* `BROKEN`：用于目前无法编译、安装、卸载或正常运行的 Port。适用于预计问题是暂时性的情形。 如果收到指示，构建集群仍会尝试构建它们，以查看潜在问题是否已解决。（然而，通常集群运行时不带此指示。）

  例如，当一个 Port：

  * 无法编译；
  * 配置或安装过程失败；
  * 将文件安装到 **${PREFIX}** 之外；
  * 卸载时未能清除所有文件（不过如果留下的是用户已修改的文件，可能是可以接受甚至是理想的）；
  * 在本应能正常运行的系统上运行失败；

  应使用 `BROKEN`。
* `FORBIDDEN`：用于含有安全漏洞，或对 FreeBSD 系统安全构成严重隐患的 Port（例如：臭名昭著的不安全程序，或提供易被攻击的服务的程序）。一旦发现某个软件存在漏洞且无可用升级版本，应立即将相关 Port 标记为 `FORBIDDEN`。理想情况下，发现安全漏洞时应尽快升级 Port，以减少存在漏洞的 FreeBSD 主机数量（我们以安全著称），然而有时从漏洞披露到漏洞软件发布更新版本之间会存在明显的时间间隔。除安全问题外，请勿使用 `FORBIDDEN`。
* `IGNORE`：用于因其他原因绝不能构建的 Port。适用于认为问题具有结构性特征的情形。构建集群在任何情况下都不会构建被标记为 `IGNORE` 的 Port。例如，在以下情况下应使用 `IGNORE`：

  * Port 不支持当前安装的 FreeBSD 版本；

  * distfile 因许可证限制不能自动获取；

  * 与当前已安装的其他 Port 不兼容（例如：该 Port 依赖 [www/drupal7](https://cgit.freebsd.org/ports/tree/www/drupal7/)，而系统已安装的是 [www/drupal8](https://cgit.freebsd.org/ports/tree/www/drupal8/)）；

  > **注意**
  >
  > 如果 Port 与当前安装的其他 Port 冲突（例如，它们安装了具有不同功能但同名的文件），[请使用 `CONFLICTS`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#conflicts)。`CONFLICTS` 会自动设置 `IGNORE`。

### 13.13.2. 实现注意事项

不要给 `BROKEN`、`IGNORE` 及相关变量的值加引号。由于这些信息最终会显示给用户，每个变量所使用的消息措辞是不同的：

```makefile
BROKEN=	fails to link with base -lcrypto
```

```makefile
IGNORE=	unsupported on recent versions
```

这样，`make describe` 的输出如下所示：

```sh
===>  foobar-0.1 is marked as broken: fails to link with base -lcrypto.
```

```sh
===>  foobar-0.1 is unsupported on recent versions.
```

## 13.14. 架构相关注意事项

### 13.14.1. 架构通用说明

FreeBSD 支持的处理器架构远不止常见的 x86 架构。一些 Port 具有特定于一个或多个架构的限制。

要查看支持的架构列表，请执行以下命令：

```sh
cd ${SRCDIR}; make targets
```

返回的值为 `TARGET`/`TARGET_ARCH` 形式。只读 make 变量 `ARCH` 的值基于 `TARGET_ARCH` 设置。Port 的 **Makefile** 应当测试该变量的值。

### 13.14.2. 标记为架构无关的 Port

不包含任何依赖特定架构文件或要求的 Port 应设置 `NO_ARCH=yes`。

这类 Port 构建出的软件包，其架构字符串将以 `:*`（通配架构）结尾，而不是例如 `freebsd:13:x86:64`（amd64 架构）。

> **注意**
>
> 设置 `NO_ARCH` 的目的在于表明无需为所有支持架构单独构建包。这样可以减少构建和分发软件包所消耗的资源，例如网络带宽、镜像服务器和分发介质的磁盘空间。但当前的软件包基础设施（例如软件包管理器、镜像、构建系统）尚未完全利用 `NO_ARCH` 带来的优势。

### 13.14.3. 仅在特定架构上标记为不可构建的 Port

* 若希望仅在某些架构上将 Port 标记为 `IGNORE`，可使用 `ONLY_FOR_ARCHS` 和 `NOT_FOR_ARCHS` 这两个便利变量，它们会自动设置 `IGNORE`。示例：

  ```makefile
  ONLY_FOR_ARCHS=	i386 amd64
  ```

  ```makefile
  NOT_FOR_ARCHS=	ia64 sparc64
  ```

  可使用 `ONLY_FOR_ARCHS_REASON` 和 `NOT_FOR_ARCHS_REASON` 设置自定义的 `IGNORE` 消息。也可以针对特定架构使用 `ONLY_FOR_ARCHS_REASON_ARCH` 和 `NOT_FOR_ARCHS_REASON_ARCH` 设定说明。
* 若 Port 下载并安装的是 i386 的二进制文件，应设置 `IA32_BINARY_PORT`。若设置了该变量，则系统必须存在 **/usr/lib32** 以提供 IA32 库，同时内核必须支持 IA32 兼容性。如果这两个条件之一未满足，则将自动设置 `IGNORE`。

### 13.14.4. 与构建集群相关的注意事项

* 某些 Port 会尝试通过向编译器传递 `-march=native` 参数来针对当前构建机器做出优化。这种做法应避免：要么作为默认关闭的选项列出，要么彻底删除该参数。 否则，由构建集群构建的默认软件包可能无法在该架构下的所有机器上运行。

## 13.15. 使用 `DEPRECATED` 和 `EXPIRATION_DATE` 标记待移除的 Port

请记住，如果一个 Port 无法工作，`BROKEN` 和 `FORBIDDEN` 应仅作为临时手段使用。永久损坏的 Port 将被从 Ports 树中完全移除。

在适当的时候，可以使用 `DEPRECATED` 和 `EXPIRATION_DATE` 提前提醒用户 Port 即将被移除。其中，`DEPRECATED` 是说明被弃用原因的字符串，`EXPIRATION_DATE` 是 ISO 8601 格式的日期字符串（YYYY-MM-DD）。两者都会显示给用户。

可以仅设置 `DEPRECATED` 而不设置 `EXPIRATION_DATE`（例如建议使用新版 Port），但反过来没有任何意义。

> **注意**
>
> 标记 Port 为 `DEPRECATED` 时，若有替代 Port 可用，建议在提交说明中提及替代项。

并没有明确规定应提前多久通知用户。当前的惯例是：安全相关问题提前一个月通知，构建相关问题提前两个月通知。这也为感兴趣的提交者留出一点时间来修复问题。

## 13.16. 避免使用 `.error` 结构

**Makefile** 中如果需要因为某些外部因素（例如用户指定了不合法的构建选项组合）而阻止 Port 安装，正确的做法是给 `IGNORE` 赋一个非空的值。该值会在执行 `make install` 时被格式化并展示给用户。

一个常见的错误是为此目的使用 `.error`。这样做的问题在于，许多与 Ports 树交互的自动化工具在遇到这种情况时会失败。最常见的例子是在尝试构建 **/usr/ports/INDEX** 时失败（参见 [运行 `make describe`](https://docs.freebsd.org/en/books/porters-handbook/testing/#make-describe)）。但即使是非常简单的命令，例如 `make maintainer`，也会因此失败。这种行为是不可接受的。

**示例 1：如何避免使用 `.error`**

下面两个 **Makefile** 片段中，第一个会导致 `make index` 失败，而第二个不会：

```makefile
.error "option is not supported"
```

```makefile
IGNORE=option is not supported
```

## 13.17. 使用 sysctl

除非用于目标（targets）中，否则不建议使用 **sysctl**。这是因为在求值任何 `makevar`（例如运行 `make index` 时所用到的）时会执行该命令，从而进一步拖慢该过程。

仅应通过 `SYSCTL` 使用 [sysctl(8)](https://man.freebsd.org/cgi/man.cgi?query=sysctl\&sektion=8\&format=html)，因为它包含完整路径，并且在必要时可以被覆盖。

## 13.18. 重新打包 distfile

有时软件作者会在不更改文件名的情况下，修改已发布的 distfile 内容。应验证这些更改是官方行为，且确实由作者执行。过去曾有 distfile 在下载服务器上被暗地里篡改，意图造成损害或危及终端用户的安全。

请将旧的 distfile 放到一边，下载新的文件，解压后使用 [diff(1)](https://man.freebsd.org/cgi/man.cgi?query=diff\&sektion=1\&format=html) 比较内容。如果确认没有可疑之处，再更新 **distinfo**。

> **重要**
>
> 请务必在 PR 和提交日志中简要说明差异，这样其他人可以了解没有发生恶意行为。

联系软件作者并向他们确认这些更改。

## 13.19. 遵循 POSIX 标准

FreeBSD Ports 通常期望软件遵循 POSIX 标准。有些软件和构建系统会基于特定操作系统或环境做出假设，这会在作为 Port 使用时引发问题。

如果有其他方式获取信息，不要使用 **/proc**。例如，可以在 `main()` 中使用 `setprogname(argv[0])`，随后调用 [getprogname(3)](https://man.freebsd.org/cgi/man.cgi?query=getprogname\&sektion=3\&format=html) 来获取可执行文件名称。

不要依赖 POSIX 没有文档化的行为。

如果应用程序在没有时间戳的情况下也能正常工作，就不要在关键路径中记录时间戳。获取时间戳可能较慢，具体取决于操作系统的时间戳精度。如果确实需要时间戳，应确定所需精度，并使用明确能提供该精度的 API。

一些简单的系统调用（例如 [gettimeofday(2)](https://man.freebsd.org/cgi/man.cgi?query=gettimeofday\&sektion=2\&format=html)、[getpid(2)](https://man.freebsd.org/cgi/man.cgi?query=getpid\&sektion=2\&format=html)）在 Linux® 上因为缓存和 vsyscall 优化而非常快，但在其他操作系统上就没有这些优势。在性能敏感的程序中，不要假设这些调用是廉价的。总的来说，应尽量避免使用系统调用。

不要依赖 Linux® 特有的 socket 行为。特别是默认的 socket 缓冲区大小不同（应通过调用 [setsockopt(2)](https://man.freebsd.org/cgi/man.cgi?query=setsockopt\&sektion=2\&format=html) 设置 `SO_SNDBUF` 和 `SO_RCVBUF`），并且在 socket 缓冲区已满时，Linux® 的 [send(2)](https://man.freebsd.org/cgi/man.cgi?query=send\&sektion=2\&format=html) 会阻塞，而 FreeBSD 会返回失败并设置 errno 为 `ENOBUFS`。

如果确实需要依赖非标准行为，请将其正确封装为通用 API，并在配置阶段检测该行为，若不满足则中止。

请通过查阅 [man 页面](https://man.freebsd.org/cgi/man.cgi) 的“STANDARDS”部分来确认所使用的函数是否为 POSIX 接口。

不要假设 **/bin/sh** 是 bash。应确保传递给 [system(3)](https://man.freebsd.org/cgi/man.cgi?query=system\&sektion=3\&format=html) 的命令行可以在 POSIX 兼容的 shell 下正常执行。

常见 bash 主义列表可见于 [此处](https://wiki.ubuntu.com/DashAsBinSh)。

请检查头文件是否按照 POSIX 或 man 页面推荐的方式包含。例如，经常会忘记包含 **sys/types.h**，这在 Linux® 上问题不大，但在 FreeBSD 上就不行。

## 13.20. 其他注意事项

请务必反复检查 **pkg-descr** 和 **pkg-plist**。如果在审查 Port 时发现可以改进其措辞，请进行修正。

请务必注意任何法律问题！不要让我们非法分发软件！


# 第 14 章 一个示例 Makefile

这里是一个可以用来创建新 Port 的 **Makefile** 示例。

所示格式是在变量排序、节间空行等方面的推荐格式。这种格式旨在让最重要的信息易于查找。关于 lint、格式化和检查 **Makefile** 的工具的更多信息，请参阅测试章节。

```sh
[描述 Port 本身和主站的部分 - PORTNAME 和 PORTVERSION 或 DISTVERSION* 变量总是放在第一位，接着是 CATEGORIES，然后是 MASTER_SITES，后面可以跟 MASTER_SITE_SUBDIR。如果需要，PKGNAMEPREFIX 和 PKGNAMESUFFIX 会排在后面。然后是 DISTNAME，EXTRACT_SUFX 和/或 DISTFILES，然后根据需要是 EXTRACT_ONLY。]
PORTNAME=	xdvi
DISTVERSION=	18.2
CATEGORIES=	print
[如果没有使用 MASTER_SITE_* 宏，不要忘记尾部的斜杠（/）！]
MASTER_SITES=	${MASTER_SITE_XCONTRIB}
MASTER_SITE_SUBDIR=	applications
PKGNAMEPREFIX=	ja-
DISTNAME=	xdvi-pl18
[如果源代码不是标准的 ".tar.gz" 格式，设置此项]
EXTRACT_SUFX=	.tar.Z

[分发的补丁部分 -- 可以为空]
PATCH_SITES=	ftp://ftp.sra.co.jp/pub/X11/japanese/
PATCHFILES=	xdvi-18.patch1.gz xdvi-18.patch2.gz
[如果分发的补丁不是相对于 WRKSRC 制作的，可能需要调整此项]
PATCH_DIST_STRIP=	-p1

[维护者；*必需的*！这是自愿处理 Port 更新和构建中断，并接收用户问题与错误报告的人。为了尽可能保持 Ports Collection 的高质量，我们不接受将新 Port 分配给 "ports@FreeBSD.org"。]
MAINTAINER=	asami@FreeBSD.org
COMMENT=	DVI Previewer for the X Window System
WWW=		http://xdvi.sourceforge.net/

[许可证 -- 不应为空]
LICENSE=	BSD2CLAUSE
LICENSE_FILE=	${WRKSRC}/LICENSE

[依赖关系 -- 可以为空]
RUN_DEPENDS=	gs:print/ghostscript

[如果 Port 需要 GNU make 而不是默认的 FreeBSD make（make(1)）来构建。例如，某些 X 应用程序需要运行 xmkmf -a，在这种情况下 Port 需要 USES=imake。]
USES=		gmake

[此部分用于其他不属于上述任何类别的标准 bsd.port.mk 变量]
[如果在配置、构建、安装过程中会询问问题]
IS_INTERACTIVE=	yes
[如果解压到与 DISTNAME 不同的目录]
WRKSRC=		${WRKDIR}/xdvi-new
[如果需要运行由 GNU autoconf 生成的 "configure" 脚本]
GNU_CONFIGURE=	yes

[此部分用于处理 Port 选项]
OPTIONS_DEFINE=	DOCS EXAMPLES FOO
OPTIONS_DEFAULT=FOO
[如果选项会更改 plist 中的文件列表，设置 OPTIONS_SUB]
OPTIONS_SUB=	yes

FOO_DESC=		Enable foo support
FOO_CONFIGURE_ENABLE=	foo

[用于下面规则中的非标准变量]
MY_FAVORITE_RESPONSE=	"yeah, right"

[特殊规则，按 Ports 框架调用的顺序排列]
pre-fetch:
	i go fetch something, yeah

post-patch:
	i need to do something after patch, great

pre-install:
	and then some more stuff before installing, wow

[最后是尾声]

.include <bsd.port.mk>
```


# 第 15 章 在 Port Makefile 中变量的顺序

**Makefile** 的开头各段必须始终按固定顺序排列。这个标准让任何人都能轻松阅读任意一个 Port，而无需在混乱顺序中查找变量。

> **注意**
>
> 此处所述的各段和变量在普通 Port 中是强制性的。在从属 Port 中，许多段和变量可以省略。

> **重要**
>
> 以下各代码块之间必须以一个空行分隔。
>
> 在每个代码块中，仅设置该 Port 所必需的变量。请按照下列顺序定义这些变量。

## 15.1. `PORTNAME` 段

这是最重要的一段。它定义了 Port 的名称、版本、源代码分发文件的位置和分类。变量必须按如下顺序排列：

* [`PORTNAME`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-portname) \* [`PORTVERSION`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-versions)\[[1](https://docs.freebsd.org/en/books/porters-handbook/order/#portversion-footnote)]
* [`DISTVERSIONPREFIX`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-versions) \* [`DISTVERSION`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-versions)\[[1](https://docs.freebsd.org/en/books/porters-handbook/order/#portversion-footnote)]
* [`DISTVERSIONSUFFIX`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-versions)
* [`PORTREVISION`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-portrevision)
* [`PORTEPOCH`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-portepoch)
* [`CATEGORIES`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-categories)
* [`MASTER_SITES`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-master_sites)
* [`MASTER_SITE_SUBDIR`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-master_sites-shorthand)（弃用）
* [`PKGNAMEPREFIX`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-pkgnameprefix-suffix)
* [`PKGNAMESUFFIX`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-pkgnameprefix-suffix)
* [`DISTNAME`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-distname)
* [`EXTRACT_SUFX`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-extract_sufx)
* [`DISTFILES`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-distfiles-definition)
* [`DIST_SUBDIR`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-dist_subdir)
* [`EXTRACT_ONLY`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-extract_only)

> **重要**
>
> `PORTVERSION` 和 `DISTVERSION` 只能择一而用。

## 15.2. `PATCHFILES` 段

此段为可选项。变量如下：

* [`PATCH_SITES`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-patchfiles)
* [`PATCHFILES`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-patchfiles)
* [`PATCH_DIST_STRIP`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#porting-patchfiles)

## 15.3. `MAINTAINER` 段

此段为强制项。变量如下：

* [`MAINTAINER`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-maintainer)
* [`COMMENT`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-comment)
* [`WWW`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-www)

## 15.4. `LICENSE` 段

这一段是可选的，但强烈建议使用。变量包括：

* [`LICENSE`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#licenses-license)
* [`LICENSE_COMB`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#licenses-license_comb)
* [`LICENSE_GROUPS`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#licenses-license_groups) 或 `LICENSE_GROUPS_NAME`
* [`LICENSE_NAME`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#licenses-license_name) 或 `LICENSE_NAME_NAME`
* [`LICENSE_TEXT`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#licenses-license_text) 或 `LICENSE_TEXT_NAME`
* [`LICENSE_FILE`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#licenses-license_file) 或 `LICENSE_FILE_NAME`
* [`LICENSE_PERMS`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#licenses-license_perms) 或 `LICENSE_PERMS_NAME_`
* [`LICENSE_DISTFILES`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#licenses-license_distfiles) 或 `LICENSE_DISTFILES_NAME`

如果存在多个许可证，需按许可证名称对各个 `LICENSE_VAR_NAME` 变量进行排序。

## 15.5. 通用 `BROKEN` / `IGNORE` / `DEPRECATED` 信息段

这一段是可选的。变量包括：

* [`DEPRECATED`](https://docs.freebsd.org/en/books/porters-handbook/porting-dads/#dads-deprecated)
* [`EXPIRATION_DATE`](https://docs.freebsd.org/en/books/porters-handbook/porting-dads/#dads-deprecated)
* [`FORBIDDEN`](https://docs.freebsd.org/en/books/porters-handbook/porting-dads/#dads-noinstall)
* [`BROKEN`](https://docs.freebsd.org/en/books/porters-handbook/porting-dads/#dads-noinstall)
* [`BROKEN_*`](https://docs.freebsd.org/en/books/porters-handbook/porting-dads/#dads-noinstall)
* [`IGNORE`](https://docs.freebsd.org/en/books/porters-handbook/porting-dads/#dads-noinstall)
* [`IGNORE_*`](https://docs.freebsd.org/en/books/porters-handbook/porting-dads/#dads-noinstall)
* [`ONLY_FOR_ARCHS`](https://docs.freebsd.org/en/books/porters-handbook/porting-dads/#dads-noinstall)
* [`ONLY_FOR_ARCHS_REASON*`](https://docs.freebsd.org/en/books/porters-handbook/porting-dads/#dads-noinstall)
* [`NOT_FOR_ARCHS`](https://docs.freebsd.org/en/books/porters-handbook/porting-dads/#dads-noinstall)
* [`NOT_FOR_ARCHS_REASON*`](https://docs.freebsd.org/en/books/porters-handbook/porting-dads/#dads-noinstall)

> **注意**
>
> `BROKEN_*` 和 `IGNORE_*` 可以是任意通用变量，例如 `IGNORE_amd64`、`BROKEN_FreeBSD_10` 等。依赖 [`USES`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses) 的变量除外，这些变量应放在 [`USES` 和 `USE_x`](https://docs.freebsd.org/en/books/porters-handbook/order/#porting-order-uses) 段中。例如，`IGNORE_WITH_PHP` 仅在设置了 [`php`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-php) 时才生效，`BROKEN_SSL` 仅在设置了 [`ssl`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-ssl) 时才生效。
>
> 如果 Port 仅在满足某些条件时才应标记为 `BROKEN`，并且这些条件只能在包含 **bsd.port.options.mk** 或 **bsd.port.pre.mk** 之后才能判断，那么应在 [其余变量段](https://docs.freebsd.org/en/books/porters-handbook/order/#porting-order-rest) 中设置这些变量。

## 15.6. 依赖关系段

这一段是可选的。变量包括：

* [`FETCH_DEPENDS`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-fetch_depends)
* [`EXTRACT_DEPENDS`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-extract_depends)
* [`PATCH_DEPENDS`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-patch_depends)
* [`BUILD_DEPENDS`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-build_depends)
* [`LIB_DEPENDS`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-lib_depends)
* [`RUN_DEPENDS`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-run_depends)
* `TEST_DEPENDS`

## 15.7. Flavors

这一段是可选的。

以定义 `FLAVORS` 开始此段，然后继续定义可用的 Flavors 助手。请参阅 [使用 FLAVORS](https://docs.freebsd.org/en/books/porters-handbook/flavors/#flavors-using) 了解更多信息。

对于不能通过助手设置的变量，应使用 `.if ${FLAVOR:U} == foo` 结构，并将其置于各自所属的段落中。

## 15.8. `USES` 和 `USE_x`

以定义 `USES` 开始本段，然后继续定义可能的 `USE_x`。

请将相关变量紧密排列。例如使用 [`USE_GITHUB`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-master_sites-github) 时，务必将所有 `GH_*` 变量紧跟其后。

## 15.9. 标准 bsd.port.mk 变量

这一段用于定义可以在 **bsd.port.mk** 中使用、但不属于前述各段的变量。

虽然变量的顺序并不重要，但请尽量将相似的变量归类在一起。例如，用户和用户组变量 `USERS` 和 `GROUPS`；配置变量 `CONFIGURE_*` 与 `*_CONFIGURE`；文件与目录列表变量如 `PORTDOCS` 与 `PORTEXAMPLES`。

## 15.10. Options 与 Helpers

如果该 Port 使用了 [选项框架](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#makefile-options)，请先定义 `OPTIONS_DEFINE` 和 `OPTIONS_DEFAULT`，然后是其它 `OPTIONS_*` 变量，再之后是 `*_DESC` 描述，最后是选项 helpers。尽量将上述所有内容按字母顺序排列。

**示例 1：Options 变量排序示例**

`FOO` 和 `BAR` 选项没有标准描述，因此需要编写。其他选项已经在 **Mk/bsd.options.desc.mk** 中定义好了描述，无需重复编写。`DOCS` 和 `EXAMPLES` 使用目标 helpers 来安装它们的文件，在此处也给出以示完整，尽管它们应归属 [目标段](https://docs.freebsd.org/en/books/porters-handbook/order/#porting-order-targets)，因此其前可插入其他变量和目标。

```makefile
OPTIONS_DEFINE=	DOCS EXAMPLES FOO BAR
OPTIONS_DEFAULT=	FOO
OPTIONS_RADIO=	SSL
OPTIONS_RADIO_SSL=    OPENSSL GNUTLS
OPTIONS_SUB=	yes

BAR_DESC=		Enable bar support
FOO_DESC=		Enable foo support

BAR_CONFIGURE_WITH=	bar=${LOCALBASE}
FOO_CONFIGURE_ENABLE=	foo
GNUTLS_CONFIGURE_ON=	--with-ssl=gnutls
OPENSSL_CONFIGURE_ON=	--with-ssl=openssl

post-install-DOCS-on:
      ${MKDIR} ${STAGEDIR}${DOCSDIR}
      cd ${WRKSRC}/doc && ${COPYTREE_SHARE} . ${STAGEDIR}${DOCSDIR}

post-install-EXAMPLES-on:
      ${MKDIR} ${STAGEDIR}${EXAMPLESDIR}
      cd ${WRKSRC}/ex && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR}
```

## 15.11. 其余变量

然后定义所有未在上述各段中提及的其它变量。

## 15.12. 目标

在所有变量定义之后，可以定义可选的 [make(1)](https://man.freebsd.org/cgi/man.cgi?query=make\&sektion=1\&format=html) 目标。请确保 `pre-*` 排在 `post-*` 之前，并按照不同阶段的执行顺序排列：

* `fetch`
* `extract`
* `patch`
* `configure`
* `build`
* `install`
* `test`

> **技巧**
>
> 使用选项 helpers 时，保持它们按字母顺序排序，但确保 `*-on` 排在 `*-off` 之前。若同时使用主目标，则主目标应排在可选目标之前：
>
> ```makefile
> post-install:
>   # 安装通用部分
>
> post-install-DOCS-on:
>   # 安装文档
>
> post-install-X11-on:
>   # 安装与 X11 相关的部分
>
> post-install-X11-off:
>   # 安装在 X11 禁用时应存在的部分
> ```


# 第 16 章 保持更新

FreeBSD Ports 不断变化。以下是一些保持更新的方式。

## 16.1. FreshPorts

订阅 [FreshPorts](https://www.freshports.org/) 是了解已提交更新的最简单方式之一。可以监控多个 Port。强烈建议维护者订阅，因为他们不仅会收到自己更改的通知，还会收到其他 FreeBSD 提交者的更改通知。（这些通常是跟上底层 Ports 框架变化所必需的——尽管从提交这些更改的人那里提前得到通知是最礼貌的做法，但有时会被忽视或不切实际。此外，在某些情况下，所做的更改是非常小的。我们期望大家在这些情况下做出最佳判断。）

要使用 FreshPorts，需要一个账户。注册邮箱为 `@FreeBSD.org` 的人会在网页的右侧看到选择加入的链接。如果已有 FreshPorts 账户但没有使用 `@FreeBSD.org` 邮箱地址，可以将邮箱改为 `@FreeBSD.org`，然后订阅，再改回去。

FreshPorts 还具有一个健全性测试功能，会自动测试每次提交到 FreeBSD Ports 树的更改。如果订阅了此服务，提交者将收到 FreshPorts 在对提交进行健全性测试时发现的任何错误通知。

## 16.2. 源代码库的 Web 界面

可以通过 Web 界面浏览源代码库中的文件。影响整个 Port 系统的更改现在记录在 [CHANGES](https://cgit.freebsd.org/ports/tree/CHANGES) 文件中。影响单个 Port 的更改现在记录在 [UPDATING](https://cgit.freebsd.org/ports/tree/UPDATING) 文件中。然而，解决任何问题的权威答案无疑是阅读 [bsd.port.mk](https://cgit.freebsd.org/ports/tree/Mk/bsd.port.mk) 和相关文件的源代码。

## 16.3. FreeBSD Ports 邮件列表

作为 Port 维护者，考虑订阅 [FreeBSD ports 邮件列表](https://lists.freebsd.org/subscription/freebsd-ports)。有关 Ports 工作方式的重要更改将在那里发布，并随后提交到 **CHANGES**。

如果邮件列表的消息量太大，可以考虑关注 [FreeBSD ports announce 邮件列表](https://lists.freebsd.org/subscription/freebsd-ports-announce)，该列表只包含公告。

## 16.4. FreeBSD Port 构建集群

FreeBSD 的一项不太为人所知的强大功能是，有一个集群的机器专门用于持续构建 Ports Collection，涵盖每个主要的操作系统版本以及每个 Tier-1 架构。

除非特别标记为 `IGNORE`，否则会构建每个独立的 Port。标记为 `BROKEN` 的 Port 仍然会尝试构建，以查看底层问题是否已经解决。（这是通过将 `TRYBROKEN` 传递给 Port 的 **Makefile** 来完成的。）

## 16.5. Portscout: FreeBSD Ports Distfile 扫描器

构建集群专门用于构建每个 Port 的最新版本，使用已经抓取的 distfile。然而，随着互联网的不断变化，distfile 很快就会消失。[Portscout](https://portscout.freebsd.org/) 是 FreeBSD Ports 的 distfile 扫描器，它尝试查询每个 Port 的每个下载站点，查看每个 distfile 是否仍然可用。Portscout 可以生成 HTML 报告并向请求的人发送有关新可用 Port 的电子邮件。除非已通过其他方式订阅，否则建议维护者定期检查更改，可以手动检查或使用 RSS 提要。

Portscout 的首页显示了 Port 维护者的电子邮件地址、维护者负责的 Ports 数量、其中有新 distfile 的 Port 数量，以及这些 Port 中过期的百分比。搜索功能允许按电子邮件地址搜索特定的维护者，并选择仅显示过期的 Ports。

点击维护者的电子邮件地址后，将显示其所有 Port 的列表，包括 Port 分类、当前版本号、是否有新版本、Port 上次更新的时间以及最后检查的时间。此页面上的搜索功能允许用户搜索特定的 Port。

点击列表中的 Port 名称后，会显示该 Port 在 [FreshPorts](https://freshports.org/) 上的信息。

附加文档可在 [Portscout 仓库](https://github.com/freebsd/portscout/) 中找到。


# 第 17 章 使用 USES 宏

## 17.1. `USES` 的介绍

`USES` 宏简化了声明 Ports 依赖和设置的过程。它们可以添加依赖关系、修改构建行为、向包添加元数据等，所有这些都通过选择简单的预设值来完成。

本章的每个部分都描述了 `USES` 的一个可能值及其可能的参数。参数在值后通过冒号（`:`）附加。多个参数之间用逗号（`,`）分隔。

**示例 1. 使用多个值**

```makefile
USES=	bison perl
```

**示例 2. 添加一个参数**

```makefile
USES=	tar:xz
```

**示例 3. 添加多个参数**

```makefile
USES=	drupal:7,theme
```

**示例 4. 综合使用**

```makefile
USES=	pgsql:9.3+ cpe python:2.7,build
```

## 17.2. `7z`

可能的参数：（无），`p7zip`，`partial`

使用 [7z(1)](https://man.freebsd.org/cgi/man.cgi?query=7z\&sektion=1\&format=html) 代替 [bsdtar(1)](https://man.freebsd.org/cgi/man.cgi?query=bsdtar\&sektion=1\&format=html) 提取文件，并将 `EXTRACT_SUFX` 设置为 `.7z`。如果基本系统中的 `7z` 无法提取文件，`p7zip` 选项会强制依赖于来自 [archivers/p7zip](https://cgit.freebsd.org/ports/tree/archivers/p7zip/) 的 `7z`。如果使用 `partial` 选项，则 `EXTRACT_SUFX` 不会改变，这对于主分发文件没有 **.7z** 扩展名时非常有用。

## 17.3. `ada`

可能的参数：（无），`6`，`12`，`(run)`

依赖一个支持 Ada 的编译器，并相应地设置 `CC`。默认使用来自 Ports 的 `gcc6-aux`。

## 17.4. `angr`

可能的参数：`binaries`，`nose`

为需要 [angrinary 分析平台](https://github.com/angr/angr) 的 Ports 提供支持。

如果存在 `binaries` 参数，则该 Port 需要特殊的 `angr` 二进制文件进行测试。

如果存在 `nose` 参数，则该 Port 使用 `nosetests` 作为测试目标。该参数隐式地意味着 `USES=python:test`。

该框架提供以下变量供 Port 设置：

`ANGR_VERSION`：`angr` 项目程序的版本。

`ANGR_BINARIES_TAGNAME`：`angr` 二进制文件的标签名。

`ANGR_NOSETESTS`：`nosetests` 程序的路径。

## 17.5. `ansible`

可能的参数：`env`，`module`，`plugin`

为依赖 [sysutils/ansible](https://cgit.freebsd.org/ports/tree/sysutils/ansible/) 的 Ports 提供支持。

如果存在 `env` 参数，则该 Port 不依赖 [sysutils/ansible](https://cgit.freebsd.org/ports/tree/sysutils/ansible/)，但需要设置一些 Ansible 变量。

如果存在 `module` 参数，则该 Port 是一个 Ansible 模块。

如果存在 `plugin` 参数，则该 Port 是一个 Ansible 插件。

该框架向 Port 暴露以下变量：

`ANSIBLE_CMD`：ansible 程序的路径。

`ANSIBLE_DOC_CMD`：ansible-doc 程序的路径。

`ANSIBLE_RUN_DEPENDS`：与 Ansible 相关的 `RUN_DEPENDS`。

`ANSIBLE_DATADIR`：Ansible 模块和插件所在的目录结构的根路径。

`ANSIBLE_ETCDIR`：Ansible 配置文件目录的路径。

`ANSIBLE_PLUGINS_PREFIX`：`${ANSIBLE_DATADIR}` 中 "plugins" 目录的路径。

`ANSIBLE_MODULESDIR`：本地 Ansible 模块的目录路径。

`ANSIBLE_PLUGINSDIR`：本地 Ansible 插件的目录路径。

`ANSIBLE_PLUGIN_TYPE`：Ansible 插件类型（例如，“connection”，“inventory”或“vars”）。

## 17.6. `apache`

可能的参数：（无），`2.4`，`build`，`run`，`server`

为依赖 Apache Web 服务器的 Ports 提供支持。

版本参数可用于要求特定版本的 Apache httpd。可以设置特定版本（`USES=apache:2.4`），最低版本（`USES=apache:2.4+`）或最高版本（`USES=apache:-2.4`）。

如果提供 `build` 参数，则会将构建依赖项添加到 Port。

如果提供 `run` 参数，则会将运行时依赖项添加到 Port。

如果提供 `server` 参数，则表示该 Port 是一个服务器 Port。

该框架提供以下变量供 Port 设置：

`AP_FAST_BUILD`：自动模块构建。

`AP_GENPLIST`：自动生成 `PLIST`，并将禁用的模块添加到 **httpd.conf** 中（仅在没有 `pkg-plist` 文件时）。

`MODULENAME`：Apache 模块的名称。默认值：`${PORTNAME}`。

`SHORTMODNAME`：Apache 模块的简短名称。默认值：`${MODULENAME:S/mod_//}`。

`SRC_FILE`：Apache 模块的源文件。默认值：`${MODULENAME}.c`。

以下变量可以被 Port 访问：

`APACHE_VERSION`：所选 Apache 服务器的主版本号和次版本号，例如 2.4。

`APACHEETCDIR`：Apache 配置目录的位置。默认值：**${LOCALBASE}/etc/apache24**。

`APACHEINCLUDEDIR`：Apache 包含文件的位置。默认值：**${LOCALBASE}/include/apache24**。

`APACHEMODDIR`：Apache 模块的位置。默认值：**${LOCALBASE}/libxexec/apache24**。

`APACHE_DEFAULT`：默认的 Apache 版本。

## 17.7. `autoreconf`

可能的参数：（无），`build`

运行 `autoreconf`。它封装了 `aclocal`、`autoconf`、`autoheader`、`automake`、`autopoint` 和 `libtoolize` 命令。每个命令都应用于 **${AUTORECONF\_WRKSRC}/configure.ac** 或其旧名称 **${AUTORECONF\_WRKSRC}/configure.in**。如果 **configure.ac** 使用 `AC_CONFIG_SUBDIRS` 定义了子目录并有自己的 **configure.ac**，则 `autoreconf` 将递归更新这些子目录。`:build` 参数仅添加对这些工具的构建时依赖项，但不运行 `autoreconf`。如果 `WRKSRC` 中不包含 **configure.ac** 的路径，可以通过设置 `AUTORECONF_WRKSRC` 来指定路径。

## 17.8. `azurepy`

可能的参数：（无）

为 `py-azure*` Ports 提供支持。移除 `azure` 命名空间并清理常见文件。

## 17.9. `blaslapack`

可能的参数：（无），`atlas`，`netlib`（默认），`gotoblas`，`openblas`

添加对 Blas / Lapack 库的依赖。

## 17.10. `bdb`

可能的参数：（无），`5`（默认），`18`

添加对 Berkeley DB 库的依赖。默认为 [databases/db5](https://cgit.freebsd.org/ports/tree/databases/db5/)。在使用 `:18` 参数时，也可以依赖于 [databases/db18](https://cgit.freebsd.org/ports/tree/databases/db18/)。可以声明一个接受值的范围，`:5+` 会查找安装的最高版本，如果没有其他版本则回退到 5。`INVALID_BDB_VER` 可用于指定与此 Port 不兼容的版本。该框架向 Port 暴露以下变量：

`BDB_LIB_NAME`：Berkeley DB 库的名称。例如，使用 [databases/db5](https://cgit.freebsd.org/ports/tree/databases/db5/) 时，它包含 `db-5.3`。

`BDB_LIB_CXX_NAME`：Berkeley DBC++ 库的名称。例如，使用 [databases/db5](https://cgit.freebsd.org/ports/tree/databases/db5/) 时，它包含 `db_cxx-5.3`。

`BDB_INCLUDE_DIR`：Berkeley DB 包含目录的位置。例如，使用 [databases/db5](https://cgit.freebsd.org/ports/tree/databases/db5/) 时，它包含 `${LOCALBASE}/include/db5`。

`BDB_LIB_DIR`：Berkeley DB 库目录的位置。例如，使用 [databases/db5](https://cgit.freebsd.org/ports/tree/databases/db5/) 时，它包含 `${LOCALBASE}/lib`。

`BDB_VER`：检测到的 Berkeley DB 版本。例如，如果使用 `USES=bdb:5+` 并安装了 Berkeley DB 18，则它包含 `18`。

> **重要**
>
> [databases/db48](https://cgit.freebsd.org/ports/tree/databases/db48/) 弃用并且不再受支持。任何 Port 都不得使用它。

## 17.11. `bison`

可能的参数：（无），`build`，`run`，`both`

使用 [devel/bison](https://cgit.freebsd.org/ports/tree/devel/bison/)。默认情况下，未指定参数或指定 `build` 参数时，表示 `bison` 是构建时依赖；`run` 表示运行时依赖；`both` 表示同时是构建时和运行时依赖。

## 17.12. `budgie`

可能的参数：（无）

为 Budgie 桌面环境提供支持。使用 `USE_BUDGIE` 选择 Port 所需的组件。有关更多信息，请参见 [使用 Budgie](https://docs.freebsd.org/en/books/porters-handbook/special/#using-budgie)。

## 17.13. `cabal`

> **重要**
>
> 不应为 Haskell 库创建 Port，详情见 [Haskell Libraries](https://docs.freebsd.org/en/books/porters-handbook/special/#haskell-libs)。

可能的参数：（无），`hpack`，`nodefault`

设置使用 Cabal 构建 Haskell 软件时使用的默认值和目标。添加对 Haskell 编译器 Port（[lang/ghc](https://cgit.freebsd.org/ports/tree/lang/ghc/)）的构建依赖。如果 `BUILD_DEPENDS` 变量中已列出其他版本的 GHC（例如 [lang/ghc810](https://cgit.freebsd.org/ports/tree/lang/ghc810/)），则使用该版本。如果提供了 `hpack` 参数，则添加对 [devel/hs-hpack](https://cgit.freebsd.org/ports/tree/devel/hs-hpack/) 的构建依赖，并在配置步骤中调用 `hpack` 生成 .cabal 文件。如果提供了 `nodefault` 参数，框架将不会尝试从 Hackage 拉取主分发文件。如果存在 `USE_GITHUB` 或 `USE_GITLAB`，则此参数会隐式添加。

框架提供以下变量：

`CABAL_REVISION`：Haskell 包在 Hackage 上可能有修订版本。将此选项设置为整数以拉取修订后的包描述。

`USE_CABAL`：如果软件使用 Haskell 依赖项，则在此变量中列出它们。每个项目应以 `packagename-0.1.2` 的形式列出。依赖项也可以有修订版本，修订版本在 `_` 符号后指定。支持自动生成依赖项列表，详情见 [使用 Cabal 构建 Haskell 应用程序](https://docs.freebsd.org/en/books/porters-handbook/special/#using-cabal)。

`CABAL_FLAGS`：在配置和构建阶段传递给 `cabal-install` 的标志列表。标志按原样传递。此变量通常用于启用或禁用 .cabal 文件中声明的标志。使用 `foo` 启用 `foo` 标志，使用 `-foo` 禁用它。

`CABAL_EXECUTABLES`：Port 安装的可执行文件列表。默认值：`${PORTNAME}`。请参阅项目的 .cabal 文件，获取此变量可能的值。每个值对应 .cabal 文件中的 `executable` 项。此列表中的项目会自动添加到 pkg-plist。

`SKIP_CABAL_PLIST`：如果定义了此变量，则不会将 `${CABAL_EXECUTABLES}` 中的项目添加到 pkg-plist。

`opt_USE_CABAL`：根据 `opt` 选项向 `${USE_CABAL}` 中添加项目。

`opt_CABAL_EXECUTABLES`：根据 `opt` 选项向 `${CABAL_EXECUTABLES}` 中添加项目。

`opt_CABAL_FLAGS`：如果启用了 `opt`，则将该值追加到 `${CABAL_FLAGS}` 中。否则，追加 `-value` 以禁用该标志。请注意，此行为与普通的 `CABAL_FLAGS` 略有不同，因为它不接受以 `-` 开头的值。

`CABAL_WRAPPER_SCRIPTS`：`${CABAL_EXECUTABLES}` 的子集，包含要包装到 shell 脚本中的 Haskell 程序，该脚本在运行程序之前设置 `*_datadir` 环境变量。这还会导致实际的 Haskell 二进制文件安装到 `libexec/cabal/` 目录。对于将数据文件安装到 `share/` 目录中的 Haskell 程序，必须使用此选项。

`FOO_DATADIR_VARS`：其他 Haskell 包的列表，其数据文件应由名为 `FOO` 的可执行文件访问。该可执行文件应是 `${CABAL_WRAPPER_SCRIPTS}` 的一部分。列出的 Haskell 包不应有版本后缀。

`CABAL_PROJECT`：某些 Haskell 项目可能已存在 `cabal.project` 文件，该文件也由 Ports 框架生成。如果是这种情况，请使用此变量指定如何处理原始的 `cabal.project`。将此变量设置为 `remove` 将导致原始文件在提取阶段被删除。将此变量设置为 `append` 将：

1. 在提取阶段将原始文件移动到 `cabal.project.${PORTNAME}`。
2. 在补丁阶段将原始的 `cabal.project.${PORTNAME}` 和生成的 `cabal.project` 合并成一个文件。

使用 `append` 可以在合并之前对原始文件进行补丁处理。

## 17.14. `cargo`

可能的参数：（无）

使用 Cargo 进行配置、构建和测试。它可以用于 Port 化使用 Cargo 构建系统的 Rust 应用程序。更多信息请参见 [使用 `cargo` 构建 Rust 应用程序](https://docs.freebsd.org/en/books/porters-handbook/special/#using-cargo)。

## 17.15. `charsetfix`

可能的参数：（无）

防止 Port 安装 **charset.alias**。该文件必须仅由 [converters/libiconv](https://cgit.freebsd.org/ports/tree/converters/libiconv/) 安装。如果 **charset.alias** 不是由 **${WRKSRC}/Makefile.in** 安装的，可以通过设置 `CHARSETFIX_MAKEFILEIN` 来指定相对于 `WRKSRC` 的路径。

## 17.16. `cl`

可能的参数：（无）

为 Common Lisp Port 提供支持。

框架提供以下变量，Port 可以设置：

`ASDF_MODULES`：当设置 `FASL_TARGET`（默认为 `PORTNAME`）时，要构建的 `ASDF` 模块列表。

`FASL_TARGET`：构建 Port 的 fasl 变体（可以是 `ccl`、`clisp` 或 `sbcl`）。

`USE_ASDF`：依赖 [devel/cl-asdf](https://cgit.freebsd.org/ports/tree/devel/cl-asdf/)。

`USE_ASDF_FASL`：依赖 `devel/cl-asdf-<FASL_TARGET>`。

`USE_CCL`：依赖 [lang/ccl](https://cgit.freebsd.org/ports/tree/lang/ccl/)；当 `FASL_TARGET=ccl` 时，隐式依赖。

`USE_CLISP`：依赖 [lang/clisp](https://cgit.freebsd.org/ports/tree/lang/clisp/)；当 `FASL_TARGET=clisp` 时，隐式依赖。

`USE_SBCL`：依赖 [lang/sbcl](https://cgit.freebsd.org/ports/tree/lang/sbcl/)；当 `FASL_TARGET=SBCL` 时，隐式依赖。

框架提供以下变量，Port 可以读取：

`ASDF_PATHNAME`：CL 源代码路径。

`ASDF_REGISTRY`：包含 asd 文件的 CL 注册表路径。

`CCL`：Clozure Common Lisp 编译器的路径。

`CLISP`：GNU Common Lisp 编译器的路径。

`CL_LIBDIR_REL`：相对于 `LOCALBASE` 或 `PREFIX` 的 CL 库目录。

`FASL_DIR_REL`：编译后的 fasl 文件的相对路径，取决于 `FASL_TARGET`。

`FASL_PATHNAME`：CL fasl 文件的路径。

`LISP_EXTRA_ARG`：构建 fasl 时使用的额外参数。

`SBCL`：Steel Bank Common Lisp 编译器的路径。

## 17.17. `cmake`

可能的参数：（无），`insource`，`noninja`，`run`，`testing`

使用 CMake 配置 Port 并生成构建系统。

默认情况下，执行源代码外构建，使 `WRKSRC` 中的源代码不受构建产物影响。使用 `insource` 参数时，将执行源代码内构建。该参数应仅作为例外，在常规的源代码外构建无法工作时使用。

默认情况下，使用 Ninja（[devel/ninja](https://cgit.freebsd.org/ports/tree/devel/ninja/)）进行构建。在某些情况下，这可能无法正确工作。使用 `noninja` 参数时，构建将使用常规的 `make`。只有当基于 Ninja 的构建不工作时，才应使用此参数。

使用 `run` 参数时，除了构建依赖外，还会注册一个运行时依赖。

使用 `testing` 参数时，将添加一个测试目标，该目标使用 CTest。当运行测试时，Port 将为测试重新配置并重新构建。

有关更多信息，请参见 [使用 `cmake`](https://docs.freebsd.org/en/books/porters-handbook/special/#using-cmake)。

## 17.18. `compiler`

可能的参数：（无），`env`（默认，隐式），`C++17-lang`，`C++14-lang`，`C++11-lang`，`gcc-C++11-lib`，`C++11-lib`，`C++0x`，`c11`，`nestedfct`，`features`

根据给定的需求确定要使用的编译器。如果 Port 需要支持 C++17 的编译器，请使用 `C++17-lang`；如果需要支持 C++14 的编译器，请使用 `C++14-lang`；如果需要支持 C++11 的编译器，请使用 `C++11-lang`；如果需要带有 C++11 库的 `g++` 编译器，请使用 `gcc-C++11-lib`；如果需要支持 C++11 标准库的编译器，请使用 `C++11-lib`。如果 Port 需要支持 C++0x、C11 或嵌套函数，应使用相应的参数。

使用 `features` 请求默认编译器支持的特性列表。在包含 **bsd.port.pre.mk** 后，Port 可以使用以下变量检查结果：

* `COMPILER_TYPE`：系统上的默认编译器，可能是 gcc 或 clang。
* `ALT_COMPILER_TYPE`：系统上的替代编译器，可能是 gcc 或 clang，仅在系统中存在两个编译器时设置。
* `COMPILER_VERSION`：默认编译器版本的前两位数字。
* `ALT_COMPILER_VERSION`：替代编译器的前两位版本数字（如果存在）。
* `CHOSEN_COMPILER_TYPE`：选择的编译器，可能是 gcc 或 clang。
* `COMPILER_FEATURES`：默认编译器支持的特性，目前列出 C++ 库。

## 17.19. `cpe`

可能的参数：（无）

在包清单中包含 Common Platform Enumeration (CPE) 信息，以 CPE 2.3 格式的字符串表示。有关详细信息，请参见 [CPE 规范](https://scap.nist.gov/specifications/cpe/)。要将 CPE 信息添加到 Port，请按照以下步骤操作：

1. 通过使用 NVD 的 [CPE 搜索引擎](https://web.nvd.nist.gov/view/cpe/search) 或在 [官方 CPE 字典](https://nvd.nist.gov/feeds/json/cpe/2.0/nvdcpe-2.0.tar.gz) 中搜索软件产品的官方 CPE 条目（警告，此文件为非常大的 JSON 文件）。*切勿自行编造 CPE 数据。*
2. 将 `cpe` 添加到 `USES` 中，并使用 `make -V CPE_STR` 检查结果，确保它与 CPE 字典条目一致。逐步调整直到 `make -V CPE_STR` 正确。
3. 如果产品名称（第二个字段，默认为 `PORTNAME`）不正确，定义 `CPE_PRODUCT`。
4. 如果厂商名称（第一个字段，默认为 `CPE_PRODUCT`）不正确，定义 `CPE_VENDOR`。
5. 如果版本字段（第三个字段，默认为 `PORTVERSION`）不正确，定义 `CPE_VERSION`。
6. 如果更新字段（第四个字段，默认为空）不正确，定义 `CPE_UPDATE`。
7. 如果仍然不正确，请检查 **Mk/Uses/cpe.mk** 以获取更多细节，或联系 Ports 安全团队 \[<ports-secteam@FreeBSD.org>]。
8. 尽可能从现有变量（如 `PORTNAME` 和 `PORTVERSION`）中推导出 CPE 名称。使用变量修饰符提取这些变量的相关部分，而不是硬编码名称。
9. *始终*在提交任何更改（如更改 `PORTNAME` 或 `PORTVERSION` 或任何其他用于推导 `CPE_STR` 的变量）之前，运行 `make -V CPE_STR` 并检查输出。

## 17.20. `cran`

可能的参数：（无），`auto-plist`，`compiles`

使用综合 R 存档网络。指定 `auto-plist` 以自动生成 **pkg-plist**。如果 Port 包含需要编译的代码，请指定 `compiles`。

## 17.21. `desktop-file-utils`

可能的参数：（无）

使用来自 [devel/desktop-file-utils](https://cgit.freebsd.org/ports/tree/devel/desktop-file-utils/) 的 update-desktop-database。在不干扰 Port **Makefile** 中任何其他安装后步骤的情况下，将运行额外的安装后步骤。会在 plist 中添加一行 [`@desktop-file-utils`](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-keywords-desktop-file-utils)。仅在 Port 提供包含 `MimeType` 条目的 `.desktop` 文件时使用此宏。

## 17.22. `desthack`

可能的参数：（无）

更改 GNU configure 的行为，以便在原始软件不支持 `DESTDIR` 时正确处理。

## 17.23. `display`

可能的参数：（无），*ARGS*

设置虚拟显示环境。如果环境变量 `DISPLAY` 未设置，则会将 Xvfb 添加为构建依赖，并将 `CONFIGURE_ENV` 扩展为当前运行的 Xvfb 实例的端口号。*ARGS* 参数默认值为 `install`，控制何时启动和停止虚拟显示。

## 17.24. `dos2unix`

可能的参数：（无）

Port 中包含需要转换为 Unix 格式的 DOS 行结束符。可以设置多个变量来控制哪些文件将被转换。默认情况下，将转换 *所有* 文件，包括二进制文件。有关示例，请参见 [简单的自动替换](https://docs.freebsd.org/en/books/porters-handbook/slow-porting/#slow-patch-automatic-replacements)。

* `DOS2UNIX_REGEX`：根据正则表达式匹配文件名。
* `DOS2UNIX_FILES`：匹配字面文件名。
* `DOS2UNIX_GLOB`：根据 glob 模式匹配文件名。
* `DOS2UNIX_WRKSRC`：开始转换的目录，默认为 `${WRKSRC}`。

## 17.25. `drupal`

可能的参数：`7`，`module`，`theme`

自动化安装作为 Drupal 主题或模块的 Port。使用 Port 所期望的 Drupal 版本。例如，`USES=drupal:7,module` 表示该 Port 创建一个 Drupal 7 模块。可以使用 `USES=drupal:7,theme` 指定 Drupal 7 主题。

## 17.26. `ebur128`

可能的参数：（无），`build`，`lib`，`run`，`test`

添加对 [audio/ebur128](https://cgit.freebsd.org/ports/tree/audio/ebur128/) 的依赖。它允许通过使用 **make.conf** 中的 `DEFAULT_VERSIONS` 来透明地依赖 `rust` 或 `legacy` 版本。例如，要使用传统版本，可以在 **make.conf** 中设置 `DEFAULT_VERSIONS+=ebur128=legacy`。

当不使用任何参数时，行为与提供 `lib` 参数时相同。其余参数提供相应的依赖类别。

## 17.27. `eigen`

可能的参数：2，3，build（默认），run

添加对 [math/eigen](https://cgit.freebsd.org/ports/tree/math/eigen/) 的依赖。

## 17.28. `electronfix`

可能的参数：`37`，`38`，`39`

为易于移植且以二进制形式分发的 Electron 应用程序提供支持。根据使用的参数，添加对 [devel/electron37](https://cgit.freebsd.org/ports/tree/devel/electron37/)，[devel/electron38](https://cgit.freebsd.org/ports/tree/devel/electron38/)，或 [devel/electron39](https://cgit.freebsd.org/ports/tree/devel/electron39/) 的构建和运行时依赖。

该框架提供以下变量，Port 可以设置：

`ELECTRONFIX_SYMLINK_FILES`：要从 Electron 分发版创建符号链接的文件列表。

`ELECTRONFIX_MAIN_EXECUTABLE`：要替换为原始 Electron 二进制文件的主可执行文件名。

## 17.29. `elfctl`

可能的参数：（无），`build`（默认），`stage`

通过设置 `ELF_FEATURES` 设置 ELF 二进制文件功能控制注释。

当没有参数或提供 `build` 参数时，将操作 `BUILD_WRKSRC` 中的二进制文件，`ELF_FEATURES` 中列出的文件相对于 `BUILD_WRKSRC`。当提供 `stage` 参数时，将操作 `STAGEDIR` 中的二进制文件，`ELF_FEATURES` 中列出的文件相对于 `STAGEDIR`。

**示例 5. 使用 `elfctl`**

```makefile
ELF_FEATURES=	featurelist:path/to/file1 \
		featurelist:path/to/file2
```

`featurelist` 的格式描述见 [elfctl(1)](https://man.freebsd.org/cgi/man.cgi?query=elfctl\&sektion=1\&format=html)。

## 17.30. `elixir`

可能的参数：（无）

为使用 [lang/elixir](https://cgit.freebsd.org/ports/tree/lang/elixir/) 的 Port 提供支持。添加对 [lang/elixir](https://cgit.freebsd.org/ports/tree/lang/elixir/) 的构建和运行时依赖。

框架提供的变量：

`ELIXIR_APP_NAME`：Elixir 应用程序名称，安装在 Elixir 的 lib 目录中。

`ELIXIR_LIB_ROOT`：Elixir 默认库路径。

`ELIXIR_APP_ROOT`：此 Elixir 应用程序的根目录。

`ELIXIR_HIDDEN`：要从代码路径中隐藏的应用程序；通常是 `${PORTNAME}`。

`ELIXIR_LOCALE`：构建期间 Elixir 使用的 UTF-8 本地化（任何 UTF-8 本地化都可以）。

`MIX_CMD`：`mix` 命令。

`MIX_COMPILE`：用于编译 Elixir 应用程序的 `mix` 命令。

`MIX_REWRITE`：自动替换 Mix 依赖项与代码路径。

`MIX_BUILD_DEPS`：以类别/portname 格式列出 `BUILD_DEPENDS`（通常称为 Erlang 和 Elixir 中的 "deps"）。

`MIX_RUN_DEPS`：以类别/portname 格式列出 `RUN_DEPENDS`。

`MIX_DOC_DIRS`：要安装到 `DOCSDIR` 的额外文档目录。

`MIX_DOC_FILES`：要安装到 `DOCSDIR` 的额外文档文件（通常是 README.md）。

`MIX_ENV`：Mix 构建的环境（与 `MAKE_ENV` 相同格式）。

`MIX_ENV_NAME`：Mix 构建环境的名称，通常为 "prod"。

`MIX_BUILD_NAME`：输出的构建名称，位于 **\_build/** 中，通常是 `${MIX_ENV_NAME}`。

`MIX_TARGET`：Mix 目标的名称，通常为 "compile"。

`MIX_EXTRA_APPS`：要构建的子应用程序列表（如果有）。

`MIX_EXTRA_DIRS`：要安装到 `ELIXIR_APP_ROOT` 的额外目录列表。

`MIX_EXTRA_FILES`：要安装到 `ELIXIR_APP_ROOT` 的额外文件列表。

## 17.31. `emacs`

可能的参数：（无）（默认），`build`，`run`，`noflavors`

为需要 Emacs 的 Port 提供支持。`build` 参数创建对 Emacs 的构建依赖。`run` 参数创建对 Emacs 的运行时依赖。如果 `build` 和 `run` 参数都缺失，则会创建对 Emacs 的构建和运行时依赖。`noflavors` 参数会防止使用 flavors，如果没有对 Emacs 的运行时依赖，则隐含此参数。

可以在 **make.conf** 中定义使用 `USES=emacs` 的 Port 的默认 Emacs flavor。例如，对于 `nox` flavor，可以使用 `DEFAULT_VERSIONS+= emacs=nox`。有效的 flavors 有：`full`，`canna`，`nox`，`wayland`，`devel_full`，`devel_nox`。

可以由 Port 设置的变量：

`EMACS_FLAVORS_EXCLUDE`：不要构建这些 Emacs flavors。如果未定义 `EMACS_FLAVORS_EXCLUDE` 且：

* 有对 Emacs 的运行时依赖
* 未指定 `noflavors` 参数

则假设所有有效的 Emacs flavors。

`EMACS_NO_DEPENDS`：不要添加对 Emacs 的构建或运行时依赖。这将防止使用 flavors，并且不会生成字节码文件作为包的一部分。

Port 可以读取的变量：

`EMACS_CMD`：Emacs 命令的完整路径（例如 **/usr/local/bin/emacs-30.1**）

`EMACS_FLAVOR`：用于依赖的 Emacs flavor（例如 `BUILD_DEPENDS= dash.el${EMACS_PKGNAMESUFFIX}>0:devel/dash@${EMACS_FLAVOR}`）

`EMACS_LIBDIR`：不包括 `${PREFIX}` 的 Emacs 库目录（例如 **share/emacs**）

`EMACS_LIBDIR_WITH_VER`：不包括 `${PREFIX}` 的库目录，包含版本（例如 **share/emacs/30.1**）

`EMACS_MAJOR_VER`：Emacs 主版本（例如 30）

`EMACS_PKGNAMESUFFIX`：`PKGNAMESUFFIX` 用于区分 Emacs flavors

`EMACS_SITE_LISPDIR`：不包括 `${PREFIX}` 的 Emacs site-lisp 目录（例如 **share/emacs/site-lisp**）

`EMACS_VER`：Emacs 版本（例如 30.1）

`EMACS_VERSION_SITE_LISPDIR`：包括版本的目录（例如 **share/emacs/30.1/site-lisp**）

## 17.32. `erlang`

可能的参数：（无），`enc`，`rebar`，`rebar3`

为 [lang/erlang](https://cgit.freebsd.org/ports/tree/lang/erlang/) 添加构建和运行时依赖。根据参数不同，添加额外的构建依赖。`enc` 添加对 [devel/erlang-native-compiler](https://cgit.freebsd.org/ports/tree/devel/erlang-native-compiler/) 的依赖，`rebar` 添加对 [devel/rebar](https://cgit.freebsd.org/ports/tree/devel/rebar/) 的依赖，`rebar3` 添加对 [devel/rebar3](https://cgit.freebsd.org/ports/tree/devel/rebar3/) 的依赖。

此外，Port 可以使用以下变量：

* `ERL_APP_NAME`：Erlang 应用程序名称，安装在 Erlang 的 lib 目录中（去掉版本）
* `ERL_APP_ROOT`：此 Erlang 应用程序的根目录
* `REBAR_CMD`：`rebar` 命令的路径
* `REBAR3_CMD`：`rebar3` 命令的路径
* `REBAR_PROFILE`：Rebar 配置文件
* `REBAR_TARGETS`：Rebar 目标列表（通常是 compile，也可能是 escriptize）
* `ERL_BUILD_NAME`：Rebar3 的构建名称
* `ERL_BUILD_DEPS`：以类别/portname 格式列出的 `BUILD_DEPENDS`
* `ERL_RUN_DEPS`：以类别/portname 格式列出的 `RUN_DEPENDS`
* `ERL_DOCS`：文档文件和目录列表

## 17.33. `fakeroot`

可能的参数：（无）

更改构建系统的一些默认行为，以允许以用户身份安装。有关 `fakeroot` 的更多信息，请参见 <https://wiki.debian.org/FakeRoot>。

## 17.34. `firebird`

可能的参数：（无），`25`

添加对 Firebird 数据库客户端库的依赖。

## 17.35. `fonts`

可能的参数：（无），`fc`，`fontsdir`（默认），`none`

添加一个运行时依赖，所需工具用于注册字体。根据不同的参数，添加 `@fc ${FONTSDIR}` 行，`@fontsdir ${FONTSDIR}` 行，或者如果参数是 `none` 则不添加任何行到 plist。`FONTSDIR` 默认为 **${PREFIX}/share/fonts/${FONTNAME}**，`FONTNAME` 默认为 `${PORTNAME}`。将 `FONTSDIR` 添加到 `PLIST_SUB` 和 `SUB_LIST`。

## 17.36. `fortran`

可能的参数：`gcc`（默认）

使用 GNU Fortran 编译器。

## 17.37. `fpc`

可能的参数：（无），`run`

为基于 Free Pascal 的 Port 提供支持。它将安装 Free Pascal 编译器和单元。

添加对 [lang/fpc](https://cgit.freebsd.org/ports/tree/lang/fpc/) 的构建依赖。

如果指定了 `run` 参数，则还会添加运行时依赖。

## 17.38. `fuse`

可能的参数：`2`（默认），`3`

该 Port 将依赖 FUSE 库，并根据 FreeBSD 的版本处理对内核模块的依赖。

## 17.39. `gem`

可能的参数：（无），`noautoplist`

处理 RubyGems 的构建。如果使用 `noautoplist`，则不会自动生成 packing list。

这意味着需要使用 `USES=ruby`。

## 17.40. `gettext`

可能的参数：（无）

弃用。同时包含 `gettext-runtime` 和 `gettext-tools`。

## 17.41. `gettext-runtime`

可能的参数：（无），`lib`（默认），`build`，`run`

使用 `devel/gettext-runtime`。默认情况下，未指定参数或使用 `lib` 参数时，会添加对 **libintl.so** 的库依赖。`build` 和 `run` 参数分别表示构建时和运行时依赖 **gettext**。

## 17.42. `gettext-tools`

可能的参数：（无），`build`（默认），`run`

使用 `devel/gettext-tools`。默认情况下，未指定参数或使用 `build` 参数时，会注册构建时依赖 **msgfmt**。使用 `run` 参数时，注册运行时依赖。

## 17.43. `ghostscript`

可能的参数：`*X*`，`build`，`run`，`nox11`

可以使用特定版本 *X*。可选版本有 `7`，`8`，`9`，以及 `agpl`（默认）。`nox11` 表示需要使用 `-nox11` 版本的 Port。`build` 和 `run` 分别会添加构建时和运行时的 Ghostscript 依赖。默认情况下，两者都会添加。

## 17.44. `gl`

可能的参数：（无）

提供了一种轻松方式来依赖 GL 组件。组件应该列出在 `USE_GL` 中。可用的组件有：

`egl`：添加对 `graphics/libglvnd` 的 **libEGL.so** 库的依赖。

`gbm`：添加对 `graphics/mesa-libs` 的 **libgbm.so** 库的依赖。

`gl`：添加对 `graphics/libglvnd` 的 **libGL.so** 库的依赖。

`glesv2`：添加对 `graphics/libglvnd` 的 **libGLESv2.so** 库的依赖。

`glew`：添加对 `graphics/glew` 的 **libGLEW\.so** 库的依赖。

`glu`：添加对 `graphics/libGLU` 的 **libGLU.so** 库的依赖。

`glut`：添加对 `graphics/freeglut` 的 **libglut.so** 库的依赖。

`opengl`：添加对 `graphics/libglvnd` 的 **libOpenGL.so** 库的依赖。

## 17.45. `gmake`

可能的参数：（无）

使用 [devel/gmake](https://cgit.freebsd.org/ports/tree/devel/gmake/) 作为构建时依赖，并设置环境以使用 `gmake` 作为构建的默认 `make`。

## 17.46. `gnome`

可能的参数：（无）

提供一种简便的方式来依赖 GNOME 组件。组件应列在 `USE_GNOME` 中。可用的组件有：

* `atk`
* `atkmm`
* `cairo`
* `cairomm`
* `dconf`
* `esound`
* `evolutiondataserver3`
* `gconf2`
* `gconfmm26`
* `gdkpixbuf`
* `gdkpixbuf2`
* `glib12`
* `glib20`
* `glibmm`
* `gnomecontrolcenter3`
* `gnomedesktop3`
* `gnomedesktop4`
* `gnomedocutils`
* `gnomemenus3`
* `gnomemimedata`
* `gnomeprefix`
* `gnomesharp20`
* `gnomevfs2`
* `gsound`
* `gtk-update-icon-cache`
* `gtk12`
* `gtk20`
* `gtk30`
* `gtkhtml3`
* `gtkhtml4`
* `gtkmm20`
* `gtkmm24`
* `gtkmm30`
* `gtksharp20`
* `gtksourceview`
* `gtksourceview2`
* `gtksourceview3`
* `gtksourceviewmm3`
* `gvfs`
* `intlhack`
* `intltool`
* `introspection`
* `libartlgpl2`
* `libbonobo`
* `libbonoboui`
* `libgda5`
* `libgda5-ui`
* `libgdamm5`
* `libglade2`
* `libgnome`
* `libgnomecanvas`
* `libgnomekbd`
* `libgnomeprint`
* `libgnomeprintui`
* `libgnomeui`
* `libgsf`
* `libgtkhtml`
* `libgtksourceviewmm`
* `libidl`
* `librsvg2`
* `libsigc++12`
* `libsigc++20`
* `libwnck`
* `libwnck3`
* `libxml++26`
* `libxml2`
* `libxslt`
* `metacity`
* `nautilus3`
* `orbit2`
* `pango`
* `pangomm`
* `pangox-compat`
* `py3gobject3`
* `pygnome2`
* `pygobject`
* `pygobject3`
* `pygtk2`
* `pygtksourceview`
* `referencehack`
* `vte`
* `vte3`

默认依赖是构建时和运行时依赖，可以通过 `:build` 或 `:run` 来更改。例如：

```makefile
USES=		gnome
USE_GNOME=	gnomemenus3:build intlhack
```

有关更多信息，请参阅 [使用 GNOME](https://docs.freebsd.org/en/books/porters-handbook/special/#using-gnome)。

## 17.47. `go`

> **重要**
>
> 不应为 Go 库创建 Ports，更多信息请参阅 [Go 库](https://docs.freebsd.org/en/books/porters-handbook/special/#go-libs)。

可能的参数：（无），`N.NN`，`N.NN+`，`N.NN-devel`，`modules`，`no_targets`，`run`

设置用于构建 Go 软件的默认值和目标。添加对 Go 编译器 Port 的构建依赖，Port 维护者可以设置所需的版本。如果使用 `X.Y+` 格式，则将使用 Go `X.Y`，除非默认的 Go 版本高于 `X.Y`，在这种情况下将使用默认版本。默认情况下，构建是在 GOPATH 模式下执行的。如果 Go 软件使用模块，可以通过 `modules` 参数启用模块感知模式。`no_targets` 将设置构建环境（如 `GO_ENV`、`GO_BUILDFLAGS`），但跳过创建提取和构建目标。`run` 还将添加对 Go 编译器 Port 的运行时依赖。

构建过程由多个变量控制：

`GO_MODULE`：作为 `go.mod` 中的 `module` 指令指定的应用模块名称。在大多数情况下，这是使用 Go 模块的 Port 所需的唯一变量。

`GO_PKGNAME`：在 GOPATH 模式下构建时的 Go 包名称。这是将在 `${GOPATH}/src` 中创建的目录。如果没有显式设置，并且存在 `GH_SUBDIR` 或 `GL_SUBDIR`，则将从中推断 `GO_PKGNAME`。在模块感知模式下不需要此设置。

`GO_TARGET`：要构建的包。默认值为 `${GO_PKGNAME}`。`GO_TARGET` 也可以是一个元组，形式为 `package:path`，其中 path 可以是一个简单的文件名或从 `${PREFIX}` 开始的完整路径。

`GO_TESTTARGET`：要测试的包。默认值为 `./...`（当前包及所有子包）。

`CGO_CFLAGS`：要传递给 C 编译器的额外 `CFLAGS` 值。

`CGO_LDFLAGS`：要传递给 C 编译器的额外 `LDFLAGS` 值。

`GO_BUILDFLAGS`：要传递给 `go build` 的额外构建参数。

`GO_LDFLAGS`：要传递给 `go build` 命令的额外 LDFLAGS 变量，无需更改 `GO_BUILDFLAGS`。

`GO_TESTFLAGS`：要传递给 `go test` 的额外构建参数。

有关使用示例，请参阅 [构建 Go 应用程序](https://docs.freebsd.org/en/books/porters-handbook/special/#using-go)。

## 17.48. `gperf`

可能的参数：（无）

如果 `gperf` 不在基本系统中，添加对 [devel/gperf](https://cgit.freebsd.org/ports/tree/devel/gperf/) 的构建时依赖。

## 17.49. `grantlee`

可能的参数：`5`，`selfbuild`

处理对 Grantlee 的依赖。指定 `5` 以依赖基于 Qt5 的版本，[devel/grantlee5](https://cgit.freebsd.org/ports/tree/devel/grantlee5/)。`selfbuild` 用于 [devel/grantlee5](https://cgit.freebsd.org/ports/tree/devel/grantlee5/) 来获取其版本号。

## 17.50. `groff`

可能的参数：`build`，`run`，`both`

如果基本系统中没有 `groff`，则注册对 [textproc/groff](https://cgit.freebsd.org/ports/tree/textproc/groff/) 的依赖。

## 17.51. `gssapi`

可能的参数：（无），`base`（默认），`heimdal`，`mit`，`mit-devel`，`flags`，`bootstrap`

处理 GSS-API 消费者所需的依赖项。仅提供 Kerberos 机制的库。默认情况下，或设置为 `base`，使用基本系统中的 GSS-API 库。也可以设置为 `heimdal` 来使用 [security/heimdal](https://cgit.freebsd.org/ports/tree/security/heimdal/)，或设置为 `mit` 来使用 [security/krb5](https://cgit.freebsd.org/ports/tree/security/krb5/)，或设置为 `mit-devel` 来使用 [security/krb5-devel](https://cgit.freebsd.org/ports/tree/security/krb5-devel/)。

当本地 Kerberos 安装不在 `LOCALBASE` 中时，请设置 `HEIMDAL_HOME`（用于 `heimdal`）或 `KRB5_HOME`（用于 `krb5`）到 Kerberos 安装的位置。

这些变量会被导出供 Port 使用：

* `GSSAPIBASEDIR`
* `GSSAPICPPFLAGS`
* `GSSAPIINCDIR`
* `GSSAPILDFLAGS`
* `GSSAPILIBDIR`
* `GSSAPILIBS`
* `GSSAPI_CONFIGURE_ARGS`

`flags` 选项可以与 `base`、`heimdal`、`mit` 或 `mit-devel` 一起使用，以自动将 `GSSAPICPPFLAGS`、`GSSAPILDFLAGS` 和 `GSSAPILIBS` 添加到 `CFLAGS`、`LDFLAGS` 和 `LDADD` 中。例如，使用 `base,flags`。

`bootstrap` 选项是一个仅供 [security/krb5](https://cgit.freebsd.org/ports/tree/security/krb5/) 和 [security/heimdal](https://cgit.freebsd.org/ports/tree/security/heimdal/) 使用的特殊前缀。例如，使用 `bootstrap,mit`。

**示例 6. 常见用法**

```makefile
OPTIONS_SINGLE=	GSSAPI
OPTIONS_SINGLE_GSSAPI=	GSSAPI_BASE GSSAPI_HEIMDAL GSSAPI_MIT GSSAPI_NONE

GSSAPI_BASE_USES=	gssapi
GSSAPI_BASE_CONFIGURE_ON=	--with-gssapi=${GSSAPIBASEDIR} ${GSSAPI_CONFIGURE_ARGS}
GSSAPI_HEIMDAL_USES=	gssapi:heimdal
GSSAPI_HEIMDAL_CONFIGURE_ON=	--with-gssapi=${GSSAPIBASEDIR} ${GSSAPI_CONFIGURE_ARGS}
GSSAPI_MIT_USES=	gssapi:mit
GSSAPI_MIT_CONFIGURE_ON=	--with-gssapi=${GSSAPIBASEDIR} ${GSSAPI_CONFIGURE_ARGS}
GSSAPI_NONE_CONFIGURE_ON=	--without-gssapi
```

## 17.52. `gstreamer`

可能的参数：（无）

提供一种简便的方法来依赖 GStreamer 组件。组件应列在 `USE_GSTREAMER` 中。可用的组件有：

* `a52dec`
* `aalib`
* `amrnb`
* `amrwbdec`
* `aom`
* `assrender`
* `bad`
* `bs2b`
* `cairo`
* `cdio`
* `cdparanoia`
* `chromaprint`
* `curl`
* `dash`
* `dtls`
* `dts`
* `dv`
* `dvd`
* `dvdread`
* `editing-services`
* `faac`
* `faad`
* `flac`
* `flite`
* `gdkpixbuf`
* `gl`
* `gme`
* `gnonlin`
* `good`
* `gsm`
* `gtk4`
* `gtk`
* `hal`
* `hls`
* `jack`
* `jpeg`
* `kate`
* `kms`
* `ladspa`
* `lame`
* `libav`
* `libcaca`
* `libde265`
* `libmms`
* `libvisual`
* `lv2`
* `mm`
* `modplug`
* `mpeg2dec`
* `mpeg2enc`
* `mpg123`
* `mplex`
* `musepack`
* `neon`
* `ogg`
* `opencv`
* `openexr`
* `openh264`
* `openjpeg`
* `openmpt`
* `opus`
* `pango`
* `png`
* `pulse`
* `qt`
* `resindvd`
* `rsvg`
* `rtmp`
* `shout2`
* `sidplay`
* `smoothstreaming`
* `sndfile`
* `sndio`
* `soundtouch`
* `soup`
* `spandsp`
* `speex`
* `srtp`
* `taglib`
* `theora`
* `ttml`
* `twolame`
* `ugly`
* `v4l2`
* `vorbis`
* `vpx`
* `vulkan`
* `wavpack`
* `webp`
* `webrtcdsp`
* `x264`
* `x265`
* `x`
* `ximagesrc`
* `zbar`

## 17.53. `guile`

可能的参数：（无），`X.Y`，`flavors`，`build`，`run`，`alias`，`conflicts`

添加对 Guile 的依赖。默认情况下，这是对适当的 `libguile*.so` 的库依赖，除非通过 `build` 和/或 `run` 选项覆盖。`alias` 选项根据需要配置 `BINARY_ALIAS`（请参见 [使用 `BINARY_ALIAS`](https://docs.freebsd.org/en/books/porters-handbook/makefiles/#binary-alias)）。

默认版本通过常规的 `DEFAULT_VERSIONS` 机制设置；如果默认版本不是列表中的版本之一，则使用可用的最新版本。

使用 Guile 的应用程序通常只构建单一版本的 Guile。然而，扩展或库模块应使用 `flavors` 选项，以使用多个 flavors 构建。

更多信息请参见 [使用 Guile](https://docs.freebsd.org/en/books/porters-handbook/special/#using-guile)。

## 17.54. `horde`

可能的参数：（无）

添加对 [devel/pear-channel-horde](https://cgit.freebsd.org/ports/tree/devel/pear-channel-horde/) 的构建时和运行时依赖。如果需要，可以使用 `USE_HORDE_BUILD` 和 `USE_HORDE_RUN` 添加其他 Horde 依赖项。更多信息请参见 [Horde 模块](https://docs.freebsd.org/en/books/porters-handbook/special/#php-horde)。

## 17.55. `iconv`

可能的参数：（无），`lib`，`build`，`patch`，`translit`，`wchar_t`

使用 `iconv` 函数，来自 Port [converters/libiconv](https://cgit.freebsd.org/ports/tree/converters/libiconv/) 的构建时和运行时依赖，或者来自基本系统的 `iconv`。默认情况下，如果没有指定参数或指定了 `lib` 参数，则表示使用 `iconv` 作为构建时和运行时依赖。`build` 表示仅作为构建时依赖，`patch` 表示仅作为补丁时依赖。如果 Port 使用 `WCHAR_T` 或 `//TRANSLIT` iconv 扩展，请添加相关参数以确保使用正确的 iconv。更多信息请参见 [使用 `iconv`](https://docs.freebsd.org/en/books/porters-handbook/special/#using-iconv)。

## 17.56. `imake`

可能的参数：（无），`env`，`notall`，`noman`

将 [devel/imake](https://cgit.freebsd.org/ports/tree/devel/imake/) 添加为构建时依赖，并在 `configure` 阶段运行 `xmkmf -a`。如果指定了 `env` 参数，则不会设置 `configure` 目标。如果 `-a` 标志对 Port 有问题，请添加 `notall` 参数。如果 `xmkmf` 无法生成 `install.man` 目标，则添加 `noman` 参数。

## 17.57. `inotify`

可能的参数：（无）

为 Port 添加 `inotify` 支持。

## 17.58. `java`

可能的参数：（无），`ant`，`build`，`extract`，`run`

如果没有提供参数且未定义 `NO_BUILD`，则默认使用 `USES=java:build,run`。如果定义了 `NO_BUILD`，则使用 `USES=java:run`。如果指定了 `ant` 参数，则 Port 使用 Apache Ant。如果指定了 `build` 参数，则会将 JDK Port 添加到构建依赖中。如果指定了 `extract` 参数，则会将 JDK Port 添加到提取依赖中。如果指定了 `run` 参数，则会将 JDK Port 添加到运行时依赖中。

该框架提供以下变量供 Port 设置：

`JAVA_VERSION`：Port 适用的 Java 版本列表，空格分隔。可选的 `+` 可以用来指定版本范围。（允许的值：`8[+]`，`11[+]`，`17[+]`，`18[+]`，`19[+]`，`21[+]`，`22[+]`，`23[+]`，`24[+]`，`25[+]`）

`JAVA_OS`：Port 适用的 JDK 操作系统列表，空格分隔。（允许的值：`native`，`linux`）

`JAVA_VENDOR`：Port 适用的 JDK 供应商列表，空格分隔。（允许的值：`openjdk`，`oracle`）

该框架为 Port 提供以下变量以供读取：

`JAVA_PORT`：JDK Port 的名称。（例如 `java/openjdk8`）

`JAVA_PORT_VERSION`：JDK Port 的版本。（例如 `8`）

`JAVA_PORT_OS`：JDK Port 使用的操作系统。（例如 `linux`）

`JAVA_PORT_VENDOR`：JDK Port 的供应商。（例如 `openjdk`）

`JAVA_PORT_OS_DESCRIPTION`：JDK Port 使用的操作系统描述。（例如 `Linux`）

`JAVA_PORT_VENDOR_DESCRIPTION`：JDK Port 供应商的描述。（例如 `OpenJDK BSD Porting Team`）

`JAVA_HOME`：JDK 安装目录的路径。（例如 **/usr/local/openjdk8**）

`JAVAC`：使用的 Java 编译器路径。（例如 **/usr/local/openjdk8/bin/javac** 或 **/usr/local/bin/javac**）

`JAR`：使用的 JAR 工具路径。（例如 **/usr/local/openjdk8/bin/jar** 或 **/usr/local/bin/fastjar**）

`APPLETVIEWER`：appletviewer 工具的路径。（例如 **/usr/local/linux-jdk1.8.0/bin/appletviewer**）

`JAVA`：`java` 可执行文件的路径。用于执行 Java 程序。（例如 **/usr/local/openjdk8/bin/java**）

`JAVADOC`：`javadoc` 工具程序的路径。

`JAVAH`：`javah` 程序的路径。

`JAVAP`：`javap` 程序的路径。

`JAVA_KEYTOOL`：`keytool` 工具程序的路径。

`JAVA_N2A`：`native2ascii` 工具的路径。

`JAVA_POLICYTOOL`：`policytool` 程序的路径。

`JAVA_SERIALVER`：`serialver` 工具程序的路径。

`RMIC`：RMI stub/skeleton 生成器 `rmic` 的路径。

`RMIREGISTRY`：RMI 注册程序的路径，`rmiregistry`。

`RMID`：RMI 守护进程程序的路径。

`JAVA_CLASSES`：包含 JDK 类文件的归档路径。在大多数 JDK 中，这是 **${JAVA\_HOME}/jre/lib/rt.jar**。

`JAVASHAREDIR`：所有共享 Java 资源的基本目录。

`JAVAJARDIR`：Port 应安装 JAR 文件的目录。

`JAVALIBDIR`：由其他 Port 安装的 JAR 文件所在的目录。

## 17.59. `jpeg`

可能的参数：`lib`（默认，隐式），`build`，`run`

帮助处理对 `jpeg` 的依赖。

如果提供了 `lib` 参数或没有提供参数，则会向 Port 添加库依赖。

如果提供了 `build` 参数，则会向 Port 添加构建时依赖。

如果提供了 `run` 参数，则会向 Port 添加运行时依赖。

如果提供了 `both` 参数，则会向 Port 添加构建时依赖和运行时依赖。

该框架提供了以下可以由 Port 设置的变量：

`JPEG_PORT`：指定要使用的 JPEG 实现。可选值包括：

* [graphics/jpeg-turbo](https://cgit.freebsd.org/ports/tree/graphics/jpeg-turbo/)（默认）
* [graphics/mozjpeg](https://cgit.freebsd.org/ports/tree/graphics/mozjpeg/)

## 17.60. `kde`

可能的参数：`5`

添加对 KDE 组件的依赖。更多信息请参见 [使用 KDE](https://docs.freebsd.org/en/books/porters-handbook/special/#using-kde)。

## 17.61. `kmod`

可能的参数：（无），`debug`

为内核模块 Port 填充模板，当前包括：

* 将 `kld` 添加到 `CATEGORIES`。
* 设置 `SSP_UNSAFE`。
* 如果在 `SRC_BASE` 中找不到内核源代码，则设置 `IGNORE`。
* 默认情况下，将 `KMODDIR` 定义为 **/boot/modules**，并将其添加到 `PLIST_SUB` 和 `MAKE_ENV` 中，安装时创建该目录。如果将 `KMODDIR` 设置为 **/boot/kernel**，则会重写为 **/boot/modules**。这样可以防止在升级内核时破坏包，因为 **/boot/kernel** 会在此过程中重命名为 **/boot/kernel.old**。
* 在安装和卸载时处理内核模块的交叉引用，使用 [`@kld`](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-keywords-kld)。
* 如果提供了 `debug` 参数，则 Port 可以将调试版本的模块安装到 **KERN\_DEBUGDIR**/**KMODDIR** 中。默认情况下，`KERN_DEBUGDIR` 从 `DEBUGDIR` 复制并设置为 **/usr/lib/debug**。框架将负责创建和删除所需的目录。

## 17.62. `kodi`

可能的参数：（无），`noautoplist`

提供对 [multimedia/kodi](https://cgit.freebsd.org/ports/tree/multimedia/kodi/) 插件的支持。如果提供了 `noautoplist` 参数，则不会自动生成 `plist`。

## 17.63. `lazarus`

可能的参数：（无），`gtk2`（默认），`qt5`，`qt6`，`flavors`

为 [editors/lazarus](https://cgit.freebsd.org/ports/tree/editors/lazarus/) 基础的 Port 提供支持。

如果未提供参数或提供了 `gtk2` 参数，则 lazarus-app 将使用 `gtk2` 界面构建，[editors/lazarus](https://cgit.freebsd.org/ports/tree/editors/lazarus/) Port 将使用 `gtk2` 界面构建。

如果提供了 `qt5` 参数，则 lazarus-app 将使用 `qt5` 界面构建。

如果提供了 `qt6` 参数，则 lazarus-app 将使用 `qt6` 界面构建。

如果提供了 `flavors` 参数，则 lazarus-app 将使用 flavors 特性构建。

如果 Port 不需要自动编译 lazarus 项目文件，则可以定义以下变量：

`NO_LAZBUILD`= `yes`

以下变量可供 Port 使用：

`LAZARUS_PROJECT_FILES`：lpi 文件列表。不能为空。默认值：空

`LAZARUS_DIR`：lazarus 安装目录的路径，默认值：**${LOCALBASE}/share/lazarus-${LAZARUS\_VER}**

`LAZBUILD_ARGS`：lazbuild 额外参数。大多数情况下可以是 `-d`。更多信息请参见 [lazbuild(1)](https://man.freebsd.org/cgi/man.cgi?query=lazbuild\&sektion=1\&format=html)。默认值：空

`LAZARUS_NO_FLAVORS`：不构建这些 lazarus flavors。如果未定义 `LAZARUS_NO_FLAVORS`，则假定构建所有有效的 lazarus flavors。

`WANT_LAZARUS_DEVEL`：如果设置为 `yes`，则使用 [lazarus/devel](https://cgit.freebsd.org/ports/tree/lazarus/devel/) 作为构建依赖。

## 17.64. `ldap`

可能的参数：（无），`<版本>`，`client`，`server`

注册对 [net/openldap](https://cgit.freebsd.org/ports/tree/net/openldap/) 的依赖。如果设置了特定的 `<版本>`（无点号表示法），则使用该版本。否则，它会尝试找到当前安装的版本。如果需要，它会回退到 `bsd.default-versions.mk` 中找到的默认版本。`client` 指定对客户端库的运行时依赖，这是默认行为。`server` 指定对服务器的运行时依赖。

Port 可以访问以下变量：

`IGNORE_WITH_OPENLDAP`：如果 Port 不支持某个版本的 OpenLDAP，可以定义此变量。

`WITH_OPENLDAP_VER`：用户定义的变量，用于设置 OpenLDAP 版本。

`OPENLDAP_VER`：检测到的 OpenLDAP 版本。

## 17.65. `lha`

可能的参数：（无）

将 `EXTRACT_SUFX` 设置为 `.lzh`。

## 17.66. `libarchive`

可能的参数：（无）

注册对 [archivers/libarchive](https://cgit.freebsd.org/ports/tree/archivers/libarchive/) 的依赖。任何依赖 libarchive 的 Port 必须包含 `USES=libarchive`。

## 17.67. `libedit`

可能的参数：（无）

注册对 [devel/libedit](https://cgit.freebsd.org/ports/tree/devel/libedit/) 的依赖。任何依赖 libedit 的 Port 必须包含 `USES=libedit`。

## 17.68. `libtool`

可能的参数：（无），`keepla`，`build`

修补 `libtool` 脚本。所有使用 `libtool` 的 Port 必须添加此项。`keepla` 参数可用于保留 **.la** 文件。一些 Port 没有自己的 libtool 副本，需要对 [devel/libtool](https://cgit.freebsd.org/ports/tree/devel/libtool/) 进行构建时依赖，使用 `:build` 参数添加此依赖。

## 17.69. `linux`

可能的参数：`c6`，`c7`

Linux 兼容性框架 Port。指定 `c6` 以依赖于 CentOS 6 包。指定 `c7` 以依赖于 CentOS 7 包。可用的包有：

* `allegro`
* `alsa-plugins-oss`
* `alsa-plugins-pulseaudio`
* `alsalib`
* `atk`
* `avahi-libs`
* `base`
* `cairo`
* `cups-libs`
* `curl`
* `cyrus-sasl2`
* `dbusglib`
* `dbuslibs`
* `devtools`
* `dri`
* `expat`
* `flac`
* `fontconfig`
* `gdkpixbuf2`
* `gnutls`
* `graphite2`
* `gtk2`
* `harfbuzz`
* `jasper`
* `jbigkit`
* `jpeg`
* `libasyncns`
* `libaudiofile`
* `libelf`
* `libgcrypt`
* `libgfortran`
* `libgpg-error`
* `libmng`
* `libogg`
* `libpciaccess`
* `libsndfile`
* `libsoup`
* `libssh2`
* `libtasn1`
* `libthai`
* `libtheora`
* `libv4l`
* `libvorbis`
* `libxml2`
* `mikmod`
* `naslibs`
* `ncurses-base`
* `nspr`
* `nss`
* `openal`
* `openal-soft`
* `openldap`
* `openmotif`
* `openssl`
* `pango`
* `pixman`
* `png`
* `pulseaudio-libs`
* `qt`
* `qt-x11`
* `qtwebkit`
* `scimlibs`
* `sdl12`
* `sdlimage`
* `sdlmixer`
* `sqlite3`
* `tcl85`
* `tcp_wrappers-libs`
* `tiff`
* `tk85`
* `ucl`
* `xorglibs`

## 17.70. `llvm`

可能的参数：（无），`XY`，min=`XY`，max=`XY`，build，run，lib

添加对 LLVM 的依赖。默认情况下，这是一个构建依赖，除非使用 `run` 或 `lib` 选项覆盖。默认版本是通过 `LLVM_DEFAULT` 设置的。也可以指定特定版本。最小和最大版本可以分别通过 `min` 和 `max` 参数指定。Ports 框架将以下变量导出到该 Port：

`LLVM_VERSION`：通过 llvm.mk 选择的版本

`LLVM_PORT`：选择的 llvm Port

`LLVM_CONFIG`：选择的 Port 的 llvm-config

`LLVM_LIBLLVM`：选择的 Port 的 libLLVM.so

`LLVM_PREFIX`：选择的 Port 的安装前缀

## 17.71. `localbase`

可能的参数：（无），`ldflags`

确保使用来自 `LOCALBASE` 的库，而不是来自基本系统的库。指定 `ldflags` 可以将 `-L${LOCALBASE}/lib` 添加到 `LDFLAGS`，而不是 `LIBS`。依赖于基本系统中也存在的库的 Ports 应该使用此选项。它也被其他一些 `USES` 内部使用。

## 17.72. `lua`

可能的参数：（无），`XY`，`XY+`，`-XY`，`XY-ZA`，`module`，`flavors`，`build`，`run`，`env`

添加对 Lua 的依赖。默认情况下，这是一个库依赖，除非通过 `build` 和/或 `run` 选项覆盖。`env` 选项防止添加任何依赖，但仍定义所有常规变量。

默认版本由通常的 `DEFAULT_VERSIONS` 机制设置，除非指定了版本或版本范围作为参数，例如 `51` 或 `51-54`。

使用 Lua 的应用程序通常仅为单个 Lua 版本构建。然而，旨在通过 Lua 代码加载的库模块应使用 `module` 选项以使用多个 flavors 构建。

有关更多信息，请参见 [使用 Lua](https://docs.freebsd.org/en/books/porters-handbook/special/#using-lua)。

## 17.73. `luajit`

可能的参数：（无），`X`

添加对 luajit 运行时的依赖。可以使用特定版本 *X*。可用版本为 `luajit`，`luajit-devel`，`luajit-openresty`。

在包含 **bsd.port.options.mk** 或 **bsd.port.pre.mk** 后，Port 可以检查以下变量：

`LUAJIT_VER`：选择的 luajit 版本

`LUAJIT_INCDIR`：luajit 的头文件路径

`LUAJIT_LUAVER`：选择的 luajit 规范版本（`luajit` 为 2.0，其他为 2.1）

有关更多信息，请参见 [使用 Lua](https://docs.freebsd.org/en/books/porters-handbook/special/#using-lua)。

## 17.74. `lxqt`

可能的参数：（无）

处理 LXQt 桌面环境的依赖。使用 `USE_LXQT` 来选择所需的组件。有关更多信息，请参见 [使用 LXQt](https://docs.freebsd.org/en/books/porters-handbook/special/#using-lxqt)。

## 17.75. `magick`

可能的参数：（无），`X`，`build`，`nox11`，`run`，`test`

添加对 `ImageMagick` 的库依赖。可以使用特定版本 *X*。可用版本为 `6` 和 `7`（默认）。`nox11` 表示需要使用 `-nox11` 版本的 Port。`build`，`run` 和 `test` 分别添加对 ImageMagick 的构建、运行时和测试依赖。

## 17.76. `makeinfo`

可能的参数：（无）

如果基本系统中没有 `makeinfo`，则添加一个构建时依赖。

## 17.77. `makeself`

可能的参数：（无）

表示分发文件是 makeself 存档，并设置相应的依赖。

## 17.78. `mate`

可能的参数：（无）

提供一种简单的方法来依赖 MATE 组件。组件应列在 `USE_MATE` 中。可用的组件有：

* `autogen`
* `caja`
* `common`
* `controlcenter`
* `desktop`
* `dialogs`
* `docutils`
* `icontheme`
* `intlhack`
* `intltool`
* `libmatekbd`
* `libmateweather`
* `marco`
* `menus`
* `notificationdaemon`
* `panel`
* `pluma`
* `polkit`
* `session`
* `settingsdaemon`

默认的依赖关系是构建和运行时的，可以通过 `:build` 或 `:run` 进行更改。例如：

```makefile
USES=		mate
USE_MATE=	menus:build intlhack
```

## 17.79. `meson`

可能的参数：（无），`muon`

为基于 Meson 的项目提供支持。有关更多信息，请参见 [使用 `meson`](https://docs.freebsd.org/en/books/porters-handbook/special/#using-meson)。

如果指定了 `muon`，则添加对 [devel/muon](https://cgit.freebsd.org/ports/tree/devel/muon/) 的构建依赖。

## 17.80. `metaport`

可能的参数：（无）

设置以下变量以简化创建 metaport：`MASTER_SITES`，`DISTFILES`，`EXTRACT_ONLY`，`NO_BUILD`，`NO_INSTALL`，`NO_MTREE`，`NO_ARCH`。

## 17.81. `minizip`

可能的参数：（无），`ng`

分别添加对 [archivers/minizip](https://cgit.freebsd.org/ports/tree/archivers/minizip/) 或 [archivers/minizip-ng](https://cgit.freebsd.org/ports/tree/archivers/minizip-ng/) 的库依赖。

## 17.82. `mlt`

可能的参数：`7`，`nodepend`

为依赖 [multimedia/mlt7](https://cgit.freebsd.org/ports/tree/multimedia/mlt7/) 的 Ports 提供支持。

如果提供了 `nodepend` 参数，则不生成库依赖。此参数仅对 multimedia/mlt7\* Ports 有意义。

## 17.83. `mysql`

可能的参数：（无），`version`，`client`（默认），`server`，`embedded`

为 MySQL 提供支持。如果未指定版本，则尝试查找当前安装的版本。回退到默认版本 MySQL-5.6。可用的版本为 `55`，`55m`，`55p`，`56`，`56p`，`56w`，`57`，`57p`，`80`，`100m`，`101m`，`102m`。其中 `m` 和 `p` 后缀分别表示 MariaDB 和 Percona 变种的 MySQL。`server` 和 `embedded` 会添加对 MySQL 服务器的构建和运行时依赖。在使用 `server` 或 `embedded` 时，添加 `client` 以同时添加对 **libmysqlclient.so** 的依赖。如果某些版本不受支持，Port 可以设置 `IGNORE_WITH_MYSQL`。

该框架将 `MYSQL_VER` 设置为检测到的 MySQL 版本。

## 17.84. `mono`

可能的参数：（无），`nuget`

通过设置适当的依赖，添加对 Mono（当前仅支持 C#）框架的依赖。

当 Port 使用 nuget 包时，指定 `nuget`。需要设置 `NUGET_DEPENDS`，其格式为 `name=version`，包含 nuget 包的名称和版本。可以使用 `name=version:_origin_` 添加可选的包源。

辅助目标 `buildnuget` 将基于提供的 **packages.config** 输出 `NUGET_DEPENDS` 的内容。

## 17.85. `motif`

可能的参数：（无）

使用 [x11-toolkits/open-motif](https://cgit.freebsd.org/ports/tree/x11-toolkits/open-motif/) 作为库依赖。最终用户可以在 **make.conf** 中设置 `WANT_LESSTIF` 来使用 [x11-toolkits/lesstif](https://cgit.freebsd.org/ports/tree/x11-toolkits/lesstif/) 作为依赖，而不是 [x11-toolkits/open-motif](https://cgit.freebsd.org/ports/tree/x11-toolkits/open-motif/)。同样，在 **make.conf** 中设置 `WANT_OPEN_MOTIF_DEVEL` 将添加对 [x11-toolkits/open-motif-devel](https://cgit.freebsd.org/ports/tree/x11-toolkits/open-motif-devel/) 的依赖。

## 17.86. `mpi`

可能的参数：`mpich`（默认），`openmpi`

为依赖 `MPI` 的 Ports 提供支持。

如果提供 `mpich` 参数，则添加对 [net/mpich](https://cgit.freebsd.org/ports/tree/net/mpich/) 的依赖。

如果提供 `openmpi` 参数，则添加对 [net/openmpi](https://cgit.freebsd.org/ports/tree/net/openmpi/) 的依赖。

Ports 框架提供以下变量，Port 可以读取：

`MPI_LIBS`：用于链接使用 `MPI` 的程序所需的库。

`MPI_CFLAGS`：编译器标志，用于构建使用 `MPI` 的程序。

`MPICC`：`mpicc` 可执行文件的位置。默认：**${MPI\_HOME}/bin/mpicc**。

`MPICXX`：`mpicxx` 可执行文件的位置。默认：**${MPI\_HOME}/bin/mpicxx**。

`MPIF90`：`mpif90` 可执行文件的位置。默认：**${MPI\_HOME}/bin/mpif90**。

`MPIFC`：与上述相同。

`MPI_HOME`：`MPI` 的安装目录。对于 `MPICH` 默认值为 `${LOCALBASE}`。

`MPIEXEC`：`mpiexec` 可执行文件的位置。默认：**${MPI\_HOME}/bin/mpiexec**。

`MPIRUN`：`mpirun` 可执行文件的位置。默认：**${MPI\_HOME}/bin/mpirun**。

## 17.87. `ncurses`

可能的参数：（无），`base`，`port`

使用 ncurses，并设置一些有用的变量。

## 17.88. `nextcloud`

可能的参数：（无）

通过添加对 [www/nextcloud](https://cgit.freebsd.org/ports/tree/www/nextcloud/) 的运行时依赖，添加对 Nextcloud 应用程序的支持。

## 17.89. `ninja`

可能的参数：（无），`build`，`make`（默认），`run`

如果指定了 `build` 或 `run` 参数，则分别添加对 [devel/ninja](https://cgit.freebsd.org/ports/tree/devel/ninja/) 的构建或运行时依赖。如果提供 `make` 或没有参数，则使用 ninja 来构建该 Port，而不是 make。`make` 隐含了 `build`。如果 `NINJA_DEFAULT` 变量设置为 `samurai`，则将依赖关系设置为 [devel/samurai](https://cgit.freebsd.org/ports/tree/devel/samurai/)。

## 17.90. `nodejs`

可能的参数：（无），`build`，`env`，`run`，`current`，`lts`，`20`，`22`，`24`，`25`，`26`

使用 nodejs。添加对 [www/node\*](https://cgit.freebsd.org/ports/tree/www/node*/) 的依赖。如果指定了受支持的版本，则必须同时指定 `run` 和/或 `build`。`env` 参数设置环境变量 `NODEJS_VERSION` 和 `NODEJS_SUFFIX`。当前 `lts` 是 24 的别名，`current` 是 26 的别名。

## 17.91. `objc`

可能的参数：（无）

如果基本系统不支持，则添加 Objective C 依赖（编译器、运行时库）。

## 17.92. `ocaml`

可能的参数：（无），`build`，`camlp4`，`dune`，`findlib`，`findplist`，`ldconfig`，`run`，`tk`，`tkbuild`，`tkrun`，`wash`

提供对 OCaml 的支持。

如果没有提供任何参数，默认使用 `build` 和 `run`。

如果提供 `build` 参数，则会将 [lang/ocamlc](https://cgit.freebsd.org/ports/tree/lang/ocamlc/) 添加到 `BUILD_DEPENDS`、`EXTRACT` 和 `PATCH_DEPENDS`。

如果提供 `camlp4` 参数，则使用 [devel/ocamlp4](https://cgit.freebsd.org/ports/tree/devel/ocamlp4/) 来构建。

如果提供 `dune` 参数，则使用 [devel/ocaml-dune](https://cgit.freebsd.org/ports/tree/devel/ocaml-dune/) 作为构建系统。

如果提供 `findlib` 参数，则使用 `ocamlfind` 来安装包。包目录会自动删除。

如果提供 `findplist` 参数，则会自动添加 `findlib` 目标目录的内容。

如果提供 `ldconfig` 参数，则会自动处理 OCaml 的 **ld.conf** 文件。当使用 `dune` 时，Dune 可能会将 stublibs 安装到 site-lib 包目录或在 `DUNE_LIBDIR` site-lib 目录下的单一目录中。如果你的 Port 安装了共享库到 OCaml 目录，请设置此项。

如果提供 `run` 参数，则将 `ocamlc` 添加到 `RUN_DEPENDS`。

如果提供 `tk` 参数，则会添加 [x11-toolkits/ocaml-labltk](https://cgit.freebsd.org/ports/tree/x11-toolkits/ocaml-labltk/) 的构建和运行时依赖。此参数隐式包含 `tkbuild` 和 `tkrun`。

如果提供 `tkbuild` 参数，则会将 [x11-toolkits/ocaml-labltk](https://cgit.freebsd.org/ports/tree/x11-toolkits/ocaml-labltk/) 添加到 `BUILD_DEPENDS`、`EXTRACT` 和 `PATCH_DEPENDS`。

如果提供 `tkrun` 参数，则会将 [x11-toolkits/ocaml-labltk](https://cgit.freebsd.org/ports/tree/x11-toolkits/ocaml-labltk/) 添加到 `RUN_DEPENDS`。

如果提供 `wash` 参数，则会在卸载时清理 Ocaml 的共享目录。当安装到非标准 `PREFIX` 时，使用此选项。

可以由 Port 设置以下变量：

`OCAML_PKGDIRS`：如果指定了 `findlib` 参数，将处理 site-lib 下的目录。默认值：`${PORTNAME}`

`OCAML_LDLIBS`：`PREFIX` 下将自动添加到或从 **ld.conf** 中删除的目录。默认值：`${OCAML_SITELIBDIR}/${PORTNAME}`

`OCAML_PACKAGES`：要构建和安装的包列表。默认值：`${PORTNAME}`

## 17.93. `octave`

可能的参数：（无），`env`

使用 [math/octave](https://cgit.freebsd.org/ports/tree/math/octave/)。`env` 仅加载一个 `OCTAVE_VERSION` 环境变量。

## 17.94. `openal`

可能的参数：`al`，`soft`（默认），`si`，`alut`

使用 OpenAL。可以指定后端，默认使用软件实现。用户可以通过设置 `WANT_OPENAL` 来指定首选后端。有效的值包括 `soft`（默认）和 `si`。

## 17.95. `pathfix`

可能的参数：（无）

查找 `PATHFIX_WRKSRC` 中的 **Makefile.in** 和 **configure** 文件（默认为 `WRKSRC`），并修复常见路径，以确保它们遵循 FreeBSD 的层次结构。例如，它会修复 `pkgconfig` 的 `.pc` 文件的安装目录为 `${PREFIX}/libdata/pkgconfig`。如果 Port 使用了 `USES=autoreconf`，则会自动将 **Makefile.am** 添加到 `PATHFIX_MAKEFILEIN` 中。

如果 Port 使用了 [USES=cmake](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-cmake)，则会查找 `PATHFIX_WRKSRC` 中的 **CMakeLists.txt**。如有需要，可以通过 `PATHFIX_CMAKELISTSTXT` 更改默认文件名。

## 17.96. `pear`

可能的参数：`env`

添加对 [devel/pear](https://cgit.freebsd.org/ports/tree/devel/pear/) 的依赖。它将为使用 PHP 扩展和应用程序仓库的软件设置默认行为。使用 `env` 参数仅设置 PEAR 环境变量。有关更多信息，请参见 [PEAR 模块](https://docs.freebsd.org/en/books/porters-handbook/special/#php-pear)。

## 17.97. `perl5`

可能的参数：（无）

依赖于 Perl。配置通过 `USE_PERL5` 进行。

`USE_PERL5` 可以包含使用 Perl 的阶段，包括 `extract`、`patch`、`build`、`run` 或 `test`。

`USE_PERL5` 还可以包含 `configure`、`modbuild` 或 `modbuildtiny`，当需要 **Makefile.PL**、**Build.PL** 或 Module::Build::Tiny 的版本时。

`USE_PERL5` 默认为 `build run`。当使用 `configure`、`modbuild` 或 `modbuildtiny` 时，`build` 和 `run` 是隐式的。

有关更多信息，请参见 [使用 Perl](https://docs.freebsd.org/en/books/porters-handbook/special/#using-perl)。

## 17.98. `pgsql`

可能的参数：（无），`X.Y`，`X.Y+`，`X.Y-`，`X.Y-Z.A`

提供对 PostgreSQL 的支持。Port 维护者可以设置所需的版本。可以指定最小版本、最大版本或版本范围；例如，`9.0-`、`8.4+`、`8.4-9.2.`

默认情况下，添加的依赖项将是客户端，但如果 port 需要其他组件，可以通过 `WANT_PGSQL=component[:target]` 来指定。例如，`WANT_PGSQL=server:configure pltcl plperl`。可用组件包括：

* `client`
* `contrib`
* `docs`
* `pgtcl`
* `plperl`
* `plpython`
* `pltcl`
* `server`

## 17.99. `php`

可能的参数：（无），`phpize`，`ext`，`zend`，`build`，`cli`，`cgi`，`mod`，`web`，`embed`，`pecl`，`flavors`，`noflavors`

提供对 PHP 的支持。为默认的 PHP 版本 [lang/php81](https://cgit.freebsd.org/ports/tree/lang/php81/) 添加运行时依赖。

`phpize`：用于构建 PHP 扩展。启用 flavors。

`ext`：用于构建、安装和注册 PHP 扩展。启用 flavors。

`zend`：用于构建、安装和注册 Zend 扩展。启用 flavors。

`build`：将 PHP 也作为构建时的依赖项。

`cli`：需要 PHP 的 CLI 版本。

`cgi`：需要 PHP 的 CGI 版本。

`mod`：需要 PHP 的 Apache 模块。

`web`：需要 PHP 的 Apache 模块或 CGI 版本。

`embed`：需要 PHP 的嵌入式库版本。

`pecl`：提供从 PECL 仓库获取 PHP 扩展的默认配置。启用 flavors。

`flavors`：启用自动生成 PHP flavors。除非出现在 [`IGNORE_WITH_PHP`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-php-ignore) 中的 PHP 版本，否则将为所有 PHP 版本生成 flavors。

`noflavors`：禁用自动生成 PHP flavors。*仅*与 PHP 本身提供的扩展一起使用。

使用变量来指定所需的 PHP 模块，以及支持的 PHP 版本。

`USE_PHP`：运行时所需的 PHP 扩展列表。可以通过在扩展名称后添加 `:build` 来添加构建时依赖项。例如：`pcre xml:build gettext`。

`IGNORE_WITH_PHP`：该 Port 不与给定版本的 PHP 一起使用。有关可能的值，请查看 **Mk/Uses/php.mk** 中的 `_ALL_PHP_VERSIONS` 内容。

在使用 `:ext` 或 `:zend` 构建 PHP 或 Zend 扩展时，可以设置以下变量：

`PHP_MODNAME`：PHP 或 Zend 扩展的名称。默认值是 `${PORTNAME}`。

`PHP_HEADER_DIRS`：安装头文件的子目录列表。框架将始终安装与扩展位于同一目录中的头文件。

`PHP_MOD_PRIO`：加载扩展的优先级。它是一个介于 `00` 和 `99` 之间的数字。

对于不依赖其他扩展的扩展，优先级自动设置为 `20`，对于依赖其他扩展的扩展，优先级自动设置为 `30`。一些扩展可能需要在其他扩展之前加载，例如 [www/php56-opcache](https://cgit.freebsd.org/ports/tree/www/php56-opcache/)。一些可能需要在优先级为 `30` 的扩展之后加载。在这种情况下，可以在 Port 的 **Makefile** 中添加 `PHP_MOD_PRIO=XX`。例如：

```makefile
USES=		php:ext
USE_PHP=	wddx
PHP_MOD_PRIO=	40
```

这些变量可以用于 `PKGNAMEPREFIX` 或 `PKGNAMESUFFIX`：

`PHP_PKGNAMEPREFIX`：包含 `php_XY_-`，其中 *XY* 是当前 flavor 的 PHP 版本。用于 PHP 扩展和模块。

`PHP_PKGNAMESUFFIX`：包含 `-php_XY_`，其中 *XY* 是当前 flavor 的 PHP 版本。用于 PHP 应用程序。

`PECL_PKGNAMEPREFIX`：包含 `php_XY_-pecl-`，其中 *XY* 是当前 flavor 的 PHP 版本。用于 PECL 模块。

> **重要**
>
> 使用 flavors 时，所有 PHP 扩展、PECL 扩展、PEAR 模块 *必须*具有不同的包名称，因此它们必须在 `PKGNAMEPREFIX` 或 `PKGNAMESUFFIX` 中使用这三个变量之一。

## 17.100. `pkgconfig`

可能的参数：（无），`build`（默认），`run`，`both`

使用 [devel/pkgconf](https://cgit.freebsd.org/ports/tree/devel/pkgconf/)。如果没有参数或使用 `build` 参数，则意味着将 `pkg-config` 作为构建时的依赖项。`run` 表示运行时依赖项，`both` 表示构建时和运行时的依赖项。

## 17.101. `pure`

可能的参数：（无），`ffi`

使用 [lang/pure](https://cgit.freebsd.org/ports/tree/lang/pure/)。主要用于构建相关的 pure Port。使用 `ffi` 参数时，它意味着将 [devel/pure-ffi](https://cgit.freebsd.org/ports/tree/devel/pure-ffi/) 作为运行时依赖项。

## 17.102. `pyqt`

可能的参数：（无），`4`，`5`

使用 PyQt。如果 Port 是 PyQt 的一部分，请设置 `PYQT_DIST`。使用 `USE_PYQT` 来选择 Port 需要的组件。可用的组件包括：

* `core`
* `dbus`
* `dbussupport`
* `demo`
* `designer`
* `designerplugin`
* `doc`
* `gui`
* `multimedia`
* `network`
* `opengl`
* `qscintilla2`
* `sip`
* `sql`
* `svg`
* `test`
* `webkit`
* `xml`
* `xmlpatterns`

这些组件仅在 PyQt4 中可用：

* `assistant`
* `declarative`
* `help`
* `phonon`
* `script`
* `scripttools`

这些组件仅在 PyQt5 中可用：

* `multimediawidgets`
* `printsupport`
* `qml`
* `serialport`
* `webkitwidgets`
* `widgets`

每个组件的默认依赖项是构建时和运行时的依赖项，要选择仅构建或仅运行，请在组件名称后添加 `_build` 或 `_run`。例如：

```makefile
USES=		pyqt
USE_PYQT=	core doc_build designer_run
```

## 17.103. `pytest`

可能的参数：（无），`4`

引入了对 [devel/pytest](https://cgit.freebsd.org/ports/tree/devel/pytest/) 的新依赖。它定义了一个 `do-test` 目标，用于正确运行测试。使用该参数依赖于特定版本的 [devel/pytest](https://cgit.freebsd.org/ports/tree/devel/pytest/)。对于使用 [devel/pytest](https://cgit.freebsd.org/ports/tree/devel/pytest/) 的 Port，建议使用此方式，而不是使用特定的 `do-test` 目标。框架向 Port 暴露了以下变量：

`PYTEST_ARGS`：传递给 pytest 的额外参数（默认为空）。

`PYTEST_IGNORED_TESTS`：列出需要忽略的 `pytest -k` 测试模式（默认为空）。适用于那些预期不通过的测试，比如需要数据库访问的测试。

`PYTEST_BROKEN_TESTS`：列出需要忽略的 `pytest -k` 损坏测试模式（默认为空）。适用于那些有问题的测试，需要修复。

此外，用户可以设置以下变量：

`PYTEST_ENABLE_IGNORED_TESTS`：启用那些通常会被 `PYTEST_IGNORED_TESTS` 忽略的测试。

`PYTEST_ENABLE_BROKEN_TESTS`：启用那些通常会被 `PYTEST_BROKEN_TESTS` 忽略的测试。

`PYTEST_ENABLE_ALL_TESTS`：启用所有那些通常会被 `PYTEST_IGNORED_TESTS` 和 `PYTEST_BROKEN_TESTS` 忽略的测试。

## 17.104. `python`

可能的参数：（无），`X.Y`，`X.Y+`，`-X.Y`，`X.Y-Z.A`，`patch`，`build`，`run`，`test`

使用 Python。可以指定支持的版本或版本范围。如果 Python 只在构建时、运行时或测试时需要，可以将其设置为构建、运行或测试依赖项，使用 `build`、`run` 或 `test`。如果 Python 在补丁阶段也需要，则使用 `patch`。更多信息请参见 [使用 Python](https://docs.freebsd.org/en/books/porters-handbook/special/#using-python)。

`USES=python:env` 可以在需要框架导出的变量但不依赖于 Python 时使用。通常用于与 [`USES=shebangfix`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-shebangfix) 配合使用，目标是仅修复 shebang，而不是添加对 Python 的依赖。

## 17.105. `qmail`

可能的参数：（无），`build`，`run`，`both`，`vars`

使用 [mail/qmail](https://cgit.freebsd.org/ports/tree/mail/qmail/)。使用 `build` 参数时，意味着将 `qmail` 作为构建时的依赖项。`run` 表示运行时依赖项。如果不带参数或使用 `both` 参数，则表示构建时和运行时的依赖项。`vars` 将仅设置 QMAIL 变量供 Port 使用。

## 17.106. `qmake`

可能的参数：（无），`norecursive`，`outsource`，`no_env`，`no_configure`

使用 QMake 进行配置。更多信息请参见 [使用 `qmake`](https://docs.freebsd.org/en/books/porters-handbook/special/#using-qmake)。

## 17.107. `qt`

可能的参数：`5`，`6`，`no_env`

添加对 Qt 组件的依赖。`no_env` 参数直接传递给 `USES= qmake`。更多信息请参见 [使用 Qt](https://docs.freebsd.org/en/books/porters-handbook/special/#using-qt)。

## 17.108. `qt-dist`

可能的参数：（无）或 `5` 和（无）或 `6` 和（无）或下列之一：`3d`，`5compat`，`base`，`charts`，`connectivity`，`datavis3d`，`declarative`，`doc`，`languageserver`，`gamepad`，`graphicaleffects`，`imageformats`，`location`，`lottie`，`multimedia`，`networkauth`，`positioning`，`quick3d`，`quickcontrols2`，`quickcontrols`，`quicktimeline`，`remoteobjects`，`script`，`scxml`，`sensors`，`serialbus`，`serialport`，`shadertools`，`speech`，`svg`，`tools`，`translations`，`virtualkeyboard`，`wayland`，`webchannel`，`webengine`，`webglplugin`，`websockets`，`webview`，`x11extras`，`xmlpatterns`。

提供构建 Qt 5 和 Qt 6 组件的支持。它负责为 Port 构建设置适当的配置环境。

**示例 7. 构建 Qt 5 组件**

该 Port 是 Qt 5 的 `networkauth` 组件，属于 `networkauth` 分发文件。

```makefile
PORTNAME=	networkauth
DISTVERSION=	${QT5_VERSION}

USES=		qt-dist:5
```

**示例 8. 构建 Qt 6 组件**

该 port 是 Qt 6 的 `websockets` 组件，属于 `websockets` 分发文件。

```makefile
PORTNAME=       websockets
PORTVERSION=    ${QT6_VERSION}

USES=           qt-dist:6
```

如果 `PORTNAME` 与组件名称不匹配，则可以将其作为参数传递给 `qt-dist`。

**示例 9. 使用不同名称构建 Qt 5 组件**

该 port 是 Qt 5 的 `gui` 组件，属于 `base` 分发文件。

```makefile
PORTNAME=	gui
DISTVERSION=	${QT5_VERSION}

USES=		qt-dist:5,base
```

## 17.109. `readline`

可能的参数：（无），`port`

将 readline 作为库依赖项，并根据需要设置 `CPPFLAGS` 和 `LDFLAGS`。如果使用 `port` 参数，或如果基本系统中没有 readline，则会添加对 [devel/readline](https://cgit.freebsd.org/ports/tree/devel/readline/) 的依赖。

## 17.110. `ruby`

可能的参数：（无），`build`，`extconf`，`run`，`setup`

为 Ruby 相关的 Port 提供支持。`(无)` 参数时，会添加对 [lang/ruby](https://cgit.freebsd.org/ports/tree/lang/ruby/) 的运行时依赖。`build` 添加对 [lang/ruby](https://cgit.freebsd.org/ports/tree/lang/ruby/) 的构建时依赖。`extconf` 表示该 Port 使用 `extconf.rb` 来配置。`run` 添加对 [lang/ruby](https://cgit.freebsd.org/ports/tree/lang/ruby/) 的运行时依赖，这是默认设置。`setup` 表示该 Port 使用 `setup.rb` 来配置和构建。

用户可以定义以下变量：

`RUBY_VER`：Ruby 的替代短版本，以 `x.y` 形式表示。

`RUBY_DEFAULT_VER`：设置为（例如）`2.7`，则默认使用 `ruby27`。

`RUBY_ARCH`：设置架构名称（例如 `i386-freebsd7`）。

以下变量会被导出供 Port 使用：

`RUBY`：设置为 ruby 的完整路径。如果设置了此变量，则以下变量的值将自动从 ruby 执行文件中获得：`RUBY_ARCH`、`RUBY_ARCHLIBDIR`、`RUBY_LIBDIR`、`RUBY_SITEARCHLIBDIR`、`RUBY_SITELIBDIR`、`RUBY_VER` 和 `RUBY_VERSION`。

`RUBY_VER`：设置为 Ruby 的替代短版本，以 `x.y` 形式表示。

`RUBY_EXTCONF`：设置为 `extconf.rb` 的替代名称（默认：`extconf.rb`）。

`RUBY_EXTCONF_SUBDIRS`：设置为子目录列表，如果包含多个模块。

`RUBY_SETUP`：设置为 `setup.rb` 的替代名称（默认：`setup.rb`）。

## 17.111. `samba`

可能的参数：`build`，`env`，`lib`，`run`

处理对 Samba 的依赖。`env` 不会添加任何依赖项，仅设置变量。`build` 和 `run` 分别会添加构建时和运行时对 **smbd** 的依赖。`lib` 会添加对 **libsmbclient.so** 的依赖。导出的变量包括：

`SAMBA_PORT`：Samba 默认 Port 的来源。

`SAMBA_INCLUDEDIR`：Samba 头文件的位置。

`SAMBA_LIBS`：Samba 共享库所在目录。

`SAMBA_LDB_PORT`：选定 Samba 版本使用的 ldb Port 的来源（例如， [databases/ldb28](https://cgit.freebsd.org/ports/tree/databases/ldb28/)）。如果一个 Port 需要依赖于与选定 Samba 版本相同的 ldb 版本，应该使用此变量。

`SAMBA_TALLOC_PORT`：选定 Samba 版本使用的 talloc Port 的来源。如果一个 Port 需要依赖于与选定 Samba 版本相同的 talloc 版本，应该使用此变量。

`SAMBA_TDB_PORT`：选定 Samba 版本使用的 TDB Port 的来源。如果一个 Port 需要依赖于与选定 Samba 版本相同的 TDB 版本，应该使用此变量。

`SAMBA_TEVENT_PORT`：选定 Samba 版本使用的 tevent Port 的来源。如果一个 Port 需要依赖于与选定 Samba 版本相同的 tevent 版本，应该使用此变量。

## 17.112. `scons`

可能的参数：（无）

为使用 [devel/scons](https://cgit.freebsd.org/ports/tree/devel/scons/) 提供支持。更多信息请参见 [使用 `scons`](https://docs.freebsd.org/en/books/porters-handbook/special/#using-scons)。

## 17.113. `sdl`

可能的参数：`sdl`

为使用 `SDL` 软件包提供支持。变量 `USE_SDL` 是强制性的，并指定要添加为依赖的组件。

当前支持的 `SDL1.2` 模块有：

* sdl
* console
* gfx
* image
* mixer
* mm
* net
* pango
* sound
* ttf

当前支持的 `SDL2` 模块有：

* sdl2
* gfx2
* image2
* mixer2
* net2
* sound2
* ttf2

当前支持的 `SDL3` 模块有：

* sdl3
* image3
* ttf3

## 17.114. `shared-mime-info`

可能的参数：（无）

使用来自 [misc/shared-mime-info](https://cgit.freebsd.org/ports/tree/misc/shared-mime-info/) 的 `update-mime-database`。此宏会自动在安装后步骤中添加，以确保该 Port 在需要时仍能指定自己的安装后步骤。同时，它还会将 [`@shared-mime-info`](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-keywords-shared-mime-info) 条目添加到 plist 中。

## 17.115. `shebangfix`

可能的参数：（无）

许多软件使用错误的脚本解释器位置，特别是 **/usr/bin/perl** 和 **/bin/bash**。`shebangfix` 宏修复脚本中的 shebang 行，这些脚本包含在 `SHEBANG_REGEX`、`SHEBANG_GLOB` 或 `SHEBANG_FILES` 中。

`SHEBANG_REGEX`：包含一个扩展正则表达式，并与 [find(1)](https://man.freebsd.org/cgi/man.cgi?query=find\&sektion=1\&format=html) 的 `-iregex` 参数一起使用。参见 [`USESshebangfix` 与 `SHEBANG_REGEX`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-shebangfix-ex-regex)。

`SHEBANG_GLOB`：包含一个使用 [find(1)](https://man.freebsd.org/cgi/man.cgi?query=find\&sektion=1\&format=html) 的 `-name` 参数的模式列表。参见 [`USESshebangfix` 与 `SHEBANG_GLOB`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-shebangfix-ex-glob)。

`SHEBANG_FILES`：包含文件列表或 [sh(1)](https://man.freebsd.org/cgi/man.cgi?query=sh\&sektion=1\&format=html) 模式。`shebangfix` 宏在 `${WRKSRC}` 中运行，因此 `SHEBANG_FILES` 可以包含相对于 `${WRKSRC}` 的路径。如果需要修补 `${WRKSRC}` 之外的文件，也可以处理绝对路径。参见 [`USESshebangfix` 与 `SHEBANG_FILES`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-shebangfix-ex-files)。

当前默认支持的解释器包括：Bash、Java、Ksh、Lua、Perl、PHP、Python、Ruby、Tcl 和 Tk。

有三个配置变量：

`SHEBANG_LANG`：支持的解释器列表。

`_interp__CMD`：在 FreeBSD 上的命令解释器路径。默认值是 **${LOCALBASE}/bin/*****interp***。

`_interp__OLD_CMD`：错误的解释器调用列表。这些通常是过时的路径，或在 FreeBSD 上不正确的路径，它们将被 `_interp__CMD` 中的正确路径所替换。

> **注意**
>
> 这些路径*始终*是 `_interp__OLD_CMD` 的一部分：`"/usr/bin/env _interp_"`、**/bin/*****interp***、**/usr/bin/*****interp***、**/usr/local/bin/*****interp***。

> **技巧**
>
> `_interp__OLD_CMD` 包含多个值。任何包含空格的条目必须加引号。参见 [指定为 `USESshebangfix` 添加解释器时的所有路径](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-shebangfix-ex-ksh)。

> **重要**
>
> shebang 修复在 `patch` 阶段完成。如果在 `build` 阶段创建了错误的 shebang（例如，`configure` 脚本或 `Makefiles`），则必须修补或给定正确的路径（例如，通过 `CONFIGURE_ENV`、`CONFIGURE_ARGS`、`MAKE_ENV` 或 `MAKE_ARGS`）来生成正确的 shebang。
>
> 支持的解释器的正确路径可以在 `_interp__CMD` 中找到。

> **技巧**
>
> 当与 [`USES=python`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-python) 一起使用时，如果仅仅是修复 shebang，但不希望依赖于 Python 本身，可以使用 `USES=python:env`。

**示例 10. 向 `USES=shebangfix` 添加另一个解释器**

要添加另一个解释器，设置 `SHEBANG_LANG`。例如：

```makefile
SHEBANG_LANG=	lua
```

**示例 11. 在向 `USES=shebangfix` 添加解释器时指定所有路径**

如果未定义，并且 `_interp__OLD_CMD` 和 `_interp__CMD` 没有默认值，则 Ksh 条目可以定义如下：

```makefile
SHEBANG_LANG=	ksh
ksh_OLD_CMD=	"/usr/bin/env ksh" /bin/ksh /usr/bin/ksh
ksh_CMD=	${LOCALBASE}/bin/ksh
```

**示例 12. 添加解释器的奇怪位置**

有些软件使用解释器的奇怪位置。例如，应用程序可能期望 Python 位于 **/opt/bin/python2.7**。可以在 Port **Makefile** 中声明需要替换的奇怪路径：

```makefile
python_OLD_CMD=	/opt/bin/python2.7
```

**示例 13. `USES=shebangfix` 与 `SHEBANG_REGEX`**

要修复 `${WRKSRC}/scripts` 中所有以 **.pl**、**.sh** 或 **.cgi** 结尾的文件，可以执行：

```makefile
USES=	shebangfix
SHEBANG_REGEX=	./scripts/.*\.(sh|pl|cgi)
```

> **注意**
>
> `SHEBANG_REGEX` 是通过运行 `find -E` 来使用的，它使用现代正则表达式，也称为扩展正则表达式。更多信息参见 [re\_format(7)](https://man.freebsd.org/cgi/man.cgi?query=re_format\&sektion=7\&format=html)。

**示例 14. `USES=shebangfix` 与 `SHEBANG_GLOB`**

要修复 `${WRKSRC}` 中所有以 **.pl** 或 **.sh** 结尾的文件，可以执行：

```makefile
USES=	shebangfix
SHEBANG_GLOB=	*.sh *.pl
```

**示例 15. `USES=shebangfix` 与 `SHEBANG_FILES`**

要修复 `${WRKSRC}` 中的 **script/foobar.pl** 和 **script/\*.sh** 文件，可以执行：

```makefile
USES=	shebangfix
SHEBANG_FILES=	scripts/foobar.pl scripts/*.sh
```

## 17.116. `sqlite`

可能的参数：（无），`2`，`3`

添加对 SQLite 的依赖。默认使用版本 3，但也可以使用 `:2` 修饰符来指定版本 2。

## 17.117. `sbrk`

可能的参数：（无）

标记该 Port 在 `aarch64` 和 `riscv64` 上为 `BROKEN`。

## 17.118. `ssl`

可能的参数：（无），`build`，`run`

提供对 OpenSSL 的支持。可以使用 `build` 或 `run` 来指定仅在构建时或运行时需要的依赖。这些变量对 Port 可用，也会被添加到 `MAKE_ENV` 中：

`OPENSSLBASE`：OpenSSL 安装基础路径。

`OPENSSLDIR`：OpenSSL 配置文件路径。

`OPENSSLLIB`：OpenSSL 库路径。

`OPENSSLINC`：OpenSSL 包含文件路径。

`OPENSSLRPATH`：如果定义，链接器需要使用的 OpenSSL 库路径。

> **技巧**
>
> 如果一个 Port 在使用 OpenSSL flavor 时无法构建，请设置 `BROKEN_SSL` 变量，并可能设置 `BROKEN_SSL_REASON__flavor_`：
>
> ```makefile
> BROKEN_SSL=	libressl
> BROKEN_SSL_REASON_libressl=	需要 OpenSSL 中才有的特性
> ```

## 17.119. `sudo`

可能的参数：（无）

添加对 [security/sudo](https://cgit.freebsd.org/ports/tree/security/sudo/) 的运行时依赖。

## 17.120. `tar`

可能的参数：（无），`Z`，`bz2`，`bzip2`，`lzma`，`tbz`，`tbz2`，`tgz`，`txz`，`xz`，`zst`，`zstd`

将 `EXTRACT_SUFX` 分别设置为 `.tar`，`.tar.Z`，`.tar.bz2`，`.tar.bz2`，`.tar.lzma`，`.tbz`，`.tbz2`，`.tgz`，`.txz`，`.tar.xz`，`.tar.zst` 或 `.tar.zstd`。

## 17.121. `tcl`

可能的参数：*version*，`wrapper`，`build`，`run`，`tea`

添加对 Tcl 的依赖。可以使用 *version* 来请求特定版本。版本可以为空、一个或多个精确版本号（当前为 `84`、`85` 或 `86`），或一个最小版本号（当前为 `84+`、`85+` 或 `86+`）。如果只请求一个非版本特定的 wrapper，可以使用 `wrapper`。可以使用 `build` 或 `run` 来指定构建时或运行时的依赖。要使用 Tcl 扩展架构构建该 Port，使用 `tea`。在包含 **bsd.port.pre.mk** 后，该 Port 可以使用以下变量检查结果：

* `TCL_VER`：选择的 Tcl 的主次版本
* `TCLSH`：Tcl 解释器的完整路径
* `TCL_LIBDIR`：Tcl 库的路径
* `TCL_INCLUDEDIR`：Tcl C 头文件的路径
* `TCL_PKG_LIB_PREFIX`：根据 TIP595 的库前缀
* `TCL_PKG_STUB_POSTFIX`：Stub 库后缀
* `TK_VER`：选择的 Tk 的主次版本
* `WISH`：Tk 解释器的完整路径
* `TK_LIBDIR`：Tk 库的路径
* `TK_INCLUDEDIR`：Tk C 头文件的路径

## 17.122. `terminfo`

可能的参数：（无）

将 [`@terminfo`](https://docs.freebsd.org/en/books/porters-handbook/plist/#plist-keywords-terminfo) 添加到 **plist**。当该 Port 安装 **\*.terminfo** 文件到 **${PREFIX}/share/misc** 时使用。

## 17.123. `tex`

可能的参数：（无）

提供对 tex 的支持。加载所有与 TEX 相关的默认变量，并且不添加任何对其他 Ports 的依赖。

变量用于指定需要哪些 TEX 模块。

`USE_TEX` 运行时所需的 TEX 扩展列表。在扩展名后添加 `:build` 来添加构建时依赖，`:run` 添加运行时依赖，`:test` 添加测试时依赖，`:extract` 添加提取时依赖。例如：`base texmf:build source:run`

当前可能的参数如下：

* `base`
* `texmf`
* `source`
* `docs`
* `web2c`
* `kpathsea`
* `ptexenc`
* `basic`
* `tlmgr`
* `texlua`
* `texluajit`
* `synctex`
* `xpdfopen`
* `dvipsk`
* `dvipdfmx`
* `xdvik`
* `gbklatex`
* `formats`
* `tex`
* `latex`
* `pdftex`
* `jadetex`
* `luatex`
* `ptex`
* `xetex`
* `xmltex`
* `texhash`
* `updmap`
* `fmtutil`

## 17.124. `tk`

与 `tcl` 的参数相同

当同时使用 Tcl 和 Tk 时的小包装器。返回的变量与使用 Tcl 时相同。

## 17.125. `trigger`

可能的参数：（无）

提供对需要由 [pkg(8)](https://man.freebsd.org/cgi/man.cgi?query=pkg\&sektion=8\&format=html) 执行触发器的 Ports 的支持。如果条件满足，触发器将在事务结束时执行。

可以通过 Ports 设置以下变量：

`TRIGGERS` 打包的触发器列表。默认为 `${PORTNAME}`。

触发器以 UCL 格式指定，通常放置在 Port 的 **files/** 目录中。

## 17.126. `uidfix`

可能的参数：（无）

更改构建系统的一些默认行为（主要是变量），以允许以普通用户身份安装该 Port。在使用 [`USES=fakeroot`](https://docs.freebsd.org/en/books/porters-handbook/uses/#uses-fakeroot) 或补丁之前，请先尝试此方法。

## 17.127. `uniquefiles`

可能的参数：（无），`dirs`

通过添加前缀或后缀使文件或目录“唯一”。如果使用 `dirs` 参数，Port 需要一个基于 `UNIQUE_PREFIX` 的前缀（且仅需前缀），适用于标准目录 `DOCSDIR`、`EXAMPLESDIR`、`DATADIR`、`WWWDIR`、`ETCDIR`。以下变量可供 Port 使用：

* `UNIQUE_PREFIX`：用于目录和文件的前缀。默认值：`${PKGNAMEPREFIX}`。
* `UNIQUE_PREFIX_FILES`：需要添加前缀的文件列表。默认值：空。
* `UNIQUE_SUFFIX`：用于文件的后缀。默认值：`${PKGNAMESUFFIX}`。
* `UNIQUE_SUFFIX_FILES`：需要添加后缀的文件列表。默认值：空。

## 17.128. `vala`

可能的参数：`build`，`lib`，`no_depend`

添加对 [lang/vala](https://cgit.freebsd.org/ports/tree/lang/vala/) 的构建或库依赖。`no_depend` 参数保留给 [lang/vala](https://cgit.freebsd.org/ports/tree/lang/vala/) 本身。

## 17.129. `varnish`

可能的参数：`4`（默认），`6`，`7`

处理 Varnish Cache 的依赖关系。添加对 [www/varnish\*](https://cgit.freebsd.org/ports/tree/www/varnish*/) 的依赖。

## 17.130. `waf`

可能的参数：（无）

为使用 `waf` 构建系统的 Ports 提供支持。

它意味着 `USES=python:build`。

以下变量会被导出以供 Port 使用：

`WAF_CMD`：`waf` 脚本的位置。如果 `waf` 脚本不在 **WRKSRC/waf** 中，请设置此项。

`CONFIGURE_TARGET`：`Configure` 目标。默认值：`configure`。

`ALL_TARGET`：`All` 目标。默认值：`build`。

`INSTALL_TARGET`：`Install` 目标。默认值：`install`。

## 17.131. `webplugin`

可能的参数：（无），`ARGS`

自动为支持 webplugin 框架的每个应用程序创建和删除符号链接。`ARGS` 可以是以下之一：

* `gecko`：支持基于 Gecko 的插件
* `native`：支持 Gecko、Opera 和 WebKit-GTK 插件
* `linux`：支持 Linux 插件
* `all`（默认，隐式）：支持所有插件类型
* （单独的条目）：仅支持列出的浏览器

以下变量可以调整：

* `WEBPLUGIN_FILES`：没有默认值，必须手动设置。要安装的插件文件。
* `WEBPLUGIN_DIR`：安装插件文件的目录，默认值 **PREFIX/lib/browser\_plugins/WEBPLUGIN\_NAME**。如果 Port 安装插件文件到默认目录以外的地方，请设置此项，以避免损坏的符号链接。
* `WEBPLUGIN_NAME`：安装插件文件的最终目录，默认值 `PKGBASE`。

## 17.132. `xfce`

可能的参数：（无），`gtk2`

为 Xfce 相关 Ports 提供支持。有关详细信息，请参阅 [使用 Xfce](https://docs.freebsd.org/en/books/porters-handbook/special/#using-xfce)。

`gtk2` 参数指定该 Port 需要 GTK2 支持。它添加了一些核心组件提供的额外功能，例如 [x11/libxfce4menu](https://cgit.freebsd.org/ports/tree/x11/libxfce4menu/) 和 [x11-wm/xfce4-panel](https://cgit.freebsd.org/ports/tree/x11-wm/xfce4-panel/)。

## 17.133. `xorg`

可能的参数：（无）

提供一种简便的方法来依赖 X.org 组件。这些组件应列在 `USE_XORG` 中。可用的组件有：

**表 1. 可用的 X.Org 组件**

| 名称            | 描述                  |
| ------------- | ------------------- |
| `dmx`         | DMX 扩展库             |
| `fontenc`     | 字体编码库               |
| `fontutil`    | 在目录中创建 X 字体文件的索引    |
| `ice`         | X11 的客户端交换库         |
| `libfs`       | FS 库                |
| `pciaccess`   | 通用 PCI 访问库          |
| `pixman`      | 低级像素操作库             |
| `sm`          | X11 会话管理库           |
| `x11`         | X11 库               |
| `xau`         | X11 身份验证协议库         |
| `xaw`         | X Athena 小部件库       |
| `xaw6`        | X Athena 小部件库       |
| `xaw7`        | X Athena 小部件库       |
| `xbitmaps`    | X.Org 位图数据          |
| `xcb`         | X 协议 C 语言绑定 (XCB) 库 |
| `xcomposite`  | X 复合扩展库             |
| `xcursor`     | X 客户端光标加载库          |
| `xdamage`     | X 损坏扩展库             |
| `xdmcp`       | X 显示管理器控制协议库        |
| `xext`        | X11 扩展库             |
| `xfixes`      | X 修复扩展库             |
| `xfont`       | X 字体库               |
| `xfont2`      | X 字体库               |
| `xft`         | 客户端字体 API，用于 X 应用程序 |
| `xi`          | X 输入扩展库             |
| `xinerama`    | X11 Xinerama 库      |
| `xkbfile`     | XKB 文件库             |
| `xmu`         | X 杂项实用程序库           |
| `xmuu`        | X 杂项实用程序库           |
| `xorg-macros` | X.Org 开发 aclocal 宏  |
| `xorg-server` | X.Org X 服务器及相关程序    |
| `xorgproto`   | Xorg 协议头文件          |
| `xpm`         | X Pixmap 库          |
| `xpresent`    | X Present 扩展库       |
| `xrandr`      | X 调整大小和旋转扩展库        |
| `xrender`     | X 渲染扩展库             |
| `xres`        | X 资源使用库             |
| `xscrnsaver`  | XScrnSaver 库        |
| `xshmfence`   | 共享内存“SyncFence”同步原语 |
| `xt`          | X 工具包库              |
| `xtrans`      | X 的抽象网络代码           |
| `xtst`        | X 测试扩展              |
| `xv`          | X 视频扩展库             |
| `xvmc`        | X 视频扩展运动补偿库         |
| `xxf86dga`    | X DGA 扩展            |
| `xxf86vm`     | X Vidmode 扩展        |

## 17.134. `xorg-cat`

可能的参数：`app`，`data`，`doc`，`driver`，`font`，`lib`，`proto`，`util`，`xserver` 和（无）或单独的 `autotools`（默认），`meson`

提供对构建 Xorg 组件的支持。它会设置所需的常见依赖项和适当的配置环境。此选项仅适用于 Xorg 组件。

类别必须与上游类别匹配。

第二个参数是要使用的构建系统。默认是 autotools，但也支持 meson。

## 17.135. `zig`

可能的参数：（无）

为构建基于 [lang/zig](https://cgit.freebsd.org/ports/tree/lang/zig/) 的 Port 提供支持。

该框架向 Port 公开以下变量：

`ZIG_TUPLE`：构建 Port 所需的 zig 依赖列表。每个条目是一个三元组，包含名称、URL 和预期找到依赖项的目录。这些三元组可以通过运行以下命令生成：

```sh
% make make-zig-tuple
```

## 17.136. `zip`

可能的参数：（无），`infozip`

指示分发文件使用 ZIP 压缩算法。对于使用 InfoZip 算法的文件，必须传递 `infozip` 参数以设置适当的依赖关系。


# 第 18 章 \_\_FreeBSD\_version 的值

这里是 **sys/param.h** 中定义的 `__FreeBSD_version` 值的便利列表：

## 18.1. FreeBSD 16 版本

**表 1. FreeBSD 16 \_\_FreeBSD\_version 值**

| 值       | 修订版本                                                                                                                                                                                              | 日期               | 发布                                                                                                                             |
| ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| 1600000 | [8b4e4c273730](https://cgit.freebsd.org/src/commit/?id=8b4e4c2737305df8807abc6cd054a32586085c93)                                                                                                  | 2025 年 9 月 4 日   | 16.0-CURRENT.                                                                                                                  |
| 1600001 | [52ce810302f7](https://cgit.freebsd.org/src/commit/?id=52ce810302f70cc7b995651eb1b19adfa014b351)                                                                                                  | 2025 年 9 月 29 日  | 在 LinuxKPI PCI 更改后的 16.0-CURRENT。                                                                                              |
| 1600002 | [37ad1beaf516](https://cgit.freebsd.org/src/commit/?id=37ad1beaf516854d5e59b90a9706b09d02cc2a81)                                                                                                  | 2025 年 10 月 20 日 | 在 LinuxKPI 嵌入式结构大小更改后的 16.0-CURRENT。                                                                                           |
| 1600003 | [7eb213614b90](https://cgit.freebsd.org/src/commit/?id=7eb213614b90cde31707a53c4b8ae6acacf2aa0f)                                                                                                  | 2025 年 10 月 30 日 | 在将 `bus_alloc_resource` API 更改为按值接受 `rid` 参数后的 16.0-CURRENT。                                                                   |
| 1600004 | [b3de3c2dea57](https://cgit.freebsd.org/src/commit/?id=b3de3c2dea576b626a8a107d96b0fd6562500c1e)                                                                                                  | 2025 年 11 月 2 日  | 在为 NFS 添加 `_PC_CASE_INSENSITIVE` 支持后的 16.0-CURRENT。                                                                            |
| 1600005 | [575639548cef](https://cgit.freebsd.org/src/commit/?id=575639548cef58590a1d70c29e47aae0e8d44153) [66e85755595a](https://cgit.freebsd.org/src/commit/?id=66e85755595a451db490d2fe24267d85db4b09c2) | 2025 年 12 月 9 日  | 在将 `BUS_ALLOC_RESOURCE` 总线驱动方法更改为按值传递 `rid` 参数以及 ZFS 移除 libuutil 后的 16.0-CURRENT。                                              |
| 1600006 | [c10447a9256b](https://cgit.freebsd.org/src/commit/?id=c10447a9256b561bf2edf26b5abf5f28071a15c7)                                                                                                  | 2025 年 12 月 15 日 | 在向 bpf(4) 添加 `BIOCGETIFLIST` ioctl 后的 16.0-CURRENT。                                                                            |
| 1600007 | [1a26b161d829](https://cgit.freebsd.org/src/commit/?id=1a26b161d829c9b52fec87fe44b4db50e8f046ff)                                                                                                  | 2025 年 12 月 18 日 | 在向 Linuxolator 添加 vmap\_pfn() 后的 16.0-CURRENT。                                                                                 |
| 1600008 | [66eedcb0224d](https://cgit.freebsd.org/src/commit/?id=66eedcb0224df03e56513f3caf1df93a52b6a919)                                                                                                  | 2026 年 1 月 13 日  | 在 struct sdt\_probe ABI 被破坏以修复探测 ID 类型后的 16.0-CURRENT。                                                                         |
| 1600009 | [22569a1d8020](https://cgit.freebsd.org/src/commit/?id=22569a1d80203bd4835a1d5d4660de5dbe334509)                                                                                                  | 2026 年 1 月 16 日  | 在更改 mac(9) 策略接口以包含针对 jail 操作的入口点后的 16.0-CURRENT。                                                                               |
| 1600010 | [ac5a19ec6989](https://cgit.freebsd.org/src/commit/?id=ac5a19ec6989675c8ec6c3ca245dba243d1a6416)                                                                                                  | 2026 年 1 月 23 日  | 在使 xdrproc\_t 始终接受两个参数后的 16.0-CURRENT。                                                                                         |
| 1600011 | [d185e9fae91a](https://cgit.freebsd.org/src/commit/?id=d185e9fae91a48041363e36a6ee4a2a9c567fc16)                                                                                                  | 2026 年 1 月 25 日  | 在更改 eventfd API 以在 linuxkpi 中为 DRM 驱动程序暴露该 API 后的 16.0-CURRENT。                                                                |
| （未更改）   | [576ee62dd2e5](https://cgit.freebsd.org/src/commit/?id=576ee62dd2e5e0454a5316eb9207f4ebaa543171)                                                                                                  | 2026 年 1 月 25 日  | 在直接在 struct in6\_ifextra 中更改 IPv6 邻居发现上下文存储后的 16.0-CURRENT。这是一个 KPI 更改，可能影响网络相关外部内核模块的构建。                                      |
| 1600012 | [99e138f20a9b](https://cgit.freebsd.org/src/commit/?id=99e138f20a9bad8276e9ebbb1e155daadf201272)                                                                                                  | 2026 年 2 月 13 日  | 在向 MAC 框架添加 `prison_cleanup` 入口点后的 16.0-CURRENT。                                                                               |
| 1600013 | [72472e52e310](https://cgit.freebsd.org/src/commit/?id=72472e52e310ec348949a3a67d3fa17e33fb8e50)                                                                                                  | 2026 年 3 月 12 日  | 在从 carp(4) 停用 ioctl(2) API 后的 16.0-CURRENT。                                                                                    |
| 1600014 | [6275cd73aca7](https://cgit.freebsd.org/src/commit/?id=6275cd73aca7f31cbb3b9da2d031f6664814d58c)                                                                                                  | 2026 年 3 月 21 日  | 在 amd64 上 `struct trapframe` 大小发生更改后的 16.0-CURRENT。                                                                            |
| 1600015 | [36fe65cc7a31](https://cgit.freebsd.org/src/commit/?id=36fe65cc7a31962e80a45d8b0fa6a401653a3deb)                                                                                                  | 2026 年 4 月 6 日   | 在提交 Linux 6.11 的 DRM 驱动程序所需的所有 linuxkpi 更改后的 16.0-CURRENT。                                                                     |
| 1600016 | [68d2339bc6af](https://cgit.freebsd.org/src/commit/?id=68d2339bc6afadba0107208430af03731a2e3f4a)                                                                                                  | 2026 年 4 月 23 日  | 在更改各种内核 API 以使用指针后的 16.0-CURRENT。                                                                                              |
| 1600017 | [8f95b8b19088](https://cgit.freebsd.org/src/commit/?id=8f95b8b19088bd8d73f6d14dab7afe848dfc0c35)                                                                                                  | 2026 年 4 月 25 日  | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-21.1.8-0-g2078da43e25a（即 21.1.8 发布版本）后的 16.0-CURRENT。 |
| 1600018 | [1569e2334ab5](https://cgit.freebsd.org/src/commit/?id=1569e2334ab5b2ee1e2b7893cb05c17a27d3eca8)                                                                                                  | 2026 年 4 月 30 日  | 在更改 linuxkpi 以支持 Linux 6.12.84 的 DRM 驱动程序后的 16.0-CURRENT。                                                                      |

## 18.2. FreeBSD 15 版本

**表 2. FreeBSD 15 \_\_FreeBSD\_version 值**

| 值       | 修订版本                                                                                             | 日期               | 发布                                                                                                                                    |
| ------- | ------------------------------------------------------------------------------------------------ | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| 1500000 | [29a16ce065db](https://cgit.freebsd.org/src/commit/?id=29a16ce065dbc28bc9e87c9bfadb08bb58b137e4) | 2023 年 8 月 24 日  | 15.0-CURRENT.                                                                                                                         |
| 1500001 | [a6662c37b6ff](https://cgit.freebsd.org/src/commit/?id=a6662c37b6ffee46e18be5f7570149edc64c1d0b) | 2023 年 9 月 17 日  | 在为 powerpc 实现 fpu\_kern\_enter 和 fpu\_kern\_leave 之后的 15.0-CURRENT。                                                                   |
| 1500002 | [17f5e2b904af](https://cgit.freebsd.org/src/commit/?id=17f5e2b904aff8e4863199a137ee21ef0939bcf4) | 2023 年 10 月 18 日 | 在更改 nfscommon 和 nfscl 模块之间的内部 KAPI 后的 15.0-CURRENT。                                                                                   |
| 1500003 | [ef85fd507e6e](https://cgit.freebsd.org/src/commit/?id=ef85fd507e6e1784a726bccd485129e00bb63311) | 2023 年 11 月 1 日  | 在去除 inode64 转换的向前兼容代码后的 15.0-CURRENT。                                                                                                 |
| 1500004 | [7fabea328fed](https://cgit.freebsd.org/src/commit/?id=7fabea328fed60d5207b262d2372e85a7f731eef) | 2023 年 11 月 23 日 | 在添加名为 `vfs_exjail_clone()` 且将被 ZFS 模块使用的新 VFS 函数后的 15.0-CURRENT。                                                                      |
| 1500005 | [21fce617d1de](https://cgit.freebsd.org/src/commit/?id=21fce617d1de231a30833cdd9819ef61277b08d8) | 2023 年 11 月 27 日 | 在对树进行一系列机械更改后的 15.0-CURRENT：删除了 SCCS 标识，删除了 #if 0 的版权字符串，在此变动后进行了机械样式修复，并从 **sys/cdefs.h** 中删除了一些宏。                                   |
| 1500006 | [c711af772782](https://cgit.freebsd.org/src/commit/?id=c711af7727824da79d87f375f3d6829feec3799a) | 2023 年 12 月 8 日  | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-17.0.6-0-g6009708b4367（即 17.0.6 发布版本）后的 15.0-CURRENT。        |
| 1500007 | [8ccd0b876e67](https://cgit.freebsd.org/src/commit/?id=8ccd0b876e67fda6249f294ff484798cc1e1569f) | 2023 年 12 月 11 日 | 在 libc 中为 Linux 兼容性暴露 execvpe 后的 15.0-CURRENT。                                                                                        |
| 1500008 | [9bf957fc9b37](https://cgit.freebsd.org/src/commit/?id=9bf957fc9b378e0f9e65eb97e84c2166b450fccc) | 2023 年 12 月 24 日 | LinuxKPI 更改后的 15.0-CURRENT。                                                                                                           |
| 1500009 | [b068bb09a1a8](https://cgit.freebsd.org/src/commit/?id=b068bb09a1a82d9fef0e939ad6135443a959e290) | 2024 年 1 月 11 日  | 添加 vnode\_pager\_clean\_async(9)和 vnode\_pager\_clean\_sync(9)后的 15.0-CURRENT。                                                        |
| 1500010 | [a2da1bdb61bc](https://cgit.freebsd.org/src/commit/?id=a2da1bdb61bc2d9db0b4268f53281e7c0bbce0bc) | 2024 年 1 月 12 日  | 在 nfscommon 和 nfscl 模块之间更改内部 KAPI 后的 15.0-CURRENT。                                                                                    |
| 1500011 | [a2da1bdb61bc](https://cgit.freebsd.org/src/commit/?id=a2da1bdb61bc2d9db0b4268f53281e7c0bbce0bc) | 2024 年 1 月 17 日  | 为 jail(8) 添加 zfs.dataset 支持后的 15.0-CURRENT。                                                                                           |
| 1500012 | [120ceebab5d4](https://cgit.freebsd.org/src/commit/?id=120ceebab5d4947dfc80d7492effa034a925d43e) | 2024 年 1 月 24 日  | 在添加 kern\_openatfp(9)和 kcmp(2)之后的 15.0-CURRENT。                                                                                       |
| 1500013 | [d04abb05375d](https://cgit.freebsd.org/src/commit/?id=d04abb05375d3525132f1e9f78090db3d0d27f14) | 2024 年 2 月 7 日   | 添加 libsys 后的 15.0-CURRENT。                                                                                                            |
| 1500014 | [ed27ae8df4b1](https://cgit.freebsd.org/src/commit/?id=ed27ae8df4b10f67289a32458d89d143e758f6d4) | 2024 年 2 月 11 日  | 将 clang 和其他 LLVM 可执行文件切换为构建为 PIE 后的 15.0-CURRENT。                                                                                     |
| 1500015 | [a7b9f4d96e8b](https://cgit.freebsd.org/src/commit/?id=a7b9f4d96e8bdc30db27ec7a193a8d8fdf7c652c) | 2024 年 3 月 13 日  | 从新总线资源 API 中的多个函数中删除冗余 type 和 rid 参数后的 15.0-CURRENT。                                                                                  |
| 1500016 | [60bc9617e79e](https://cgit.freebsd.org/src/commit/?id=60bc9617e79e99bdf670304923f3baed4b749ad3) | 2024 年 3 月 18 日  | 引入 livedump\_start\_vnode(9) 后的 15.0-CURRENT。                                                                                         |
| 1500017 | [bcd401b5a39c](https://cgit.freebsd.org/src/commit/?id=bcd401b5a39c6186bb1fe450286299f2a481244c) | 2024 年 3 月 20 日  | 在修复构建最近的 boost 库时的 clang 断言或崩溃后的 15.0-CURRENT。                                                                                        |
| 1500018 | [0192eda105b3](https://cgit.freebsd.org/src/commit/?id=0192eda105b367d4670205547e8e830e3716bea3) | 2024 年 4 月 6 日   | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-18.1.3-0-gc13b7485b879（即 18.1.3 发布版本）后的 15.0-CURRENT。        |
| 1500019 | [e03e8b077433](https://cgit.freebsd.org/src/commit/?id=e03e8b07743385e5b199409074fb60b1a9ed1fac) | 2024 年 5 月 31 日  | 在将 `CLOCK_BOOTTIME` 重新定义为 `CLOCK_MONOTONIC` 而不是 `CLOCK_UPTIME` 后的 15.0-CURRENT。                                                       |
| 1500020 | [7818c2d37c2c](https://cgit.freebsd.org/src/commit/?id=7818c2d37c2c600fc9ad6f2a0951e50dd21b17c8) | 2024 年 7 月 12 日  | 移除对构建 armv6 的支持后的 15.0-CURRENT。                                                                                                       |
| 1500021 | [24388fccd551](https://cgit.freebsd.org/src/commit/?id=24388fccd551f79f64e54099a7d78196535c0a29) | 2024 年 7 月 21 日  | 在 LinuxKPI 更改后的 15.0-CURRENT。                                                                                                         |
| 1500022 | [a1740cb93639](https://cgit.freebsd.org/src/commit/?id=a1740cb93639648b41055958ad8c7f6083efdc96) | 2024 年 7 月 29 日  | 移除内核堆栈交换支持后的 15.0-CURRENT。                                                                                                            |
| 1500023 | [1206cf04a717](https://cgit.freebsd.org/src/commit/?id=1206cf04a717a55bc15255ed043b066941cb43f2) | 2024 年 7 月 30 日  | 向 [malloc(9)](https://man.freebsd.org/cgi/man.cgi?query=malloc\&sektion=9\&format=html) 添加新标志后的 15.0-CURRENT。                         |
| 1500024 | [e3953c036f9d](https://cgit.freebsd.org/src/commit/?id=e3953c036f9d66c85b8e19f99f0710b3288ce5fb) | 2024 年 10 月 2 日  | 将 **libmd.so.6** 升级为 **libmd.so.7** 后的 15.0-CURRENT。                                                                                  |
| 1500025 | [9d52823bf1df](https://cgit.freebsd.org/src/commit/?id=9d52823bf1dfac237e58b5208299aaa5e2df42e9) | 2024 年 10 月 6 日  | 在扩展 `vm_object` 中的 `flags` 字段后的 15.0-CURRENT。                                                                                         |
| 1500026 | [f3dbef108212](https://cgit.freebsd.org/src/commit/?id=f3dbef108212460489ae68b4c47e20b73984f433) | 2024 年 10 月 23 日 | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-19.1.2-0-g7ba7d8e2f7b6（即 19.1.2 发布版本）后的 15.0-CURRENT。        |
| 1500027 | [893d044346d5](https://cgit.freebsd.org/src/commit/?id=893d044346d5ae5fe10cc188b8b0762efd2a5b27) | 2024 年 11 月 14 日 | 在隐藏 `struct ifnet` 并更改 [sound(4)](https://man.freebsd.org/cgi/man.cgi?query=sound\&sektion=4\&format=html) 的设备注册 KPI 后的 15.0-CURRENT。 |
| 1500028 | [cab31f5633c1](https://cgit.freebsd.org/src/commit/?id=cab31f5633c1ffdd8b24749a3c9dd22c59568503) | 2024 年 11 月 25 日 | 添加 `TDA_PSELECT` 标志以实现信号掩码的提前恢复后的 15.0-CURRENT。                                                                                       |
| 1500029 | [46297859a745](https://cgit.freebsd.org/src/commit/?id=46297859a74563dde6fc5bff9f9ecded9fb61ba6) | 2024 年 12 月 6 日  | 在添加 `bus_attach_children`、`bus_detach_children` 和 `bus_identify_children` 后的 15.0-CURRENT。                                            |
| 1500030 | [b196276c20b5](https://cgit.freebsd.org/src/commit/?id=b196276c20b577b364372f1aa1a646b9ce34bf5c) | 2025 年 1 月 2 日   | 更改 `bus_generic_detach` 以在分离子设备后删除它们后的 15.0-CURRENT。                                                                                  |
| 1500031 | [0009c4e737b1](https://cgit.freebsd.org/src/commit/?id=0009c4e737b17f69f1b3f856e87a392073aeb48e) | 2025 年 2 月 1 日   | 在将内核 RPC 服务切换为使用 netlink 后的 15.0-CURRENT。                                                                                             |
| 1500032 | [464372940b36](https://cgit.freebsd.org/src/commit/?id=464372940b365b6109866440f5ce96f41b084f86) | 2025 年 2 月 14 日  | 在 nfscommon 和 nfscl 模块之间的内部 API 更改后的 15.0-CURRENT。                                                                                    |
| 1500033 | [05dfaadde4ae](https://cgit.freebsd.org/src/commit/?id=05dfaadde4ae0f5d823836d5d849e3ba5ebdbf17) | 2025 年 2 月 19 日  | 在向 LinuxKPI 添加 `shrinker_alloc` 和 `shrinker_free` 后的 15.0-CURRENT。                                                                    |
| 1500034 | [6ba1c5abb957](https://cgit.freebsd.org/src/commit/?id=6ba1c5abb9575aaf4ef0a7efb085d42be252e645) | 2025 年 3 月 3 日   | 在更改 ipfw(4) 和 ipfw(8) 之间的 ABI 后的 15.0-CURRENT。                                                                                        |
| 1500035 | [d5c804138845](https://cgit.freebsd.org/src/commit/?id=d5c804138845a1c8d81fbbce48de676806de32e6) | 2025 年 3 月 26 日  | 在向 Heimdal 库符号映射添加缺失符号后的 15.0-CURRENT。                                                                                                |
| 1500036 | [85967694b459](https://cgit.freebsd.org/src/commit/?id=85967694b4590a436c56a061b397620e342784ae) | 2025 年 4 月 9 日   | 在更改网桥与 `struct ifnet` 之间的链接后的 15.0-CURRENT。                                                                                           |
| 1500037 | [7acd5af48cf1](https://cgit.freebsd.org/src/commit/?id=7acd5af48cf1870ec48d5910dff1a26466d98074) | 2025 年 4 月 12 日  | 对 LinuxKPI 进行分配更改后的 15.0-CURRENT。                                                                                                     |
| 1500038 | [b7527823fdcc](https://cgit.freebsd.org/src/commit/?id=b7527823fdcc29f0da9c17152dbb062eeb18244d) | 2025 年 4 月 19 日  | 移除 `vm_page_next()` 和 `_prev` 后的 15.0-CURRENT。                                                                                        |
| 1500039 | [d609c5733b00](https://cgit.freebsd.org/src/commit/?id=d609c5733b00151c1236618d8be472790f765947) | 2025 年 5 月 4 日   | 引入正确类型的 jiffies 后的 15.0-CURRENT。                                                                                                      |
| 1500040 | [22d4fecbcf57](https://cgit.freebsd.org/src/commit/?id=22d4fecbcf576fb799686972e3de7fc78938fe6a) | 2025 年 5 月 4 日   | 在 nfscommon 和 nfscl 模块之间的内部 API 更改后的 15.0-CURRENT。                                                                                    |
| 1500041 | [794e792121ba](https://cgit.freebsd.org/src/commit/?id=794e792121bab69243836f34d89c05346b859811) | 2025 年 5 月 6 日   | 在从 `struct vm_object` 中移除 `memq` 字段后的 15.0-CURRENT。                                                                                   |
| 1500042 | [2fa185f9bf59](https://cgit.freebsd.org/src/commit/?id=2fa185f9bf5948ead9c3920d452ddd6bcad8f569) | 2025 年 5 月 9 日   | 在弃用 OCF 中的 `CRYPTO_F_DONE` 标志后的 15.0-CURRENT。                                                                                         |
| 1500043 | [a1215090416b](https://cgit.freebsd.org/src/commit/?id=a1215090416b8afb346fb2ff5b38f25ba0134a3a) | 2025 年 5 月 15 日  | 在 `link_addr` 中添加更严格的地址格式检查后的 15.0-CURRENT。                                                                                           |
| 1500044 | [0ec732913fce](https://cgit.freebsd.org/src/commit/?id=0ec732913fceb9aae2d56c2dd667203711b76550) | 2025 年 5 月 28 日  | 在 amd64 上添加 `PCB_TLSBASE` 后的 15.0-CURRENT。                                                                                            |
| 1500045 | [a02180cf60a6](https://cgit.freebsd.org/src/commit/?id=a02180cf60a6a0102669b678e9c81ad9f1aa4d91) | 2025 年 6 月 3 日   | 在将 drm-kmod 中的 dma-mapping.h 更改引入 LinuxKPI 后的 15.0-CURRENT。                                                                           |
| 1500046 | [1fee99800a79](https://cgit.freebsd.org/src/commit/?id=1fee99800a79887b9037749a34d09f2acab082c0) | 2025 年 6 月 8 日   | 在从 `struct vm_page` 中移除 `listq` 字段后的 15.0-CURRENT。                                                                                    |
| 1500047 | [29d0bcfd07e3](https://cgit.freebsd.org/src/commit/?id=29d0bcfd07e366bb5cf55b63419c3976f0a80bd6) | 2025 年 6 月 15 日  | 在导入 MIT Kerberos 后的 15.0-CURRENT。                                                                                                     |
| 1500048 | [e3a4b989d7f7](https://cgit.freebsd.org/src/commit/?id=e3a4b989d7f7d82f7ab8cefe0d665dbe6b74d316) | 2025 年 6 月 17 日  | 在切换到 256 个独立运行队列后的 15.0-CURRENT。                                                                                                      |
| 1500049 | [d8c5c513e1cb](https://cgit.freebsd.org/src/commit/?id=d8c5c513e1cbca329a75fa6ea5f5064c3a1d78b2) | 2025 年 6 月 30 日  | 在 nfscommon 和 nfscl 模块之间的内部 API 更改后的 15.0-CURRENT。                                                                                    |
| 1500050 | [842da154a0ce](https://cgit.freebsd.org/src/commit/?id=842da154a0ce8f866d65f495537a13ffa8fb9cc0) | 2025 年 7 月 4 日   | 在 LinuxKPI 更改后的 15.0-CURRENT。                                                                                                         |
| 1500051 | [65ed1a035ceb](https://cgit.freebsd.org/src/commit/?id=65ed1a035ceb8f7c323c0bc0c7344a7fa7cadc9f) | 2025 年 7 月 5 日   | 在添加对网桥成员配置 vlan 过滤的支持后的 15.0-CURRENT。                                                                                                 |
| 1500052 | [ff2dc0bca372](https://cgit.freebsd.org/src/commit/?id=ff2dc0bca3728448284d757ca983d023da7279b5) | 2025 年 7 月 16 日  | 在添加 kva\_layout 并移除 DMAP\_MIN/MAX\_ADDRESS 后的 15.0-CURRENT。                                                                           |
| 1500053 | [04055decc91c](https://cgit.freebsd.org/src/commit/?id=04055decc91c5911498bfcb924d26f37803ecb3a) | 2025 年 7 月 19 日  | 在 nfscommon 和 nfscl 模块之间的内部 API 更改后的 15.0-CURRENT。                                                                                    |
| 1500054 | [c7da9fb90b0b](https://cgit.freebsd.org/src/commit/?id=c7da9fb90b0b6385e99bb7747476359b712993fa) | 2025 年 7 月 21 日  | 在从 Heimdal 切换到 MIT Kerberos 后的 15.0-CURRENT。                                                                                          |
| 1500055 | [dd0ec030f8fd](https://cgit.freebsd.org/src/commit/?id=dd0ec030f8fddfd109b860ae8df2b29fa0c60f23) | 2025 年 7 月 27 日  | 在向 Kerberos 库添加符号版本控制后的 15.0-CURRENT。                                                                                                 |
| 1500056 | [4befc6711ab2](https://cgit.freebsd.org/src/commit/?id=4befc6711ab25912c3378afe5a2989945acf803f) | 2025 年 7 月 30 日  | 在 `struct ucred` 中将 `cr_gid` 从 `cr_groups` 中移出后的 15.0-CURRENT。                                                                        |
| 1500057 | [b3340428f394](https://cgit.freebsd.org/src/commit/?id=b3340428f394d08b9776899c7f6dc16ed5fd590c) | 2025 年 8 月 7 日   | 在向 libutil 添加符号版本控制后的 15.0-CURRENT。                                                                                                   |
| 1500058 | [4c6c27d3fb4a](https://cgit.freebsd.org/src/commit/?id=4c6c27d3fb4ad15931aae2eaf8e624aed99a3fd9) | 2025 年 8 月 8 日   | 在 arm64 上添加 TBI 支持后的 15.0-CURRENT。                                                                                                    |
| 1500059 | [db7c0e32a05d](https://cgit.freebsd.org/src/commit/?id=db7c0e32a05dd7011553321e82ac66dd712eaf09) | 2025 年 8 月 9 日   | 在导入 OpenSSL 3.5.1 后的 15.0-CURRENT。                                                                                                    |
| 1500060 | [f13e8ea08310](https://cgit.freebsd.org/src/commit/?id=f13e8ea08310fe8a0d8bc7817ae428939f8e5144) | 2025 年 8 月 13 日  | 在添加 `gpiobus_add_bus` 并移除 `gpiobus_attach_bus` 后的 15.0-CURRENT。                                                                       |
| 1500061 | [dd22a6853d92](https://cgit.freebsd.org/src/commit/?id=dd22a6853d92e4b94431988cb1d7a5fa498d24ab) | 2025 年 8 月 16 日  | 在更改 `getgroups` 和 `setgroups` 以仅处理补充组后的 15.0-CURRENT。                                                                                 |
| 1500062 | [567e6250c003](https://cgit.freebsd.org/src/commit/?id=567e6250c003eeb251b4bc8dbe60d2adabab2988) | 2025 年 8 月 17 日  | 在引入 VTYPE\_ISDEV()、VN\_ISDEV() 和 VATTR\_ISDEV() 后的 15.0-CURRENT。                                                                      |
| 1500063 | [c340ef28fd38](https://cgit.freebsd.org/src/commit/?id=c340ef28fd384b567e35882d04ce17fa31b7384f) | 2025 年 8 月 18 日  | 在 certctl 重写（现在会生成一个包）后的 15.0-CURRENT。                                                                                                |
| 1500064 | [6e7cc49f94cf](https://cgit.freebsd.org/src/commit/?id=6e7cc49f94cf9760125ab1699b6eb9b8311394a5) | 2025 年 9 月 4 日   | 在分支 stable/15 后的 15.0-STABLE。                                                                                                         |
| 1500065 | [a38672e64a1c](https://cgit.freebsd.org/src/commit/?id=a38672e64a1ce9a156d1888ffc505252da3e4cf1) | 2025 年 9 月 30 日  | 在 LinuxKPI PCI 更改后的 15.0-STABLE。                                                                                                      |
| 1500066 | [5a31c623143f](https://cgit.freebsd.org/src/commit/?id=5a31c623143f4a20e5b5fb337ec97ac0b39635fc) | 2025 年 10 月 2 日  | 在导入 `virtual_oss` 后的 15.0-STABLE。                                                                                                     |
| 1500500 | [b15f726dfe60](https://cgit.freebsd.org/src/commit/?id=b15f726dfe60b436bb92876f8f0a1238641fee76) | 2025 年 10 月 9 日  | 在分支 releng/15.0 后的 15.0-STABLE。                                                                                                       |
| 1500501 | [a4ee95e54ad1](https://cgit.freebsd.org/src/commit/?id=a4ee95e54ad1e6a00be4dbaf9c3476915c212918) | 2025 年 10 月 23 日 | 在 LinuxKPI 更改后的 15.0-STABLE。                                                                                                          |
| 1500502 | [33d15245f9be](https://cgit.freebsd.org/src/commit/?id=33d15245f9be27336035c41fcf7c78ab50f3e6cc) | 2025 年 11 月 23 日 | 在 nfscommon 和 nfscl 模块之间的内部 API 更改后的 15.0-STABLE。                                                                                     |
| 1500503 | [398dd921c382](https://cgit.freebsd.org/src/commit/?id=398dd921c382760236acefe8f893912a2efd1696) | 2025 年 12 月 1 日  | 在向 `struct buf` 和 `struct bio` 添加 exterror(9) 跟踪后的 15.0-STABLE。                                                                       |
| 1500504 | [3fbce8315ee2](https://cgit.freebsd.org/src/commit/?id=3fbce8315ee22ef3a3e0fde3c57130e6ad16535f) | 2025 年 12 月 18 日 | 在更改 `bus_alloc_resource` API 以按值接受 `rid` 参数后的 15.0-STABLE。                                                                            |
| 1500505 | [198ef2a31cee](https://cgit.freebsd.org/src/commit/?id=198ef2a31cee7dd256434ad6120d279d9bcc211a) | 2025 年 12 月 24 日 | 在实现 vmap\_pfn 后的 15.0-STABLE。                                                                                                         |
| 1500506 | [f5828b88a979](https://cgit.freebsd.org/src/commit/?id=f5828b88a979fd9b48c2a6370bf2ee761d4ee52a) | 2026 年 1 月 31 日  | 在 libcrypto 依赖项更改后的 15.0-STABLE。                                                                                                      |
| 1500507 | [d1c800badec7](https://cgit.freebsd.org/src/commit/?id=d1c800badec7750194ba19a225d364377b74362b) | 2026 年 3 月 27 日  | 在 amd64 struct trapframe 大小更改后的 15.0-STABLE。                                                                                          |
| 1500508 | [d1c800badec7](https://cgit.freebsd.org/src/commit/?id=d1c800badec7750194ba19a225d364377b74362b) | 2026 年 4 月 22 日  | 在为 Linux 7.0 的 802.11 和 Linux 6.11 的 DRM 驱动程序更改 linuxkpi 后的 15.0-STABLE。                                                              |
| 1500509 | [c969df6ccef6](https://cgit.freebsd.org/src/commit/?id=c969df6ccef61ffc01d038eee383d0852e66da3d) | 2026 年 4 月 30 日  | 在更改 linuxkpi 以支持 Linux 6.12.84 的 DRM 驱动程序后的 15.0-STABLE。                                                                              |
| 1501500 | [4702f6ab1514](https://cgit.freebsd.org/src/commit/?id=4702f6ab1514335088a849f9f47a3e95e3724a2d) | 2026 年 5 月 1 日   | 在从 15.1-PRERELEASE 重命名为 15.1-STABLE 后的 15.1-STABLE。                                                                                   |
| 1501501 | [7fa638d6f7cf](https://cgit.freebsd.org/src/commit/?id=7fa638d6f7cf9ee471648a794756cb9d0aa289ba) | 2026 年 5 月 30 日  | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-21.1.8-0-g2078da43e25a（即 21.1.8 发布版本）后的 15.1-STABLE。         |

## 18.3. FreeBSD 14 版本

**表 3. FreeBSD 14 \_\_FreeBSD\_version 值**

| 值       | 修订版本                                                                                             | 日期               | 发布                                                                                                                                              |
| ------- | ------------------------------------------------------------------------------------------------ | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| 1400000 | [a53ce3fc4938](https://cgit.freebsd.org/src/commit/?id=a53ce3fc4938e37d5ec89304846203d2083c61a2) | 2021 年 1 月 22 日  | 14.0-CURRENT.                                                                                                                                   |
| 1400001 | [739ecbcf1c4f](https://cgit.freebsd.org/src/commit/?id=739ecbcf1c4fd22b5f6ee0bb180a67644046a3e0) | 2021 年 1 月 23 日  | 在添加符号链接支持后的 14.0-CURRENT 进行无锁查找。                                                                                                                |
| 1400002 | [2cf84258922f](https://cgit.freebsd.org/src/commit/?id=2cf84258922f306a3f84866685d2f5346f67db58) | 2021 年 1 月 26 日  | 在修复构建 devel/onetbb 时修复了一个 clang 断言的 14.0-CURRENT port。                                                                                          |
| 1400003 | [d386f3a3c32f](https://cgit.freebsd.org/src/commit/?id=d386f3a3c32f0396aa7995349dd65d6c59711393) | 2021 年 1 月 28 日  | 添加各种与 drm-kmod 冲突的 LinuxKPI 位后的 14.0-CURRENT。                                                                                                   |
| 1400004 | [68f6800ce05c](https://cgit.freebsd.org/src/commit/?id=68f6800ce05c386ff045b4416d8595d09c4d8fdd) | 2021 年 2 月 8 日   | 内核接口更改后的 14.0-CURRENT 用于派发加密操作。                                                                                                                 |
| 1400005 | [45eabf5754ac](https://cgit.freebsd.org/src/commit/?id=45eabf5754ac1d291bd677fdf29f59ce4bbc2c8f) | 2021 年 2 月 17 日  | 在更改 arm64 上的 ptrace(2)的 API PT\_GETDBREGS / PT\_SETDBREGS 后，14.0-CURRENT。                                                                       |
| 1400006 | [c96151d33509](https://cgit.freebsd.org/src/commit/?id=c96151d33509655efb7fb26768cb56a041c176f1) | 2021 年 3 月 17 日  | 添加 sndstat(4)枚举 ioctls 后的 14.0-CURRENT。                                                                                                         |
| 1400007 | [d36d68161517](https://cgit.freebsd.org/src/commit/?id=d36d6816151705907393889d661cbfd25c630ca8) | 2021 年 4 月 6 日   | 修复错误后的 14.0-CURRENT dlpi\_tls\_data                                                                                                             |
| 1400008 | [e152bbecb221](https://cgit.freebsd.org/src/commit/?id=e152bbecb221a592e7dbcabe3d1170a60f0d0dfe) | 2021 年 4 月 11 日  | 在 krpc 和 NFS 模块之间更改内部 KAPI 后的 14.0-CURRENT。                                                                                                     |
| 1400009 | [9ca874cf740e](https://cgit.freebsd.org/src/commit/?id=9ca874cf740ee68c5742df8b5f9e20910085c011) | 2021 年 4 月 20 日  | 在为 VLAN 和 VxLAN 添加 TCP LRO 支持之后的 14.0-CURRENT。                                                                                                  |
| 1400010 | [a3a02acde100](https://cgit.freebsd.org/src/commit/?id=a3a02acde1009f03dc78e979e051acee9f9247c2) | 2021 年 4 月 21 日  | 在更改 sndstat(4) ioctls nvlist 模式和定义后的 14.0-CURRENT。                                                                                              |
| 1400015 | [d72cd275187c](https://cgit.freebsd.org/src/commit/?id=d72cd275187c6399caf0ca4125292dc7e55fa478) | 2021 年 5 月 25 日  | 增加更多 LinuxKPI 更改后需要调整 drm-kmod 的 14.0-CURRENT。                                                                                                  |
| 1400016 | [21e3c1fbe246](https://cgit.freebsd.org/src/commit/?id=21e3c1fbe2460f144f6d4dfd61c3346b2de59667) | 2021 年 5 月 25 日  | 删除了对 KTLS 软件后端的支持后的 14.0-CURRENT。                                                                                                               |
| 1400017 | [beb817edfe22](https://cgit.freebsd.org/src/commit/?id=beb817edfe22cdea91e19a60c42caabd9404da48) | 2021 年 5 月 25 日  | 添加 crypto\_cursor\_segment() 后的 14.0-CURRENT。                                                                                                   |
| 1400018 | [a4b07a2701f5](https://cgit.freebsd.org/src/commit/?id=a4b07a2701f568c2c0f0c0426091f1489244a92d) | 2021 年 5 月 30 日  | 允许 VFS\_QUOTACTL(9)实现指示繁忙状态更改后的 14.0-CURRENT                                                                                                    |
| 1400019 | [37d64dcdfa51](https://cgit.freebsd.org/src/commit/?id=37d64dcdfa519157aff9711f1f226ad7bd778f46) | 2021 年 6 月 7 日   | 包括 pr\_err\_once() 在 LinuxKPI printk.h 中后的 14.0-CURRENT。                                                                                        |
| 1400020 | [8a1a42b2a7a4](https://cgit.freebsd.org/src/commit/?id=8a1a42b2a7a428fb97fda9f19fd0d67a4eec7535) | 2021 年 6 月 9 日   | 在 LinuxKPI 中添加宏 might\_lock\_nested() 和 lockdep\_(re/un/)pin\_lock() 后的 14.0-CURRENT。                                                           |
| 1400021 | [b47f461c8e67](https://cgit.freebsd.org/src/commit/?id=b47f461c8e67253fdb394968428b760e880baa08) | 2021 年 6 月 10 日  | 在向 LinuxKPI 添加 list\_for\_each\_entry\_lockless() 宏后的 14.0-CURRENT。                                                                             |
| 1400022 | [40cc9a3a6b81](https://cgit.freebsd.org/src/commit/?id=40cc9a3a6b81a65a03712dfd93bbed48552a97ad) | 2021 年 6 月 11 日  | 14.0-CURRENT 在提交 e1a907a25cfa 后更改了 krpc 和 nfsserver 模块之间的内部 KAPI。                                                                               |
| 1400023 | [d409305fa383](https://cgit.freebsd.org/src/commit/?id=d409305fa3838fb39b38c26fc085fb729b8766d5) | 2021 年 6 月 13 日  | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-12.0.0-0-gd28af7c654d8（即 12.0.0 发布版本）后的 14.0-CURRENT。                  |
| 1400024 | [41dfd8bd6466](https://cgit.freebsd.org/src/commit/?id=41dfd8bd6466fd39957dee2614d88c81cdf420a7) | 2021 年 6 月 18 日  | 在对 LinuxKPI 进行各种添加之后的 14.0-CURRENT。                                                                                                             |
| 1400025 | [5fa1eb1cd927](https://cgit.freebsd.org/src/commit/?id=5fa1eb1cd927219070b5753b64114a9240d76bf8) | 2021 年 7 月 5 日   | 在对 LinuxKPI 进行各种添加后的 14.0-CURRENT。                                                                                                              |
| 1400026 | [fad3f322efb5](https://cgit.freebsd.org/src/commit/?id=fad3f322efb53d4924fdda34f9f23f881659c269) | 2021 年 7 月 16 日  | 在将 nfscommon 和 nfsd 模块之间的内部 KAPI 更改后的 14.0-CURRENT。                                                                                             |
| 1400027 | [cc55ee8009a5](https://cgit.freebsd.org/src/commit/?id=cc55ee8009a550810d38777fd6ace9abf3a2f6b4) | 2021 年 7 月 28 日  | 在 aarch64 上向 libcompiler\_rt.a 添加离线 LSE 原子帮助程序后的 14.0-CURRENT。                                                                                  |
| 1400028 | [792b602a337d](https://cgit.freebsd.org/src/commit/?id=792b602a337ddc5efaa5e5326d9433fe3da7f303) | 2021 年 7 月 31 日  | 在 LinuxKPI 中使 FPU 部分线程安全后的 14.0-CURRENT。                                                                                                        |
| 1400029 | [245ec7651e42](https://cgit.freebsd.org/src/commit/?id=245ec7651e4221043d1032fb3f82f335dc65fc7f) | 2021 年 8 月 5 日   | 添加 fspacectl(2), vn\_deallocate(9)和 VOP\_DEALLOCATE(9)后的 14.0-CURRENT。                                                                          |
| 1400030 | [95941b963606](https://cgit.freebsd.org/src/commit/?id=95941b963606f6e03282cd6f866f3166dcedfa5b) | 2021 年 8 月 12 日  | 在 VOP\_DEALLOCATE(9)参数更改后的 14.0-CURRENT，并添加了对 POSIX 共享内存的 fspacectl(2)支持。                                                                       |
| 1400031 | [1a4c5061fc5b](https://cgit.freebsd.org/src/commit/?id=1a4c5061fc5ba8f2eee41456a6873547915f268a) | 2021 年 8 月 24 日  | 在将 fspacectl(2)，vn\_deallocate(9)和 VOP\_DEALLOCATE(9)更改为更新 rmsr.r\_offset 为有意义的值后的 14.0-CURRENT。                                                |
| 1400032 | [76321d2d432e](https://cgit.freebsd.org/src/commit/?id=76321d2d432ed270d93b282e54e59b708c0cf3b4) | 2021 年 8 月 25 日  | 在更改 fspacectl(2)、vn\_deallocate(9)和 VOP\_DEALLOCATE(9)之后的 14.0-CURRENT，使得计算清零字节数更容易。                                                            |
| 1400033 | [c751d067c166](https://cgit.freebsd.org/src/commit/?id=c751d067c166db71ce8bf3a323c62ac3428bd32a) | 2021 年 9 月 7 日   | 将套接字缓冲区锁移动到包含套接字中，并将 sb(un)lock 重命名为 SOCK\_IO\_RECV\_LOCK、SOCK\_IO\_RECV\_UNLOCK、SOCK\_IO\_SEND\_LOCK 和 SOCK\_IO\_SEND\_UNLOCK 后的 14.0-CURRENT。 |
| 1400034 | [c751d067c166](https://cgit.freebsd.org/src/commit/?id=c751d067c166db71ce8bf3a323c62ac3428bd32a) | 2021 年 9 月 29 日  | LinuxKPI 更改后的 14.0-CURRENT。                                                                                                                     |
| 1400035 | [16f1ee11e657](https://cgit.freebsd.org/src/commit/?id=16f1ee11e6574d7f8d8a9dc6ebc9be3036ff9fd0) | 2021 年 10 月 4 日  | 将 libtinfow 从 libncurses 中拆分后的 14.0-CURRENT。                                                                                                    |
| 1400036 | [ac847dbf7368](https://cgit.freebsd.org/src/commit/?id=ac847dbf73685a5df9f70bbcdefa9fdeb559071d) | 2021 年 10 月 6 日  | 在 OCF 中扩展 AES-CCM 和 Chacha20-Poly1305 密码，以支持多个随机数长度后的 14.0-CURRENT。                                                                             |
| 1400037 | [2b68eb8e1dbb](https://cgit.freebsd.org/src/commit/?id=2b68eb8e1dbbdaf6a0df1c83b26f5403ca52d4c3) | 2021 年 10 月 11 日 | 从 VOP\_STAT(9)中删除线程参数后的 14.0-CURRENT 和 fo\_stat                                                                                                 |
| 1400038 | [0d6516b45346](https://cgit.freebsd.org/src/commit/?id=0d6516b453469ce1d92ec903c4c4df9ee08be0f9) | 2021 年 10 月 17 日 | LinuxKPI 获得懒惰的 BAR 分配支持后的 14.0-CURRENT                                                                                                          |
| 1400039 | [bd49c454ca62](https://cgit.freebsd.org/src/commit/?id=bd49c454ca62170506a98959c1acab7ad50c3276) | 2021 年 10 月 19 日 | 在页面分配器更改后的 14.0-CURRENT。                                                                                                                        |
| 1400040 | [f38bef2ce417](https://cgit.freebsd.org/src/commit/?id=f38bef2ce417d6270f32b4ed17cec84bfd95d548) | 2021 年 10 月 30 日 | 在 libdialog 共享库版本号提升之后的 14.0-CURRENT。                                                                                                           |
| 1400041 | [0c276dee030b](https://cgit.freebsd.org/src/commit/?id=0c276dee030b241e12e1ceb1b2ab619004f08ce1) | 2021 年 11 月 6 日  | 更改 VOP\_ALLOCATE(9)的参数后的 14.0-CURRENT。                                                                                                          |
| 1400042 | [20aa359773be](https://cgit.freebsd.org/src/commit/?id=20aa359773befc8182f6b5dcb5aad7390cab6c26) | 2021 年 11 月 13 日 | 升级 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 至 llvmorg-13.0.0-0-gd7b669b3a303，又称 13.0.0 发行版的 14.0-CURRENT。                      |
| 1400043 | [7e1d3eefd410](https://cgit.freebsd.org/src/commit/?id=7e1d3eefd410ca0fbae5a217422821244c3eeee4) | 2021 年 11 月 25 日 | 从 NDINIT(9)中删除未使用的线程参数后的 14.0-CURRENT。                                                                                                          |
| 1400044 | [ec434c85b46d](https://cgit.freebsd.org/src/commit/?id=ec434c85b46dd715da1940e2a8911bf476b0e477) | 2021 年 12 月 9 日  | 在支持 AEAD 密码并将 Blake-2S/B auth 转换更改为像其他 auth 转换一样在 Setkey 之前进行 Init 之后，将 14.0-CURRENT 中的内核软件加密密码转换更改。                                            |
| 1400045 | [b214fcceacad](https://cgit.freebsd.org/src/commit/?id=b214fcceacad6b842545150664bd2695c1c2b34f) | 2021 年 12 月 15 日 | 在将 VOP\_READDIR(9)的 cookies 参数更改为 \*\*uint64\_t 后的 14.0-CURRENT。                                                                                |
| 1400046 | [e2650af157bc](https://cgit.freebsd.org/src/commit/?id=e2650af157bc7489deaf2c9054995f0f88a6e5da) | 2021 年 12 月 30 日 | 在使 CPU\_SET 宏与 glibc 兼容之后的 14.0-CURRENT。                                                                                                        |
| 1400047 | [ed6417cd8d0b](https://cgit.freebsd.org/src/commit/?id=ed6417cd8d0bb5a2c175fce9d8e4a495fae9e9f4) | 2022 年 1 月 17 日  | 在多个因 drm-kmod 而需要的 LinuxKPI 更改后，14.0-CURRENT。                                                                                                   |
| 1400048 | [dd2f7a4b45eb](https://cgit.freebsd.org/src/commit/?id=dd2f7a4b45eb1285e710cfce60cb77f7c11f8075) | 2022 年 1 月 18 日  | 在添加\<crypto/chacha20\_poly1305.h>之后的 14.0-CURRENT。                                                                                              |
| 1400049 | [2c4b65cc3d22](https://cgit.freebsd.org/src/commit/?id=2c4b65cc3d227f31864e183c15f6c42e2c596cd9) | 2022 年 1 月 24 日  | 添加\<crypto/curve25519.h>后的 14.0-CURRENT。                                                                                                        |
| 1400050 | [213e91399b79](https://cgit.freebsd.org/src/commit/?id=213e91399b7998554d787bb290109ebe602aa279) | 2022 年 1 月 25 日  | iflib 添加了新功能后，14.0-CURRENT 允许驱动程序将自己的 TX 队列选择功能设置为 ift\_txq\_select 在结构 if\_txrx 中。                                                             |
| 1400051 | [59d465e200bb](https://cgit.freebsd.org/src/commit/?id=59d465e200bb7058dfdb183c061730c10dd5bc03) | 2022 年 1 月 25 日  | 在为 LinuxKPI 添加 i2c 支持之后的 14.0-CURRENT。                                                                                                          |
| 1400052 | [05f0b24bfb34](https://cgit.freebsd.org/src/commit/?id=05f0b24bfb3416606c8ea02bc1bdb9bcee7aee0c) | 2022 年 2 月 14 日  | 添加 GUID\_INIT 和 pm\_qos.h 支持 LinuxKPI 后的 14.0-CURRENT。                                                                                          |
| 1400053 | [ba87e9bf7420](https://cgit.freebsd.org/src/commit/?id=ba87e9bf74202b08b8e3b0a297b9b88f6869fbfb) | 2022 年 2 月 17 日  | 在将 mmap\_lock.h 添加到 LinuxKPI 后的 14.0-CURRENT。                                                                                                   |
| 1400054 | [50bb3a33d879](https://cgit.freebsd.org/src/commit/?id=50bb3a33d879536e86e8a23365f070ef00b5cb32) | 2022 年 3 月 28 日  | 将 irq\_work\_queue 更改为在 LinuxKPI 中返回布尔值以匹配 5.10 API 后的 14.0-CURRENT。                                                                            |
| 1400055 | [d69af4758be9](https://cgit.freebsd.org/src/commit/?id=d69af4758be912625ec08656ba64eb90a98c9a7f) | 2022 年 3 月 29 日  | 在将 for\_each\_sgtable\_dma\_sg 和 for\_each\_sgtable\_dma\_page 添加到 LinuxKPI 之后的 14.0-CURRENT                                                    |
| 1400056 | [ab8ac4c28574](https://cgit.freebsd.org/src/commit/?id=ab8ac4c28574a42a2891b2e2341f802949c1fb57) | 2022 年 3 月 31 日  | 在升级 zlib 到 1.2.12 之后的 14.0-CURRENT                                                                                                              |
| 1400057 | [e68b35e40881](https://cgit.freebsd.org/src/commit/?id=e68b35e40881a1bd858e1b4b5003123a484fd7cd) | 2022 年 4 月 22 日  | 更改 udp\_tun\_func\_t()原型后的 14.0-CURRENT                                                                                                         |
| 1400058 | [2e32d4e41d20](https://cgit.freebsd.org/src/commit/?id=2e32d4e41d205d6f14834f87306a77ff77b9c0bd) | 2022 年 5 月 7 日   | 在删除 devclass 参数后的 14.0-CURRENT 新总线更改后。                                                                                                          |
| 1400059 | [3a9a9c0ca44e](https://cgit.freebsd.org/src/commit/?id=3a9a9c0ca44ec535dcf73fe8462bee458e54814b) | 2022 年 5 月 14 日  | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-14.0.3-0-g1f9140064dfb（即 14.0.3 发布版本）后的 14.0-CURRENT。                  |
| 1400060 | [85d7875d4291](https://cgit.freebsd.org/src/commit/?id=85d7875d42913c2cb10a007a1be05b210dc6aab2) | 2022 年 6 月 6 日   | 14.0-CURRENT 在 LinuxKPI dmi\_matches()修复后。                                                                                                      |
| 1400061 | [c4c5981c14d5](https://cgit.freebsd.org/src/commit/?id=c4c5981c14d5bd69e9df9ae691069ec4c2e92174) | 2022 年 6 月 8 日   | 在 mbuf(9)结构更改之后的 14.0-CURRENT。                                                                                                                  |
| 1400062 | [8c309d48aabf](https://cgit.freebsd.org/src/commit/?id=8c309d48aabf1cb469334c7716033f177a2715c0) | 2022 年 6 月 18 日  | 结构 kinfo\_file 更改后的 14.0-CURRENT 版本。                                                                                                            |
| 1400063 | [8cff8e6e13a6](https://cgit.freebsd.org/src/commit/?id=8cff8e6e13a6d3ccff40fc0d8d97f5aef22a8f4d) | 2022 年 6 月 29 日  | 在多次由 drm-kmod 需要的 LinuxKPI 更改后的 14.0-CURRENT。                                                                                                   |
| 1400064 | [ddd9004e7a5d](https://cgit.freebsd.org/src/commit/?id=ddd9004e7a5dbf02c34ef0effcef90f7d5df357d) | 2022 年 7 月 18 日  | 在删除 OBJT\_DEFAULT 后的 14.0-CURRENT。                                                                                                              |
| 1400065 | [b273f93657cf](https://cgit.freebsd.org/src/commit/?id=b273f93657cf0e6f2c6ee4d0f40a43656233c6d0) | 2022 年 8 月 8 日   | 在多次由 drm-kmod 需要的 LinuxKPI 更改后的 14.0-CURRENT。                                                                                                   |
| 1400066 | [ff7812ee7d44](https://cgit.freebsd.org/src/commit/?id=ff7812ee7d444b738a454064f9639c3feb5743e8) | 2022 年 8 月 18 日  | 在多次由 drm-kmod 需要的 LinuxKPI 更改后的 14.0-CURRENT。                                                                                                   |
| 1400069 | [f95c0bc89ea4](https://cgit.freebsd.org/src/commit/?id=f95c0bc89ea4fcde04b0990d57e842ef387ea896) | 2022 年 9 月 22 日  | 在多次 LinuxKPI 更改后的 14.0-CURRENT。                                                                                                                 |
| 1400070 | [6bddde307e21](https://cgit.freebsd.org/src/commit/?id=6bddde307e21eba297ac3f3e534b4cf3be81dfe2) | 2022 年 9 月 22 日  | 在 KPI 更改后的 14.0-CURRENT 到 pmap\_unmapdev()和 kmem\_\*()。                                                                                         |
| 1400071 | [d3f96f661050](https://cgit.freebsd.org/src/commit/?id=d3f96f661050e9bd21fe29931992a8b9e67ff189) | 2022 年 9 月 26 日  | KPI 变更后的 14.0-CURRENT，使 sysctl OIDs 列表转换为 RB 树。                                                                                                 |
| 1400072 | [8a96874eeeee](https://cgit.freebsd.org/src/commit/?id=8a96874eeeee5195b0b0952b77227bef6a26d1a6) | 2022 年 9 月 22 日  | 14.0-CURRENT 之后 qsort\_r 原型被修改以匹配 POSIX。                                                                                                        |
| 1400073 | [9c9501390512](https://cgit.freebsd.org/src/commit/?id=9c950139051298831ce19d01ea5fb33ec6ea7f89) | 2022 年 10 月 17 日 | 引入 TX 队列选择功能 v2 后的 14.0-CURRENT。                                                                                                                |
| 1400074 | [e28932c643e8](https://cgit.freebsd.org/src/commit/?id=e28932c643e891294a49f386ba65322cf8410225) | 2022 年 12 月 9 日  | 在文件操作中添加备用 fops 插槽后的 14.0-CURRENT。                                                                                                              |
| 1400078 | [4b56afaf7bf4](https://cgit.freebsd.org/src/commit/?id=4b56afaf7bf4fa37bae5b26fd93ee1ff5969c1bb) | 2023 年 1 月 13 日  | 在更改 LinuxKPI pci.h 后的 14.0-CURRENT                                                                                                              |
| 1400079 | [3264f6b88fce](https://cgit.freebsd.org/src/commit/?id=3264f6b88fce7c5437d205685863617d8f6a22dd) | 2023 年 2 月 8 日   | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-15.0.7-0-g8dfdcc7b7bf6（即 15.0.7 发布版本）后的 14.0-CURRENT。                  |
| 1400084 | [ea3061526e9c](https://cgit.freebsd.org/src/commit/?id=ea3061526e9ce5d3b65932c1d3e4437abd556d65) | 2023 年 3 月 23 日  | 在更改 arm64 结构 reg、结构 gpreg、结构 trapframe 和结构 pcb 后的 14.0-CURRENT。                                                                                 |
| 1400085 | [1cebc9298cf2](https://cgit.freebsd.org/src/commit/?id=1cebc9298cf2272da46c3c574d06a80ce59854aa) | 2023 年 3 月 28 日  | 多个 LinuxKPI 更改后的 14.0-CURRENT                                                                                                                   |
| 1400086 | [c17eb99a66e7](https://cgit.freebsd.org/src/commit/?id=c17eb99a66e7d1e8a64458a969eeb7649f827493) | 2023 年 4 月 8 日   | vn\_lock\_pair()参数更改后的 14.0-CURRENT。                                                                                                            |
| 1400087 | [af22da75a035](https://cgit.freebsd.org/src/commit/?id=af22da75a035e25cb47cd3f2eabe5a84d8a5cb34) | 2023 年 4 月 22 日  | LinuxKPI 更新后的 14.0-CURRENT。                                                                                                                     |
| 1400088 | [97583aa25675](https://cgit.freebsd.org/src/commit/?id=97583aa2567589cb83540d2d9de1980b76db9a99) | 2023 年 4 月 24 日  | 将 LinuxKPI 迁移到 IfAPI 后的 14.0-CURRENT。                                                                                                           |
| 1400089 | [9fb6718d1b18](https://cgit.freebsd.org/src/commit/?id=9fb6718d1b180c341373b25c03dbfc221ddee311) | 2023 年 4 月 25 日  | 通过在 smp 中动态分配 stoppcbs 数组后的 14.0-CURRENT。                                                                                                       |
| 1400090 | [653738e895ba](https://cgit.freebsd.org/src/commit/?id=653738e895ba022be1179a95a85089e7bc66dbbe) | 2023 年 6 月 7 日   | 14.0-CURRENT 在 ptrace 开始在 PT\_DETACH 期间清除 TDB\_BORN 之后。                                                                                         |
| 1400091 | [a681cba16d89](https://cgit.freebsd.org/src/commit/?id=a681cba16d8967651a2146385ce44a2bfeb1c4c3) | 2023 年 6 月 22 日  | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-16.0.6-0-g7cbf1a259152（即 16.0.6 发布版本）后的 14.0-CURRENT。                  |
| 1400092 | [9ead001d5b42](https://cgit.freebsd.org/src/commit/?id=9ead001d5b42ef9cba04757c9e7ee74c06037139) | 2023 年 6 月 24 日  | 导入 OpenSSL 3.0.9 后的 14.0-CURRENT 基本操作。                                                                                                          |
| 1400093 | [ba8cc6d7271a](https://cgit.freebsd.org/src/commit/?id=ba8cc6d7271a50fec978a1d3a088aec7985fae48) | 2023 年 7 月 5 日   | 在 VFS 中使用\_\_enum\_uint8 进行 vtype 和 vstate 后的 14.0-CURRENT                                                                                      |
| 1400097 | [29a16ce065db](https://cgit.freebsd.org/src/commit/?id=29a16ce065dbc28bc9e87c9bfadb08bb58b137e4) | 2023 年 8 月 24 日  | 在分支 stable/14 之后的 14.0-STABLE                                                                                                                   |
| 1400500 | [29a16ce065db](https://cgit.freebsd.org/src/commit/?id=29a16ce065dbc28bc9e87c9bfadb08bb58b137e4) | 2023 年 9 月 8 日   | 在 releng/14.0 分支后的 14.0-STABLE                                                                                                                  |
| 1400501 | [91e53779b4fc](https://cgit.freebsd.org/src/commit/?id=91e53779b4fc39e755a03190f785ce0cf3f83eb7) | 2023 年 11 月 19 日 | 在 powerpc 上实现 fpu\_kern\_enter 和 fpu\_kern\_leave 后的 14.0-STABLE。                                                                               |
| 1400502 | [092abb839d1d](https://cgit.freebsd.org/src/commit/?id=092abb839d1d2826533bb9c4c93d713f8b5043f9) | 2023 年 12 月 24 日 | 在修改 kgssapi 和 krpc 模块之间的内部 API 后，14.0-STABLE                                                                                                    |
| 1400503 | [ba99d960884d](https://cgit.freebsd.org/src/commit/?id=ba99d960884d50eb7d36146914206644ee132aa4) | 2023 年 12 月 29 日 | 在将 nfscommon 和 nfscl 模块之间的内部 KAPI 更改后的 14.0-STABLE。                                                                                             |
| 1400504 | [68584c97ecfb](https://cgit.freebsd.org/src/commit/?id=68584c97ecfb3046de7fb1b16c2caa785392237c) | 2024 年 1 月 7 日   | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-17.0.6-0-g6009708b4367（即 17.0.6 发布版本）后的 14.0-STABLE。                   |
| 1400505 | [64e869e9b93c](https://cgit.freebsd.org/src/commit/?id=64e869e9b93c8ce47f874b770df696c06bcba0d3) | 2024 年 1 月 7 日   | 在添加 vnode\_pager\_clean\_async(9)和 vnode\_pager\_clean\_sync(9)之后的 14.0-STABLE。                                                                 |
| 1400506 | [d90417109582](https://cgit.freebsd.org/src/commit/?id=d9041710958227194c5e34b169ae73d7ad411017) | 2024 年 1 月 19 日  | 在将 nfscommon 和 nfscl 模块之间的内部 KAPI 更改为 14.0-STABLE。                                                                                              |
| 1400507 | [b566e44b2b88](https://cgit.freebsd.org/src/commit/?id=b566e44b2b88eb9f1b3b658998c7418cccab9e2f) | 2024 年 1 月 31 日  | 添加 kern\_openatfp(9)和 kcmp(2)后的 14.0-STABLE。                                                                                                    |
| 1400508 | [2d120981e26d](https://cgit.freebsd.org/src/commit/?id=2d120981e26dfef5c9cb9eb9936bb46cb6918136) | 2024 年 2 月 18 日  | LinuxKPI 更新后的 14.0-STABLE。                                                                                                                      |
| 1400509 | [b392b36d3776](https://cgit.freebsd.org/src/commit/?id=b392b36d3776b696601ce0253256803276d24ea2) | 2024 年 2 月 18 日  | 在更改 net80211 struct ieee80211vap 内部后的 14.0-STABLE。                                                                                              |
| 1400510 | [69da6e087983](https://cgit.freebsd.org/src/commit/?id=69da6e0879831f1ccc5c60135ed43fcea10a933b) | 2024 年 3 月 23 日  | 修复在构建最近的 boost 库时出现的 clang 断言或崩溃后的 14.0-STABLE 版本。                                                                                              |
| 1400511 | [7c41358a2b0a](https://cgit.freebsd.org/src/commit/?id=7c41358a2b0a2e70a2b61ec347354f3452e4d2f3) | 2024 年 4 月 20 日  | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-18.1.3-0-gc13b7485b879（即 18.1.3 发布版本）后的 14.0-STABLE。                   |
| 1401500 | [7b082bdf72e6](https://cgit.freebsd.org/src/commit/?id=7b082bdf72e65f94b9b17d9fa1d0c1c202e4eb49) | 2024 年 5 月 2 日   | 从 14.1-PRERELEASE 重命名为 14.1-STABLE。                                                                                                             |
| 1401501 | [f285eabc89ce](https://cgit.freebsd.org/src/commit/?id=f285eabc89ce8ccf3aaf563401df942e406c2b5f) | 2024 年 6 月 6 日   | 在添加 `linuxkpi_video` 模块后的 14.1-STABLE。                                                                                                          |
| 1401502 | [b37a6d41a046](https://cgit.freebsd.org/src/commit/?id=b37a6d41a046dbb46ee1d6bf00c710c03c944a24) | 2024 年 8 月 2 日   | 在 LinuxKPI 更改后的 14.1-STABLE。                                                                                                                    |
| 1401503 | [8a5a9dbf389e](https://cgit.freebsd.org/src/commit/?id=8a5a9dbf389e86d278764ababf2f1eb8ee276680) | 2024 年 10 月 15 日 | 在扩展 `vm_object` 中的 `flags` 字段后的 14.1-STABLE。                                                                                                    |
| 1402500 | [4e8444d5750a](https://cgit.freebsd.org/src/commit/?id=4e8444d5750a5d9da9c812e8f6caf6d62862be0a) | 2024 年 10 月 31 日 | 从 14.2-PRERELEASE 重命名为 14.2-STABLE。                                                                                                             |
| 1402501 | [35d2f335e855](https://cgit.freebsd.org/src/commit/?id=35d2f335e855af816d0a7fe5baf6a3facba84562) | 2024 年 12 月 1 日  | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-19.1.4-0-gaadaa00de76e（即 19.1.4 发布版本）后的 14.2-STABLE。                   |
| 1402502 | [d172f42e4ba7](https://cgit.freebsd.org/src/commit/?id=d172f42e4ba7ba8542ae0866aaba56e329b4ea2c) | 2025 年 2 月 27 日  | 在删除新总线资源 API 中多个函数的冗余 `type` 和 `rid` 参数后的 14.2-STABLE。                                                                                          |
| 1402503 | [4aed8b3b613c](https://cgit.freebsd.org/src/commit/?id=4aed8b3b613c5e1499336e4d7ec7e9a3ac3d9a12) | 2025 年 2 月 27 日  | 在添加 `bus_attach_children`、`bus_detach_children` 和 `bus_identify_children` 后的 14.2-STABLE。                                                       |
| 1402505 | [a3b2d8e360c3](https://cgit.freebsd.org/src/commit/?id=a3b2d8e360c37853035f9cede6064c4602312bfc) | 2025 年 4 月 18 日  | 在对 LinuxKPI 进行分配更改并删除 iwlwifi 固件后的 14.2-STABLE。                                                                                                 |
| 1403500 | [61bcd8183104](https://cgit.freebsd.org/src/commit/?id=61bcd8183104bcae6fa9e3db460a15dc15c1600a) | 2025 年 5 月 2 日   | 在从 14.3-PRERELEASE 重命名为 14.3-STABLE 后的 14.3-STABLE。                                                                                             |
| 1403501 | [37303e96528e](https://cgit.freebsd.org/src/commit/?id=37303e96528e3c4662a464cfc778ddaa5194a3d1) | 2025 年 5 月 20 日  | 在 `link_addr` 中添加更严格的地址格式检查后的 14.3-STABLE。                                                                                                      |
| 1403502 | [b7291e0da6ff](https://cgit.freebsd.org/src/commit/?id=b7291e0da6ff485854ba07a0f8e18fb7b60ef5ba) | 2025 年 6 月 12 日  | 在 amd64 上添加 `PCB_TLSBASE` 后的 14.3-STABLE。                                                                                                       |
| 1403503 | [6cdcf08c9c5e](https://cgit.freebsd.org/src/commit/?id=6cdcf08c9c5eda6dc3b8395cefd9d30a4f5e2f1a) | 2025 年 7 月 13 日  | 在 LinuxKPI dma-mapping.h 和 acpi 更改后的 14.3-STABLE。                                                                                               |
| 1403504 | [590d12774f8f](https://cgit.freebsd.org/src/commit/?id=590d12774f8f921a3181dc0b893612925b041394) | 2025 年 7 月 28 日  | 在切换到 256 个独立运行队列后的 14.3-STABLE。                                                                                                                 |
| 1403505 | [4f22d274ab0d](https://cgit.freebsd.org/src/commit/?id=4f22d274ab0d1da23c000e4f7f2ea003c5fa94a7) | 2025 年 8 月 23 日  | 在向 `nfsv4_fillattr` 添加 `xattrsupp` 参数后的 14.3-STABLE。                                                                                            |
| 1403506 | [4612f5f2d233](https://cgit.freebsd.org/src/commit/?id=4612f5f2d23348c8a861834d4c9f98b0a2742f56) | 2025 年 8 月 28 日  | 在引入 VTYPE\_ISDEV()、VN\_ISDEV() 和 VATTR\_ISDEV() 后的 14.3-STABLE。                                                                                 |
| 1403507 | [108b5d90bc1f](https://cgit.freebsd.org/src/commit/?id=108b5d90bc1fa8ed83cfd6f58e636193e03e8049) | 2025 年 12 月 18 日 | 在更改 `bus_alloc_resource` API 以按值接受 `rid` 参数后的 14.3-STABLE。                                                                                      |
| 1403508 | [16e2bb8177bd](https://cgit.freebsd.org/src/commit/?id=16e2bb8177bd86a954ef968551d8c8980582381a) | 2026 年 1 月 16 日  | 在 LinuxKPI 的各种更改后的 14.3-STABLE。                                                                                                                 |
| 1404500 | [567cb65a378f](https://cgit.freebsd.org/src/commit/?id=567cb65a378f36caba79672fd72c961b2c99a132) | 2026 年 2 月 6 日   | 在从 14.4-PRERELEASE 重命名为 14.4-STABLE 后的 14.4-STABLE。                                                                                             |
| 1404501 | [47f4f76074a4](https://cgit.freebsd.org/src/commit/?id=47f4f76074a48cdaa743f05929725c84f71d502b) | 2026 年 5 月 30 日  | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-21.1.8-0-g2078da43e25a（即 21.1.8 发布版本）后的 14.4-STABLE。                   |

## 18.4. FreeBSD 13 版本

**表 4. FreeBSD 13 \_\_FreeBSD\_version 值**

| 值       | 修订版本                                                                                             | 日期               | 发布                                                                                                                                                          |
| ------- | ------------------------------------------------------------------------------------------------ | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1300000 | [339436](https://svnweb.freebsd.org/changeset/base/339436)                                       | 2018 年 10 月 19 日 | 13.0-CURRENT.                                                                                                                                               |
| 1300001 | [339730](https://svnweb.freebsd.org/changeset/base/339730)                                       | 2018 年 10 月 25 日 | 在提升 OpenSSL 共享库版本号后的 13.0-CURRENT                                                                                                                           |
| 1300002 | [339765](https://svnweb.freebsd.org/changeset/base/339765)                                       | 2018 年 10 月 25 日 | 恢复 sys/joystick.h 后的 13.0-CURRENT。                                                                                                                          |
| 1300003 | [340055](https://svnweb.freebsd.org/changeset/base/340055)                                       | 2018 年 11 月 2 日  | vop\_symlink API 更改后的 13.0-CURRENT（ a\_target 现在是 const 。）                                                                                                  |
| 1300004 | [340841](https://svnweb.freebsd.org/changeset/base/340841)                                       | 2018 年 11 月 23 日 | 启用 crtbegin 和 crtend 代码后的 13.0-CURRENT。                                                                                                                     |
| 1300005 | [341836](https://svnweb.freebsd.org/changeset/base/341836)                                       | 2018 年 12 月 11 日 | 在启用 UFS inode 校验和之后的 13.0-CURRENT。                                                                                                                          |
| 1300006 | [342398](https://svnweb.freebsd.org/changeset/base/342398)                                       | 2018 年 12 月 24 日 | 在修复 sys/random.h 包含以便从 C++可用后的 13.0-CURRENT。                                                                                                                |
| 1300007 | [342629](https://svnweb.freebsd.org/changeset/base/342629)                                       | 2018 年 12 月 30 日 | 在 32 位平台上更改 struct linux\_cdev 大小后的 13.0-CURRENT。                                                                                                           |
| 1300008 | [342772](https://svnweb.freebsd.org/changeset/base/342772)                                       | 2019 年 1 月 4 日   | 在添加 kern.smp.threads\_per\_core 和 kern.smp.cores sysctl 后的 13.0-CURRENT。                                                                                    |
| 1300009 | [343213](https://svnweb.freebsd.org/changeset/base/343213)                                       | 2019 年 1 月 20 日  | 通过对 ieee80211com 结构进行 struct ieee80211vap 结构更改以解决 ioctl/detach 竞争。                                                                                          |
| 1300010 | [343485](https://svnweb.freebsd.org/changeset/base/343485)                                       | 2019 年 1 月 27 日  | 在将 SPECNAMELEN 从 63 增加到 MAXNAMELEN （255）后的 13.0-CURRENT。                                                                                                    |
| 1300011 | [344041](https://svnweb.freebsd.org/changeset/base/344041)                                       | 2019 年 2 月 12 日  | 在 renameat(2) 被修正以在使用 `CAPABILITIES` 选项构建的内核中正常工作后的 13.0-CURRENT。                                                                                           |
| 1300012 | [344062](https://svnweb.freebsd.org/changeset/base/344062)                                       | 2019 年 2 月 12 日  | 在 taskqgroup\_attach() 和 taskqgroup\_attach\_cpu() 之后，13.0-CURRENT 接受一个 device\_t 和一个结构资源指针作为参数，用于表示设备中断。                                                   |
| 1300013 | [344300](https://svnweb.freebsd.org/changeset/base/344300)                                       | 2019 年 2 月 19 日  | 在去除 drm 和 drm2 后的 13.0-CURRENT。                                                                                                                             |
| 1300014 | [344779](https://svnweb.freebsd.org/changeset/base/344779)                                       | 2019 年 3 月 4 日   | 在升级 clang、llvm、lld、lldb、compiler-rt 和 libc++ 到 8.0.0 rc3 之后的 13.0-CURRENT。                                                                                  |
| 1300015 | [345196](https://svnweb.freebsd.org/changeset/base/345196)                                       | 2019 年 3 月 15 日  | 在去匿名化线程和 proc 状态枚举后的 13.0-CURRENT，因此用户空间应用程序可以在不重新定义值名称的情况下使用它们。                                                                                            |
| 1300016 | [345236](https://svnweb.freebsd.org/changeset/base/345236)                                       | 2019 年 3 月 16 日  | 在 amd64 上默认启用 LLVM OpenMP 8.0.0 rc5 后的 13.0-CURRENT。                                                                                                        |
| 1300017 | [345305](https://svnweb.freebsd.org/changeset/base/345305)                                       | 2019 年 3 月 19 日  | 在 iflib 中向驱动程序公开 Rx mbuf 缓冲区大小后的 13.0-CURRENT。                                                                                                              |
| 1300018 | [346012](https://svnweb.freebsd.org/changeset/base/346012)                                       | 2019 年 3 月 16 日  | 在 345982 中引入 funlinkat 系统调用后的 13.0-CURRENT。                                                                                                                 |
| 1300019 | [346282](https://svnweb.freebsd.org/changeset/base/346282)                                       | 2019 年 4 月 16 日  | 添加 is\_random\_seeded(9)到 random(4)后的 13.0-CURRENT。                                                                                                         |
| 1300020 | [346358](https://svnweb.freebsd.org/changeset/base/346358)                                       | 2019 年 4 月 18 日  | 在恢复 random(4) 可用性折衷之前的 346250 和添加新的可调整项和诊断 sysctl，以便在引导后以编程方式发现早期种子问题后的 13.0-CURRENT。                                                                       |
| 1300021 | [346645](https://svnweb.freebsd.org/changeset/base/346645)                                       | 2019 年 4 月 24 日  | 在 LinuxKPI 使用 bus\_dma(9) 以与 IOMMU 兼容之后的 13.0-CURRENT。                                                                                                      |
| 1300022 | [347089](https://svnweb.freebsd.org/changeset/base/347089)                                       | 2019 年 5 月 4 日   | 在修复 LinuxKPI 中 346645 的回归问题后的 13.0-CURRENT。                                                                                                                 |
| 1300023 | [347192](https://svnweb.freebsd.org/changeset/base/347192)                                       | 2019 年 5 月 6 日   | 13.0-CURRENT 在列出内核转储设备配置后。                                                                                                                                  |
| 1300024 | [347325](https://svnweb.freebsd.org/changeset/base/347325)                                       | 2019 年 5 月 8 日   | 13.0-CURRENT 在提升 Mellanox 驱动程序版本号（mlx4en(4); mlx5en(4)）后。                                                                                                   |
| 1300025 | [347532](https://svnweb.freebsd.org/changeset/base/347532)                                       | 2019 年 5 月 13 日  | 重命名 vm.max\_wired 为 vm.max\_user\_wired 并更改其类型后的 13.0-CURRENT                                                                                               |
| 1300026 | [347596](https://svnweb.freebsd.org/changeset/base/347596)                                       | 2019 年 5 月 14 日  | 在 LinuxKPI 中添加上下文成员到 ww\_mutex 后的 13.0-CURRENT。                                                                                                             |
| 1300027 | [347601](https://svnweb.freebsd.org/changeset/base/347601)                                       | 2019 年 5 月 14 日  | 在 LinuxKPI 中添加准备到 pm\_ops 后的 13.0-CURRENT。                                                                                                                  |
| 1300028 | [347925](https://svnweb.freebsd.org/changeset/base/347925)                                       | 2019 年 5 月 17 日  | 在 bm ， cs ，删除后的 13.0-CURRENT，de，ed， ep ，ex， fe ， pcn ，sf， sn ， tl ， tx ， txp ， vx ， wb 和 xe 驱动程序。                                                           |
| 1300029 | [347984](https://svnweb.freebsd.org/changeset/base/347984)                                       | 2019 年 5 月 20 日  | 13.0-CURRENT 在移除由于 sys/eventhandler.h 导致的一些头部污染后。受影响的文件现在可能需要显式包含 sys/eventhandler.h、sys/ktr.h、sys/lock.h 或 sys/mutex.h 中的一个或多个，当缺少的头部在 1300029 之前可能是隐式包含的。 |
| 1300030 | [348350](https://svnweb.freebsd.org/changeset/base/348350)                                       | 2019 年 5 月 29 日  | 13.0-CURRENT 在 powerpc64 上为 libdwarf 添加重定位支持后，修复了对未链接对象上 DWARF 信息的处理。原始提交在 348347 中。                                                                        |
| 1300031 | [348808](https://svnweb.freebsd.org/changeset/base/348808)                                       | 2019 年 6 月 8 日   | 在为 i386 内核模块添加 dpcpu 和 vnet 部分修复后，13.0-CURRENT 可以避免在某些情况下发生崩溃。需要使用链接器脚本魔法重新编译 i386 内核模块，否则它们将拒绝加载。                                                          |
| 1300032 | [349151](https://svnweb.freebsd.org/changeset/base/349151)                                       | 2019 年 6 月 17 日  | 将内核 crc32() 实现分离到自己的头文件(gsb\_crc32.h)并将源代码重命名为 gsb\_crc32.c 后的 13.0-CURRENT。                                                                                |
| 1300033 | [349277](https://svnweb.freebsd.org/changeset/base/349277)                                       | 2019 年 6 月 21 日  | 在 LinuxKPI 的 rcu 列表中添加后的 13.0-CURRENT。                                                                                                                      |
| 1300034 | [349352](https://svnweb.freebsd.org/changeset/base/349352)                                       | 2019 年 6 月 24 日  | 删除 NAND 和 NANDFS 后的 13.0-CURRENT。                                                                                                                           |
| 1300035 | [349846](https://svnweb.freebsd.org/changeset/base/349846)                                       | 2019 年 7 月 8 日   | 13.0-CURRENT 合并 vm\_page 保持和导线机制 后。                                                                                                                         |
| 1300036 | [349972](https://svnweb.freebsd.org/changeset/base/349972)                                       | 2019 年 7 月 13 日  | 13.0-CURRENT 添加 arm\_drain\_writebuf() 和 arm\_sync\_icache() 以与 NetBSD 和 OpenBSD 兼容 后。                                                                      |
| 1300037 | [350307](https://svnweb.freebsd.org/changeset/base/350307)                                       | 2019 年 7 月 24 日  | 在移除 libcap\_random(3)后的 13.0-CURRENT。                                                                                                                       |
| 1300038 | [350437](https://svnweb.freebsd.org/changeset/base/350437)                                       | 2019 年 7 月 30 日  | 删除了 gzip 压缩的 a.out 支持后的 13.0-CURRENT。                                                                                                                       |
| 1300039 | [350665](https://svnweb.freebsd.org/changeset/base/350665)                                       | 2019 年 8 月 7 日   | 从 projects/fuse2 合并 fusefs 后的 13.0-CURRENT。                                                                                                                 |
| 1300040 | [351140](https://svnweb.freebsd.org/changeset/base/351140)                                       | 2019 年 8 月 16 日  | 删除了自 1997 年起弃用的 **sys/dir.h** 后的 13.0-CURRENT。                                                                                                              |
| （未更改）   | [351423](https://svnweb.freebsd.org/changeset/base/351423)                                       | 2019 年 8 月 23 日  | 在将大多数参数更改为 ping6(8)后的 13.0-CURRENT。                                                                                                                         |
| 1300041 | [351480](https://svnweb.freebsd.org/changeset/base/351480)                                       | 2019 年 8 月 25 日  | 13.0-CURRENT 在内核 zlib 统一完成后移除 zlib 1.0.4 之后。                                                                                                                |
| 1300042 | [351522](https://svnweb.freebsd.org/changeset/base/351522)                                       | 2019 年 8 月 27 日  | 13.0-CURRENT 在内核端添加了对内核 TLS 的支持。                                                                                                                            |
| 1300043 | [351698](https://svnweb.freebsd.org/changeset/base/351698)                                       | 2019 年 9 月 2 日   | 删除 gets(3)后的 13.0-CURRENT。                                                                                                                                  |
| 1300044 | [351701](https://svnweb.freebsd.org/changeset/base/351701)                                       | 2019 年 9 月 2 日   | 加入处理在一个调用中处理多个文件的 sysfs 创建/删除函数后的 13.0-CURRENT LinuxKPI。                                                                                                    |
| 1300045 | [351729](https://svnweb.freebsd.org/changeset/base/351729)                                       | 2019 年 9 月 3 日   | 加入 sysctlbyname(3)系统调用后的 13.0-CURRENT。                                                                                                                      |
| 1300046 | [351937](https://svnweb.freebsd.org/changeset/base/351937)                                       | 2019 年 9 月 6 日   | LinuxKPI sysfs 改进后的 13.0-CURRENT。                                                                                                                           |
| 1300047 | [352110](https://svnweb.freebsd.org/changeset/base/352110)                                       | 2019 年 9 月 9 日   | 在更改 vm\_page 引用计数同步规则后的 13.0-CURRENT。                                                                                                                       |
| 1300048 | [352700](https://svnweb.freebsd.org/changeset/base/352700)                                       | 2019 年 9 月 25 日  | 在 13.0-CURRENT 中添加了 shm\_open2 系统调用，以支持即将推出的 memfd\_create(2)系统调用。                                                                                          |
| 1300049 | [353274](https://svnweb.freebsd.org/changeset/base/353274)                                       | 2019 年 10 月 7 日  | 在将 VNET 关闭检查提取到自己的 VNET 结构字段之后的 13.0-CURRENT                                                                                                                |
| 1300050 | [353358](https://svnweb.freebsd.org/changeset/base/353358)                                       | 2019 年 10 月 9 日  | 在更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 至 9.0.0 final release r372316 后的 13.0-CURRENT。                                                |
| 1300051 | [353685](https://svnweb.freebsd.org/changeset/base/353685)                                       | 2019 年 10 月 17 日 | 从 netdump(4)拆分出更通用的 debugnet(4)后的 13.0-CURRENT。                                                                                                             |
| 1300052 | [353698](https://svnweb.freebsd.org/changeset/base/353698)                                       | 2019 年 10 月 17 日 | 在将页面繁忙字段提升为一流锁之后，13.0-CURRENT 不再需要对象锁来保持一致性。                                                                                                                |
| 1300053 | [353700](https://svnweb.freebsd.org/changeset/base/353700)                                       | 2019 年 10 月 17 日 | 在实现 NetGDB 之后的 13.0-CURRENT。                                                                                                                                |
| 1300054 | [353868](https://svnweb.freebsd.org/changeset/base/353868)                                       | 2019 年 10 月 21 日 | 在移除用于访问接口地址列表的过时 KPI 之后的 13.0-CURRENT。                                                                                                                      |
| 1300055 | [354335](https://svnweb.freebsd.org/changeset/base/354335)                                       | 2019 年 11 月 4 日  | 在 LinuxKPI 中启用设备类组属性后的 13.0-CURRENT                                                                                                                         |
| 1300056 | [354460](https://svnweb.freebsd.org/changeset/base/354460)                                       | 2019 年 11 月 7 日  | 13.0-CURRENT 在修复了 libc++中潜在的 OOB 读安全问题之后。                                                                                                                   |
| 1300057 | [354694](https://svnweb.freebsd.org/changeset/base/354694)                                       | 2019 年 11 月 13 日 | 13.0-CURRENT 在 elf\_aux\_info(3)中添加了对 AT\_EXECPATH 的支持。                                                                                                     |
| 1300058 | [354820](https://svnweb.freebsd.org/changeset/base/354820)                                       | 2019 年 11 月 18 日 | 在将 vm\_page aflags 字段扩展到 16 位后的 13.0-CURRENT。                                                                                                               |
| 1300059 | [354835](https://svnweb.freebsd.org/changeset/base/354835)                                       | 2019 年 11 月 18 日 | 13.0-CURRENT 将内部 sysent 目标转换为使用新 makesyscalls.lua。                                                                                                          |
| 1300060 | [354922](https://svnweb.freebsd.org/changeset/base/354922)                                       | 2019 年 11 月 20 日 | 13.0-CURRENT 添加 /etc/os-release 作为 /var/run/os-release 的符号链接。                                                                                               |
| 1300061 | [354977](https://svnweb.freebsd.org/changeset/base/354977)                                       | 2019 年 11 月 21 日 | 添加了 bitstring(3)功能，用于查找连续的设置或未设置位。                                                                                                                          |
| 1300062 | [355309](https://svnweb.freebsd.org/changeset/base/355309)                                       | 2019 年 12 月 2 日  | 在添加 TCP\_STATS 支持后的 13.0-CURRENT。                                                                                                                           |
| 1300063 | [355537](https://svnweb.freebsd.org/changeset/base/355537)                                       | 2019 年 12 月 8 日  | 在去除 VI\_DOOMED 后的 13.0-CURRENT（请改用 VN\_IS\_DOOMED）。                                                                                                         |
| 1300064 | [355658](https://svnweb.freebsd.org/changeset/base/355658)                                       | 2019 年 12 月 9 日  | 在修正 C++版本检查以声明 timespec\_get(3)之后的 13.0-CURRENT。                                                                                                            |
| 1300065 | [355643](https://svnweb.freebsd.org/changeset/base/355643)                                       | 2019 年 12 月 12 日 | 在添加 musl libc 和 glibc 中常见的 sigsetop 扩展后的 13.0-CURRENT。                                                                                                      |
| 1300066 | [355679](https://svnweb.freebsd.org/changeset/base/355679)                                       | 2019 年 12 月 12 日 | 作为引入 NFS 4.2 的一部分，更改 NFS 模块之间的内部接口后的 13.0-CURRENT。                                                                                                          |
| 1300067 | [355732](https://svnweb.freebsd.org/changeset/base/355732)                                       | 2019 年 12 月 13 日 | 删除了弃用的 callout\_handle\_init ， timeout 和 untimeout 函数后的 13.0-CURRENT。                                                                                       |
| 1300068 | [355828](https://svnweb.freebsd.org/changeset/base/355828)                                       | 2019 年 12 月 16 日 | 在 64 位平台上将 ARG\_MAX 的值加倍后的 13.0-CURRENT。                                                                                                                    |
| 1300069 | [356051](https://svnweb.freebsd.org/changeset/base/356051)                                       | 2019 年 12 月 24 日 | 添加 busdma 模板后的 13.0-CURRENT。                                                                                                                                |
| 1300070 | [356113](https://svnweb.freebsd.org/changeset/base/356113)                                       | 2019 年 12 月 27 日 | 消除 AT\_\*定义中最后一个 MI 差异后的 13.0-CURRENT（用于 powerpc）。                                                                                                          |
| 1300071 | [356135](https://svnweb.freebsd.org/changeset/base/356135)                                       | 2019 年 12 月 27 日 | 在将 USB 统计更改为每个设备而不是每个总线后的 13.0-CURRENT。                                                                                                                     |
| 1300072 | [356185](https://svnweb.freebsd.org/changeset/base/356185)                                       | 2019 年 12 月 29 日 | 在移除 GEOM\_SCHED 类和 gsched 工具后的 13.0-CURRENT。                                                                                                                |
| 1300073 | [356263](https://svnweb.freebsd.org/changeset/base/356263)                                       | 2020 年 1 月 2 日   | 删除 arm/arm 作为有效目标后的 13.0-CURRENT。                                                                                                                           |
| 1300074 | [356337](https://svnweb.freebsd.org/changeset/base/356337)                                       | 2020 年 1 月 3 日   | 从 VOP\_UNLOCK 中删除标志参数后的 13.0-CURRENT。                                                                                                                       |
| 1300075 | [356409](https://svnweb.freebsd.org/changeset/base/356409)                                       | 2020 年 1 月 6 日   | 在取消的 USB 传输中添加自己的计数器后的 13.0-CURRENT。                                                                                                                        |
| 1300076 | [356511](https://svnweb.freebsd.org/changeset/base/356511)                                       | 2020 年 1 月 8 日   | 在将 vnop 实现推入 posix\_fallocate(2)层之后的 13.0-CURRENT。                                                                                                          |
| （未更改）   | [357396](https://svnweb.freebsd.org/changeset/base/357396)                                       | 2020 年 2 月 2 日   | 从 src 树中删除 armv5 架构代码后的 13.0-CURRENT。                                                                                                                       |
| 1300077 | [357455](https://svnweb.freebsd.org/changeset/base/357455)                                       | 2020 年 2 月 3 日   | 从 src 树中移除 sparc64 架构代码后的 13.0-CURRENT。                                                                                                                     |
| 1300078 | [358020](https://svnweb.freebsd.org/changeset/base/358020)                                       | 2020 年 2 月 17 日  | 在更改 struct vnet 和 VNET 魔术 Cookie 后的 13.0-CURRENT。                                                                                                           |
| 1300079 | [358164](https://svnweb.freebsd.org/changeset/base/358164)                                       | 2020 年 2 月 20 日  | 升级 ncurses 到 6.2.x 后的 13.0-CURRENT                                                                                                                          |
| 1300080 | [358172](https://svnweb.freebsd.org/changeset/base/358172)                                       | 2020 年 2 月 20 日  | 13.0-CURRENT 添加 realpathat 系统调用到 VFS 之后。                                                                                                                    |
| 1300081 | [358218](https://svnweb.freebsd.org/changeset/base/358218)                                       | 2020 年 2 月 21 日  | 13.0-CURRENT 在最近的 linuxkpi 更改之后。                                                                                                                            |
| 1300082 | [358497](https://svnweb.freebsd.org/changeset/base/358497)                                       | 2020 年 3 月 1 日   | 删除 bktr(4)后的 13.0-CURRENT。                                                                                                                                  |
| 1300083 | [358834](https://svnweb.freebsd.org/changeset/base/358834)                                       | 2020 年 3 月 10 日  | 移除 amd(8)后的 13.0-CURRENT，r358821。                                                                                                                           |
| 1300084 | [358851](https://svnweb.freebsd.org/changeset/base/358851)                                       | 2020 年 3 月 10 日  | 更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 至 10.0.0-rc3 c290cb61fdc 后的 13.0-CURRENT。                                                      |
| 1300085 | [359261](https://svnweb.freebsd.org/changeset/base/359261)                                       | 2020 年 3 月 23 日  | 在导入 kyua 测试框架后的 13.0-CURRENT。                                                                                                                               |
| 1300086 | [359347](https://svnweb.freebsd.org/changeset/base/359347)                                       | 2020 年 3 月 26 日  | 在将 powerpc 和 powerpcspe 切换到 lld 链接器后的 13.0-CURRENT。                                                                                                         |
| 1300087 | [359374](https://svnweb.freebsd.org/changeset/base/359374)                                       | 2020 年 3 月 27 日  | 在内核加密的驱动程序和消费者接口重构后的 13.0-CURRENT。                                                                                                                          |
| 1300088 | [359530](https://svnweb.freebsd.org/changeset/base/359530)                                       | 2020 年 4 月 1 日   | 删除 procfs 进程调试支持后的 13.0-CURRENT。                                                                                                                            |
| 1300089 | [359727](https://svnweb.freebsd.org/changeset/base/359727)                                       | 2020 年 4 月 8 日   | 将 RCU 接口克隆到 LinuxKPI 中的可睡眠部分和不可睡眠部分后的 13.0-CURRENT。                                                                                                         |
| 1300090 | [359747](https://svnweb.freebsd.org/changeset/base/359747)                                       | 2020 年 4 月 9 日   | 在移除使用 Giant 的旧 NFS 锁设备驱动程序后的 13.0-CURRENT。                                                                                                                  |
| 1300091 | [359839](https://svnweb.freebsd.org/changeset/base/359839)                                       | 2020 年 4 月 12 日  | 实现 close\_range(2)系统调用后的 13.0-CURRENT。                                                                                                                      |
| 1300092 | [359920](https://svnweb.freebsd.org/changeset/base/359920)                                       | 2020 年 4 月 14 日  | 在 KTLS 重新设计未映射的 mbuf 后，13.0-CURRENT 可以在 mbuf 本身携带 ext\_pgs 。                                                                                                |
| 1300093 | [360418](https://svnweb.freebsd.org/changeset/base/360418)                                       | 2020 年 4 月 27 日  | 在 13.0-CURRENT 中添加了对内核 TLS 接收卸载的支持。                                                                                                                         |
| 1300094 | [360796](https://svnweb.freebsd.org/changeset/base/360796)                                       | 2020 年 5 月 7 日   | linuxkpi 更改后的 13.0-CURRENT。                                                                                                                                 |
| 1300095 | [361275](https://svnweb.freebsd.org/changeset/base/361275)                                       | 2020 年 5 月 20 日  | 在为 FreeBSD 客户端添加 HyperV 套接字支持后的 13.0-CURRENT。                                                                                                               |
| 1300096 | [361410](https://svnweb.freebsd.org/changeset/base/361410)                                       | 2020 年 5 月 23 日  | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 更新至 10.0.1 rc1 f79cd71e145 后的 13.0-CURRENT。                                                    |
| 1300097 | [361724](https://svnweb.freebsd.org/changeset/base/361724)                                       | 2020 年 6 月 2 日   | 在 LinuxKPI 中实现 \_\_is\_constexpr() 函数宏后的 13.0-CURRENT。                                                                                                      |
| 1300098 | [362159](https://svnweb.freebsd.org/changeset/base/362159)                                       | 2020 年 6 月 14 日  | 在将 export\_args ex\_flags 字段更改为 64 位后的 13.0-CURRENT。                                                                                                        |
| 1300099 | [362453](https://svnweb.freebsd.org/changeset/base/362453)                                       | 2020 年 6 月 20 日  | 在 13.0-CURRENT 中，使用 libmd 实现 SHA256 来替代 liblzma。                                                                                                            |
| 1300100 | [362640](https://svnweb.freebsd.org/changeset/base/362640)                                       | 2020 年 6 月 26 日  | 在更改 NFS 内核模块之间的内部 API 后的 13.0-CURRENT。                                                                                                                      |
| 1300101 | [363077](https://svnweb.freebsd.org/changeset/base/363077)                                       | 2020 年 7 月 10 日  | 在 LinuxKPI 中实现 array\_size() 功能后的 13.0-CURRENT。                                                                                                             |
| 1300102 | [363562](https://svnweb.freebsd.org/changeset/base/363562)                                       | 2020 年 7 月 26 日  | 在 VFS 层实现无锁查找后的 13.0-CURRENT。                                                                                                                               |
| 1300103 | [363757](https://svnweb.freebsd.org/changeset/base/363757)                                       | 2020 年 8 月 1 日   | 在为 NDINIT\_ALL 强制权利后，13.0-CURRENT                                                                                                                           |
| 1300104 | [363783](https://svnweb.freebsd.org/changeset/base/363783)                                       | 2020 年 8 月 2 日   | 13.0-CURRENT 在 vnode 布局更改之后。                                                                                                                                |
| 1300105 | [363894](https://svnweb.freebsd.org/changeset/base/363894)                                       | 2020 年 8 月 5 日   | 13.0-CURRENT 在 vaccess() 更改之后。                                                                                                                              |
| 1300106 | [364092](https://svnweb.freebsd.org/changeset/base/364092)                                       | 2020 年 8 月 11 日  | 在添加一个参数到 newnfs\_connect() ，指示连接使用 TLS 后的 13.0-CURRENT 。                                                                                                    |
| 1300107 | [364109](https://svnweb.freebsd.org/changeset/base/364109)                                       | 2020 年 8 月 11 日  | 在更改克隆与 RCU 相关的任务结构字段后的 13.0-CURRENT。                                                                                                                        |
| 1300108 | [364233](https://svnweb.freebsd.org/changeset/base/364233)                                       | 2020 年 8 月 14 日  | 在 linuxkpi 中添加了一些 wait\_bit 函数，这些函数是从 Linux v5.4 中的 DRM 所需的，13.0-CURRENT。                                                                                   |
| 1300109 | [364274](https://svnweb.freebsd.org/changeset/base/364274)                                       | 2020 年 8 月 16 日  | 在 vget() 参数移除和 namei 标志重新编号之后的 13.0-CURRENT。                                                                                                                |
| （未更改）   | [364284](https://svnweb.freebsd.org/changeset/base/364284)                                       | 2020 年 8 月 16 日  | 在更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 至 release/11.x llvmorg-11.0.0-rc1-47-gff47911ddfc 后的 13.0-CURRENT。                            |
| 1300110 | [364331](https://svnweb.freebsd.org/changeset/base/364331)                                       | 2020 年 8 月 18 日  | 删除未使用的 use\_ext 参数后的 13.0-CURRENT 到 nfscl\_reqstart() 。                                                                                                     |
| 1300111 | [364476](https://svnweb.freebsd.org/changeset/base/364476)                                       | 2020 年 8 月 22 日  | 在内核 RPC 中添加 TLS 支持后的 13.0-CURRENT。                                                                                                                          |
| 1300112 | [364747](https://svnweb.freebsd.org/changeset/base/364747)                                       | 2020 年 8 月 25 日  | 在合并 OpenZFS 支持后的 13.0-CURRENT。                                                                                                                              |
| 1300113 | [364753](https://svnweb.freebsd.org/changeset/base/364753)                                       | 2020 年 8 月 25 日  | 在向 libcompiler\_rt 添加原子和 bswap 函数后的 13.0-CURRENT。                                                                                                           |
| 1300114 | [365459](https://svnweb.freebsd.org/changeset/base/365459)                                       | 2020 年 9 月 8 日   | 在更改 arm64 AT\_HWCAP 定义以供 elf\_aux\_info(3) 后的 13.0-CURRENT。                                                                                                 |
| 1300115 | [365705](https://svnweb.freebsd.org/changeset/base/365705)                                       | 2020 年 9 月 14 日  | 通过修复与 crunchgen(1) 应用程序构建相关的 WARNS=6 后的 13.0-CURRENT。                                                                                                       |
| 1300116 | [366062](https://svnweb.freebsd.org/changeset/base/366062)                                       | 2020 年 9 月 22 日  | 引入 powerpc64le ARCH 后的 13.0-CURRENT。                                                                                                                        |
| 1300117 | [366070](https://svnweb.freebsd.org/changeset/base/366070)                                       | 2020 年 9 月 23 日  | 在重新实现 purgevfs 以迭代 vnodes 而不是整个哈希之后的 13.0-CURRENT。                                                                                                          |
| 1300118 | [366374](https://svnweb.freebsd.org/changeset/base/366374)                                       | 2020 年 10 月 2 日  | 在向 linuxkpi 添加背光支持和 dmi\_\* 功能后的 13.0-CURRENT。                                                                                                              |
| 1300119 | [366432](https://svnweb.freebsd.org/changeset/base/366432)                                       | 2020 年 10 月 6 日  | 在 LinuxKPI 中填充 ww\_mutex 的获取上下文字段后的 13.0-CURRENT。                                                                                                           |
| 1300120 | [366666](https://svnweb.freebsd.org/changeset/base/366666)                                       | 2020 年 10 月 13 日 | 13.0-CURRENT 在修复 arm64 写入只读映射之后。                                                                                                                            |
| 1300121 | [366719](https://svnweb.freebsd.org/changeset/base/366719)                                       | 2020 年 10 月 15 日 | 13.0-CURRENT 在添加 VOP\_EAGAIN 后。                                                                                                                             |
| 1300122 | [366782](https://svnweb.freebsd.org/changeset/base/366782)                                       | 2020 年 10 月 17 日 | 添加 ptsname\_r 后的 13.0-CURRENT。                                                                                                                              |
| 1300123 | [366871](https://svnweb.freebsd.org/changeset/base/366871)                                       | 2020 年 10 月 20 日 | 在 VOP 、 VPTOCNP 和 INACTIVE 更改后的 13.0-CURRENT。                                                                                                               |
| 1300124 | [367162](https://svnweb.freebsd.org/changeset/base/367162)                                       | 2020 年 10 月 30 日 | 在添加 cache\_vop\_mkdir 并将 cache\_rename 重命名为 cache\_vop\_rename 后的 13.0-CURRENT。                                                                             |
| 1300125 | [367347](https://svnweb.freebsd.org/changeset/base/367347)                                       | 2020 年 11 月 4 日  | 在拆卸处理中使用 rms 锁后的 13.0-CURRENT。                                                                                                                              |
| 1300126 | [367384](https://svnweb.freebsd.org/changeset/base/367384)                                       | 2020 年 11 月 5 日  | 在合理化 per-cpu zones 后的 13.0-CURRENT。                                                                                                                         |
| 1300127 | [367432](https://svnweb.freebsd.org/changeset/base/367432)                                       | 2020 年 11 月 6 日  | 将 malloc\_type\_internal 移入 malloc\_type 后的 13.0-CURRENT。                                                                                                   |
| 1300128 | [367522](https://svnweb.freebsd.org/changeset/base/367522)                                       | 2020 年 11 月 9 日  | 在 LinuxKPI 添加后的 13.0-CURRENT 中，实现了基本系统中 drm-kmod 所需的 ACPI 位。                                                                                                |
| 1300129 | [367627](https://svnweb.freebsd.org/changeset/base/367627)                                       | 2020 年 11 月 12 日 | 在退役 `malloc_last_fail` 后的 13.0-CURRENT。                                                                                                                     |
| 1300130 | [367777](https://svnweb.freebsd.org/changeset/base/367777)                                       | 2020 年 11 月 17 日 | 在 `p_pd` / `pwddesc` 从 `p_fd` / filedesc 分离后的 13.0-CURRENT。                                                                                                 |
| 1300131 | [368417](https://svnweb.freebsd.org/changeset/base/368417)                                       | 2020 年 12 月 7 日  | 删除加密文件描述符后的 13.0-CURRENT。                                                                                                                                   |
| 1300132 | [368659](https://svnweb.freebsd.org/changeset/base/368659)                                       | 2020 年 12 月 15 日 | 当改善 USB 栈中的备用设置处理后，13.0-CURRENT                                                                                                                             |
| 1300133 | [2ed0c8d801f5](https://cgit.freebsd.org/src/commit/?id=2ed0c8d801f5f72dbde7a7d30135c1cc361a1e90) | 2020 年 12 月 23 日 | 在修改 NFS 和内核 RPC 模块之间的内部 API 后的 13.0-CURRENT。                                                                                                                |
| 1300134 | [a84b0e94cdbf](https://cgit.freebsd.org/src/commit/?id=a84b0e94cdbf1a17a798ab7f77375aacb4d400ff) | 2021 年 1 月 7 日   | 13.0-CURRENT 分离 USB HID 支持的硬件独立部分到一个新的模块。                                                                                                                   |
| 1300135 | [35a39dc5b349](https://cgit.freebsd.org/src/commit/?id=35a39dc5b34962081eeda8dbcf0b99a31585499b) | 2021 年 1 月 12 日  | 添加 kernel\_fpu\_begin / kernel\_fpu\_end 到 LinuxKPI 后的 13.0-CURRENT。                                                                                        |
| 1300136 | [72c551930be1](https://cgit.freebsd.org/src/commit/?id=72c551930be195b5ea982c1b16767f54388424f2) | 2021 年 1 月 17 日  | 13.0-CURRENT 在重新在快速 taskqueue 上实现 LinuxKPI 的 irq\_work 队列后。                                                                                                 |
| 1300137 | [010196adcfaf](https://cgit.freebsd.org/src/commit/?id=010196adcfaf2bb610725394d40691874b4ff2af) | 2021 年 1 月 30 日  | 修复构建 devel/onetbb 时修复 clang 断言的 13.0-CURRENT port。                                                                                                          |
| 1300138 | [dcee9964238b](https://cgit.freebsd.org/src/commit/?id=dcee9964238b12a8e55917f292139f074b1a80b2) | 2021 年 2 月 1 日   | 将无锁符号链接查找添加到 vfs 缓存后的 13.0-ALPHA3。                                                                                                                          |
| 1300139 | [91a07ed50ffc](https://cgit.freebsd.org/src/commit/?id=91a07ed50ffca4dfada3e7f1f050ea746c1bac66) | 2021 年 2 月 2 日   | 添加各种 LinuxKPI 位后与 drm-kmod 冲突的 13.0-ALPHA3。                                                                                                                 |
| 1300500 | [3c6a89748a01](https://cgit.freebsd.org/src/commit/?id=3c6a89748a01869c18955d5e3bfcdf35f6705d26) | 2021 年 2 月 5 日   | 13.0-STABLE 在 releng/13.0 分支后。                                                                                                                              |
| 1300501 | [c3f97dd75a1c](https://cgit.freebsd.org/src/commit/?id=c3f97dd75a1c294c4f60f42b604ee8bcda17be09) | 2021 年 4 月 23 日  | 在修复 rtld 的 dl\_iterate\_phdr() 后的 13.0-STABLE。                                                                                                              |
| 1300501 | [c3f97dd75a1c](https://cgit.freebsd.org/src/commit/?id=c3f97dd75a1c294c4f60f42b604ee8bcda17be09) | 2021 年 4 月 23 日  | 在修复 rtld 的 dl\_iterate\_phdr() 后的 13.0-STABLE 。                                                                                                             |
| 1300502 | [da6a8ccfa293](https://cgit.freebsd.org/src/commit/?id=da6a8ccfa293c3c831fdde51169754fcb9587657) | 2021 年 4 月 23 日  | 在 LinuxKPI 中实现 atomic\_dec\_and\_lock\_irqsave() 后的 13.0-STABLE。                                                                                            |
| 1300503 | [d60c6dc8f69b](https://cgit.freebsd.org/src/commit/?id=d60c6dc8f69b1264c7af5e2479ea94f000fd2c6d) | 2021 年 4 月 23 日  | 13.0-STABLE 更改 krpc 和 NFS 之间的内部 KAPI 后。                                                                                                                     |
| 1300504 | [fb34817c686c](https://cgit.freebsd.org/src/commit/?id=fb34817c686cc130449325499870e36979899801) | 2021 年 4 月 30 日  | 在更新 LinuxKPI 以适应 drm-kmod 5.5 更新后的 13.0-STABLE。                                                                                                             |
| 1300505 | [8f81f190a640](https://cgit.freebsd.org/src/commit/?id=8f81f190a640e211dd814bdde7811982b9491fb0) | 2021 年 5 月 10 日  | 在 nscl.ko 和 nfscommon.ko 模块之间更改内部 KAPI 后的 13.0-STABLE。                                                                                                      |
| 1300506 | [e31579b8558d](https://cgit.freebsd.org/src/commit/?id=e31579b8558db508dfc3f8fc276611a7c3c93aa1) | 2021 年 6 月 2 日   | 在为 VLAN 和 VxLAN 添加 TCP LRO 支持后的 13.0-STABLE。                                                                                                                |
| 1300507 | [c64d1bd7145b](https://cgit.freebsd.org/src/commit/?id=c64d1bd7145b5d30c97d1cd99e584da529d95100) | 2021 年 6 月 2 日   | 在向 EPOCH(9) 跟踪器结构添加新成员后的 13.0-STABLE。                                                                                                                       |
| 1300508 | [658f5eed38c3](https://cgit.freebsd.org/src/commit/?id=658f5eed38c35f3f7d6695110b7dae8dc94d12c7) | 2021 年 6 月 11 日  | 添加 LinuxKPI 中的 might\_lock\_nested() 和 lockdep\_(re/un/)pin\_lock() 宏之后的 13.0-STABLE。                                                                       |
| 1300509 | [210349325af9](https://cgit.freebsd.org/src/commit/?id=210349325af9920d1535ad76fa3b92847684f6e0) | 2021 年 6 月 14 日  | 在为 LinuxKPI 添加一个 list\_for\_each\_entry\_lockless() 宏之后的 13.0-STABLE。                                                                                       |
| 1300510 | [eb3397588e1b](https://cgit.freebsd.org/src/commit/?id=eb3397588e1b48043e166587ea454f60efea88d0) | 2021 年 6 月 26 日  | 经过在 krpc 和 nfsd 模块之间更改内部 KAPI 后的 13.0-STABLE。                                                                                                               |
| 1300511 | [2622570aeb3d](https://cgit.freebsd.org/src/commit/?id=2622570aeb3d162812d72f7ef192c322cd8b73ef) | 2021 年 7 月 7 日   | 改变 softdep\_prelink() 为仅在另一个线程自先前 prelink 更改了 vnode 元数据后执行同步的 13.0-STABLE。                                                                                  |
| 1300512 | [f72db34d2295](https://cgit.freebsd.org/src/commit/?id=f72db34d2295080f57a283858125aa906c0d409e) | 2021 年 7 月 18 日  | 在各种合并到 LinuxKPI、OFED、net80211 和驱动程序之后的 13.0-STABLE。                                                                                                         |
| 1300513 | [af732203b8f7](https://cgit.freebsd.org/src/commit/?id=af732203b8f7f006927528db5497f5cbc4c4742a) | 2021 年 7 月 31 日  | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-12.0.1-0-gfed41342a82f（即 12.0.1 发布版本）后的 13.0-STABLE。                               |
| 1300514 | [53d162819c20](https://cgit.freebsd.org/src/commit/?id=53d162819c20e5cf267cb91f7a19940e96e8bec4) | 2021 年 8 月 3 日   | 内部接口之间的 KBI 的不兼容更改需要重新构建模块。                                                                                                                                 |
| 1300515 | [0437d10e359e](https://cgit.freebsd.org/src/commit/?id=0437d10e359ea1cbefff8d17cd18ca491dbbd5d7) | 2021 年 9 月 22 日  | 13.0-STABLE 返回到 13.0 KBI 为 linuxkpi。                                                                                                                        |
| 1300518 | [a017868e2818](https://cgit.freebsd.org/src/commit/?id=a017868e281874261a560ba1e3069b4e14b7483e) | 2021 年 10 月 21 日 | 加入 crypto\_cursor\_segment() 后的 13.0-STABLE 。                                                                                                               |
| 1300519 | [fe2827f1678b](https://cgit.freebsd.org/src/commit/?id=fe2827f1678b8ff0baf62a1529b2cc121a25b090) | 2021 年 10 月 21 日 | 在 OCF 中扩展 AES-CCM 和 Chacha20-Poly1305 密码，以支持多个随机数长度后的 13.0-STABLE。                                                                                          |
| 1300521 | [29745cf91cfc](https://cgit.freebsd.org/src/commit/?id=29745cf91cfc22afa94da0ce43e07a6dc377f631) | 2021 年 11 月 19 日 | 在各种合并到 LinuxKPI 和 net80211 之后的 13.0-STABLE。                                                                                                                 |
| 1300522 | [0c8684ae2001](https://cgit.freebsd.org/src/commit/?id=0c8684ae20019b63c6672cc9fa40e1426708b007) | 2021 年 11 月 24 日 | 在更改 NFS 模块之间的内部 KAPI 后，13.0-STABLE                                                                                                                          |
| （未更改）   | [7224d4125ab5](https://cgit.freebsd.org/src/commit/?id=7224d4125ab57bc1c4c799a6c286be42f8d37a83) | 2021 年 12 月 6 日  | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 更新到 llvmorg-13.0.0-0-gd7b669b3a303（即 13.0.0 发布版本）后的 13.0-STABLE。                               |
| 1300523 | [690bcf605d84](https://cgit.freebsd.org/src/commit/?id=690bcf605d84283c1f9d254885a3cac69c5e80a6) | 2021 年 12 月 18 日 | 在向 VOP\_ALLOCATE(9)添加两个参数后的 13.0-STABLE。                                                                                                                    |
| 1300524 | [dc4114875ef1](https://cgit.freebsd.org/src/commit/?id=dc4114875ef10618002d3eeb46f09dc42da56b30) | 2022 年 1 月 14 日  | 在使 CPU\_SET 宏与 glibc 兼容后的 13.0-STABLE。                                                                                                                      |
| 1300525 | [dee0854a009c](https://cgit.freebsd.org/src/commit/?id=dee0854a009cde7dcdb16ba39754237737022c8a) | 2022 年 1 月 22 日  | 在 drm-kmod 需要的多个 LinuxKPI 更改之后的 13.0-STABLE。                                                                                                                |
| 1300526 | [c39ff2415cb9](https://cgit.freebsd.org/src/commit/?id=c39ff2415cb965b729fd16f9eae91e712313877b) | 2022 年 2 月 20 日  | 多次 LinuxKPI 更改后的 13.0-STABLE 重叠但与 drm-kmod 不冲突。                                                                                                             |
| 1301000 | [ad329796bdb2](https://cgit.freebsd.org/src/commit/?id=ad329796bdb29c69bce610ad332d08257d7157ac) | 2022 年 3 月 10 日  | releng/13.1 分支。                                                                                                                                             |
| 1301500 | [08523c8c63bb](https://cgit.freebsd.org/src/commit/?id=08523c8c63bbcdcd3f0d36787a544817cb5b8282) | 2022 年 3 月 10 日  | releng/13.1 分支后的 13.1-STABLE。                                                                                                                               |
| 1301501 | [6663718bb496](https://cgit.freebsd.org/src/commit/?id=6663718bb49635deac3f5dc55fa6f0f7cba593ba) | 2022 年 3 月 27 日  | 在对 LinuxKPI 和 net80211 进行各种合并后的 13.1-STABLE。                                                                                                                |
| 1301502 | [2278cf4e48e7](https://cgit.freebsd.org/src/commit/?id=2278cf4e48e7679b0a60008a83c764fe852174b2) | 2022 年 4 月 27 日  | 在各种合并到 LinuxKPI 后的 13.1-STABLE。                                                                                                                             |
| 1301503 | [b2aa64d05bd8](https://cgit.freebsd.org/src/commit/?id=b2aa64d05bd8b04a1bdb63f2a5f9de39c600b463) | 2022 年 5 月 19 日  | 添加替代 DRIVER\_MODULE 宏而没有 devclass 参数后的 13.1-STABLE。                                                                                                         |
| 1301504 | [a13b6fc61908](https://cgit.freebsd.org/src/commit/?id=a13b6fc61908fd6afa460b88f94e4a67be74bb9a) | 2022 年 6 月 4 日   | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-14.0.3-0-g1f9140064dfb（即 14.0.3 发布版本）后的 13.1-STABLE。                               |
| 1301505 | [6f93a76ffeab](https://cgit.freebsd.org/src/commit/?id=6f93a76ffeabf7d4488edc73a0cca01436c2903b) | 2022 年 6 月 21 日  | 在进行各种合并到 LinuxKPI 后的 13.1-STABLE。                                                                                                                           |
| 1301506 | [8e6cfc632cf6](https://cgit.freebsd.org/src/commit/?id=8e6cfc632cf6f9fc906df9d825649443939b55c6) | 2022 年 7 月 13 日  | 添加\<crypto/chacha20\_poly1305.h>和\<crypto/curve25519.h>后，13.1-STABLE。                                                                                       |
| 1301507 | [9cbba5950123](https://cgit.freebsd.org/src/commit/?id=9cbba5950123f3afedcc5f24c43956e7a26f22f4) | 2022 年 6 月 21 日  | 13.1-STABLE 经过对 LinuxKPI 的各种合并后。                                                                                                                            |
| 1301508 | [83ac15a799e3](https://cgit.freebsd.org/src/commit/?id=83ac15a799e348c391951f5877feecd4089bab80) | 2022 年 10 月 17 日 | 在各种合并到 LinuxKPI 后的 13.1-STABLE 版本，并用于去除宏定义的 pause()。                                                                                                        |
| 1301509 | [baa97013121a](https://cgit.freebsd.org/src/commit/?id=baa97013121a915057ee54dfcb2cb87e541f7d7f) | 2022 年 10 月 19 日 | 引入 TX 队列选择功能 v2 后的 13.1-STABLE。                                                                                                                             |
| 1301510 | [6820a0512fa6](https://cgit.freebsd.org/src/commit/?id=6820a0512fa6616ee1da46cb0075da80478776f0) | 2022 年 12 月 8 日  | LinuxKPI dmi\_matches() 修复后的 13.1-STABLE。                                                                                                                   |
| 1301511 | [17333d92643d](https://cgit.freebsd.org/src/commit/?id=17333d92643d998d1c6a2dc5f6b1508b6507ad31) | 2022 年 12 月 17 日 | 添加新的 rc 后的 13.1-STABLE： machine\_id 生成 /etc/machine-id 。                                                                                                    |
| 1302500 | [c243de11cf7c](https://cgit.freebsd.org/src/commit/?id=c243de11cf7c4bb3d67bbc1655b149037e5b04f1) | 2023 年 2 月 9 日   | 在 releng/13.2 分支后的 13.2-STABLE。                                                                                                                             |
| 1302501 | [e3068d2655e2](https://cgit.freebsd.org/src/commit/?id=e3068d2655e2aea3e0b462a7298a68d344769ec6) | 2023 年 2 月 16 日  | 在将 totalram\_pages() 添加到 LinuxKPI 后的 13.2-STABLE。                                                                                                           |
| 1302502 | [5ca371f4f536](https://cgit.freebsd.org/src/commit/?id=5ca371f4f536f9ee9d6c9fb178bf1f7f6de33216) | 2023 年 2 月 17 日  | LinuxKPI 合并后的 13.2-STABLE 版本。                                                                                                                               |
| 1302503 | [aaca677fee21](https://cgit.freebsd.org/src/commit/?id=aaca677fee21f202db4bb974fc5056f4dcbbb598) | 2023 年 2 月 21 日  | 在各种合并到 LinuxKPI 后的 13.2-STABLE。                                                                                                                             |
| 1302504 | [d6852eed98ed](https://cgit.freebsd.org/src/commit/?id=d6852eed98ed32ad51120a22aa1ebdf0601917b3) | 2023 年 3 月 12 日  | 在将机器 ID 合并到 13.2-STABLE 后 hostid\_save 。                                                                                                                    |
| 1302505 | [85e32e957fcc](https://cgit.freebsd.org/src/commit/?id=85e32e957fcca01d50e29e543584909795c1acef) | 2023 年 4 月 9 日   | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-15.0.7-0-g8dfdcc7b7bf6（即 15.0.7 发布版本）后的 13.2-STABLE。                               |
| 1302506 | [e982b1cf1fe1](https://cgit.freebsd.org/src/commit/?id=e982b1cf1fe1dc0b84dc24f03d1c21e3fe6bdef3) | 2023 年 6 月 26 日  | 在各种合并到 LinuxKPI 之后的 13.2-STABLE。                                                                                                                            |
| 1302507 | [b2acc21dfbd6](https://cgit.freebsd.org/src/commit/?id=b2acc21dfbd6fab28b1715c775b43d4914b75e0c) | 2023 年 7 月 23 日  | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-16.0.6-0-g7cbf1a259152（即 16.0.6 发布版本）后的 13.2-STABLE。                               |
| 1302508 | [21ccba43f511](https://cgit.freebsd.org/src/commit/?id=21ccba43f511cc4089899619b5a85e6d83a200dc) | 2023 年 9 月 6 日   | ptrace 开始在 PT\_DETACH 期间清除 TDB\_BORN 后的 13.2-STABLE。                                                                                                        |
| 1302509 | [faedeaf7377b](https://cgit.freebsd.org/src/commit/?id=faedeaf7377ba7253c281cf3315b17e0cb979075) | 2023 年 12 月 2 日  | 在添加名为 `vfs_exjail_clone()` 且将被 ZFS 模块使用的新 VFS 函数后的 13.2-STABLE。                                                                                             |
| 1302510 | [45758665781d](https://cgit.freebsd.org/src/commit/?id=45758665781dd63dfa38bcb646d4f36b0a6a104f) | 2024 年 1 月 7 日   | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-17.0.6-0-g6009708b4367（即 17.0.6 发布版本）后的 13.2-STABLE。                               |
| 1303001 | [a75a3d7afcc8](https://cgit.freebsd.org/src/commit/?id=a75a3d7afcc88dc0bc9b2797cce983056acadf10) | 2024 年 2 月 19 日  | 更改 net80211 struct ieee80211vap 内部后的 13.3-BETA3。                                                                                                            |
| 1303501 | [a7e1fc7f620d](https://cgit.freebsd.org/src/commit/?id=a7e1fc7f620d3341549c1380f550aaafbdb45622) | 2024 年 2 月 19 日  | 更改 net80211 struct ieee80211vap 内部后的 13.3-STABLE。                                                                                                           |
| 1303502 | [07839ae99c06](https://cgit.freebsd.org/src/commit/?id=07839ae99c06fcbebd5da6ead49c160c32046542) | 2024 年 3 月 23 日  | 在修复构建最新的 boost 库时发生 clang 断言或崩溃后，13.3-STABLE。                                                                                                               |
| 1303503 | [055e875e6077](https://cgit.freebsd.org/src/commit/?id=055e875e6077ed1eb2256c3ab5de59a3f6fbce18) | 2024 年 4 月 20 日  | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-18.1.3-0-gc13b7485b879（即 18.1.3 发布版本）后的 13.3-STABLE。                               |
| 1304500 | [77064cddb948](https://cgit.freebsd.org/src/commit/?id=77064cddb94875dc8d9693a93ac25019b7f62c59) | 2024 年 8 月 1 日   | 从 13.4-PRERELEASE 重命名为 13.4-STABLE。                                                                                                                         |
| 1304501 | [b802ab153dd2](https://cgit.freebsd.org/src/commit/?id=b802ab153dd24f468b9bfe33a96c61408e0d0565) | 2024 年 12 月 1 日  | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-19.1.4-0-gaadaa00de76e（即 19.1.4 发布版本）后的 13.4-STABLE。                               |

## 18.5. FreeBSD 12 版本

**表 5. FreeBSD 12 \_\_FreeBSD\_version 值**

| 值       | 修订版本                                                                                             | 日期               | 发布                                                                                                                                 |
| ------- | ------------------------------------------------------------------------------------------------ | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| 1200000 | [302409](https://svnweb.freebsd.org/changeset/base/302409)                                       | 2016 年 7 月 7 日   | 12.0-CURRENT.                                                                                                                      |
| 1200001 | [302628](https://svnweb.freebsd.org/changeset/base/302628)                                       | 2016 年 7 月 12 日  | 从 `[a-z]`-type 范围中删除排序规则后的 12.0-CURRENT。                                                                                           |
| 1200002 | [304395](https://svnweb.freebsd.org/changeset/base/304395)                                       | 2016 年 8 月 18 日  | 删除未使用和过时的 `openbsd_poll` 系统调用后的 12.0-CURRENT。                                                                                      |
| 1200003 | [304608](https://svnweb.freebsd.org/changeset/base/304608)                                       | 2016 年 8 月 22 日  | 在修订版 303795 中添加 C++11 `thread_local` 支持后的 12.0-CURRENT。                                                                            |
| 1200004 | [304752](https://svnweb.freebsd.org/changeset/base/304752)                                       | 2016 年 8 月 24 日  | 在为 `newlocale(3)` 和 `querylocale(3)` 修复 LC\*MASK 后的 12.0-CURRENT（修订版 304703）。                                                      |
| 1200005 | [304789](https://svnweb.freebsd.org/changeset/base/304789)                                       | 2016 年 8 月 25 日  | 在修订版 304787 中更改 iSCSI 用户空间程序和内核之间的一些 ioctl 接口后的 12.0-CURRENT。                                                                      |
| 1200006 | [305256](https://svnweb.freebsd.org/changeset/base/305256)                                       | 2016 年 9 月 1 日   | 在修订版 305254 中修复 `crunchgen(1)` `META_MODE` 后的 12.0-CURRENT。                                                                        |
| 1200007 | [305421](https://svnweb.freebsd.org/changeset/base/305421)                                       | 2016 年 9 月 5 日   | 在解决 `device_detach()` 和 `usbd_do_request_flags(9)` 之间的死锁后的 12.0-CURRENT。                                                           |
| 1200008 | [305833](https://svnweb.freebsd.org/changeset/base/305833)                                       | 2016 年 9 月 15 日  | 在修订版 305824 中移除 4.3BSD 兼容宏 `m_copy()` 后的 12.0-CURRENT。                                                                             |
| 1200009 | [306077](https://svnweb.freebsd.org/changeset/base/306077)                                       | 2016 年 9 月 21 日  | 在修订版 305988 中移除 `bio_taskqueue()` 后的 12.0-CURRENT。                                                                                 |
| 1200010 | [306276](https://svnweb.freebsd.org/changeset/base/306276)                                       | 2016 年 9 月 23 日  | 在默认使用 `longnames` 支持挂载 `msdosfs(5)` 后的 12.0-CURRENT。                                                                               |
| 1200011 | [306556](https://svnweb.freebsd.org/changeset/base/306556)                                       | 2016 年 10 月 1 日  | 在修订版 306555 中向 `fb_info` 添加 `fb_memattr` 字段后的 12.0-CURRENT。                                                                        |
| 1200012 | [306592](https://svnweb.freebsd.org/changeset/base/306592)                                       | 2016 年 10 月 2 日  | 在 `net80211(4)` 更改后的 12.0-CURRENT（修订 306590、306591）。                                                                               |
| 1200013 | [307140](https://svnweb.freebsd.org/changeset/base/307140)                                       | 2016 年 10 月 12 日 | 在安装与 `libzfs_core` 一起开发所需的头文件后的 12.0-CURRENT。                                                                                      |
| 1200014 | [307529](https://svnweb.freebsd.org/changeset/base/307529)                                       | 2016 年 10 月 17 日 | 在合并 `rtwn(4)` 和 `urtwn(4)` 中的公共代码，并添加对 802.11ac 设备的支持后的 12.0-CURRENT。                                                              |
| 1200015 | [308874](https://svnweb.freebsd.org/changeset/base/308874)                                       | 2016 年 11 月 20 日 | 在一些用于修复 powerpc 的 ABI 更改后的 12.0-CURRENT。                                                                                           |
| 1200016 | [309017](https://svnweb.freebsd.org/changeset/base/309017)                                       | 2016 年 11 月 22 日 | 从 `vmmeter` 中删除 `PG_CACHED` 相关字段后的 12.0-CURRENT。                                                                                   |
| 1200017 | [309124](https://svnweb.freebsd.org/changeset/base/309124)                                       | 2016 年 11 月 25 日 | 在将 clang、llvm、lldb、compiler-rt 和 libc++ 升级到 3.9.0，并添加 lld 3.9.0 后的 12.0-CURRENT。                                                   |
| 1200018 | [309676](https://svnweb.freebsd.org/changeset/base/309676)                                       | 2016 年 12 月 7 日  | 在向 `struct kinfo_proc` 和 `struct kinfo_proc32` 添加 `ki_moretdname` 成员以将整个线程名称导出到用户空间实用程序后的 12.0-CURRENT。                            |
| 1200019 | [310149](https://svnweb.freebsd.org/changeset/base/310149)                                       | 2016 年 12 月 16 日 | 在开始为 11ac 支持打下基础后的 12.0-CURRENT。                                                                                                   |
| 1200020 | [312087](https://svnweb.freebsd.org/changeset/base/312087)                                       | 2017 年 1 月 13 日  | 删除 `fgetsock` 和 `fputsock` 后的 12.0-CURRENT。                                                                                        |
| 1200021 | [313858](https://svnweb.freebsd.org/changeset/base/313858)                                       | 2017 年 2 月 16 日  | 删除 MCA 和 EISA 支持后的 12.0-CURRENT。                                                                                                   |
| 1200022 | [314040](https://svnweb.freebsd.org/changeset/base/314040)                                       | 2017 年 2 月 21 日  | 在使 LinuxKPI 任务结构在系统调用之间持久化后的 12.0-CURRENT。                                                                                         |
| （未更改）   | [314373](https://svnweb.freebsd.org/changeset/base/314373)                                       | 2017 年 3 月 2 日   | 删除 System V Release 4 二进制兼容性支持后的 12.0-CURRENT。                                                                                     |
| 1200023 | [314564](https://svnweb.freebsd.org/changeset/base/314564)                                       | 2017 年 3 月 2 日   | 在将 clang、llvm、lld、lldb、compiler-rt 和 libc++ 的副本升级到 4.0.0 后的 12.0-CURRENT。                                                          |
| 1200024 | [314865](https://svnweb.freebsd.org/changeset/base/314865)                                       | 2017 年 3 月 7 日   | 删除 `pcap-int.h` 后的 12.0-CURRENT。                                                                                                   |
| 1200025 | [315430](https://svnweb.freebsd.org/changeset/base/315430)                                       | 2017 年 3 月 16 日  | 添加 `<dev/mmc/mmc_ioctl.h>` 头文件后的 12.0-CURRENT。                                                                                     |
| 1200026 | [315662](https://svnweb.freebsd.org/changeset/base/315662)                                       | 2017 年 3 月 16 日  | 从用户空间隐藏 `struct inpcb` 和 `struct tcpcb` 后的 12.0-CURRENT。                                                                           |
| 1200027 | [315673](https://svnweb.freebsd.org/changeset/base/315673)                                       | 2017 年 3 月 21 日  | 使 CAM SIM 锁变为可选后的 12.0-CURRENT。                                                                                                    |
| 1200028 | [316683](https://svnweb.freebsd.org/changeset/base/316683)                                       | 2017 年 4 月 10 日  | 在修订版 316648 中将 `smp_no_rendevous_barrier()` 重命名为 `smp_no_rendezvous_barrier()` 后的 12.0-CURRENT。                                    |
| 1200029 | [317176](https://svnweb.freebsd.org/changeset/base/317176)                                       | 2017 年 4 月 19 日  | 在修订版 317061 中从 `struct pcpu` 移除 `struct vmmeter` 后的 12.0-CURRENT。                                                                  |
| 1200030 | [317383](https://svnweb.freebsd.org/changeset/base/317383)                                       | 2017 年 4 月 24 日  | 在移除 NATM 支持（包括 `en(4)`、`fatm(4)`、`hatm(4)` 和 `patm(4)`）后的 12.0-CURRENT。                                                            |
| 1200031 | [318736](https://svnweb.freebsd.org/changeset/base/318736)                                       | 2017 年 5 月 23 日  | 在 `ino_t`、`dev_t` 和 `nlink_t` 扩展到 64 位并 `struct dirent` 更改布局后的 12.0-CURRENT（也称为 `ino64`）。                                          |
| 1200032 | [319664](https://svnweb.freebsd.org/changeset/base/319664)                                       | 2017 年 6 月 8 日   | 移除 `groff` 后的 12.0-CURRENT。                                                                                                        |
| 1200033 | [320043](https://svnweb.freebsd.org/changeset/base/320043)                                       | 2017 年 6 月 17 日  | 在将 `struct event` 成员 `data` 的类型增加到 64 位并添加 `ext` 结构成员后的 12.0-CURRENT。                                                              |
| 1200034 | [320085](https://svnweb.freebsd.org/changeset/base/320085)                                       | 2017 年 6 月 19 日  | 在 NFS 客户端和服务器实际使用 64 位 `ino_t` 后的 12.0-CURRENT。                                                                                    |
| 1200035 | [320317](https://svnweb.freebsd.org/changeset/base/320317)                                       | 2017 年 6 月 24 日  | 添加 `MAP_GUARD` `mmap(2)` 标志后的 12.0-CURRENT。                                                                                        |
| 1200036 | [320347](https://svnweb.freebsd.org/changeset/base/320347)                                       | 2017 年 6 月 26 日  | 在 powerpc 上将 `time_t` 更改为 64 位后的 12.0-CURRENT（32 位版本）。                                                                             |
| 1200037 | [320545](https://svnweb.freebsd.org/changeset/base/320545)                                       | 2017 年 7 月 1 日   | 在清理和内联 `bus_dmamap*` 函数后的 12.0-CURRENT（320528）。                                                                                    |
| 1200038 | [320879](https://svnweb.freebsd.org/changeset/base/320879)                                       | 2017 年 7 月 10 日  | 在 MMC CAM 提交后的 12.0-CURRENT（320844）。                                                                                               |
| 1200039 | [321369](https://svnweb.freebsd.org/changeset/base/321369)                                       | 2017 年 7 月 22 日  | 在将 clang、llvm、lld、lldb、compiler-rt 和 libc++ 的副本升级到 5.0.0（trunk r308421）后的 12.0-CURRENT。                                            |
| 1200040 | [321688](https://svnweb.freebsd.org/changeset/base/321688)                                       | 2017 年 7 月 29 日  | 在添加 NFS 客户端强制卸载支持 `umount -N` 后的 12.0-CURRENT。                                                                                     |
| 1200041 | [322762](https://svnweb.freebsd.org/changeset/base/322762)                                       | 2017 年 8 月 21 日  | 在 `WRFSBASE` 指令于 amd64 上可用后的 12.0-CURRENT。                                                                                         |
| 1200042 | [322900](https://svnweb.freebsd.org/changeset/base/322900)                                       | 2017 年 8 月 25 日  | 在将 `PLPMTUD` 计数器更改为使用 `counter(9)` 后的 12.0-CURRENT。                                                                                |
| 1200043 | [322989](https://svnweb.freebsd.org/changeset/base/322989)                                       | 2017 年 8 月 28 日  | 在将 x86 `CACHE_LINE_SIZE` 降至 64 字节后的 12.0-CURRENT。                                                                                  |
| 1200044 | [323349](https://svnweb.freebsd.org/changeset/base/323349)                                       | 2017 年 9 月 8 日   | 在 LinuxKPI 中实现 `poll_wait()` 后的 12.0-CURRENT。                                                                                      |
| 1200045 | [323706](https://svnweb.freebsd.org/changeset/base/323706)                                       | 2017 年 9 月 18 日  | 在 LinuxKPI 中添加共享内存支持后的 12.0-CURRENT（323703）。                                                                                       |
| 1200046 | [323910](https://svnweb.freebsd.org/changeset/base/323910)                                       | 2017 年 9 月 22 日  | 在为 LinuxKPI 添加 32 位兼容性 IOCTL 支持后的 12.0-CURRENT。                                                                                    |
| 1200047 | [324053](https://svnweb.freebsd.org/changeset/base/324053)                                       | 2017 年 9 月 26 日  | 删除 `M_HASHTYPE_RSS_UDP_IPV4_EX` 后的 12.0-CURRENT（324052）。                                                                           |
| 1200048 | [324227](https://svnweb.freebsd.org/changeset/base/324227)                                       | 2017 年 10 月 2 日  | 从用户空间隐藏 `struct socket` 和 `struct unpcb` 后的 12.0-CURRENT。                                                                          |
| 1200049 | [324281](https://svnweb.freebsd.org/changeset/base/324281)                                       | 2017 年 10 月 4 日  | 向 `struct diocgattr_arg` 添加 `value.u16` 字段后的 12.0-CURRENT。                                                                         |
| 1200050 | [324342](https://svnweb.freebsd.org/changeset/base/324342)                                       | 2017 年 10 月 5 日  | 添加 `armv7` `MACHINE_ARCH` 后的 12.0-CURRENT（324340）。                                                                                 |
| 1200051 | [324455](https://svnweb.freebsd.org/changeset/base/324455)                                       | 2017 年 10 月 9 日  | 删除 `libstand.a` 作为公共接口后的 12.0-CURRENT（324454）。                                                                                     |
| 1200052 | [325028](https://svnweb.freebsd.org/changeset/base/325028)                                       | 2017 年 10 月 26 日 | 在修复 `ptrace()` 以在恢复时总是清除正确的线程事件后的 12.0-CURRENT。                                                                                    |
| 1200053 | [325506](https://svnweb.freebsd.org/changeset/base/325506)                                       | 2017 年 11 月 7 日  | 在更改 `struct mbuf` 布局以为接收数据包添加可选硬件时间戳后的 12.0-CURRENT。                                                                               |
| 1200054 | [325852](https://svnweb.freebsd.org/changeset/base/325852)                                       | 2017 年 11 月 15 日 | 在更改 `struct vmtotal` 布局以允许报告大内存计数器后的 12.0-CURRENT。                                                                                 |
| 1200055 | [327740](https://svnweb.freebsd.org/changeset/base/327740)                                       | 2018 年 1 月 9 日   | 添加 `cpucontrol -e` 支持后的 12.0-CURRENT。                                                                                              |
| 1200056 | [327952](https://svnweb.freebsd.org/changeset/base/327952)                                       | 2018 年 1 月 14 日  | 在将 clang、llvm、lld、lldb、compiler-rt 和 libc++ 升级到 6.0.0 后的 12.0-CURRENT（分支/release\_60 r321788）。                                     |
| 1200057 | [329033](https://svnweb.freebsd.org/changeset/base/329033)                                       | 2018 年 2 月 8 日   | 在应用 clang 6.0.0 修复以使 wine Ports 能够正确构建后的 12.0-CURRENT。                                                                             |
| 1200058 | [329166](https://svnweb.freebsd.org/changeset/base/329166)                                       | 2018 年 2 月 12 日  | 在提交 Lua 加载程序后的 12.0-CURRENT。                                                                                                       |
| 1200059 | [330299](https://svnweb.freebsd.org/changeset/base/330299)                                       | 2018 年 3 月 2 日   | 在删除 `union semun` 的声明（除非定义了 `_WANT_SEMUN`），还删除 `struct mymsg` 并重命名 `struct semid_ds` 和 `struct msgid_ds` 的仅内核成员后的 12.0-CURRENT。    |
| 1200060 | [330384](https://svnweb.freebsd.org/changeset/base/330384)                                       | 2018 年 3 月 4 日   | 在将 clang、llvm、lld、lldb、compiler-rt 和 libc++ 升级到 6.0.0 发行版后的 12.0-CURRENT。                                                          |
| 1200061 | [332100](https://svnweb.freebsd.org/changeset/base/332100)                                       | 2018 年 4 月 6 日   | 在更改 `syslog(3)` 以使其发出符合 RFC 5424 格式的消息后的 12.0-CURRENT。                                                                             |
| 1200062 | [332423](https://svnweb.freebsd.org/changeset/base/332423)                                       | 2018 年 4 月 12 日  | 在更改 Netmap API 后的 12.0-CURRENT。                                                                                                    |
| 1200063 | [333446](https://svnweb.freebsd.org/changeset/base/333446)                                       | 2018 年 5 月 10 日  | 在重新设计 CTL 前端和后端选项以使用 `nv(3)` 并允许创建多个 ioctl 前端端口后的 12.0-CURRENT。                                                                    |
| 1200064 | [334074](https://svnweb.freebsd.org/changeset/base/334074)                                       | 2018 年 5 月 22 日  | 在更改 ifnet 地址和多播地址 TAILQ 为 CK\_STAILQ 后的 12.0-CURRENT。                                                                              |
| 1200065 | [334290](https://svnweb.freebsd.org/changeset/base/334290)                                       | 2018 年 5 月 28 日  | 在更改 `dwatch(1)` 以允许 `-E code` 覆盖配置文件 EVENT\_DETAILS 后的 12.0-CURRENT。                                                               |
| 1200066 | [334466](https://svnweb.freebsd.org/changeset/base/334466)                                       | 2018 年 6 月 1 日   | 在删除英特尔内核中的 PMC 表后的 12.0-CURRENT。                                                                                                   |
| 1200067 | [334892](https://svnweb.freebsd.org/changeset/base/334892)                                       | 2018 年 6 月 9 日   | 在将 `DW_LANG` 常量添加到 `libdwarf` 后的 12.0-CURRENT。                                                                                     |
| 1200068 | [334930](https://svnweb.freebsd.org/changeset/base/334930)                                       | 2018 年 6 月 12 日  | 在 NFS 模块之间更改接口后的 12.0-CURRENT。                                                                                                     |
| 1200069 | [335237](https://svnweb.freebsd.org/changeset/base/335237)                                       | 2018 年 6 月 15 日  | 在将 `struct kerneldumpheader` 更改为版本 4 后的 12.0-CURRENT（类似于 11-STABLE 及之前版本中的版本 2）。                                                   |
| 1200070 | [335873](https://svnweb.freebsd.org/changeset/base/335873)                                       | 2018 年 7 月 2 日   | 在 amd64 和 i386 上将 `atomic(9)` 内联到模块后（需要对这些架构的所有消费者模块进行重建）的 12.0-CURRENT。                                                           |
| 1200071 | [335930](https://svnweb.freebsd.org/changeset/base/335930)                                       | 2018 年 7 月 4 日   | 在更改 `epoch(9)` 的 ABI 和 API（335924）后（需要重新构建消费者模块）的 12.0-CURRENT。                                                                    |
| 1200072 | [335979](https://svnweb.freebsd.org/changeset/base/335979)                                       | 2018 年 7 月 5 日   | 在更改 `struct xinpcb` 及其相关结构的 ABI 和 API 后的 12.0-CURRENT。                                                                             |
| 1200073 | [336313](https://svnweb.freebsd.org/changeset/base/336313)                                       | 2018 年 7 月 15 日  | 在更改 `struct if_shared_ctx` 和 `struct if_softc_ctx` 的 ABI 和 API（要求 `iflib(9)` 消费者模块重新构建）后的 12.0-CURRENT。                            |
| 1200074 | [336360](https://svnweb.freebsd.org/changeset/base/336360)                                       | 2018 年 7 月 16 日  | 在更新 `libstdc++` 配置以使用 C99 函数后的 12.0-CURRENT。                                                                                       |
| 1200075 | [336538](https://svnweb.freebsd.org/changeset/base/336538)                                       | 2018 年 7 月 19 日  | 在将 `zfsloader` 合并到 loader 中、将 `ntpd:ntpd` 添加为 `uid:gid` 123:123 以及移除 arm 大端支持（`MACHINE_ARCH=armeb`）后的 12.0-CURRENT。                |
| 1200076 | [336914](https://svnweb.freebsd.org/changeset/base/336914)                                       | 2018 年 7 月 30 日  | 在对 `timespecadd` 进行 KPI 更改后的 12.0-CURRENT。                                                                                         |
| 1200077 | [337576](https://svnweb.freebsd.org/changeset/base/337576)                                       | 2018 年 8 月 10 日  | 在将 `timespec_get(3)` 添加到系统后的 12.0-CURRENT。                                                                                         |
| 1200078 | [337863](https://svnweb.freebsd.org/changeset/base/337863)                                       | 2018 年 8 月 15 日  | 在为 Jail 添加 `exec.created` 钩子后的 12.0-CURRENT。                                                                                       |
| 1200079 | [338061](https://svnweb.freebsd.org/changeset/base/338061)                                       | 2018 年 8 月 19 日  | 在将 `arc4random` 转换为使用 Chacha20 算法并弃用 `arc4random_stir` 和 `arc4random_addrandom` 后的 12.0-CURRENT。                                   |
| 1200080 | [338172](https://svnweb.freebsd.org/changeset/base/338172)                                       | 2018 年 8 月 22 日  | 在删除 drm 驱动程序后的 12.0-CURRENT。                                                                                                       |
| 1200081 | [338182](https://svnweb.freebsd.org/changeset/base/338182)                                       | 2018 年 8 月 21 日  | 在对 NVMe 进行 KPI 更改后的 12.0-CURRENT。                                                                                                  |
| 1200082 | [338285](https://svnweb.freebsd.org/changeset/base/338285)                                       | 2018 年 8 月 24 日  | 在撤销 drm 驱动程序的移除后的 12.0-CURRENT。                                                                                                    |
| 1200083 | [338331](https://svnweb.freebsd.org/changeset/base/338331)                                       | 2018 年 8 月 26 日  | 在删除 `arc4random_stir` 和 `arc4random_addrandom` 后的 12.0-CURRENT。                                                                    |
| 1200084 | [338478](https://svnweb.freebsd.org/changeset/base/338478)                                       | 2018 年 9 月 5 日   | 在更新 `objcopy(1)` 以正确处理小端 MIPS64 目标文件后的 12.0-CURRENT。                                                                               |
| 1200085 | [339270](https://svnweb.freebsd.org/changeset/base/339270)                                       | 2018 年 10 月 19 日 | 在将 OpenSSL 更新到版本 1.1.1 后的 12.0-STABLE。                                                                                             |
| 1200086 | [339732](https://svnweb.freebsd.org/changeset/base/339732)                                       | 2018 年 10 月 25 日 | 在更新 OpenSSL 共享库版本号后的 12.0-STABLE。                                                                                                  |
| 1200500 | [340471](https://svnweb.freebsd.org/changeset/base/340471)                                       | 2018 年 11 月 16 日 | 在 releng/12.0 分支后的 12-STABLE。                                                                                                      |
| 1200501 | [342801](https://svnweb.freebsd.org/changeset/base/342801)                                       | 2019 年 1 月 6 日   | 在合并修复 `linux_destroy_dev()` 行为（当仍有文件从销毁的 cdev 打开时）后的 12-STABLE。                                                                    |
| 1200502 | [343126](https://svnweb.freebsd.org/changeset/base/343126)                                       | 2019 年 1 月 17 日  | 在启用从 C++ 中 `#include` `sys/random.h` 后的 12-STABLE。                                                                                 |
| 1200503 | [344152](https://svnweb.freebsd.org/changeset/base/344152)                                       | 2019 年 2 月 15 日  | 在合并修复 CAPABILITIES 内核下 `renameat(2)` 后的 12-STABLE。                                                                                 |
| 1200504 | [345169](https://svnweb.freebsd.org/changeset/base/345169)                                       | 2019 年 3 月 15 日  | 在合并 CCM 以使 ZoF Ports 受益后的 12-STABLE。                                                                                               |
| 1200505 | [345327](https://svnweb.freebsd.org/changeset/base/345327)                                       | 2019 年 3 月 20 日  | 在合并支持有选择地禁用 ZFS 而不禁用加载程序后的 12-STABLE。                                                                                              |
| 1200506 | [346168](https://svnweb.freebsd.org/changeset/base/346168)                                       | 2019 年 4 月 12 日  | 在合并 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 8.0.0 最终发布 r356365 后的 12-STABLE。                                     |
| 1200507 | [346337](https://svnweb.freebsd.org/changeset/base/346337)                                       | 2019 年 4 月 17 日  | 在 345303、345658 和部分 345305 的 `iflib` 更改 MFC 后的 12-STABLE。                                                                          |
| 1200508 | [346784](https://svnweb.freebsd.org/changeset/base/346784)                                       | 2019 年 4 月 27 日  | 在 `ether_gen_addr` 可用后的 12-STABLE。                                                                                                 |
| 1200509 | [347790](https://svnweb.freebsd.org/changeset/base/347790)                                       | 2019 年 5 月 16 日  | 在提升 Mellanox 驱动程序版本号（`mlx4en(4)`；`mlx5en(4)`）后的 12-STABLE。                                                                         |
| 1200510 | [348036](https://svnweb.freebsd.org/changeset/base/348036)                                       | 2019 年 5 月 21 日  | 在从 348035 更改 linuxkpi 中的结构后的 12-STABLE。                                                                                            |
| 1200511 | [348243](https://svnweb.freebsd.org/changeset/base/348243)                                       | 2019 年 5 月 24 日  | 在 MFC 347843：向 LinuxKPI 的 `task_struct` 结构添加 `group_leader` 成员后的 12-STABLE。                                                        |
| 1200512 | [348245](https://svnweb.freebsd.org/changeset/base/348245)                                       | 2019 年 5 月 24 日  | 在 LinuxKPI 的 `ww_mutex` 中添加上下文成员后的 12-STABLE。                                                                                      |
| 1200513 | [349763](https://svnweb.freebsd.org/changeset/base/349763)                                       | 2019 年 7 月 5 日   | 在 MFC `epoch(9)` 更改后的 12-STABLE：349763, 340404, 340415, 340417, 340419, 340420。                                                    |
| 1200514 | [350083](https://svnweb.freebsd.org/changeset/base/350083)                                       | 2019 年 7 月 17 日  | 在向 LinuxKPI 的 `rcu` 列表添加内容后的 12-STABLE。                                                                                            |
| 1200515 | [350877](https://svnweb.freebsd.org/changeset/base/350877)                                       | 2019 年 8 月 11 日  | 在 MFC 349891（将 SRCS 列表重新组织为每行一个文件，然后按字母顺序排列）和 349972（添加 `arm_sync_icache()` 和 `arm_drain_writebuf()` sysarch 系统调用包装器）后的 12-STABLE。 |
| 1200516 | [351276](https://svnweb.freebsd.org/changeset/base/351276)                                       | 2019 年 8 月 20 日  | 在 MFC 对 `iflib` 的各种更改 351276 后的 12-STABLE。                                                                                         |
| 1200517 | [352076](https://svnweb.freebsd.org/changeset/base/352076)                                       | 2019 年 9 月 9 日   | 在向 LinuxKPI 添加可在一次调用中处理多个文件的 `sysfs` 创建/删除函数后的 12-STABLE。                                                                          |
| 1200518 | [352114](https://svnweb.freebsd.org/changeset/base/352114)                                       | 2019 年 9 月 10 日  | 在对 LinuxKPI 的 `sysfs` 进行额外更新后的 12-STABLE。                                                                                          |
| 1200519 | [352351](https://svnweb.freebsd.org/changeset/base/352351)                                       | 2019 年 9 月 15 日  | 在 MFC 新的 `fusefs` 驱动程序后的 12-STABLE。                                                                                                |
| 1201000 | [352546](https://svnweb.freebsd.org/changeset/base/352546)                                       | 2019 年 9 月 20 日  | 从 stable/12\@r352480 分支出 releng/12.1 分支。                                                                                           |
| 1201500 | [352547](https://svnweb.freebsd.org/changeset/base/352547)                                       | 2019 年 9 月 20 日  | 在 releng/12.1 分支后的 12-STABLE。                                                                                                      |
| 1201501 | [354598](https://svnweb.freebsd.org/changeset/base/354598)                                       | 2019 年 11 月 10 日 | 在修复 libc++ 中潜在的 OOB 读取安全问题后的 12-STABLE。                                                                                            |
| 1201502 | [354613](https://svnweb.freebsd.org/changeset/base/354613)                                       | 2019 年 11 月 11 日 | 在 LinuxKPI 中启用设备类组属性后的 12-STABLE。                                                                                                  |
| 1201503 | [354928](https://svnweb.freebsd.org/changeset/base/354928)                                       | 2019 年 11 月 21 日 | 在为 `elf_aux_info(3)` 添加对 `AT_EXECPATH` 的支持后的 12-STABLE。                                                                            |
| 1201504 | [355658](https://svnweb.freebsd.org/changeset/base/355658)                                       | 2019 年 11 月 10 日 | 在更正 C++ 版本检查以声明 `timespec_get(3)` 后的 12-STABLE。                                                                                    |
| 1201505 | [355899](https://svnweb.freebsd.org/changeset/base/355899)                                       | 2019 年 12 月 19 日 | 在添加 musl libc 和 glibc 中常见的 `sigsetop` 扩展后的 12-STABLE。                                                                              |
| 1201506 | [355968](https://svnweb.freebsd.org/changeset/base/355968)                                       | 2019 年 12 月 21 日 | 在 64 位平台上将 `ARG_MAX` 的值加倍后的 12-STABLE。                                                                                             |
| 1201507 | [356306](https://svnweb.freebsd.org/changeset/base/356306)                                       | 2020 年 1 月 2 日   | 在 `bitstring(3)` 中添加函数，以查找连续的设置或未设置的位序列后的 12-STABLE。                                                                               |
| 1201508 | [356394](https://svnweb.freebsd.org/changeset/base/356394)                                       | 2020 年 1 月 6 日   | 在将 USB 统计数据从每个总线更改为每个设备后的 12-STABLE。                                                                                               |
| 1201509 | [356460](https://svnweb.freebsd.org/changeset/base/356460)                                       | 2020 年 1 月 7 日   | 在更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 至 9.0.0 最终版 r372316 后的 12-STABLE。                                    |
| 1201510 | [356679](https://svnweb.freebsd.org/changeset/base/356679)                                       | 2020 年 1 月 13 日  | 在为被取消的 USB 传输添加自己的计数器后的 12-STABLE。                                                                                                 |
| 1201511 | [357333](https://svnweb.freebsd.org/changeset/base/357333)                                       | 2020 年 1 月 31 日  | 在添加 **/etc/os-release** 作为到 **/var/run/os-release** 的符号链接后的 12-STABLE。                                                             |
| 1201512 | [357612](https://svnweb.freebsd.org/changeset/base/357612)                                       | 2020 年 2 月 6 日   | 在最近的 LinuxKPI 更改后的 12-STABLE。                                                                                                      |
| 1201513 | [359957](https://svnweb.freebsd.org/changeset/base/359957)                                       | 2020 年 4 月 15 日  | 在将 RCU 接口克隆到 LinuxKPI 中的可睡眠部分和不可睡眠部分后的 12-STABLE。                                                                                  |
| 1201514 | [360525](https://svnweb.freebsd.org/changeset/base/360525)                                       | 2020 年 5 月 1 日   | 在 LinuxKPI 中实现完整的 `bus_dma(9)` 支持并引入所有依赖项后的 12-STABLE。                                                                             |
| 1201515 | [360545](https://svnweb.freebsd.org/changeset/base/360545)                                       | 2020 年 5 月 1 日   | 在更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 到 10.0.0 版本后的 12-STABLE。                                             |
| 1201516 | [360620](https://svnweb.freebsd.org/changeset/base/360620)                                       | 2020 年 5 月 4 日   | 在将 `id_mapped` 移动到 `bus_dma_impl` 结构末尾以保留 KPI 后的 12-STABLE。                                                                        |
| 1201517 | [361350](https://svnweb.freebsd.org/changeset/base/361350)                                       | 2020 年 5 月 21 日  | 在将 `vm.max_wired` 重命名为 `vm.max_user_wired` 并更改其类型后的 12-STABLE。                                                                     |
| 1201518 | [362319](https://svnweb.freebsd.org/changeset/base/362319)                                       | 2020 年 6 月 18 日  | 在 LinuxKPI 中实现 `__is_constexpr()` 函数宏后的 12-STABLE。                                                                                 |
| 1201519 | [362916](https://svnweb.freebsd.org/changeset/base/362916)                                       | 2020 年 7 月 4 日   | 在使 liblzma 使用 libmd 的 `SHA256` 实现后的 12-STABLE。                                                                                     |
| 1201520 | [363494](https://svnweb.freebsd.org/changeset/base/363494)                                       | 2020 年 7 月 24 日  | 在更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 到 10.0.1 版本后的 12-STABLE。                                             |
| 1201521 | [363790](https://svnweb.freebsd.org/changeset/base/363790)                                       | 2020 年 8 月 3 日   | 在 LinuxKPI 中实现 `array_size()` 函数后的 12-STABLE。                                                                                      |
| 1201522 | [363832](https://svnweb.freebsd.org/changeset/base/363832)                                       | 2020 年 8 月 4 日   | 在添加 `sysctlbyname` 系统调用后的 12-STABLE。                                                                                               |
| 1201523 | [364390](https://svnweb.freebsd.org/changeset/base/364390)                                       | 2020 年 8 月 19 日  | 在更改为克隆与 `RCU` 有关的任务结构字段后的 12-STABLE。                                                                                               |
| 1201524 | [365356](https://svnweb.freebsd.org/changeset/base/365356)                                       | 2020 年 9 月 5 日   | 在将 XDR 拆分为单独的内核模块以最小化 ZFS 依赖项后的 12-STABLE。                                                                                         |
| 1201525 | [365471](https://svnweb.freebsd.org/changeset/base/365471)                                       | 2020 年 9 月 8 日   | 在将原子和 `bswap` 函数添加到 libcompiler\_rt 后的 12-STABLE。                                                                                  |
| 1201526 | [365608](https://svnweb.freebsd.org/changeset/base/365608)                                       | 2020 年 9 月 10 日  | 在更新 `net80211` 并更改内核特权检查 `API` 后的 12-STABLE。                                                                                       |
| 1202000 | [365618](https://svnweb.freebsd.org/changeset/base/365618)                                       | 2020 年 9 月 11 日  | 从 stable/12\@r365618 分支出 releng/12.2 分支。                                                                                           |
| 1202500 | [365619](https://svnweb.freebsd.org/changeset/base/365619)                                       | 2020 年 9 月 11 日  | 在 releng/12.2 分支后的 12-STABLE。                                                                                                      |
| 1202501 | [365661](https://svnweb.freebsd.org/changeset/base/365661)                                       | 2020 年 9 月 12 日  | 在跟进提交到 libcompiler\_rt 后的 12-STABLE。                                                                                               |
| 1202502 | [365816](https://svnweb.freebsd.org/changeset/base/365816)                                       | 2020 年 9 月 16 日  | 在修复 `crunchgen(1)` 应用程序构建（使用 `WARNS=6`）后的 12-STABLE。                                                                               |
| 1202503 | [366878](https://svnweb.freebsd.org/changeset/base/366878)                                       | 2020 年 10 月 20 日 | 在 LinuxKPI 中填充 `ww_mutex` 的获取上下文字段后的 12-STABLE。                                                                                    |
| 1202504 | [367511](https://svnweb.freebsd.org/changeset/base/367511)                                       | 2020 年 11 月 9 日  | 在添加 `ptsname_r(3)` 后的 12-STABLE。                                                                                                   |
| 1202505 | [f3d75bed5475](https://cgit.freebsd.org/src/commit/?id=f3d75bed5475b15f21edf4052665b1212b548bd0) | 2020 年 12 月 28 日 | 在 USB 堆栈中改进处理备用设置后的 12-STABLE。                                                                                                     |
| 1202506 | [d36cc12ddfe3](https://cgit.freebsd.org/src/commit/?id=d36cc12ddfe3335ec8306bd4b393f11069551fa0) | 2021 年 4 月 30 日  | 在更改 krpc 和 NFS 之间的内部 `KAPI` 后的 12-STABLE。                                                                                          |
| 1202507 | [1e279fe9deae](https://cgit.freebsd.org/src/commit/?id=1e279fe9deaea1c5e3503117dd3077dcffb1276d) | 2021 年 5 月 10 日  | 在更改 `nscl.ko` 和 `nfscommon.ko` 模块之间的内部 `KAPI` 后的 12-STABLE。                                                                        |
| 1202508 | [489236b04748](https://cgit.freebsd.org/src/commit/?id=489236b0474857b0a7a2df77c302290e12be9e7b) | 2021 年 6 月 26 日  | 在更改 krpc 和 nfsd 模块之间的内部 `KAPI` 后的 12-STABLE。                                                                                       |
| 1203500 | [f2900e784cb0](https://cgit.freebsd.org/src/commit/?id=f2900e784cb024e55ec0f5cd6834af5fadcb9f9a) | 2021 年 10 月 20 日 | 在 releng/12.3 分支后的 12-STABLE。                                                                                                      |
| 1203501 | [b148c7b87148](https://cgit.freebsd.org/src/commit/?id=b148c7b87148b653fdbef9c5aa591b9abcd99e26) | 2021 年 12 月 22 日 | 在将原子和 `bswap` 函数添加到 libcompiler\_rt 后的 12-STABLE。                                                                                  |
| 1203502 | [4772e4135cb3](https://cgit.freebsd.org/src/commit/?id=4772e4135cb3fe7f25531894f3b02f35ec086bda) | 2021 年 12 月 22 日 | 在更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 到 11.0.1 后的 12-STABLE。                                               |
| 1203503 | [e405b2dc913c](https://cgit.freebsd.org/src/commit/?id=e405b2dc913c99189aa9b923ed686a790253cc7e) | 2021 年 12 月 25 日 | 在更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 到 12.0.0 后的 12-STABLE。                                               |
| 1203504 | [1a398266112e](https://cgit.freebsd.org/src/commit/?id=1a398266112e73f91a4f2e2701ceefd3f2948aac) | 2021 年 12 月 25 日 | 在 aarch64 上将外联 LSE 原子帮助器添加到 libcompiler\_rt.a 后的 12-STABLE。                                                                        |
| 1203505 | [0b7be89b329e](https://cgit.freebsd.org/src/commit/?id=0b7be89b329e0f862c25f34abfb13c75a4d45f2a) | 2021 年 12 月 25 日 | 在更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 到 13.0.0 后的 12-STABLE。                                               |
| 1203506 | [f591279d9c93](https://cgit.freebsd.org/src/commit/?id=f591279d9c93bc2ea9cd1a447c2df11d437fbc7b) | 2022 年 2 月 12 日  | 在恢复 `random(4)` 可用性折衷后的 12-STABLE。                                                                                                 |
| 1203507 | [180d95e04e93](https://cgit.freebsd.org/src/commit/?id=180d95e04e938328de8f2a24d16fdb5049e15262) | 2022 年 4 月 9 日   | 在 `zlib` 统一后的 12-STABLE。                                                                                                           |
| 1203508 | [6c717a28505d](https://cgit.freebsd.org/src/commit/?id=6c717a28505d3e77a0c3780ca1f65eb85b538eb9) | 2022 年 10 月 19 日 | 在 `iflib` 后的 12-STABLE：允许驱动程序确定在哪个队列上进行 `TX`。                                                                                      |
| 1204000 | [fce871fe3520](https://cgit.freebsd.org/src/commit/?id=fce871fe35204527a2ce08e43e1572ae9295cc00) | 2022 年 10 月 20 日 | releng/12.4 从 stable/12 分支出来。                                                                                                      |
| 1204500 | [6a9031c5e2ba](https://cgit.freebsd.org/src/commit/?id=6a9031c5e2ba5435aa4ea08ee05c351d5bef035d) | 2022 年 10 月 20 日 | 在 releng/12.4 分支后的 12-STABLE。                                                                                                      |

## 18.6. FreeBSD 11 版本

**表 6. FreeBSD 11 \_\_FreeBSD\_version 值**

| 值       | 修订                                                         | 日期               | 发布                                                                                                                                                     |
| ------- | ---------------------------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 1100000 | [256284](https://svnweb.freebsd.org/changeset/base/256284) | 2013 年 10 月 10 日 | 11.0-CURRENT.                                                                                                                                          |
| 1100001 | [256776](https://svnweb.freebsd.org/changeset/base/256776) | 2013 年 10 月 19 日 | 在添加对"首次启动" `rc.d` 脚本支持后的 11.0-CURRENT，因此 Ports 可以利用此功能。                                                                                                |
| 1100002 | [257696](https://svnweb.freebsd.org/changeset/base/257696) | 2013 年 11 月 5 日  | 在放弃对历史 ioctl 的支持后的 11.0-CURRENT。                                                                                                                       |
| 1100003 | [258284](https://svnweb.freebsd.org/changeset/base/258284) | 2013 年 11 月 17 日 | 在 iconv 更改后的 11.0-CURRENT。                                                                                                                             |
| 1100004 | [259424](https://svnweb.freebsd.org/changeset/base/259424) | 2013 年 12 月 15 日 | 在 259286 中引入 `gss_pseudo_random` 行为更改后的 11.0-CURRENT。                                                                                                  |
| 1100005 | [260010](https://svnweb.freebsd.org/changeset/base/260010) | 2013 年 12 月 28 日 | 在 259951 后的 11.0-CURRENT - 不要合并 `vm_map_stack(9)` 中的条目。                                                                                                |
| 1100006 | [261246](https://svnweb.freebsd.org/changeset/base/261246) | 2014 年 1 月 28 日  | 在升级 libelf 和 libdwarf 后的 11.0-CURRENT。                                                                                                                 |
| 1100007 | [261283](https://svnweb.freebsd.org/changeset/base/261283) | 2014 年 1 月 30 日  | 在升级 libc++ 至 3.4 版本后的 11.0-CURRENT。                                                                                                                    |
| 1100008 | [261881](https://svnweb.freebsd.org/changeset/base/261881) | 2014 年 2 月 14 日  | 在 libc++ 3.4 ABI 兼容性修复后的 11.0-CURRENT。                                                                                                                 |
| 1100009 | [261991](https://svnweb.freebsd.org/changeset/base/261991) | 2014 年 2 月 16 日  | 在升级至 llvm/clang 3.4 版本后的 11.0-CURRENT。                                                                                                                 |
| 1100010 | [262630](https://svnweb.freebsd.org/changeset/base/262630) | 2014 年 2 月 28 日  | 在升级 ncurses 至 5.9 版本（修订版 262629）后的 11.0-CURRENT。                                                                                                       |
| 1100011 | [263102](https://svnweb.freebsd.org/changeset/base/263102) | 2014 年 3 月 13 日  | 在结构 `if_data` 的 ABI 更改后的 11.0-CURRENT。                                                                                                                 |
| 1100012 | [263140](https://svnweb.freebsd.org/changeset/base/263140) | 2014 年 3 月 14 日  | 在删除 Novell IPX 协议支持后的 11.0-CURRENT。                                                                                                                    |
| 1100013 | [263152](https://svnweb.freebsd.org/changeset/base/263152) | 2014 年 3 月 14 日  | 在删除 AppleTalk 协议支持后的 11.0-CURRENT。                                                                                                                     |
| 1100014 | [263235](https://svnweb.freebsd.org/changeset/base/263235) | 2014 年 3 月 16 日  | 在重命名 **\<sys/capability.h>** 为 **\<sys/capsicum.h>** 后的 11.0-CURRENT，以避免与其他操作系统中同名头文件发生冲突。兼容性头文件仍然保留以减少构建中断，但会在适当时机被弃用。                                |
| 1100015 | [263620](https://svnweb.freebsd.org/changeset/base/263620) | 2014 年 3 月 22 日  | 在 `cnt` 重命名为 `vm_cnt` 后的 11.0-CURRENT。                                                                                                                 |
| 1100016 | [263660](https://svnweb.freebsd.org/changeset/base/263660) | 2014 年 3 月 23 日  | 在添加 `armv6hf TARGET_ARCH` 后的 11.0-CURRENT。                                                                                                             |
| 1100017 | [264121](https://svnweb.freebsd.org/changeset/base/264121) | 2014 年 4 月 4 日   | 在 GCC 支持 `__block` 定义后的 11.0-CURRENT。                                                                                                                  |
| 1100018 | [264212](https://svnweb.freebsd.org/changeset/base/264212) | 2014 年 4 月 6 日   | 在支持 UDP-Lite 协议（RFC 3828）后的 11.0-CURRENT。                                                                                                              |
| 1100019 | [264289](https://svnweb.freebsd.org/changeset/base/264289) | 2014 年 4 月 8 日   | 在 FreeBSD-SA-14:06.openssl 后的 11.0-CURRENT（修订版 264265）。                                                                                                |
| 1100020 | [265215](https://svnweb.freebsd.org/changeset/base/265215) | 2014 年 5 月 1 日   | 在删除 `lindev`、默认使用 **/dev/full** 后的 11.0-CURRENT（修订版 265212）。                                                                                           |
| 1100021 | [266151](https://svnweb.freebsd.org/changeset/base/266151) | 2014 年 5 月 6 日   | 在 **src.opts.mk** 更改后的 11.0-CURRENT，将 `make.conf(5)` 与 `buildworld` 分离（修订版 265419）。                                                                    |
| 1100022 | [266904](https://svnweb.freebsd.org/changeset/base/266904) | 2014 年 5 月 30 日  | 在对 `strcasecmp(3)` 进行更改、将 `strcasecmp_l(3)` 和 `strncasecmp_l(3)` 从 **\<string.h>** 移到 **\<strings.h>** 以符合 POSIX 2008 规范后的 11.0-CURRENT（修订版 266865）。   |
| 1100023 | [267440](https://svnweb.freebsd.org/changeset/base/267440) | 2014 年 6 月 13 日  | 在 CUSE 库和内核模块默认附加到构建后的 11.0-CURRENT。                                                                                                                   |
| 1100024 | [267992](https://svnweb.freebsd.org/changeset/base/267992) | 2014 年 6 月 27 日  | 在 `sysctl(3)` `API` 更改后的 11.0-CURRENT。                                                                                                                 |
| 1100025 | [268066](https://svnweb.freebsd.org/changeset/base/268066) | 2014 年 6 月 30 日  | 在 `regex(3)` 库更新添加 ">" 和 "<" 分隔符后的 11.0-CURRENT。                                                                                                       |
| 1100026 | [268118](https://svnweb.freebsd.org/changeset/base/268118) | 2014 年 7 月 1 日   | 在 NFS 模块之间的内部接口（包括 krpc）被更改后的 11.0-CURRENT（修订版 268115）。                                                                                                |
| 1100027 | [268441](https://svnweb.freebsd.org/changeset/base/268441) | 2014 年 7 月 8 日   | 在 FreeBSD-SA-14:17.kmem 后的 11.0-CURRENT（修订版 268431）。                                                                                                   |
| 1100028 | [268945](https://svnweb.freebsd.org/changeset/base/268945) | 2014 年 7 月 21 日  | 在 `hdestroy(3)` 合规修复更改 ABI 后的 11.0-CURRENT。                                                                                                            |
| 1100029 | [270173](https://svnweb.freebsd.org/changeset/base/270173) | 2014 年 8 月 3 日   | 在 `SOCK_DGRAM` 错误修复后的 11.0-CURRENT（修订版 269489）。                                                                                                        |
| 1100030 | [270929](https://svnweb.freebsd.org/changeset/base/270929) | 2014 年 9 月 1 日   | 在 `SOCK_RAW` 套接字被更改为完全不修改数据包后的 11.0-CURRENT。                                                                                                           |
| 1100031 | [271341](https://svnweb.freebsd.org/changeset/base/271341) | 2014 年 9 月 9 日   | 在 FreeBSD-SA-14:18.openssl 后的 11.0-CURRENT（修订版 269686）。                                                                                                |
| 1100032 | [271438](https://svnweb.freebsd.org/changeset/base/271438) | 2014 年 9 月 11 日  | 在对 `ifa_ifwithbroadaddr`、`ifa_ifwithdstaddr`、`ifa_ifwithnet` 和 `ifa_ifwithroute` 的 API 更改后的 11.0-CURRENT。                                              |
| 1100033 | [271657](https://svnweb.freebsd.org/changeset/base/271657) | 2014 年 9 月 9 日   | 在更改 `access`、`eaccess` 和 `faccessat` 以验证模式参数后的 11.0-CURRENT。                                                                                           |
| 1100034 | [271686](https://svnweb.freebsd.org/changeset/base/271686) | 2014 年 9 月 16 日  | 在 FreeBSD-SA-14:19.tcp 后的 11.0-CURRENT（修订版 271666）。                                                                                                    |
| 1100035 | [271705](https://svnweb.freebsd.org/changeset/base/271705) | 2014 年 9 月 17 日  | 在 i915 硬件上下文支持后的 11.0-CURRENT。                                                                                                                         |
| 1100036 | [271724](https://svnweb.freebsd.org/changeset/base/271724) | 2014 年 9 月 17 日  | 版本升级，使 ABI 注释能够区分适用于严格的 `mmap(2)` 标志检查的二进制文件（修订版 271724）。                                                                                              |
| 1100037 | [272674](https://svnweb.freebsd.org/changeset/base/272674) | 2014 年 10 月 6 日  | 在添加 `explicit_bzero(3)` 后的 11.0-CURRENT（修订版 272673）。                                                                                                   |
| 1100038 | [272951](https://svnweb.freebsd.org/changeset/base/272951) | 2014 年 10 月 11 日 | 在清理 TCP 包装头后的 11.0-CURRENT。                                                                                                                            |
| 1100039 | [273250](https://svnweb.freebsd.org/changeset/base/273250) | 2014 年 10 月 18 日 | 在移除 `MAP_RENAME` 和 `MAP_NORESERVE` 后的 11.0-CURRENT。                                                                                                    |
| 1100040 | [273432](https://svnweb.freebsd.org/changeset/base/273432) | 2014 年 10 月 21 日 | 在 FreeBSD-SA-14:23（修订版 273146）后的 11.0-CURRENT。                                                                                                         |
| 1100041 | [273875](https://svnweb.freebsd.org/changeset/base/273875) | 2014 年 10 月 30 日 | 在对 `syscall_register`、`syscall32_register`、`syscall_register_helper` 和 `syscall32_register_helper` 的 API 更改后的 11.0-CURRENT（修订版 273707）。                |
| 1100042 | [274046](https://svnweb.freebsd.org/changeset/base/274046) | 2014 年 11 月 3 日  | 在对 `struct tcpcb` 更改后的 11.0-CURRENT。                                                                                                                   |
| 1100043 | [274085](https://svnweb.freebsd.org/changeset/base/274085) | 2014 年 11 月 4 日  | 在默认启用 `vt(4)` 后的 11.0-CURRENT。                                                                                                                         |
| 1100044 | [274116](https://svnweb.freebsd.org/changeset/base/274116) | 2014 年 11 月 4 日  | 在添加用于数据吞吐量可视化的新库/工具（`dpv` 和 `figpar`）后的 11.0-CURRENT。                                                                                                  |
| 1100045 | [274162](https://svnweb.freebsd.org/changeset/base/274162) | 2014 年 11 月 4 日  | 在 FreeBSD-SA-14:23、FreeBSD-SA-14:24 和 FreeBSD-SA-14:25 后的 11.0-CURRENT。                                                                                |
| 1100046 | [274470](https://svnweb.freebsd.org/changeset/base/274470) | 2014 年 11 月 13 日 | 在 `kern_poll` 签名更改后的 11.0-CURRENT（修订版 274462）。                                                                                                         |
| 1100047 | [274476](https://svnweb.freebsd.org/changeset/base/274476) | 2014 年 11 月 13 日 | 在移除 VFS 系统调用助手的 `no-at` 版本后的 11.0-CURRENT，例如 `kern_open`。                                                                                              |
| 1100048 | [275358](https://svnweb.freebsd.org/changeset/base/275358) | 2014 年 12 月 1 日  | 在网络代码中开始移除弃用的 `M_FLOWID` 标志后的 11.0-CURRENT。                                                                                                            |
| 1100049 | [275633](https://svnweb.freebsd.org/changeset/base/275633) | 2014 年 12 月 9 日  | 在导入对 `LLVM` 向量化器的重要修复（该向量化器在某些情况下可能导致缓冲区溢出）后的 11.0-CURRENT。                                                                                            |
| 1100050 | [275732](https://svnweb.freebsd.org/changeset/base/275732) | 2014 年 12 月 12 日 | 在向 `OpenCrypto` 添加 `AES-ICM` 和 `AES-GCM` 后的 11.0-CURRENT。                                                                                              |
| 1100051 | [276096](https://svnweb.freebsd.org/changeset/base/276096) | 2014 年 12 月 23 日 | 在从内核中移除旧的 `NFS` 客户端和服务器代码后的 11.0-CURRENT。                                                                                                              |
| 1100052 | [276479](https://svnweb.freebsd.org/changeset/base/276479) | 2014 年 12 月 31 日 | 在升级 `clang`、`llvm` 和 `lldb` 到 3.5.0 发布版后的 11.0-CURRENT。                                                                                                |
| 1100053 | [276781](https://svnweb.freebsd.org/changeset/base/276781) | 2015 年 1 月 7 日   | 在 `MCLGET(9)` 获得返回值后的 11.0-CURRENT（修订版 276750）。                                                                                                        |
| 1100054 | [277213](https://svnweb.freebsd.org/changeset/base/277213) | 2015 年 1 月 15 日  | 在重写 callout 子系统后的 11.0-CURRENT。                                                                                                                        |
| 1100055 | [277528](https://svnweb.freebsd.org/changeset/base/277528) | 2015 年 1 月 22 日  | 在撤销 277213 中的 callout 更改后的 11.0-CURRENT。                                                                                                               |
| 1100056 | [277610](https://svnweb.freebsd.org/changeset/base/277610) | 2015 年 1 月 23 日  | 在添加 `futimens` 和 `utimensat` 系统调用后的 11.0-CURRENT。                                                                                                      |
| 1100057 | [277897](https://svnweb.freebsd.org/changeset/base/277897) | 2015 年 1 月 29 日  | 在移除 `d_thread_t` 后的 11.0-CURRENT。                                                                                                                      |
| 1100058 | [278228](https://svnweb.freebsd.org/changeset/base/278228) | 2015 年 2 月 5 日   | 在添加对 `SCSI VPD` 扩展查询页面（0x86）的探测支持后的 11.0-CURRENT。                                                                                                      |
| 1100059 | [278442](https://svnweb.freebsd.org/changeset/base/278442) | 2015 年 2 月 9 日   | 在导入 `xz 5.2.0` 后的 11.0-CURRENT，增加了多线程压缩，`lzma` 增加了 `libthr` 依赖（修订版 278433）。                                                                            |
| 1100060 | [278846](https://svnweb.freebsd.org/changeset/base/278846) | 2015 年 2 月 16 日  | 在将 `FBIO_BLANK` 转发到帧缓冲客户端后的 11.0-CURRENT。                                                                                                              |
| 1100061 | [278964](https://svnweb.freebsd.org/changeset/base/278964) | 2015 年 2 月 18 日  | 在添加 `CDAI_FLAG_NONE` 后的 11.0-CURRENT。                                                                                                                  |
| 1100062 | [279221](https://svnweb.freebsd.org/changeset/base/279221) | 2015 年 2 月 23 日  | 在添加 `mtio(4)` 和 `sa(4)` 的 `API` 和 `ioctl(2)` 后的 11.0-CURRENT。                                                                                          |
| 1100063 | [279728](https://svnweb.freebsd.org/changeset/base/279728) | 2015 年 3 月 7 日   | 在内核中为 `pps_ioctl()` `API` 添加互斥支持后的 11.0-CURRENT。                                                                                                       |
| 1100064 | [279729](https://svnweb.freebsd.org/changeset/base/279729) | 2015 年 3 月 7 日   | 在向 USB 串行驱动程序添加 `PPS` 支持后的 11.0-CURRENT。                                                                                                               |
| 1100065 | [280031](https://svnweb.freebsd.org/changeset/base/280031) | 2015 年 3 月 15 日  | 在升级 `clang`、`llvm` 和 `lldb` 到 3.6.0 后的 11.0-CURRENT。                                                                                                   |
| 1100066 | [280306](https://svnweb.freebsd.org/changeset/base/280306) | 2015 年 3 月 20 日  | 在从 `OpenSSL` 中移除 `SSLv2` 支持后的 11.0-CURRENT。                                                                                                            |
| 1100067 | [280630](https://svnweb.freebsd.org/changeset/base/280630) | 2015 年 3 月 25 日  | 在从 `fetch(1)` 和 `fetch(3)` 中移除 `SSLv2` 支持后的 11.0-CURRENT。                                                                                              |
| 1100068 | [281172](https://svnweb.freebsd.org/changeset/base/281172) | 2015 年 4 月 6 日   | 在更改 `net.inet6.ip6.mif6table` `sysctl` 后的 11.0-CURRENT。                                                                                                |
| 1100069 | [281550](https://svnweb.freebsd.org/changeset/base/281550) | 2015 年 4 月 15 日  | 在从 `iconv(3)` 中移除 `const` 修饰符后的 11.0-CURRENT。                                                                                                          |
| 1100070 | [281613](https://svnweb.freebsd.org/changeset/base/281613) | 2015 年 4 月 16 日  | 在将 ALTQ 从 **contrib** 移动到 **net/altq** 后的 11.0-CURRENT。                                                                                                |
| 1100071 | [282256](https://svnweb.freebsd.org/changeset/base/282256) | 2015 年 4 月 29 日  | 在对 `smb(4)` 的 `API/ABI` 更改后的 11.0-CURRENT（修订版 281985）。                                                                                                 |
| 1100072 | [282319](https://svnweb.freebsd.org/changeset/base/282319) | 2015 年 5 月 1 日   | 在 `libc` 中添加 `reallocarray(3)` 后的 11.0-CURRENT（修订版 282314）。                                                                                            |
| 1100073 | [282650](https://svnweb.freebsd.org/changeset/base/282650) | 2015 年 5 月 8 日   | 在将 PCM 流中允许的最大 `PCM` 通道数量扩展到 127 并将最大子通道数量减少到 1 后的 11.0-CURRENT。                                                                                       |
| 1100074 | [283526](https://svnweb.freebsd.org/changeset/base/283526) | 2015 年 5 月 25 日  | 在添加对 x86-64 `Linux` 二进制文件的初步支持（修订版 283424），并将 `clang` 和 `llvm` 升级到 3.6.1 后的 11.0-CURRENT。                                                              |
| 1100075 | [283623](https://svnweb.freebsd.org/changeset/base/283623) | 2015 年 5 月 27 日  | 在 `dounmount()` 需要对传递的 `struct mount` 进行引用后的 11.0-CURRENT（修订版 283602）。                                                                                 |
| 1100076 | [283983](https://svnweb.freebsd.org/changeset/base/283983) | 2015 年 6 月 4 日   | 在默认禁用生成传统格式密码数据库条目后的 11.0-CURRENT。                                                                                                                     |
| 1100077 | [284233](https://svnweb.freebsd.org/changeset/base/284233) | 2015 年 6 月 10 日  | 在对 `lim_cur`、`lim_max` 和 `lim_rlimit` 的 `API` 更改后的 11.0-CURRENT（修订版 284215）。                                                                           |
| 1100078 | [286672](https://svnweb.freebsd.org/changeset/base/286672) | 2015 年 8 月 12 日  | 在 `crunchgen(1)` 从 284356 更改至 285986 后的 11.0-CURRENT。                                                                                                  |
| 1100079 | [286874](https://svnweb.freebsd.org/changeset/base/286874) | 2015 年 8 月 18 日  | 在导入 `jemalloc 4.0.0` 后的 11.0-CURRENT（修订版 286866）。                                                                                                      |
| 1100080 | [288943](https://svnweb.freebsd.org/changeset/base/288943) | 2015 年 10 月 5 日  | 在升级 `clang`、`llvm`、`lldb`、`compiler-rt` 和 `libc++` 到 3.7.0 后的 11.0-CURRENT。                                                                            |
| 1100081 | [289415](https://svnweb.freebsd.org/changeset/base/289415) | 2015 年 10 月 16 日 | 在更新 `ZFS` 以支持可恢复的发送/接收后的 11.0-CURRENT（修订版 289362）。                                                                                                     |
| 1100082 | [289594](https://svnweb.freebsd.org/changeset/base/289594) | 2015 年 10 月 19 日 | 在 `Linux KPI` 更新后的 11.0-CURRENT。                                                                                                                       |
| 1100083 | [289749](https://svnweb.freebsd.org/changeset/base/289749) | 2015 年 10 月 22 日 | 在将 **linuxapi.ko** 重命名为 **linuxkpi.ko** 后的 11.0-CURRENT。                                                                                               |
| 1100084 | [290135](https://svnweb.freebsd.org/changeset/base/290135) | 2015 年 10 月 29 日 | 在将 `LinuxKPI` 模块移至默认内核构建后的 11.0-CURRENT。                                                                                                               |
| 1100085 | [290207](https://svnweb.freebsd.org/changeset/base/290207) | 2015 年 10 月 30 日 | 在导入 `OpenSSL 1.0.2d` 后的 11.0-CURRENT。                                                                                                                  |
| 1100086 | [290275](https://svnweb.freebsd.org/changeset/base/290275) | 2015 年 11 月 2 日  | 在使 `figpar(3)` 宏更加唯一后的 11.0-CURRENT。                                                                                                                   |
| 1100087 | [290479](https://svnweb.freebsd.org/changeset/base/290479) | 2015 年 11 月 7 日  | 在更改 `sysctl_add_oid(9)` 的 `ABI` 后的 11.0-CURRENT。                                                                                                       |
| 1100088 | [290495](https://svnweb.freebsd.org/changeset/base/290495) | 2015 年 11 月 7 日  | 在字符串排序和 locale 重做后的 11.0-CURRENT。                                                                                                                      |
| 1100089 | [290505](https://svnweb.freebsd.org/changeset/base/290505) | 2015 年 11 月 7 日  | 在对 `sysctl_add_oid(9)` 的 `API` 更改后的 11.0-CURRENT（修订版 290475）。                                                                                          |
| 1100090 | [290715](https://svnweb.freebsd.org/changeset/base/290715) | 2015 年 11 月 10 日 | 在对 `callout_stop` 宏的 `API` 更改后的 11.0-CURRENT（修订版 290664）。                                                                                              |
| 1100091 | [291537](https://svnweb.freebsd.org/changeset/base/291537) | 2015 年 11 月 30 日 | 在 291527 中更改 **nfsd.ko** 和 **nfscommon.ko** 模块之间的接口后的 11.0-CURRENT。                                                                                    |
| 1100092 | [292499](https://svnweb.freebsd.org/changeset/base/292499) | 2015 年 12 月 19 日 | 在移除 `vm_pageout_grow_cache` 后的 11.0-CURRENT（修订版 292469）。                                                                                               |
| 1100093 | [292966](https://svnweb.freebsd.org/changeset/base/292966) | 2015 年 12 月 30 日 | 在移除 **sys/crypto/sha2.h** 后的 11.0-CURRENT（修订版 292782）。                                                                                                 |
| 1100094 | [294086](https://svnweb.freebsd.org/changeset/base/294086) | 2016 年 1 月 15 日  | 在 `LinuxKPI PCI` 变更后的 11.0-CURRENT（修订版 294086）。                                                                                                        |
| 1100095 | [294327](https://svnweb.freebsd.org/changeset/base/294327) | 2016 年 1 月 19 日  | 在 `LRO` 优化后的 11.0-CURRENT。                                                                                                                             |
| 1100096 | [294505](https://svnweb.freebsd.org/changeset/base/294505) | 2016 年 1 月 21 日  | 在添加 `LinuxKPI idr_*` 后的 11.0-CURRENT。                                                                                                                  |
| 1100097 | [294860](https://svnweb.freebsd.org/changeset/base/294860) | 2016 年 1 月 26 日  | 在对 `dpv(3)` 的 `API` 更改后的 11.0-CURRENT。                                                                                                                 |
| 1100098 | [295682](https://svnweb.freebsd.org/changeset/base/295682) | 2016 年 2 月 16 日  | 在对 `rman` 的 `API` 更改后的 11.0-CURRENT（修订版 294883）。                                                                                                       |
| 1100099 | [295739](https://svnweb.freebsd.org/changeset/base/295739) | 2016 年 2 月 18 日  | 在允许驱动程序设置 `TCP ACK/data` 段聚合限制后的 11.0-CURRENT。                                                                                                         |
| 1100100 | [296136](https://svnweb.freebsd.org/changeset/base/296136) | 2016 年 2 月 26 日  | 在添加 `bus_alloc_resource_any(9)` `API` 后的 11.0-CURRENT。                                                                                                 |
| 1100101 | [296417](https://svnweb.freebsd.org/changeset/base/296417) | 2016 年 3 月 5 日   | 在升级 `clang`、`llvm`、`lldb` 和 `compiler-rt` 到 3.8.0 发行版后的 11.0-CURRENT。                                                                                  |
| 1100102 | [296749](https://svnweb.freebsd.org/changeset/base/296749) | 2016 年 3 月 12 日  | 在修复 `libelf` 跨端序问题后的 11.0-CURRENT（修订版 296685）。                                                                                                         |
| 1100103 | [297000](https://svnweb.freebsd.org/changeset/base/297000) | 2016 年 3 月 18 日  | 在为 `rman` 范围使用 `uintmax_t` 后的 11.0-CURRENT。                                                                                                            |
| 1100104 | [297156](https://svnweb.freebsd.org/changeset/base/297156) | 2016 年 3 月 21 日  | 在通过 `proc.p_filemon` 指针而非其自身列表跟踪 `filemon` 使用情况后的 11.0-CURRENT。                                                                                        |
| 1100105 | [297602](https://svnweb.freebsd.org/changeset/base/297602) | 2016 年 4 月 6 日   | 在修复 `sed` 函数 `i` 和 `a` 不再丢弃前导空格后的 11.0-CURRENT。                                                                                                        |
| 1100106 | [298486](https://svnweb.freebsd.org/changeset/base/298486) | 2016 年 4 月 22 日  | 在修复在 RDMA 中使用 IPv6 地址的问题后的 11.0-CURRENT。                                                                                                               |
| 1100107 | [299090](https://svnweb.freebsd.org/changeset/base/299090) | 2016 年 5 月 4 日   | 在改进 `bitstring(3)` `API` 的性能和功能后的 11.0-CURRENT。                                                                                                        |
| 1100108 | [299530](https://svnweb.freebsd.org/changeset/base/299530) | 2016 年 5 月 12 日  | 在修复 `LinuxKPI` 中 `IOCTLs` 的处理后的 11.0-CURRENT。                                                                                                          |
| 1100109 | [299933](https://svnweb.freebsd.org/changeset/base/299933) | 2016 年 5 月 16 日  | 在 `LinuxKPI` 中实现更多 `Linux` 设备相关功能后的 11.0-CURRENT。                                                                                                      |
| 1100110 | [300207](https://svnweb.freebsd.org/changeset/base/300207) | 2016 年 5 月 19 日  | 在添加对管理叠瓦式磁记录（`SMR`）驱动器的支持后的 11.0-CURRENT。                                                                                                              |
| 1100111 | [300303](https://svnweb.freebsd.org/changeset/base/300303) | 2016 年 5 月 20 日  | 在从 `arm64` 中移除 `brk` 和 `sbrk` 后的 11.0-CURRENT。                                                                                                         |
| 1100112 | [300539](https://svnweb.freebsd.org/changeset/base/300539) | 2016 年 5 月 23 日  | 在向 `bitstring(3)` `API` 添加 `bit_count` 后的 11.0-CURRENT。                                                                                                |
| 1100113 | [300701](https://svnweb.freebsd.org/changeset/base/300701) | 2016 年 5 月 26 日  | 在 `armv6` 上禁用对齐故障后的 11.0-CURRENT。                                                                                                                      |
| 1100114 | [300806](https://svnweb.freebsd.org/changeset/base/300806) | 2016 年 5 月 26 日  | 在修复 `crunchgen(1)` 与 `MAKEOBJDIRPREFIX` 一起使用的问题后的 11.0-CURRENT。                                                                                        |
| 1100115 | [300982](https://svnweb.freebsd.org/changeset/base/300982) | 2016 年 5 月 30 日  | 在为 `M_HASHTYPE_` 添加 `mbuf` 标志后的 11.0-CURRENT。                                                                                                          |
| 1100116 | [301011](https://svnweb.freebsd.org/changeset/base/301011) | 2016 年 5 月 31 日  | 在 `SHA-512t256`（修订版 300903）和 `Skein`（修订版 300966）添加到 `libmd`、`libcrypt`、内核和 `ZFS`（修订版 301010）后的 11.0-CURRENT。                                           |
| 1100117 | [301892](https://svnweb.freebsd.org/changeset/base/301892) | 2016 年 6 月 6 日   | 在 `libpam` 与修订版 301602 同步并提升库版本后的 11.0-CURRENT。                                                                                                        |
| 1100118 | [302071](https://svnweb.freebsd.org/changeset/base/302071) | 2016 年 6 月 21 日  | 在破坏 `struct disk` 二进制兼容性（修订版 302069）后的 11.0-CURRENT。                                                                                                   |
| 1100119 | [302150](https://svnweb.freebsd.org/changeset/base/302150) | 2016 年 6 月 23 日  | 在将 `geom_disk` 切换到使用池互斥量后的 11.0-CURRENT。                                                                                                               |
| 1100120 | [302153](https://svnweb.freebsd.org/changeset/base/302153) | 2016 年 6 月 23 日  | 在向 `struct ifnet` 添加备用字段后的 11.0-CURRENT。                                                                                                               |
| 1100121 | [303979](https://svnweb.freebsd.org/changeset/base/303979) | 2015 年 8 月 12 日  | 在 `releng/11.0` 从 `11-STABLE` 分支（修订版 303975）后的 11-STABLE。                                                                                              |
| 1100500 | [303979](https://svnweb.freebsd.org/changeset/base/303979) | 2016 年 8 月 12 日  | 在添加分支 303976 后的 11.0-STABLE。                                                                                                                           |
| 1100501 | [304609](https://svnweb.freebsd.org/changeset/base/304609) | 2016 年 8 月 22 日  | 在添加 `C++11` `thread_local` 支持后的 11.0-STABLE。                                                                                                           |
| 1100502 | [304865](https://svnweb.freebsd.org/changeset/base/304865) | 2016 年 8 月 26 日  | 在 `LC_*_MASK` 修复后的 11.0-STABLE。                                                                                                                        |
| 1100503 | [305733](https://svnweb.freebsd.org/changeset/base/305733) | 2016 年 9 月 12 日  | 在解决 `device_detach()` 和 `usbd_do_request_flags(9)` 之间的死锁后的 11.0-STABLE。                                                                                |
| 1100504 | [307330](https://svnweb.freebsd.org/changeset/base/307330) | 2016 年 10 月 14 日 | 在 `ZFS` 合并后的 11.0-STABLE。                                                                                                                              |
| 1100505 | [307590](https://svnweb.freebsd.org/changeset/base/307590) | 2016 年 10 月 19 日 | 在 `struct fb_info` 更改后的 11.0-STABLE。                                                                                                                   |
| 1100506 | [308048](https://svnweb.freebsd.org/changeset/base/308048) | 2016 年 10 月 28 日 | 在安装使用 `libzfs_core` 进行开发所需的头文件后的 11.0-STABLE。                                                                                                          |
| 1100507 | [310120](https://svnweb.freebsd.org/changeset/base/310120) | 2016 年 12 月 15 日 | 在将 `ki_moretdname` 成员添加到 `struct kinfo_proc` 和 `struct kinfo_proc32` 以将整个线程名称导出到用户空间实用程序后的 11.0-STABLE。                                                |
| 1100508 | [310618](https://svnweb.freebsd.org/changeset/base/310618) | 2016 年 12 月 26 日 | 在升级 `clang`、`llvm`、`lldb`、`compiler-rt` 和 `libc++` 到 3.9.1 发行版，以及添加 `lld` 3.9.1 后的 11.0-STABLE。                                                        |
| 1100509 | [311186](https://svnweb.freebsd.org/changeset/base/311186) | 2017 年 1 月 3 日   | 在 `crunchgen(1)` `META_MODE` 修复后的 11.0-STABLE（修订版 311185）。                                                                                             |
| 1100510 | [315312](https://svnweb.freebsd.org/changeset/base/315312) | 2017 年 3 月 15 日  | 在 MFC `fget_cap`、`getsock_cap` 和相关更改后的 11.0-STABLE。                                                                                                    |
| 1100511 | [316423](https://svnweb.freebsd.org/changeset/base/316423) | 2017 年 4 月 2 日   | 在多次 MFC 更新 `clang`、`llvm`、`lld`、`lldb`、`compiler-rt` 和 `libc++` 到 4.0.0 发行版后的 11.0-STABLE。                                                             |
| 1100512 | [316498](https://svnweb.freebsd.org/changeset/base/316498) | 2017 年 4 月 4 日   | 在将 `CAM` `SIM` 锁设置为可选后的 11.0-STABLE（修订版 315673、315674）。                                                                                                |
| 1100513 | [318197](https://svnweb.freebsd.org/changeset/base/318197) | 2017 年 5 月 11 日  | 在合并添加 **\<dev/mmc/mmc\_ioctl.h>** 头文件后的 11.0-STABLE。                                                                                                   |
| 1100514 | [319279](https://svnweb.freebsd.org/changeset/base/319279) | 2017 年 5 月 31 日  | 在多次 MFC `libpcap`、`WITHOUT_INET6` 和其他一些较小更改后的 11.0-STABLE。                                                                                             |
| 1101000 | [320486](https://svnweb.freebsd.org/changeset/base/320486) | 2017 年 6 月 30 日  | `releng/11.1` 从 `stable/11` 分支出。                                                                                                                       |
| 1101001 | [320763](https://svnweb.freebsd.org/changeset/base/320763) | 2017 年 6 月 30 日  | 在合并 `MAP_GUARD` `mmap(2)` 标志添加后的 11.1-RC1。                                                                                                             |
| 1101500 | [320487](https://svnweb.freebsd.org/changeset/base/320487) | 2017 年 6 月 30 日  | 在 `releng/11.1` 分支后的 11-STABLE。                                                                                                                        |
| 1101501 | [320666](https://svnweb.freebsd.org/changeset/base/320666) | 2017 年 7 月 5 日   | 在合并 `MAP_GUARD` `mmap(2)` 标志添加后的 11-STABLE。                                                                                                            |
| 1101502 | [321688](https://svnweb.freebsd.org/changeset/base/321688) | 2017 年 7 月 29 日  | 在合并 `NFS` 客户端强制卸载支持 `umount -N` 添加后的 11-STABLE。                                                                                                        |
| 1101503 | [323431](https://svnweb.freebsd.org/changeset/base/323431) | 2017 年 9 月 11 日  | 在合并使 `WRFSBASE` 指令在 `amd64` 上可操作的更改后的 11-STABLE。                                                                                                       |
| 1101504 | [324006](https://svnweb.freebsd.org/changeset/base/324006) | 2017 年 9 月 26 日  | 在从 head 合并 `libm` 后的 11-STABLE，添加了 `cacoshl(3)`、`cacosl(3)`、`casinhl(3)`、`casinl(3)`、`catanl(3)`、`catanhl(3)`、`sincos(3)`、`sincosf(3)` 和 `sincosl(3)`。 |
| 1101505 | [324023](https://svnweb.freebsd.org/changeset/base/324023) | 2017 年 9 月 26 日  | 在合并 `clang`、`llvm`、`lld`、`lldb`、`compiler-rt` 和 `libc++` 5.0.0 发行版后的 11-STABLE。                                                                        |
| 1101506 | [325003](https://svnweb.freebsd.org/changeset/base/325003) | 2017 年 10 月 25 日 | 在合并修订版 324281，向 `struct diocgattr_arg` 添加 `value.u16` 字段后的 11-STABLE。                                                                                  |
| 1101507 | [328379](https://svnweb.freebsd.org/changeset/base/328379) | 2018 年 1 月 24 日  | 在合并修订版 325028 后的 11-STABLE，修复 `ptrace()` 以在恢复时始终清除正确的线程事件。                                                                                             |
| 1101508 | [328386](https://svnweb.freebsd.org/changeset/base/328386) | 2018 年 1 月 24 日  | 在合并修订版 316648 后的 11-STABLE，将 `smp_no_rendevous_barrier()` 重命名为 `smp_no_rendezvous_barrier()`。                                                          |
| 1101509 | [328653](https://svnweb.freebsd.org/changeset/base/328653) | 2018 年 2 月 1 日   | 在从 FreeBSD-head 向后移植 `LinuxKPI` 的覆盖合并后的 11-STABLE。                                                                                                     |
| 1101510 | [329450](https://svnweb.freebsd.org/changeset/base/329450) | 2018 年 2 月 17 日  | 在 `LinuxKPI` 中的 `cmpxchg()` 宏完全可用后的 11-STABLE。                                                                                                         |
| 1101511 | [329981](https://svnweb.freebsd.org/changeset/base/329981) | 2018 年 2 月 25 日  | 在结束最近的 `LinuxKPI` 相关更新后的 11-STABLE。                                                                                                                    |
| 1101512 | [331219](https://svnweb.freebsd.org/changeset/base/331219) | 2018 年 3 月 19 日  | 在从上游 `llvm`、`clang` 和 `lld` 5.0 分支合并 `retpoline` 支持后的 11-STABLE。                                                                                       |
| 1101513 | [331838](https://svnweb.freebsd.org/changeset/base/331838) | 2018 年 3 月 31 日  | 在合并 `clang`、`llvm`、`lld`、`lldb`、`compiler-rt` 和 `libc++` 6.0.0 发行版以及几次后续修复后的 11-STABLE。                                                                |
| 1101514 | [332089](https://svnweb.freebsd.org/changeset/base/332089) | 2018 年 4 月 5 日   | 在合并修订版 328331，在 `rc` 脚本中添加新的不兼容的 `${name}_limits` 解释后的 11-STABLE。                                                                                      |
| 1101515 | [332363](https://svnweb.freebsd.org/changeset/base/332363) | 2018 年 4 月 10 日  | 在撤销 331880 后的 11-STABLE，删除 `rc` 脚本中 `${name}_limits` 的新且不兼容的解释。                                                                                        |
| 1101516 | [334392](https://svnweb.freebsd.org/changeset/base/334392) | 2018 年 5 月 30 日  | 在 `dwatch(1)` 润色后的 11-STABLE。                                                                                                                          |
| 1102000 | [334459](https://svnweb.freebsd.org/changeset/base/334459) | 2018 年 6 月 1 日   | `releng/11.2` 从 `stable/11` 分支出来。                                                                                                                      |
| 1102500 | [334461](https://svnweb.freebsd.org/changeset/base/334461) | 2018 年 6 月 1 日   | 在 `releng/11.2` 分支后的 11-STABLE。                                                                                                                        |
| 1102501 | [335436](https://svnweb.freebsd.org/changeset/base/335436) | 2018 年 6 月 20 日  | 在需要重新编译外部内核模块的 `LinuxKPI` 更新后的 11-STABLE。                                                                                                              |
| 1102502 | [338617](https://svnweb.freebsd.org/changeset/base/338617) | 2018 年 9 月 12 日  | 在添加套接字选项 `SO_TS_CLOCK` 并修复 `recvmsg32()` 系统调用（以正确降级 64 位结构的布局来匹配 32 位应用程序的期望）后的 11-STABLE。                                                             |
| 1102503 | [338931](https://svnweb.freebsd.org/changeset/base/338931) | 2018 年 9 月 25 日  | 在将 `TCP` 校验和修复合并到 `iflib(9)` 并向 **if\_media.h** 添加新的媒体类型后的 11-STABLE。                                                                                  |
| 1102504 | [340309](https://svnweb.freebsd.org/changeset/base/340309) | 2018 年 11 月 9 日  | 在几次 MFC 后的 11-STABLE：将 `objcopy(1)` 更新为正确处理小端 `MIPS64` 目标；更正 `mips64el` 测试以使用 `ELF` 头；为 `_libelf_is_mips64el` 中的 64 位 `ELF` 添加测试。                      |
| 1102505 | [342804](https://svnweb.freebsd.org/changeset/base/342804) | 2019 年 1 月 6 日   | 在合并修复 `linux_destroy_dev()` 行为（当仍有文件从正在销毁的 cdev 中打开时）后的 11-STABLE。                                                                                     |
| 1102506 | [344220](https://svnweb.freebsd.org/changeset/base/344220) | 2019 年 2 月 17 日  | 在将多个提交合并到 `lualoader` 后的 11-STABLE。                                                                                                                    |
| 1102507 | [346296](https://svnweb.freebsd.org/changeset/base/346296) | 2019 年 4 月 16 日  | 在合并 `llvm`、`clang`、`compiler-rt`、`libc++`、`libunwind`、`lld`、`lldb` 和 `openmp` 8.0.0 最终发行版 r356365 后的 11-STABLE。                                        |
| 1102508 | [346784](https://svnweb.freebsd.org/changeset/base/346784) | 2019 年 4 月 27 日  | 在 `ether_gen_addr` 可用后的 11-STABLE。                                                                                                                     |
| 1102509 | [347212](https://svnweb.freebsd.org/changeset/base/347212) | 2019 年 5 月 6 日   | 在 MFC 修订版 345303、345658 以及部分 345305 后的 11-STABLE。                                                                                                      |
| 1102510 | [347883](https://svnweb.freebsd.org/changeset/base/347883) | 2019 年 5 月 16 日  | 在提升 `Mellanox` 驱动程序版本号（`mlx4en(4)`；`mlx5en(4)`）后的 11-STABLE。                                                                                           |
| 1103000 | [349026](https://svnweb.freebsd.org/changeset/base/349026) | 2019 年 6 月 14 日  | `releng/11.3` 从 `stable/11` 分支出。                                                                                                                       |
| 1103500 | [349027](https://svnweb.freebsd.org/changeset/base/349027) | 2019 年 6 月 14 日  | 在 `releng/11.3` 分支后的 11-STABLE。                                                                                                                        |
| 1103501 | [354598](https://svnweb.freebsd.org/changeset/base/354598) | 2019 年 11 月 10 日 | 在修复 `libc++` 中潜在的 `OOB` 读取安全问题后的 11-STABLE。                                                                                                            |
| 1103502 | [354614](https://svnweb.freebsd.org/changeset/base/354614) | 2019 年 11 月 11 日 | 在向 `LinuxKPI` 添加 `sysfs` 创建/删除函数（在一次调用中处理多个文件）后的 11-STABLE。                                                                                            |
| 1103503 | [354615](https://svnweb.freebsd.org/changeset/base/354615) | 2019 年 11 月 11 日 | 在 `LinuxKPI` `sysfs` 改进后的 11-STABLE。                                                                                                                   |
| 1103504 | [354616](https://svnweb.freebsd.org/changeset/base/354616) | 2019 年 11 月 11 日 | 在启用 `LinuxKPI` 中的设备类组属性后的 11-STABLE。                                                                                                                   |
| 1103505 | [355899](https://svnweb.freebsd.org/changeset/base/355899) | 2019 年 12 月 19 日 | 在添加 musl libc 和 glibc 中常见的 `sigsetop` 扩展后的 11-STABLE。                                                                                                  |
| 1103506 | [356395](https://svnweb.freebsd.org/changeset/base/356395) | 2020 年 1 月 6 日   | 在将 USB 统计更改为每设备而非每总线后的 11-STABLE。                                                                                                                      |
| 1103507 | [356680](https://svnweb.freebsd.org/changeset/base/356680) | 2020 年 1 月 13 日  | 在为被取消的 USB 传输添加自己的计数器后的 11-STABLE。                                                                                                                     |
| 1103508 | [357613](https://svnweb.freebsd.org/changeset/base/357613) | 2020 年 2 月 6 日   | 在最近的 `LinuxKPI` 更改后的 11-STABLE。                                                                                                                        |
| 1103509 | [359958](https://svnweb.freebsd.org/changeset/base/359958) | 2020 年 4 月 15 日  | 在将 `id_mapped` 移动到 `bus_dma_impl` 结构末尾以保留 `KPI` 后的 11-STABLE。                                                                                          |
| 1103510 | [360658](https://svnweb.freebsd.org/changeset/base/360658) | 2020 年 5 月 5 日   | 在更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 到 9.0.0 最终版本 r372316 后的 11-STABLE。                                                       |
| 1103511 | [360784](https://svnweb.freebsd.org/changeset/base/360784) | 2020 年 5 月 7 日   | 在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 更新到 10.0.0 版本后的 11-STABLE。                                                                |
| 1104000 | [360804](https://svnweb.freebsd.org/changeset/base/360804) | 2020 年 5 月 8 日   | `releng/11.4` 从 `stable/11` 分支出。                                                                                                                       |
| 1104001 | [360822](https://svnweb.freebsd.org/changeset/base/360822) | 2020 年 5 月 8 日   | 在更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 到 10.0.0 版本后的 11.4-BETA1。                                                                |
| 1104500 | [360805](https://svnweb.freebsd.org/changeset/base/360805) | 2020 年 5 月 8 日   | 在 `releng/11.4` 分支后的 11-STABLE。                                                                                                                        |
| 1104501 | [362320](https://svnweb.freebsd.org/changeset/base/362320) | 2020 年 6 月 18 日  | 在 `LinuxKPI` 中实现 `__is_constexpr()` 函数宏后的 11-STABLE。                                                                                                   |
| 1104502 | [362919](https://svnweb.freebsd.org/changeset/base/362919) | 2020 年 7 月 4 日   | 在使 `liblzma` 使用 `SHA256` 的 `libmd` 实现后的 11-STABLE。                                                                                                     |
| 1104503 | [363496](https://svnweb.freebsd.org/changeset/base/363496) | 2020 年 7 月 24 日  | 在更新 `llvm`、`clang`、`compiler-rt`、`libc++`、`libunwind`、`lld`、`lldb` 和 `openmp` 到 10.0.1 发行版后的 11-STABLE。                                                |
| 1104504 | [363792](https://svnweb.freebsd.org/changeset/base/363792) | 2020 年 8 月 3 日   | 在 `LinuxKPI` 中实现 `array_size()` 函数后的 11-STABLE。                                                                                                        |
| 1104505 | [364391](https://svnweb.freebsd.org/changeset/base/364391) | 2020 年 8 月 19 日  | 在更改为克隆与 `RCU` 相关的任务结构字段后的 11-STABLE。                                                                                                                   |
| 1104506 | [365471](https://svnweb.freebsd.org/changeset/base/365471) | 2020 年 9 月 8 日   | 在向 `libcompiler_rt` 添加原子和 `bswap` 函数后的 11-STABLE。                                                                                                      |
| 1104507 | [365661](https://svnweb.freebsd.org/changeset/base/365661) | 2020 年 9 月 12 日  | 在对 `libcompiler_rt` 进行后续提交后的 11-STABLE。                                                                                                                |
| 1104508 | [366879](https://svnweb.freebsd.org/changeset/base/366879) | 2020 年 10 月 20 日 | 在填充 `LinuxKPI` 中的 `ww_mutex` 的获取上下文字段后的 11-STABLE。                                                                                                     |
| 1104509 | [366889](https://svnweb.freebsd.org/changeset/base/366889) | 2020 年 10 月 20 日 | 在对 `LinuxKPI` 的 `RCU` 列表进行添加后的 11-STABLE。                                                                                                              |
| 1104510 | [367513](https://svnweb.freebsd.org/changeset/base/367513) | 2020 年 11 月 9 日  | 在添加 `ptsname_r` 后的 11-STABLE。                                                                                                                          |

## 18.7. FreeBSD 10 版本

**表 7. FreeBSD 10 \_\_FreeBSD\_version 值**

| 值       | 修订                                                         | 日期               | 发布                                                                                                                                                                                                                                                     |
| ------- | ---------------------------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| 1000000 | [225757](https://svnweb.freebsd.org/changeset/base/225757) | 2011 年 9 月 26 日  | 10.0-CURRENT.                                                                                                                                                                                                                                          |
| 1000001 | [227070](https://svnweb.freebsd.org/changeset/base/227070) | 2011 年 11 月 4 日  | 在添加 `posix_fadvise(2)` 系统调用后的 10-CURRENT。                                                                                                                                                                                                              |
| 1000002 | [228444](https://svnweb.freebsd.org/changeset/base/228444) | 2011 年 12 月 12 日 | 在 **sys/types.h** 中定义布尔值 `true`/`false` 后，`sizeof(bool)` 的大小可能更改（修订版 228444）。在引入 **xlocale.h** 后的 10-CURRENT（修订版 227753）。                                                                                                                              |
| 1000003 | [228571](https://svnweb.freebsd.org/changeset/base/228571) | 2011 年 12 月 16 日 | 在对 `carp(4)` 进行重大更改后的 10-CURRENT，更改了结构体 `in_aliasreq` 的大小、结构体 `in6_aliasreq`（修订版 228571）以及 `SIOCAIFADDR` 的参数检查（修订版 228574）。                                                                                                                            |
| 1000004 | [229204](https://svnweb.freebsd.org/changeset/base/229204) | 2012 年 1 月 1 日   | 在移除 `skpc()` 并添加 `memcchr(9)`（修订版 229200）后的 10-CURRENT。                                                                                                                                                                                                |
| 1000005 | [230207](https://svnweb.freebsd.org/changeset/base/230207) | 2012 年 1 月 16 日  | 在删除对 `SIOCSIFADDR`、`SIOCSIFNETMASK`、`SIOCSIFBRDADDR`、`SIOCSIFDSTADDR` ioctls 的支持后的 10-CURRENT。                                                                                                                                                         |
| 1000006 | [230590](https://svnweb.freebsd.org/changeset/base/230590) | 2012 年 1 月 26 日  | 在 `cam(4)` 层引入读取容量数据异步通知后的 10-CURRENT。                                                                                                                                                                                                                 |
| 1000007 | [231025](https://svnweb.freebsd.org/changeset/base/231025) | 2012 年 2 月 5 日   | 在引入新的 `tcp(4)` 套接字选项后的 10-CURRENT：`TCP_KEEPINIT`、`TCP_KEEPIDLE`、`TCP_KEEPINTVL` 和 `TCP_KEEPCNT`。                                                                                                                                                       |
| 1000008 | [231505](https://svnweb.freebsd.org/changeset/base/231505) | 2012 年 2 月 11 日  | 在引入新的可扩展 `sysctl(3)` 接口 `NET_RT_IFLISTL` 用于查询地址列表后的 10-CURRENT。                                                                                                                                                                                        |
| 1000009 | [232154](https://svnweb.freebsd.org/changeset/base/232154) | 2012 年 2 月 25 日  | 在导入 `libarchive` 3.0.3（修订版 232153）后的 10-CURRENT。                                                                                                                                                                                                       |
| 1000010 | [233757](https://svnweb.freebsd.org/changeset/base/233757) | 2012 年 3 月 31 日  | 在 `xlocale` 清理后的 10-CURRENT。                                                                                                                                                                                                                           |
| 1000011 | [234355](https://svnweb.freebsd.org/changeset/base/234355) | 2012 年 4 月 16 日  | 10-CURRENT 导入 `LLVM/Clang` 3.1 主干 154661（修订版 234353）。                                                                                                                                                                                                  |
| 1000012 | [234924](https://svnweb.freebsd.org/changeset/base/234924) | 2012 年 5 月 2 日   | 10-CURRENT `jemalloc` 导入。                                                                                                                                                                                                                              |
| 1000013 | [235788](https://svnweb.freebsd.org/changeset/base/235788) | 2012 年 5 月 22 日  | 在 `byacc` 导入后的 10-CURRENT。                                                                                                                                                                                                                             |
| 1000014 | [237631](https://svnweb.freebsd.org/changeset/base/237631) | 2012 年 6 月 27 日  | 在 `BSD sort` 成为默认排序后的 10-CURRENT（修订版 237629）。                                                                                                                                                                                                          |
| 1000015 | [238405](https://svnweb.freebsd.org/changeset/base/238405) | 2012 年 7 月 12 日  | 在导入 `OpenSSL` 1.0.1c 后的 10-CURRENT。                                                                                                                                                                                                                    |
| （未更改）   | [238429](https://svnweb.freebsd.org/changeset/base/238429) | 2012 年 7 月 13 日  | 在修复 `LLVM/Clang` 3.1 回归后的 10-CURRENT。                                                                                                                                                                                                                  |
| 1000016 | [239179](https://svnweb.freebsd.org/changeset/base/239179) | 2012 年 8 月 8 日   | 在 `ucom(4)` 中的 `KBI` 更改后的 10-CURRENT。                                                                                                                                                                                                                  |
| 1000017 | [239214](https://svnweb.freebsd.org/changeset/base/239214) | 2012 年 8 月 8 日   | 在将流特性添加到 `USB` 堆栈后的 10-CURRENT。                                                                                                                                                                                                                        |
| 1000018 | [240233](https://svnweb.freebsd.org/changeset/base/240233) | 2012 年 9 月 8 日   | 在 `pf(4)` 的重大重写后的 10-CURRENT。                                                                                                                                                                                                                          |
| 1000019 | [241245](https://svnweb.freebsd.org/changeset/base/241245) | 2012 年 10 月 6 日  | 在 `pfil(9)` `KBI/KPI` 更改为以网络字节顺序提供数据包给 `AF_INET` 过滤器钩子后的 10-CURRENT。                                                                                                                                                                                   |
| 1000020 | [241610](https://svnweb.freebsd.org/changeset/base/241610) | 2012 年 10 月 16 日 | 在网络接口克隆 `KPI` 更改且结构体 `if_clone` 变得不透明后的 10-CURRENT。                                                                                                                                                                                                    |
| 1000021 | [241897](https://svnweb.freebsd.org/changeset/base/241897) | 2012 年 10 月 22 日 | 在移除对非 `MPSAFE` 文件系统的支持并添加对 `FUSEFS` 的支持后的 10-CURRENT（修订版 241519）。                                                                                                                                                                                      |
| 1000022 | [241913](https://svnweb.freebsd.org/changeset/base/241913) | 2012 年 10 月 22 日 | 在整个 `IPv4` 栈切换到网络字节顺序以用于 `IP` 数据包头存储后的 10-CURRENT。                                                                                                                                                                                                     |
| 1000023 | [242619](https://svnweb.freebsd.org/changeset/base/242619) | 2012 年 11 月 5 日  | 在通用 `USB` 串行驱动程序代码中添加抖动缓冲区，以在 `TTY` 缓冲区满时临时存储字符，并在发生这种情况时添加流停止和启动信号后的 10-CURRENT。                                                                                                                                                                      |
| 1000024 | [242624](https://svnweb.freebsd.org/changeset/base/242624) | 2012 年 11 月 5 日  | 在 `i386` 和 `amd64` 上将 `clang` 设置为默认编译器后的 10-CURRENT。                                                                                                                                                                                                   |
| 1000025 | [243443](https://svnweb.freebsd.org/changeset/base/243443) | 2012 年 11 月 17 日 | 在 `struct sockaddr_in6` 中的 `sin6_scope_id` 成员变量更改为在通过 `sysctl` 或路由套接字将结构传递给用户空间之前由内核填充后的 10-CURRENT。这意味着 `sin6_addr.s6_addr[2]` 中的 `KAME` 特定嵌入式范围 id 在用户空间应用程序中始终清除。                                                                                   |
| 1000026 | [245313](https://svnweb.freebsd.org/changeset/base/245313) | 2013 年 1 月 11 日  | 在 `install` 获得 `-N` 标志后的 10-CURRENT。也可用于指示 `nmtree` 的存在。                                                                                                                                                                                               |
| 1000027 | [246084](https://svnweb.freebsd.org/changeset/base/246084) | 2013 年 1 月 29 日  | 在 `cat` 获得 `-l` 标志后的 10-CURRENT（修订版 246083）。                                                                                                                                                                                                           |
| 1000028 | [246759](https://svnweb.freebsd.org/changeset/base/246759) | 2013 年 2 月 13 日  | 移动到驱动程序结构后的 10-CURRENT，需要重建所有 USB 模块。                                                                                                                                                                                                                  |
| 1000029 | [247821](https://svnweb.freebsd.org/changeset/base/247821) | 2013 年 3 月 4 日   | 在引入无滴答 `callout` 设施后的 10-CURRENT，也改变了 `struct callout` 的布局（修订版 247777）。                                                                                                                                                                                |
| 1000030 | [248210](https://svnweb.freebsd.org/changeset/base/248210) | 2013 年 3 月 12 日  | 在 `VM` 子系统中引入 `KPI` 破坏以支持读/写锁定后的 10-CURRENT（修订版 248084）。                                                                                                                                                                                               |
| 1000031 | [249943](https://svnweb.freebsd.org/changeset/base/249943) | 2013 年 4 月 26 日  | 在 `ifnet` 的 `if_output` 方法的 `dst` 参数更改为带有 `const` 限定符后的 10-CURRENT（修订版 249925）。                                                                                                                                                                        |
| 1000032 | [250163](https://svnweb.freebsd.org/changeset/base/250163) | 2013 年 5 月 1 日   | 在引入 `accept4(2)`（修订版 250154）和 `pipe2(2)`（修订版 250159）系统调用后的 10-CURRENT。                                                                                                                                                                                 |
| 1000033 | [250881](https://svnweb.freebsd.org/changeset/base/250881) | 2013 年 5 月 21 日  | 在导入 `flex` 2.5.37 后的 10-CURRENT。                                                                                                                                                                                                                       |
| 1000034 | [251294](https://svnweb.freebsd.org/changeset/base/251294) | 2013 年 6 月 3 日   | 在将这些函数添加到 `libm` 后的 10-CURRENT：`cacos(3)`、`cacosf(3)`、`cacosh(3)`、`cacoshf(3)`、`casin(3)`、`casinf(3)`、`casinh(3)`、`casinhf(3)`、`catan(3)`、`catanf(3)`、`catanh(3)`、`catanhf(3)`、`logl(3)`、`log2l(3)`、`log10l(3)`、`log1pl(3)`、`expm1l(3)`。               |
| 1000035 | [251527](https://svnweb.freebsd.org/changeset/base/251527) | 2013 年 6 月 8 日   | 在引入 `aio_mlock(2)` 系统调用后的 10-CURRENT（修订版 251526）。                                                                                                                                                                                                      |
| 1000036 | [253049](https://svnweb.freebsd.org/changeset/base/253049) | 2013 年 7 月 9 日   | 在对内核 `GSSAPI` 模块的函数调用接口添加新功能后的 10-CURRENT。                                                                                                                                                                                                             |
| 1000037 | [253089](https://svnweb.freebsd.org/changeset/base/253089) | 2013 年 7 月 9 日   | 在将统计结构体迁移到 `PCPU` 计数器后的 10-CURRENT。更改的结构体包括：`ahstat`、`arpstat`、`espstat`、`icmp6_ifstat`、`icmp6stat`、`in6_ifstat`、`ip6stat`、`ipcompstat`、`ipipstat`、`ipsecstat`、`mrt6stat`、`mrtstat`、`pfkeystat`、`pim6stat`、`pimstat`、`rip6stat`、`udpstat`（修订版 253081）。 |
| 1000038 | [253396](https://svnweb.freebsd.org/changeset/base/253396) | 2013 年 7 月 16 日  | 在 `arm`、`armeb`、`armv6` 和 `armv6eb` 架构上将 `ARM EABI` 设置为默认 `ABI` 后的 10-CURRENT。                                                                                                                                                                         |
| 1000039 | [253549](https://svnweb.freebsd.org/changeset/base/253549) | 2013 年 7 月 22 日  | 在 `CAM` 和 `mps(4)` 驱动程序扫描更改后的 10-CURRENT。                                                                                                                                                                                                              |
| 1000040 | [253638](https://svnweb.freebsd.org/changeset/base/253638) | 2013 年 7 月 24 日  | 在添加 libusb pkgconf 文件后的 10-CURRENT。                                                                                                                                                                                                                    |
| 1000041 | [253970](https://svnweb.freebsd.org/changeset/base/253970) | 2013 年 8 月 5 日   | 在 PF\_INET6 中从 time\_second 更改为 time\_uptime 后的 10-CURRENT。                                                                                                                                                                                            |
| 1000042 | [254138](https://svnweb.freebsd.org/changeset/base/254138) | 2013 年 8 月 9 日   | 在 `VM` 子系统更改后的 10-CURRENT，统一软硬忙机制。                                                                                                                                                                                                                     |
| 1000043 | [254273](https://svnweb.freebsd.org/changeset/base/254273) | 2013 年 8 月 13 日  | WITH\_ICONV 后，10-CURRENT 默认启用。 新增 src.conf(5) 选项， WITH\_LIBICONV\_COMPAT （默认禁用）添加 libiconv\_open 以与 converters/libiconv port 兼容。                                                                                                                       |
| 1000044 | [254358](https://svnweb.freebsd.org/changeset/base/254358) | 2013 年 8 月 15 日  | 10-CURRENT 在 libc.so 转换为 ld(1) 脚本后（修订版 251668）。                                                                                                                                                                                                        |
| 1000045 | [254389](https://svnweb.freebsd.org/changeset/base/254389) | 2013 年 8 月 15 日  | 在将 `cdevsw` 标志 `D_UNMAPPED_IO` 替换为 `struct cdev` 标志 `SI_UNMAPPED` 的 `devfs` 编程接口更改后的 10-CURRENT。                                                                                                                                                       |
| 1000046 | [254537](https://svnweb.freebsd.org/changeset/base/254537) | 2013 年 8 月 19 日  | 10-CURRENT 添加 M\_PROTO\[9-12] 和删除 M\_FRAG\|M\_FIRSTFRAG\|M\_LASTFRAG mbuf 标志后（修订版本 254524、254526）。                                                                                                                                                     |
| 1000047 | [254627](https://svnweb.freebsd.org/changeset/base/254627) | 2013 年 8 月 21 日  | stat(2) 更新后的 10-CURRENT，允许将一些 Windows/DOS 和 CIFS 文件属性存储为 stat(2)标志。                                                                                                                                                                                    |
| 1000048 | [254672](https://svnweb.freebsd.org/changeset/base/254672) | 2013 年 8 月 22 日  | 在结构体 `xsctp_inpcb` 修改后的 10-CURRENT。                                                                                                                                                                                                                    |
| 1000049 | [254760](https://svnweb.freebsd.org/changeset/base/254760) | 2013 年 8 月 24 日  | 10-CURRENT 在为不适用于分割 I/O（如 sa(4)）的设备提供 physio(9)支持后。                                                                                                                                                                                                    |
| 1000050 | [254844](https://svnweb.freebsd.org/changeset/base/254844) | 2013 年 8 月 24 日  | 在 `mbuf` 结构体修改后的 10-CURRENT（修订版 254780、254799、254804、254807、254842）。                                                                                                                                                                                   |
| 1000051 | [254887](https://svnweb.freebsd.org/changeset/base/254887) | 2013 年 8 月 25 日  | 在 `Radeon KMS` 驱动程序导入后的 10-CURRENT（修订版 254885）。                                                                                                                                                                                                        |
| 1000052 | [255180](https://svnweb.freebsd.org/changeset/base/255180) | 2013 年 9 月 3 日   | 在导入 NetBSD libexecinfo 之后，10-CURRENT 连接到构建。                                                                                                                                                                                                            |
| 1000053 | [255305](https://svnweb.freebsd.org/changeset/base/255305) | 2013 年 9 月 6 日   | 在 `Capsicum` 框架的 `API` 和 `ABI` 更改后的 10-CURRENT。                                                                                                                                                                                                        |
| 1000054 | [255321](https://svnweb.freebsd.org/changeset/base/255321) | 2013 年 9 月 6 日   | 在 `gcc` 和 `libstdc++` 不再默认构建后的 10-CURRENT。                                                                                                                                                                                                             |
| 1000055 | [255449](https://svnweb.freebsd.org/changeset/base/255449) | 2013 年 9 月 6 日   | 在添加 `MMAP_32BIT` `mmap(2)` 标志后的 10-CURRENT（修订版 255426）。                                                                                                                                                                                                |
| 1000100 | [259065](https://svnweb.freebsd.org/changeset/base/259065) | 2013 年 12 月 7 日  | **releng/10.0** 从 **stable/10** 分支出来。                                                                                                                                                                                                                  |
| 1000500 | [256283](https://svnweb.freebsd.org/changeset/base/256283) | 2013 年 10 月 10 日 | 在从 **head/** 分支后的 10-STABLE。                                                                                                                                                                                                                           |
| 1000501 | [256916](https://svnweb.freebsd.org/changeset/base/256916) | 2013 年 10 月 22 日 | 在添加第一次引导 `rc(8)` 支持后的 10-STABLE。                                                                                                                                                                                                                       |
| 1000502 | [258398](https://svnweb.freebsd.org/changeset/base/258398) | 2013 年 11 月 20 日 | 在从 **libc.so.7** 中删除 `iconv` 符号后的 10-STABLE。                                                                                                                                                                                                           |
| 1000510 | [259067](https://svnweb.freebsd.org/changeset/base/259067) | 2013 年 12 月 7 日  | **releng/10.0** `__FreeBSD_version` 更新以防止值向后变化。                                                                                                                                                                                                        |
| 1000700 | [259069](https://svnweb.freebsd.org/changeset/base/259069) | 2013 年 12 月 7 日  | 在 **releng/10.0** 分支后的 10-STABLE。                                                                                                                                                                                                                      |
| 1000701 | [259447](https://svnweb.freebsd.org/changeset/base/259447) | 2013 年 12 月 15 日 | 修复 Heimdal 编码后的 10.0-STABLE 版本。                                                                                                                                                                                                                        |
| 1000702 | [260135](https://svnweb.freebsd.org/changeset/base/260135) | 2013 年 12 月 31 日 | 在 `MAP_STACK` 修复后的 10-STABLE。                                                                                                                                                                                                                          |
| 1000703 | [262801](https://svnweb.freebsd.org/changeset/base/262801) | 2014 年 3 月 5 日   | 在将 `libc++` 升级至 3.4 版本后的 10-STABLE。                                                                                                                                                                                                                    |
| 1000704 | [262889](https://svnweb.freebsd.org/changeset/base/262889) | 2014 年 3 月 7 日   | 在 `vt(4)` 驱动程序的 MFC（修订版 262861）后的 10-STABLE。                                                                                                                                                                                                           |
| 1000705 | [263508](https://svnweb.freebsd.org/changeset/base/263508) | 2014 年 3 月 21 日  | 在升级 `llvm/clang` 到 3.4 版本后的 10-STABLE。                                                                                                                                                                                                                 |
| 1000706 | [264214](https://svnweb.freebsd.org/changeset/base/264214) | 2014 年 4 月 6 日   | 在 `GCC` 支持 `__block` 定义后的 10-STABLE。                                                                                                                                                                                                                   |
| 1000707 | [264289](https://svnweb.freebsd.org/changeset/base/264289) | 2014 年 4 月 8 日   | 在 `FreeBSD-SA-14:06.openssl` 后的 10-STABLE。                                                                                                                                                                                                             |
| 1000708 | [265122](https://svnweb.freebsd.org/changeset/base/265122) | 2014 年 4 月 30 日  | 在 `FreeBSD-SA-14:07.devfs`、`FreeBSD-SA-14:08.tcp` 和 `FreeBSD-SA-14:09.openssl` 后的 10-STABLE。                                                                                                                                                           |
| 1000709 | [265946](https://svnweb.freebsd.org/changeset/base/265946) | 2014 年 5 月 13 日  | 在支持 `UDP-Lite` 协议（RFC 3828）后的 10-STABLE。                                                                                                                                                                                                               |
| 1000710 | [267465](https://svnweb.freebsd.org/changeset/base/267465) | 2014 年 6 月 13 日  | 在对 `strcasecmp(3)` 进行更改、将 `strcasecmp_l(3)` 和 `strncasecmp_l(3)` 从 **\<string.h>** 移动到 **\<strings.h>** 以符合 `POSIX` 2008 标准后的 10-STABLE。                                                                                                               |
| 1000711 | [268442](https://svnweb.freebsd.org/changeset/base/268442) | 2014 年 7 月 8 日   | 在 `FreeBSD-SA-14:17.kmem` 后的 10-STABLE（修订版 268432）。                                                                                                                                                                                                    |
| 1000712 | [269400](https://svnweb.freebsd.org/changeset/base/269400) | 2014 年 8 月 1 日   | 在合并 `nfsd(8)` 4.1 后的 10-STABLE（修订版 269398）。                                                                                                                                                                                                            |
| 1000713 | [269484](https://svnweb.freebsd.org/changeset/base/269484) | 2014 年 8 月 3 日   | 在更新 `regex(3)` 库以添加">"和"<"定界符后的 10-STABLE。                                                                                                                                                                                                             |
| 1000714 | [270174](https://svnweb.freebsd.org/changeset/base/270174) | 2014 年 8 月 3 日   | 在 `SOCK_DGRAM` bug 修复后的 10-STABLE（修订版 269490）。                                                                                                                                                                                                         |
| 1000715 | [271341](https://svnweb.freebsd.org/changeset/base/271341) | 2014 年 9 月 9 日   | 在 `FreeBSD-SA-14:18` 后的 10-STABLE（修订版 269686）。                                                                                                                                                                                                         |
| 1000716 | [271686](https://svnweb.freebsd.org/changeset/base/271686) | 2014 年 9 月 16 日  | 在 `FreeBSD-SA-14:19`（修订版 271667）后的 10-STABLE。                                                                                                                                                                                                          |
| 1000717 | [271816](https://svnweb.freebsd.org/changeset/base/271816) | 2014 年 9 月 18 日  | 在 `i915` 硬件上下文支持后的 10-STABLE。                                                                                                                                                                                                                          |
| 1001000 | [272463](https://svnweb.freebsd.org/changeset/base/272463) | 2014 年 10 月 2 日  | 在 **releng/10.1** 分支后的 10.1-RC1。                                                                                                                                                                                                                       |
| 1001500 | [272464](https://svnweb.freebsd.org/changeset/base/272464) | 2014 年 10 月 2 日  | 在 **releng/10.1** 分支后的 10-STABLE。                                                                                                                                                                                                                      |
| 1001501 | [273432](https://svnweb.freebsd.org/changeset/base/273432) | 2014 年 10 月 21 日 | 在 `FreeBSD-SA-14:20`、`FreeBSD-SA-14:22` 和 `FreeBSD-SA-14:23`（修订版 273411）后的 10-STABLE。                                                                                                                                                                  |
| 1001502 | [274162](https://svnweb.freebsd.org/changeset/base/274162) | 2014 年 11 月 4 日  | 在 `FreeBSD-SA-14:23`、`FreeBSD-SA-14:24` 和 `FreeBSD-SA-14:25` 后的 10-STABLE。                                                                                                                                                                             |
| 1001503 | [275040](https://svnweb.freebsd.org/changeset/base/275040) | 2014 年 11 月 25 日 | 在合并新的库/实用程序（`dpv(1)`、`dpv(3)` 和 `figpar(3)`）以进行数据吞吐量可视化后的 10-STABLE。                                                                                                                                                                                   |
| 1001504 | [275742](https://svnweb.freebsd.org/changeset/base/275742) | 2014 年 12 月 13 日 | 在合并对 `LLVM` 向量化器的重要修复后的 10-STABLE，该修复在某些情况下可能导致缓冲区越界。                                                                                                                                                                                                  |
| 1001505 | [276633](https://svnweb.freebsd.org/changeset/base/276633) | 2015 年 1 月 3 日   | 在 [276312](https://svnweb.freebsd.org/changeset/base/276312) 中合并一些 `arm` 常量后的 10-STABLE。                                                                                                                                                               |
| 1001506 | [277087](https://svnweb.freebsd.org/changeset/base/277087) | 2015 年 1 月 12 日  | 在合并 `yacc` 的最大表大小更新后的 10-STABLE。                                                                                                                                                                                                                       |
| 1001507 | [277790](https://svnweb.freebsd.org/changeset/base/277790) | 2015 年 1 月 27 日  | 在对 `UDP` 隧道回调进行更改以提供上下文指针和源 `sockaddr` 后的 10-STABLE。                                                                                                                                                                                                   |
| 1001508 | [278974](https://svnweb.freebsd.org/changeset/base/278974) | 2015 年 2 月 18 日  | 在添加 `CDAI_TYPE_EXT_INQ` 请求类型后的 10-STABLE。                                                                                                                                                                                                              |
| 1001509 | [279287](https://svnweb.freebsd.org/changeset/base/279287) | 2015 年 2 月 25 日  | 在 `FreeBSD-EN-15:01.vt`、`FreeBSD-EN-15:02.openssl`、`FreeBSD-EN-15:03.freebsd-update`、`FreeBSD-SA-15:04.igmp` 和 `FreeBSD-SA-15:05.bind` 后的 10-STABLE。                                                                                                   |
| 1001510 | [279329](https://svnweb.freebsd.org/changeset/base/279329) | 2015 年 2 月 26 日  | 在 MFC 修订版 [278964](https://svnweb.freebsd.org/changeset/base/278964) 后的 10-STABLE。                                                                                                                                                                     |
| 1001511 | [280246](https://svnweb.freebsd.org/changeset/base/280246) | 2015 年 3 月 19 日  | 在 **sys/capability.h** 重命名为 **sys/capsicum.h** 后的 10-STABLE（修订版 [280224/](https://svnweb.freebsd.org/changeset/base/280224/)）。                                                                                                                         |
| 1001512 | [280438](https://svnweb.freebsd.org/changeset/base/280438) | 2015 年 3 月 24 日  | 在添加新的 `mtio(4)`、`sa(4)` ioctl 后的 10-STABLE。                                                                                                                                                                                                            |
| 1001513 | [281955](https://svnweb.freebsd.org/changeset/base/281955) | 2015 年 4 月 24 日  | 在开始从网络代码中移除弃用的 `M_FLOWID` 标志使用后的 10-STABLE。                                                                                                                                                                                                            |
| 1001514 | [282275](https://svnweb.freebsd.org/changeset/base/282275) | 2015 年 4 月 30 日  | 在 MFC `iconv(3)` 修复后的 10-STABLE。                                                                                                                                                                                                                       |
| 1001515 | [282781](https://svnweb.freebsd.org/changeset/base/282781) | 2015 年 5 月 11 日  | 在添加回 `M_FLOWID` 后的 10-STABLE。                                                                                                                                                                                                                          |
| 1001516 | [283341](https://svnweb.freebsd.org/changeset/base/283341) | 2015 年 5 月 24 日  | 在 MFC 许多 `USB` 相关事务后的 10-STABLE。                                                                                                                                                                                                                       |
| 1001517 | [283950](https://svnweb.freebsd.org/changeset/base/283950) | 2015 年 6 月 3 日   | 在 MFC 声音相关事务后的 10-STABLE。                                                                                                                                                                                                                              |
| 1001518 | [284204](https://svnweb.freebsd.org/changeset/base/284204) | 2015 年 6 月 10 日  | 在 MFC `zfs` `vfs` 修复后的 10-STABLE（修订版 [284203](https://svnweb.freebsd.org/changeset/base/284203)）。                                                                                                                                                      |
| 1001519 | [284720](https://svnweb.freebsd.org/changeset/base/284720) | 2015 年 6 月 23 日  | 在还原 `amd64` 上提升 `MAXCPU` 后的 10-STABLE。                                                                                                                                                                                                                 |
| 1002000 | [285830](https://svnweb.freebsd.org/changeset/base/285830) | 2015 年 7 月 24 日  | **releng/10.2** 从 10-STABLE 分支出来。                                                                                                                                                                                                                      |
| 1002500 | [285831](https://svnweb.freebsd.org/changeset/base/285831) | 2015 年 7 月 24 日  | 在 **releng/10.2** 从 10-STABLE 分支后的 10-STABLE。                                                                                                                                                                                                          |
| 1002501 | [289005](https://svnweb.freebsd.org/changeset/base/289005) | 2015 年 10 月 8 日  | 在合并影响 `zfeature_info` 结构体内部接口的 `ZFS` 更改后的 10-STABLE（修订版 [288572](https://svnweb.freebsd.org/changeset/base/288572)）。                                                                                                                                   |
| 1002502 | [291243](https://svnweb.freebsd.org/changeset/base/291243) | 2015 年 11 月 24 日 | 在合并影响 `g_dev_setdumpdev()` 参数的转储设备更改后的 10-STABLE（修订版 [291215](https://svnweb.freebsd.org/changeset/base/291215)）。                                                                                                                                      |
| 1002503 | [292224](https://svnweb.freebsd.org/changeset/base/292224) | 2015 年 12 月 14 日 | 在合并对 `nfsd.ko` 和 `nfscommon.ko` 模块内部接口的更改、要求它们一起升级后的 10-STABLE（修订版 [292223](https://svnweb.freebsd.org/changeset/base/292223)）。                                                                                                                        |
| 1002504 | [292589](https://svnweb.freebsd.org/changeset/base/292589) | 2015 年 12 月 22 日 | 在合并 `xz` 5.2.2（多线程支持）后的 10-STABLE（修订版 [292588](https://svnweb.freebsd.org/changeset/base/292588)）。                                                                                                                                                     |
| 1002505 | [292908](https://svnweb.freebsd.org/changeset/base/292908) | 2015 年 12 月 30 日 | 在合并对 `pci(4)` 的更改后的 10-STABLE（修订版 [292907](https://svnweb.freebsd.org/changeset/base/292907)）。                                                                                                                                                         |
| 1002506 | [293476](https://svnweb.freebsd.org/changeset/base/293476) | 2016 年 1 月 9 日   | 在合并 `utimensat(2)` 后的 10-STABLE（修订版 [293473](https://svnweb.freebsd.org/changeset/base/293473)）。                                                                                                                                                       |
| 1002507 | [293610](https://svnweb.freebsd.org/changeset/base/293610) | 2016 年 1 月 9 日   | 在合并对 `linux(4)` 的更改后的 10-STABLE（修订版 [293477](https://svnweb.freebsd.org/changeset/base/293477) 至 [293609](https://svnweb.freebsd.org/changeset/base/293609)）。                                                                                          |
| 1002508 | [293619](https://svnweb.freebsd.org/changeset/base/293619) | 2016 年 1 月 9 日   | 在合并对 `figpar(3)` 类型/宏的更改后的 10-STABLE（修订版 [290275](https://svnweb.freebsd.org/changeset/base/290275)）。                                                                                                                                                  |
| 1002509 | [295107](https://svnweb.freebsd.org/changeset/base/295107) | 2016 年 2 月 1 日   | 在合并对 `dpv(3)` 的 `API` 更改后的 10-STABLE。                                                                                                                                                                                                                  |
| 1003000 | [296373](https://svnweb.freebsd.org/changeset/base/296373) | 2016 年 3 月 4 日   | **releng/10.3** 从 10-STABLE 分支出来。                                                                                                                                                                                                                      |
| 1003500 | [296374](https://svnweb.freebsd.org/changeset/base/296374) | 2016 年 3 月 4 日   | 在 **releng/10.3** 从 10-STABLE 分支后的 10-STABLE。                                                                                                                                                                                                          |
| 1003501 | [298299](https://svnweb.freebsd.org/changeset/base/298299) | 2016 年 6 月 19 日  | 在为 `kdbcontrol` 添加 `-P` 选项后的 10-STABLE（修订版 [298297](https://svnweb.freebsd.org/changeset/base/298297)）。                                                                                                                                                |
| 1003502 | [299966](https://svnweb.freebsd.org/changeset/base/299966) | 2016 年 6 月 19 日  | 在将 `libcrypto.so` 设置为位置无关后的 10-STABLE。                                                                                                                                                                                                                 |
| 1003503 | [300235](https://svnweb.freebsd.org/changeset/base/300235) | 2016 年 6 月 19 日  | 在允许 `MK_` 覆盖后的 10-STABLE（修订版 [300233](https://svnweb.freebsd.org/changeset/base/300233)）。                                                                                                                                                              |
| 1003504 | [302066](https://svnweb.freebsd.org/changeset/base/302066) | 2016 年 6 月 21 日  | 在从 11-CURRENT MFC `filemon` 更改后的 10-STABLE。                                                                                                                                                                                                            |
| 1003505 | [302228](https://svnweb.freebsd.org/changeset/base/302228) | 2016 年 6 月 27 日  | 在将 `sed` 转换为使用 `REG_STARTEND` 以修复 `Mesa` 问题后的 10-STABLE。                                                                                                                                                                                               |
| 1003506 | [304611](https://svnweb.freebsd.org/changeset/base/304611) | 2016 年 8 月 22 日  | 在添加 `C++11` `thread_local` 支持后的 10-STABLE。                                                                                                                                                                                                             |
| 1003507 | [304864](https://svnweb.freebsd.org/changeset/base/304864) | 2016 年 8 月 26 日  | 在 `LC_*_MASK` 修复后的 10-STABLE。                                                                                                                                                                                                                          |
| 1003508 | [305734](https://svnweb.freebsd.org/changeset/base/305734) | 2016 年 9 月 12 日  | 在解决 `device_detach()` 和 `usbd_do_request_flags(9)` 之间死锁后的 10-STABLE。                                                                                                                                                                                   |
| 1003509 | [307331](https://svnweb.freebsd.org/changeset/base/307331) | 2016 年 10 月 14 日 | 在 `ZFS` 合并后的 10-STABLE。                                                                                                                                                                                                                                |
| 1003510 | [308047](https://svnweb.freebsd.org/changeset/base/308047) | 2016 年 10 月 28 日 | 在安装使用 `libzfs_core` 进行开发所需的头文件后的 10-STABLE。                                                                                                                                                                                                            |
| 1003511 | [310121](https://svnweb.freebsd.org/changeset/base/310121) | 2016 年 12 月 15 日 | 在 `kinfo_proc` 中导出整个线程名称后的 10-STABLE（修订版 [309676](https://svnweb.freebsd.org/changeset/base/309676)）。                                                                                                                                                  |
| 1003512 | [315730](https://svnweb.freebsd.org/changeset/base/315730) | 2017 年 3 月 22 日  | 在 `libmd` 更改后的 10-STABLE（修订版 [314143](https://svnweb.freebsd.org/changeset/base/314143)）。                                                                                                                                                              |
| 1003513 | [316499](https://svnweb.freebsd.org/changeset/base/316499) | 2017 年 4 月 4 日   | 在使 `CAM` `SIM` 锁定可选后的 10-STABLE（修订版 [315673](https://svnweb.freebsd.org/changeset/base/315673)、[315674](https://svnweb.freebsd.org/changeset/base/315674)）。                                                                                            |
| 1003514 | [318198](https://svnweb.freebsd.org/changeset/base/318198) | 2017 年 5 月 11 日  | 在合并添加 **\<dev/mmc/mmc\_ioctl.h>** 头文件后的 10-STABLE。                                                                                                                                                                                                     |
| 1003515 | [321222](https://svnweb.freebsd.org/changeset/base/321222) | 2017 年 7 月 19 日  | 在向 `libc++` 添加 `C++14` 大小的释放函数后的 10-STABLE。                                                                                                                                                                                                            |
| 1003516 | [321717](https://svnweb.freebsd.org/changeset/base/321717) | 2017 年 7 月 30 日  | 在合并添加 `MAP_GUARD` `mmap(2)` 标志后的 10-STABLE。                                                                                                                                                                                                            |
| 1004000 | [323604](https://svnweb.freebsd.org/changeset/base/323604) | 2017 年 9 月 15 日  | **releng/10.4** 从 10-STABLE 分支出来。                                                                                                                                                                                                                      |
| 1004500 | [323605](https://svnweb.freebsd.org/changeset/base/323605) | 2017 年 9 月 15 日  | 在 **releng/10.4** 从 10-STABLE 分支后的 10-STABLE。                                                                                                                                                                                                          |
| 1004501 | [328379](https://svnweb.freebsd.org/changeset/base/328379) | 2018 年 1 月 24 日  | 在合并 [325028](https://svnweb.freebsd.org/changeset/base/325028) 后的 10-STABLE，修复 `ptrace()` 以在恢复时始终清除正确的线程事件。                                                                                                                                            |
| 1004502 | [356396](https://svnweb.freebsd.org/changeset/base/356396) | 2020 年 1 月 6 日   | 在将 `USB` 统计数据改为每设备而非每总线后的 10-STABLE。                                                                                                                                                                                                                   |
| 1004503 | [356681](https://svnweb.freebsd.org/changeset/base/356681) | 2020 年 1 月 13 日  | 在为被取消的 `USB` 传输添加独立计数器后的 10-STABLE。                                                                                                                                                                                                                    |

## 18.8. FreeBSD 9 版本

**表 8. FreeBSD 9 \_\_FreeBSD\_version 值**

| 值      | 修订                                                         | 日期               | 发布                                                                                                                                         |
| ------ | ---------------------------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| 900000 | [196432](https://svnweb.freebsd.org/changeset/base/196432) | 2009 年 8 月 22 日  | 9.0-CURRENT.                                                                                                                               |
| 900001 | [197019](https://svnweb.freebsd.org/changeset/base/197019) | 2009 年 9 月 8 日   | 在导入 `x86emu` 后的 9.0-CURRENT，这是一个用于模拟实模式 x86 CPU 的软件仿真器，来自 OpenBSD。                                                                         |
| 900002 | [197430](https://svnweb.freebsd.org/changeset/base/197430) | 2009 年 9 月 23 日  | 在实现 `EVFILT_USER` `kevent` 过滤功能后的 9.0-CURRENT。                                                                                             |
| 900003 | [200039](https://svnweb.freebsd.org/changeset/base/200039) | 2009 年 12 月 2 日  | 在添加 `sigpause(2)` 和 `PIE` 支持后的 9.0-CURRENT。                                                                                                |
| 900004 | [200185](https://svnweb.freebsd.org/changeset/base/200185) | 2009 年 12 月 6 日  | 在添加 `libulog` 及其 `libutempter` 兼容接口后的 9.0-CURRENT。                                                                                         |
| 900005 | [200447](https://svnweb.freebsd.org/changeset/base/200447) | 2009 年 12 月 12 日 | 在添加 `sleepq_sleepcnt(9)` 后的 9.0-CURRENT，可用于查询特定等待队列上等待者的数量。                                                                                |
| 900006 | [201513](https://svnweb.freebsd.org/changeset/base/201513) | 2010 年 1 月 4 日   | 在将 `scandir(3)` 和 `alphasort(3)` 原型更改为符合 SUSv4 后的 9.0-CURRENT。                                                                             |
| 900007 | [202219](https://svnweb.freebsd.org/changeset/base/202219) | 2010 年 1 月 13 日  | 在删除 `utmp(5)` 并添加 `utmpx`（参见 `getutxent(3)`）以改善用户登录和系统事件记录后的 9.0-CURRENT。                                                                  |
| 900008 | [202722](https://svnweb.freebsd.org/changeset/base/202722) | 2010 年 1 月 20 日  | 在导入 BSDL `bc/dc` 并废弃 GNU `bc/dc` 后的 9.0-CURRENT。                                                                                           |
| 900009 | [203052](https://svnweb.freebsd.org/changeset/base/203052) | 2010 年 1 月 26 日  | 在向网络接口添加 `SIOCGIFDESCR` 和 `SIOCSIFDESCR` ioctl 后的 9.0-CURRENT。这些 ioctl 可用于操纵接口描述，灵感来自 OpenBSD。                                             |
| 900010 | [205471](https://svnweb.freebsd.org/changeset/base/205471) | 2010 年 3 月 22 日  | 在导入 `zlib` 1.2.4 后的 9.0-CURRENT。                                                                                                           |
| 900011 | [207410](https://svnweb.freebsd.org/changeset/base/207410) | 2010 年 4 月 24 日  | 在添加 soft-updates 日志记录后的 9.0-CURRENT。                                                                                                       |
| 900012 | [207842](https://svnweb.freebsd.org/changeset/base/207842) | 2010 年 5 月 10 日  | 在添加 `liblzma`、`xz`、`xzdec` 和 `lzmainfo` 后的 9.0-CURRENT。                                                                                    |
| 900013 | [208486](https://svnweb.freebsd.org/changeset/base/208486) | 2010 年 5 月 24 日  | 在为 `linux(4)` 引入 `USB` 修复后的 9.0-CURRENT。                                                                                                   |
| 900014 | [208973](https://svnweb.freebsd.org/changeset/base/208973) | 2010 年 6 月 10 日  | 在添加 `Clang` 后的 9.0-CURRENT。                                                                                                                |
| 900015 | [210390](https://svnweb.freebsd.org/changeset/base/210390) | 2010 年 7 月 22 日  | 在导入 BSD `grep` 后的 9.0-CURRENT。                                                                                                             |
| 900016 | [210565](https://svnweb.freebsd.org/changeset/base/210565) | 2010 年 7 月 28 日  | 在向 `malloc_type_internal` 结构体添加 `mti_zone` 后的 9.0-CURRENT。                                                                                 |
| 900017 | [211701](https://svnweb.freebsd.org/changeset/base/211701) | 2010 年 8 月 23 日  | 在将默认 `grep` 更改回 GNU `grep` 并添加 `WITH_BSD_GREP` 开关后的 9.0-CURRENT。                                                                           |
| 900018 | [211735](https://svnweb.freebsd.org/changeset/base/211735) | 2010 年 8 月 24 日  | 在由 `pthread_kill(3)` 生成的信号在 `si_code` 中被识别为 `SI_LWP` 后的 9.0-CURRENT。之前，`si_code` 为 `SI_USER`。                                              |
| 900019 | [211937](https://svnweb.freebsd.org/changeset/base/211937) | 2010 年 8 月 28 日  | 在向 `mmap(2)` 添加 `MAP_PREFAULT_READ` 标志后的 9.0-CURRENT。                                                                                      |
| 900020 | [212381](https://svnweb.freebsd.org/changeset/base/212381) | 2010 年 9 月 9 日   | 在向 `sbufs` 添加 drain 功能后的 9.0-CURRENT，这也改变了 `struct sbuf` 的布局。                                                                              |
| 900021 | [212568](https://svnweb.freebsd.org/changeset/base/212568) | 2010 年 9 月 13 日  | 在 DTrace 增加对用户空间跟踪支持后的 9.0-CURRENT。                                                                                                        |
| 900022 | [213395](https://svnweb.freebsd.org/changeset/base/213395) | 2010 年 10 月 2 日  | 在添加 BSDL `man` 实用程序并淘汰 GNU/GPL `man` 实用程序后的 9.0-CURRENT。                                                                                   |
| 900023 | [213700](https://svnweb.freebsd.org/changeset/base/213700) | 2010 年 10 月 11 日 | 在将 `xz` 更新为 git 20101010 快照后的 9.0-CURRENT。                                                                                                 |
| 900024 | [215127](https://svnweb.freebsd.org/changeset/base/215127) | 2010 年 11 月 11 日 | 在 `libgcc.a` 被 `libcompiler_rt.a` 替换后的 9.0-CURRENT。                                                                                        |
| 900025 | [215166](https://svnweb.freebsd.org/changeset/base/215166) | 2010 年 11 月 12 日 | 在引入模块化拥塞控制后的 9.0-CURRENT。                                                                                                                  |
| 900026 | [216088](https://svnweb.freebsd.org/changeset/base/216088) | 2010 年 11 月 30 日 | 在引入串行管理协议（SMP）透传以及 `XPT_SMP_IO` 和 `XPT_GDEV_ADVINFO` CAM `CCBs` 后的 9.0-CURRENT。                                                            |
| 900027 | [216212](https://svnweb.freebsd.org/changeset/base/216212) | 2010 年 12 月 5 日  | 在将 `log2` 添加到 `libm` 后的 9.0-CURRENT。                                                                                                       |
| 900028 | [216615](https://svnweb.freebsd.org/changeset/base/216615) | 2010 年 12 月 21 日 | 在添加 Hhook（Helper Hook）、Khelp（Kernel Helpers）和 Object Specific Data（OSD）KPI 后的 9.0-CURRENT。                                                 |
| 900029 | [216758](https://svnweb.freebsd.org/changeset/base/216758) | 2010 年 12 月 28 日 | 在修改 TCP 堆栈以允许 Khelp 模块通过助手挂钩点与其交互，并在 TCP 控制块中存储每个连接数据后的 9.0-CURRENT。                                                                       |
| 900030 | [217309](https://svnweb.freebsd.org/changeset/base/217309) | 2011 年 1 月 12 日  | 在将 `libdialog` 更新到 20100428 版本后的 9.0-CURRENT。                                                                                              |
| 900031 | [218414](https://svnweb.freebsd.org/changeset/base/218414) | 2011 年 2 月 7 日   | 在添加 `pthread_getthreadid_np(3)` 后的 9.0-CURRENT。                                                                                            |
| 900032 | [218425](https://svnweb.freebsd.org/changeset/base/218425) | 2011 年 2 月 8 日   | 在删除 uio\_yield 原型和符号后的 9.0-CURRENT。                                                                                                        |
| 900033 | [218822](https://svnweb.freebsd.org/changeset/base/218822) | 2011 年 2 月 18 日  | 在将 `binutils` 更新到 2.17.50 版本后的 9.0-CURRENT。                                                                                                |
| 900034 | [219406](https://svnweb.freebsd.org/changeset/base/219406) | 2011 年 3 月 8 日   | 在结构体 `sysvec`（`sv_schedtail`）更改后的 9.0-CURRENT。                                                                                             |
| 900035 | [220150](https://svnweb.freebsd.org/changeset/base/220150) | 2011 年 3 月 29 日  | 在将基本 `gcc` 和 `libstdc++` 更新到最后的 GPLv2 许可修订版后的 9.0-CURRENT。                                                                                 |
| 900036 | [220770](https://svnweb.freebsd.org/changeset/base/220770) | 2011 年 4 月 18 日  | 在从基本系统中删除 `libobjc` 和 Objective-C 支持后的 9.0-CURRENT。                                                                                        |
| 900037 | [221862](https://svnweb.freebsd.org/changeset/base/221862) | 2011 年 5 月 13 日  | 在向基本系统导入 `libprocstat(3)` 库和 `fuser(1)` 实用程序后的 9.0-CURRENT。                                                                                |
| 900038 | [222167](https://svnweb.freebsd.org/changeset/base/222167) | 2011 年 5 月 22 日  | 在向 `VFS_FHTOVP(9)` 添加锁标志参数后的 9.0-CURRENT。                                                                                                  |
| 900039 | [223637](https://svnweb.freebsd.org/changeset/base/223637) | 2011 年 6 月 28 日  | 在从 OpenBSD 4.5 导入 `pf` 后的 9.0-CURRENT。                                                                                                     |
| 900040 | [224217](https://svnweb.freebsd.org/changeset/base/224217) | 2011 年 7 月 19 日  | 将 FreeBSD 的默认 `MAXCPU` 在 `amd64` 和 `ia64` 上增加到 64，对于 XLP（mips）增加到 128。                                                                     |
| 900041 | [224834](https://svnweb.freebsd.org/changeset/base/224834) | 2011 年 8 月 13 日  | 在实现 Capsicum 功能后的 9.0-CURRENT；fget(9)获得了一个权限参数。                                                                                            |
| 900042 | [225350](https://svnweb.freebsd.org/changeset/base/225350) | 2011 年 8 月 28 日  | 为准备 9.0，为 ABI 发生更改的共享库提升版本号。                                                                                                               |
| 900043 | [225350](https://svnweb.freebsd.org/changeset/base/225350) | 2011 年 9 月 2 日   | 添加不支持同步缓存 SCSI 命令的 USB 大容量存储设备的自动检测。                                                                                                       |
| 900044 | [225469](https://svnweb.freebsd.org/changeset/base/225469) | 2011 年 9 月 10 日  | 重构自动特性。9.0-RELEASE。                                                                                                                        |
| 900045 | [229285](https://svnweb.freebsd.org/changeset/base/229285) | 2012 年 1 月 2 日   | 在从 1000002 合并 `true`/`false` 后的 9-STABLE。                                                                                                  |
| 900500 | [229318](https://svnweb.freebsd.org/changeset/base/229318) | 2012 年 1 月 2 日   | 9.0-STABLE.                                                                                                                                |
| 900501 | [229723](https://svnweb.freebsd.org/changeset/base/229723) | 2012 年 1 月 6 日   | 在合并添加 `posix_fadvise(2)` 系统调用后的 9.0-STABLE。                                                                                                |
| 900502 | [230237](https://svnweb.freebsd.org/changeset/base/230237) | 2012 年 1 月 16 日  | 合并 gperf 3.0.3 之后的 9.0-STABLE                                                                                                              |
| 900503 | [231768](https://svnweb.freebsd.org/changeset/base/231768) | 2012 年 2 月 15 日  | 引入新的可扩展 sysctl(3)接口 NET\_RT\_IFLISTL 用于查询地址列表后的 9.0-STABLE。                                                                                |
| 900504 | [232728](https://svnweb.freebsd.org/changeset/base/232728) | 2012 年 3 月 3 日   | 在jail内挂载文件系统相关更改后的 9.0-STABLE。                                                                                                             |
| 900505 | [232945](https://svnweb.freebsd.org/changeset/base/232945) | 2012 年 3 月 13 日  | 引入新的 tcp(4)套接字选项后的 9.0-STABLE：TCP\_KEEPINIT，TCP\_KEEPIDLE，TCP\_KEEPINTVL 和 TCP\_KEEPCNT。                                                   |
| 900506 | [235786](https://svnweb.freebsd.org/changeset/base/235786) | 2012 年 5 月 22 日  | 9.0-STABLE 在引入 quick\_exit 函数以及 C++11 所需的相关更改后。                                                                                            |
| 901000 | [239082](https://svnweb.freebsd.org/changeset/base/239082) | 2012 年 8 月 5 日   | 9.1-RELEASE.                                                                                                                               |
| 901500 | [239081](https://svnweb.freebsd.org/changeset/base/239081) | 2012 年 8 月 6 日   | 分支 releng/9.1 之后的 9.1-STABLE（RELENG\_9\_1）。                                                                                                |
| 901501 | [240659](https://svnweb.freebsd.org/changeset/base/240659) | 2012 年 11 月 11 日 | 在 queue.h 中添加 LIST\_PREV(3)（修订 242893）和 USB 串行设备的 KBI 更改后的 9.1-STABLE。                                                                     |
| 901502 | [243656](https://svnweb.freebsd.org/changeset/base/243656) | 2012 年 11 月 28 日 | U 盘中的 9.1-STABLE 在 USB 串行抖动缓冲区之后需要重建 USB 串行设备模块。                                                                                           |
| 901503 | [247090](https://svnweb.freebsd.org/changeset/base/247090) | 2013 年 2 月 21 日  | 将 USB 移至驱动程序结构后的 9.1-STABLE 需要重新构建所有 USB 模块。还指示存在 nmtree。                                                                                  |
| 901504 | [248338](https://svnweb.freebsd.org/changeset/base/248338) | 2013 年 3 月 15 日  | 安装后的 9.1-STABLE 获得了-l、-M、-N 和相关标志，cat 获得了-l 选项。                                                                                            |
| 901505 | [251687](https://svnweb.freebsd.org/changeset/base/251687) | 2013 年 6 月 13 日  | 经过修复的 9.1-STABLE 在 ctfmerge 自举 (rev 249243).                                                                                               |
| 902001 | [253912](https://svnweb.freebsd.org/changeset/base/253912) | 2013 年 8 月 3 日   | releng/9.2 从 stable/9 分支出来。                                                                                                                |
| 902501 | [253913](https://svnweb.freebsd.org/changeset/base/253913) | 2013 年 8 月 2 日   | 创建 releng/9.2 分支后的 9.2-STABLE。                                                                                                             |
| 902502 | [254938](https://svnweb.freebsd.org/changeset/base/254938) | 2013 年 8 月 26 日  | 包含 PIM\_RESCAN CAM 路径查询标志后的 9.2-STABLE。                                                                                                    |
| 902503 | [254979](https://svnweb.freebsd.org/changeset/base/254979) | 2013 年 8 月 27 日  | 包含 SI\_UNMAPPED cdev 标志后的 9.2-STABLE。                                                                                                      |
| 902504 | [256917](https://svnweb.freebsd.org/changeset/base/256917) | 2013 年 10 月 22 日 | 在包含对"首次启动"rc(8)脚本的支持后，9.2-STABLE。                                                                                                          |
| 902505 | [259448](https://svnweb.freebsd.org/changeset/base/259448) | 2013 年 12 月 12 日 | 在 Heimdal 编码修复之后的 9.2-STABLE。                                                                                                              |
| 902506 | [260136](https://svnweb.freebsd.org/changeset/base/260136) | 2013 年 12 月 31 日 | 在 MAP\_STACK 修复（版本 260082）之后的 9-STABLE。                                                                                                    |
| 902507 | [262801](https://svnweb.freebsd.org/changeset/base/262801) | 2014 年 3 月 5 日   | 升级 libc++至 3.4 版本后的 9-STABLE。                                                                                                              |
| 902508 | [263171](https://svnweb.freebsd.org/changeset/base/263171) | 2014 年 3 月 14 日  | 9-STABLE 合并了 Radeon KMS 驱动程序（rev 263170）。                                                                                                  |
| 902509 | [263509](https://svnweb.freebsd.org/changeset/base/263509) | 2014 年 3 月 21 日  | 升级到 LLVM/Clang 3.4 版本之后的 9-STABLE。                                                                                                         |
| 902510 | [263818](https://svnweb.freebsd.org/changeset/base/263818) | 2014 年 3 月 27 日  | 合并了 vt(4) 驱动程序后的 9-STABLE。                                                                                                                 |
| 902511 | [264289](https://svnweb.freebsd.org/changeset/base/264289) | 2014 年 3 月 27 日  | FreeBSD-SA-14:06.openssl 之后的 9-STABLE。                                                                                                     |
| 902512 | [265123](https://svnweb.freebsd.org/changeset/base/265123) | 2014 年 4 月 30 日  | 在 FreeBSD-SA-14:08.tcp 之后的 9-STABLE。                                                                                                       |
| 903000 | [267656](https://svnweb.freebsd.org/changeset/base/267656) | 2014 年 6 月 20 日  | 9-RC1 releng/9.3 分支。                                                                                                                       |
| 903500 | [267657](https://svnweb.freebsd.org/changeset/base/267657) | 2014 年 6 月 20 日  | 9.3-STABLE releng/9.3 分支。                                                                                                                  |
| 903501 | [268443](https://svnweb.freebsd.org/changeset/base/268443) | 2014 年 7 月 8 日   | 在 FreeBSD-SA-14:17.kmem (rev 268433)之后的 9-STABLE。                                                                                          |
| 903502 | [270175](https://svnweb.freebsd.org/changeset/base/270175) | 2014 年 8 月 19 日  | 在 SOCK\_DGRAM bug 修复之后的 9-STABLE (rev 269789)。                                                                                             |
| 903503 | [271341](https://svnweb.freebsd.org/changeset/base/271341) | 2014 年 9 月 9 日   | 自 FreeBSD-SA-14:18 之后的 9-STABLE（修订版 269687）。                                                                                               |
| 903504 | [271686](https://svnweb.freebsd.org/changeset/base/271686) | 2014 年 9 月 16 日  | 在 FreeBSD-SA-14:19 之后的 9-STABLE（修订版 271668）。                                                                                               |
| 903505 | [273432](https://svnweb.freebsd.org/changeset/base/273432) | 2014 年 10 月 21 日 | 在 FreeBSD-SA-14:20，FreeBSD-SA-14:21 和 FreeBSD-SA-14:22 之后的 9-STABLE（修订版 273412）。                                                           |
| 903506 | [274162](https://svnweb.freebsd.org/changeset/base/274162) | 2014 年 11 月 4 日  | FreeBSD-SA-14:23、FreeBSD-SA-14:24 和 FreeBSD-SA-14:25 之后的 9-STABLE。                                                                         |
| 903507 | [275742](https://svnweb.freebsd.org/changeset/base/275742) | 2014 年 12 月 13 日 | 在合并重要修复到 LLVM 向量化器后的 9-STABLE，某些情况下可能导致缓冲区溢出。                                                                                              |
| 903508 | [279287](https://svnweb.freebsd.org/changeset/base/279287) | 2015 年 2 月 25 日  | 在 FreeBSD-EN-15:01.vt，FreeBSD-EN-15:02.openssl，FreeBSD-EN-15:03.freebsd-update，FreeBSD-SA-15:04.igmp 和 FreeBSD-SA-15:05.bind 之后的 9-STABLE。 |
| 903509 | [296219](https://svnweb.freebsd.org/changeset/base/296219) | 2016 年 2 月 29 日  | 在将默认值从 compat.linux.osrelease 调整为 2.6.18 以支持开箱即用的 linux-c6-\* ports之后的 9-STABLE。                                                           |
| 903510 | [300236](https://svnweb.freebsd.org/changeset/base/300236) | 2016 年 5 月 19 日  | 最新版本的伯克利引导加载程序（BBL）在系统二进制接口（SBI）页面移动后，9-STABLE 由于代码尺寸增加了 300234。                                                                           |
| 903511 | [305735](https://svnweb.freebsd.org/changeset/base/305735) | 2016 年 9 月 12 日  | 通过解决 device\_detach() 和 usbd\_do\_request\_flags(9)之间的死锁问题后的 9-STABLE。                                                                     |

## 18.9. FreeBSD 8 版本

**表 9. FreeBSD 8 \_\_FreeBSD\_version 值**

| 值      | 修订                                                         | 日期               | 发布                                                                                                                                         |
| ------ | ---------------------------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| 800000 | [172531](https://svnweb.freebsd.org/changeset/base/172531) | 2007 年 10 月 11 日 | 8.0-CURRENT。将宽字节和单字节 ctype 分开。                                                                                                             |
| 800001 | [172688](https://svnweb.freebsd.org/changeset/base/172688) | 2007 年 10 月 16 日 | 8.0-CURRENT 在 libpcap 0.9.8 和 tcpdump 3.9.8 导入后。                                                                                           |
| 800002 | [172841](https://svnweb.freebsd.org/changeset/base/172841) | 2007 年 10 月 21 日 | 8.0-CURRENT 在将 kthread\_create(9) 等重命名为 kproc\_create(9) 之后。                                                                               |
| 800003 | [172932](https://svnweb.freebsd.org/changeset/base/172932) | 2007 年 10 月 24 日 | 在将 ABI 向后兼容性添加到 FreeBSD 4/5/6 版本的 PCIOCGETCONF、PCIOCREAD 和 PCIOCWRITE IOCTL 之后，需要再次破坏 PCIOCGETCONF IOCTL 的 ABI                             |
| 800004 | [173573](https://svnweb.freebsd.org/changeset/base/173573) | 2007 年 11 月 12 日 | 8.0-CURRENT 在将 agp(4)驱动程序从 src/sys/pci 移动到 src/sys/dev/agp 之后                                                                              |
| 800005 | [174261](https://svnweb.freebsd.org/changeset/base/174261) | 2007 年 12 月 4 日  | 8.0-CURRENT 在 jumbo 帧分配器发生更改之后（修订版本 174247）。                                                                                               |
| 800006 | [174399](https://svnweb.freebsd.org/changeset/base/174399) | 2007 年 12 月 7 日  | 在 hwpmc(4)添加 callgraph 捕获功能后的 8.0-CURRENT。                                                                                                 |
| 800007 | [174901](https://svnweb.freebsd.org/changeset/base/174901) | 2007 年 12 月 25 日 | 8.0-CURRENT 后 kdb\_enter() 增加了一个"why"参数。                                                                                                   |
| 800008 | [174951](https://svnweb.freebsd.org/changeset/base/174951) | 2007 年 12 月 28 日 | 8.0-CURRENT 在移除 LK\_EXCLUPGRADE 选项后。                                                                                                       |
| 800009 | [175168](https://svnweb.freebsd.org/changeset/base/175168) | 2008 年 1 月 9 日   | 引入 lockmgr\_disown(9)后的 8.0-CURRENT                                                                                                        |
| 800010 | [175204](https://svnweb.freebsd.org/changeset/base/175204) | 2008 年 1 月 10 日  | vn\_lock(9)原型更改后的 8.0-CURRENT                                                                                                              |
| 800011 | [175295](https://svnweb.freebsd.org/changeset/base/175295) | 2008 年 1 月 13 日  | VOP\_LOCK(9)和 VOP\_UNLOCK(9)原型更改后的 8.0-CURRENT。                                                                                            |
| 800012 | [175487](https://svnweb.freebsd.org/changeset/base/175487) | 2008 年 1 月 19 日  | 在引入 lockmgr\_recursed(9)、BUF\_RECURSED(9) 和 BUF\_ISLOCKED(9) 以及删除 BUF\_REFCNT() 后的 8.0-CURRENT。                                            |
| 800013 | [175581](https://svnweb.freebsd.org/changeset/base/175581) | 2008 年 1 月 23 日  | 在引入“ASCII”编码后的 8.0-CURRENT。                                                                                                                |
| 800014 | [175636](https://svnweb.freebsd.org/changeset/base/175636) | 2008 年 1 月 24 日  | 更改 lockmgr(9)原型和删除 lockcount() 和 LOCKMGR\_ASSERT() 后的 8.0-CURRENT。                                                                         |
| 800015 | [175688](https://svnweb.freebsd.org/changeset/base/175688) | 2008 年 1 月 26 日  | 8.0-CURRENT 在扩展 fts(3) 结构的类型之后。                                                                                                            |
| 800016 | [175872](https://svnweb.freebsd.org/changeset/base/175872) | 2008 年 2 月 1 日   | 在向 MEXTADD(9) 添加参数后的 8.0-CURRENT                                                                                                           |
| 800017 | [176015](https://svnweb.freebsd.org/changeset/base/176015) | 2008 年 2 月 6 日   | 在 lockmgr(9)空间中引入 LK\_NODUP 和 LK\_NOWITNESS 选项后的 8.0-CURRENT。                                                                              |
| 800018 | [176112](https://svnweb.freebsd.org/changeset/base/176112) | 2008 年 2 月 8 日   | 8.0-CURRENT 添加 m\_collapse 后。                                                                                                              |
| 800019 | [176124](https://svnweb.freebsd.org/changeset/base/176124) | 2008 年 2 月 9 日   | 8.0-CURRENT 将当前工作目录、根目录和jail目录支持添加到 kern.proc.filedesc sysctl 后。                                                                           |
| 800020 | [176251](https://svnweb.freebsd.org/changeset/base/176251) | 2008 年 2 月 13 日  | 引入 lockmgr\_assert(9)和 BUF\_ASSERT 函数后的 8.0-CURRENT。                                                                                       |
| 800021 | [176321](https://svnweb.freebsd.org/changeset/base/176321) | 2008 年 2 月 15 日  | 8.0-CURRENT 在引入 lockmgr\_args(9)和移除 LK\_INTERNAL 标志之后。                                                                                     |
| 800022 | [176556](https://svnweb.freebsd.org/changeset/base/176556) | (撤销)             | 8.0-CURRENT 在将默认系统 ar 更改为 BSD ar(1)之后。                                                                                                     |
| 800023 | [176560](https://svnweb.freebsd.org/changeset/base/176560) | 2008 年 2 月 25 日  | 更改 lockstatus(9)和 VOP\_ISLOCKED(9)的原型后的 8.0-CURRENT；更具体地说是淘汰 struct thread 参数。                                                             |
| 800024 | [176709](https://svnweb.freebsd.org/changeset/base/176709) | 2008 年 3 月 1 日   | 砍掉 lockwaiters 和 BUF\_LOCKWAITERS 函数后，8.0-CURRENT 将 brelvp 的返回值从 void 改为 int，并为 lockinit(9)引入了新标志。                                         |
| 800025 | [176958](https://svnweb.freebsd.org/changeset/base/176958) | 2008 年 3 月 8 日   | 8.0-CURRENT 在 fcntl(2)中添加 F\_DUP2FD 命令后。                                                                                                   |
| 800026 | [177086](https://svnweb.freebsd.org/changeset/base/177086) | 2008 年 3 月 12 日  | 在将优先级参数更改为 cv\_broadcastpri 后的 8.0-CURRENT，其中 0 表示无优先级。                                                                                    |
| 800027 | [177551](https://svnweb.freebsd.org/changeset/base/177551) | 2008 年 3 月 24 日  | 在将 bpf 监控 ABI 更改为 zerocopy bpf 缓冲区添加后的 8.0-CURRENT。                                                                                        |
| 800028 | [177637](https://svnweb.freebsd.org/changeset/base/177637) | 2008 年 3 月 26 日  | 在将 l\_sysid 添加到 struct flock 后的 8.0-CURRENT。                                                                                               |
| 800029 | [177688](https://svnweb.freebsd.org/changeset/base/177688) | 2008 年 3 月 28 日  | 继重新集成 BUF\_LOCKWAITERS 函数和添加 lockmgr\_waiters(9)之后的 8.0-CURRENT。                                                                           |
| 800030 | [177844](https://svnweb.freebsd.org/changeset/base/177844) | 2008 年 4 月 1 日   | 引入 rw\_try\_rlock(9) 和 rw\_try\_wlock(9) 函数后的 8.0-CURRENT。                                                                                 |
| 800031 | [177958](https://svnweb.freebsd.org/changeset/base/177958) | 2008 年 4 月 6 日   | 引入 lockmgr\_rw 和 lockmgr\_args\_rw 函数后的 8.0-CURRENT。                                                                                       |
| 800032 | [178006](https://svnweb.freebsd.org/changeset/base/178006) | 2008 年 4 月 8 日   | 在实现 openat 和相关系统调用后的 8.0-CURRENT 版本，引入了 open(2)的 O\_EXEC 标志，并提供了相应的 Linux 兼容系统调用。                                                          |
| 800033 | [178017](https://svnweb.freebsd.org/changeset/base/178017) | 2008 年 4 月 8 日   | 在本机操作级别为 psm(4) 添加了 write(2) 支持后的 8.0-CURRENT。现在可以向 /dev/psm%d 写入任意命令，并从中读取状态。                                                             |
| 800034 | [178051](https://svnweb.freebsd.org/changeset/base/178051) | 2008 年 4 月 10 日  | 引入 memrchr 函数后的 8.0-CURRENT。                                                                                                               |
| 800035 | [178256](https://svnweb.freebsd.org/changeset/base/178256) | 2008 年 4 月 16 日  | 在引入 fdopendir 函数后的 8.0-CURRENT。                                                                                                            |
| 800036 | [178362](https://svnweb.freebsd.org/changeset/base/178362) | 2008 年 4 月 20 日  | 在 8.0-CURRENT 切换到 802.11 无线到多 BSS 支持后 (又称 vaps )。                                                                                          |
| 800037 | [178892](https://svnweb.freebsd.org/changeset/base/178892) | 2008 年 5 月 9 日   | 在 8.0-CURRENT 添加多路由表支持后 (又称 setfib(1), setfib(2))。                                                                                         |
| 800038 | [179316](https://svnweb.freebsd.org/changeset/base/179316) | 2008 年 5 月 26 日  | 删除 netatm 和 ISDN4BSD 后的 8.0-CURRENT 版本。此外，还添加了紧凑型 C 类型（CTF）工具。                                                                             |
| 800039 | [179784](https://svnweb.freebsd.org/changeset/base/179784) | 2008 年 6 月 14 日  | 8.0-CURRENT 删除 sgtty 后。                                                                                                                    |
| 800040 | [180025](https://svnweb.freebsd.org/changeset/base/180025) | 2008 年 6 月 26 日  | 8.0-CURRENT 使用内核 NFS lockd 客户端。                                                                                                            |
| 800041 | [180691](https://svnweb.freebsd.org/changeset/base/180691) | 2008 年 7 月 22 日  | 在添加 arc4random\_buf(3)和 arc4random\_uniform(3)之后的 8.0-CURRENT。                                                                             |
| 800042 | [181439](https://svnweb.freebsd.org/changeset/base/181439) | 2008 年 8 月 8 日   | 8.0-CURRENT 加入 cpuctl(4)后。                                                                                                                 |
| 800043 | [181694](https://svnweb.freebsd.org/changeset/base/181694) | 2008 年 8 月 13 日  | 将 bpf(4)更改为使用单个设备节点的 8.0-CURRENT。                                                                                                          |
| 800044 | [181803](https://svnweb.freebsd.org/changeset/base/181803) | 2008 年 8 月 17 日  | 在 VIMAGE 项目第一步提交后的 8.0-CURRENT，将全局变量重命名为具有 `V_` 前缀的 virtualized 宏，然后再将它们映射回其全局名称。                                                          |
| 800045 | [181905](https://svnweb.freebsd.org/changeset/base/181905) | 2008 年 8 月 20 日  | 8.0-CURRENT 在集成 MPSAFE TTY 层后，包括与其交互的各种驱动程序和实用程序的更改。                                                                                       |
| 800046 | [182869](https://svnweb.freebsd.org/changeset/base/182869) | 2008 年 9 月 8 日   | 8.0-CURRENT 在 amd64 架构上每 CPU 的 GDT 分离后。                                                                                                    |
| 800047 | [182905](https://svnweb.freebsd.org/changeset/base/182905) | 2008 年 9 月 10 日  | 删除 VSVTX、VSGID 和 VSUID 后的 8.0-CURRENT。                                                                                                     |
| 800048 | [183091](https://svnweb.freebsd.org/changeset/base/183091) | 2008 年 9 月 16 日  | 将内核 NFS 挂载代码转换为在 nmount(2)中接受单独的挂载选项后的 8.0-CURRENT iovec ，而不仅仅是一个大的 struct nfs\_args。                                                      |
| 800049 | [183114](https://svnweb.freebsd.org/changeset/base/183114) | 2008 年 9 月 17 日  | 在删除 suser(9)和 suser\_cred(9)之后的 8.0-CURRENT。                                                                                               |
| 800050 | [184099](https://svnweb.freebsd.org/changeset/base/184099) | 2008 年 10 月 20 日 | 缓存 API 更改后的 8.0-CURRENT。                                                                                                                   |
| 800051 | [184205](https://svnweb.freebsd.org/changeset/base/184205) | 2008 年 10 月 23 日 | 在移除 MALLOC(9) 和 FREE(9) 宏之后的 8.0-CURRENT。                                                                                                  |
| 800052 | [184419](https://svnweb.freebsd.org/changeset/base/184419) | 2008 年 10 月 28 日 | 8.0-CURRENT 在 accmode\_t 的引入和将 VOP\_ACCESS a\_mode 参数重命名为 a\_accmode 之后。                                                                   |
| 800053 | [184555](https://svnweb.freebsd.org/changeset/base/184555) | 2008 年 11 月 2 日  | 8.0-CURRENT 修改了 vfs\_busy(9) 的原型并引入了它的 MBF\_NOWAIT 和 MBF\_MNTLSTLOCK 标志。                                                                   |
| 800054 | [185162](https://svnweb.freebsd.org/changeset/base/185162) | 2008 年 11 月 22 日 | 在添加 buf\_ring 后的 8.0-CURRENT，添加了内存屏障和 ifnet 功能，以促进支持这些功能的卡的多个硬件传输队列，并添加了无锁环形缓冲区实现，以使驱动程序能够更有效地管理数据包的排队。                                    |
| 800055 | [185363](https://svnweb.freebsd.org/changeset/base/185363) | 2008 年 11 月 27 日 | 8.0-CURRENT 在添加 Intel™ Core, Core2 和 Atom 支持到 hwpmc(4) 后。                                                                                  |
| 800056 | [185435](https://svnweb.freebsd.org/changeset/base/185435) | 2008 年 11 月 29 日 | 8.0-CURRENT 在引入多/无 IPv4/v6 jails 后。                                                                                                        |
| 800057 | [185522](https://svnweb.freebsd.org/changeset/base/185522) | 2008 年 12 月 1 日  | 在切换到 ath hal 源代码后，8.0-CURRENT                                                                                                              |
| 800058 | [185968](https://svnweb.freebsd.org/changeset/base/185968) | 2008 年 12 月 12 日 | 8.0-CURRENT 在 VOP\_VPTOCNP 操作引入后。                                                                                                          |
| 800059 | [186119](https://svnweb.freebsd.org/changeset/base/186119) | 2008 年 12 月 15 日 | 8.0-CURRENT 包括新的 arp-v2 重写。                                                                                                                |
| 800060 | [186344](https://svnweb.freebsd.org/changeset/base/186344) | 2008 年 12 月 19 日 | 添加 makefs 后的 8.0-CURRENT。                                                                                                                  |
| 800061 | [187289](https://svnweb.freebsd.org/changeset/base/187289) | 2009 年 1 月 15 日  | 在 TCP 适当字节计数后的 8.0-CURRENT。                                                                                                                |
| 800062 | [187830](https://svnweb.freebsd.org/changeset/base/187830) | 2009 年 1 月 28 日  | 在删除 minor() ， minor2unit() ， unit2minor() 等之后的 8.0-CURRENT                                                                                 |
| 800063 | [188745](https://svnweb.freebsd.org/changeset/base/188745) | 2009 年 2 月 18 日  | 在 GENERIC 配置更改为使用 USB2 堆栈后的 8.0-CURRENT，同时还添加了 fdevname(3)。                                                                                |
| 800064 | [188946](https://svnweb.freebsd.org/changeset/base/188946) | 2009 年 2 月 23 日  | 在 USB2 堆栈移至并替换 dev/usb 后的 8.0-CURRENT。                                                                                                     |
| 800065 | [189092](https://svnweb.freebsd.org/changeset/base/189092) | 2009 年 2 月 26 日  | 在重命名 libmp(3)中的所有函数后，8.0-CURRENT。                                                                                                          |
| 800066 | [189110](https://svnweb.freebsd.org/changeset/base/189110) | 2009 年 2 月 27 日  | 更改 USB devfs 处理和布局后的 8.0-CURRENT。                                                                                                          |
| 800067 | [189136](https://svnweb.freebsd.org/changeset/base/189136) | 2009 年 2 月 28 日  | 在添加 getdelim() ， getline() ， stpncpy() ， strnlen() ， wcsnlen() ， wcscasecmp() 和 wcsncasecmp() 后的 8.0-CURRENT。                              |
| 800068 | [189276](https://svnweb.freebsd.org/changeset/base/189276) | 2009 年 3 月 2 日   | 重命名 ushub devclass 为 uhub 后的 8.0-CURRENT。                                                                                                  |
| 800069 | [189585](https://svnweb.freebsd.org/changeset/base/189585) | 2009 年 3 月 9 日   | 将 libusb20.so.1 重命名为 libusb.so.1 后的 8.0-CURRENT。                                                                                           |
| 800070 | [189592](https://svnweb.freebsd.org/changeset/base/189592) | 2009 年 3 月 9 日   | 将 IGMPv3 和源特定多播（SSM）合并到 IPv4 堆栈后的 8.0-CURRENT。                                                                                             |
| 800071 | [189825](https://svnweb.freebsd.org/changeset/base/189825) | 2009 年 3 月 14 日  | 在 gcc 被修补以在 c99 和 gnu99 模式下使用 C99 内联语义后的 8.0-CURRENT。                                                                                      |
| 800072 | [189853](https://svnweb.freebsd.org/changeset/base/189853) | 2009 年 3 月 15 日  | 在移除 IFF\_NEEDSGIANT 标志后的 8.0-CURRENT；不再支持非 MPSAFE 网络设备驱动程序。                                                                                |
| 800073 | [190265](https://svnweb.freebsd.org/changeset/base/190265) | 2009 年 3 月 18 日  | 在为 rpath 和所需路径实现动态字符串令牌替换后的 8.0-CURRENT。                                                                                                   |
| 800074 | [190373](https://svnweb.freebsd.org/changeset/base/190373) | 2009 年 3 月 24 日  | 8.0-CURRENT 在 tcpdump 4.0.0 和 libpcap 1.0.0 导入后。                                                                                           |
| 800075 | [190787](https://svnweb.freebsd.org/changeset/base/190787) | 2009 年 4 月 6 日   | 8.0-CURRENT 在更改 vnet\_net、vnet\_inet 和 vnet\_ipfw 结构布局后。                                                                                   |
| 800076 | [190866](https://svnweb.freebsd.org/changeset/base/190866) | 2009 年 4 月 9 日   | 在 dummynet 中添加延迟配置后的 8.0-当前版本。                                                                                                             |
| 800077 | [190914](https://svnweb.freebsd.org/changeset/base/190914) | 2009 年 4 月 14 日  | 移除 VOP\_LEASE() 和 vop\_vector.vop\_lease 后的 8.0-CURRENT。                                                                                   |
| 800078 | [191080](https://svnweb.freebsd.org/changeset/base/191080) | 2009 年 4 月 15 日  | 在添加结构 rt\_weight 字段到结构 rt\_metrics 和结构 rt\_metrics\_lite 后的 8.0-CURRENT，改变了结构 rt\_metrics\_lite 的布局。进行了版本号 RTM\_VERSION 的提升，但后来被撤销。        |
| 800079 | [191117](https://svnweb.freebsd.org/changeset/base/191117) | 2009 年 4 月 15 日  | 在将 llentry 指针添加到 struct route 和 struct route\_in6 之后的 8.0-CURRENT。                                                                         |
| 800080 | [191126](https://svnweb.freebsd.org/changeset/base/191126) | 2009 年 4 月 15 日  | 8.0-CURRENT 在 struct inpcb 布局更改后。                                                                                                          |
| 800081 | [191267](https://svnweb.freebsd.org/changeset/base/191267) | 2009 年 4 月 19 日  | 8.0-CURRENT 在更改了结构 malloc\_type 的布局之后。                                                                                                     |
| 800082 | [191368](https://svnweb.freebsd.org/changeset/base/191368) | 2009 年 4 月 21 日  | 8.0-CURRENT 在更改了结构 ifnet 后，以及具有 if\_ref() 和 if\_rele() ifnet refcounting 。                                                                 |
| 800083 | [191389](https://svnweb.freebsd.org/changeset/base/191389) | 2009 年 4 月 22 日  | 在实现低级别蓝牙 HCI API 后的 8.0-CURRENT。                                                                                                           |
| 800084 | [191672](https://svnweb.freebsd.org/changeset/base/191672) | 2009 年 4 月 29 日  | 在 IPv6 SSM 和 MLDv2 更改后的 8.0-CURRENT。                                                                                                       |
| 800085 | [191688](https://svnweb.freebsd.org/changeset/base/191688) | 2009 年 4 月 30 日  | 在启用支持具有一个活动镜像的 VIMAGE 内核构建后的 8.0-CURRENT。                                                                                                  |
| 800086 | [191910](https://svnweb.freebsd.org/changeset/base/191910) | 2009 年 5 月 8 日   | 在 patch(1)中添加对任意长度输入行的支持后的 8.0-CURRENT。                                                                                                    |
| 800087 | [191990](https://svnweb.freebsd.org/changeset/base/191990) | 2009 年 5 月 11 日  | 在一些 VFS KPI 更改后的 8.0-CURRENT。线程参数从 VFS 的 FSD 部分移除。 VFS\_\* 函数不再需要上下文，因为它总是指向 curthread 。在一些特殊情况下，保留了旧的行为。                                  |
| 800088 | [192470](https://svnweb.freebsd.org/changeset/base/192470) | 2009 年 5 月 20 日  | 在 net80211 监控模式更改后的 8.0-CURRENT。                                                                                                           |
| 800089 | [192649](https://svnweb.freebsd.org/changeset/base/192649) | 2009 年 5 月 23 日  | 添加 UDP 控制块支持后的 8.0-CURRENT。                                                                                                                |
| 800090 | [192669](https://svnweb.freebsd.org/changeset/base/192669) | 2009 年 5 月 23 日  | 在虚拟化接口克隆后的 8.0-CURRENT。                                                                                                                    |
| 800091 | [192895](https://svnweb.freebsd.org/changeset/base/192895) | 2009 年 5 月 27 日  | 在添加分层jails和移除全局安全级别后的 8.0-CURRENT。                                                                                                         |
| 800092 | [193011](https://svnweb.freebsd.org/changeset/base/193011) | 2009 年 5 月 29 日  | 在更改 sx\_init\_flags() KPI 后的 8.0-CURRENT。 SX\_ADAPTIVESPIN 退役，并引入了一个新的 SX\_NOADAPTIVE 标志来处理反向逻辑。                                           |
| 800093 | [193047](https://svnweb.freebsd.org/changeset/base/193047) | 2009 年 5 月 29 日  | 在向结构挂载添加 mnt\_xflag 后的 8.0-CURRENT。                                                                                                        |
| 800094 | [193093](https://svnweb.freebsd.org/changeset/base/193093) | 2009 年 5 月 30 日  | 在添加 VOP\_ACCESSX(9)后的 8.0-CURRENT。                                                                                                         |
| 800095 | [193096](https://svnweb.freebsd.org/changeset/base/193096) | 2009 年 5 月 30 日  | 在更改轮询 KPI 后的 8.0-CURRENT。现在轮询处理程序返回处理的数据包数量。还引入了一个新的 IFCAP\_POLLING\_NOCOUNT ，用于指定返回值不重要且应跳过计数。                                            |
| 800096 | [193219](https://svnweb.freebsd.org/changeset/base/193219) | 2009 年 6 月 1 日   | 8.0-CURRENT 在更新到新的 netisr 实现后，并在更改存储和访问 FIB 的方式后。                                                                                          |
| 800097 | [193731](https://svnweb.freebsd.org/changeset/base/193731) | 2009 年 6 月 8 日   | 8.0-CURRENT 在引入 vnet 析构钩子和基础设施后。                                                                                                           |
| （未更改）  | [194012](https://svnweb.freebsd.org/changeset/base/194012) | 2009 年 6 月 11 日  | 在引入 netgraph 出站到入站路径调用检测和排队后的 8.0-CURRENT，也改变了 struct thread 的布局。                                                                          |
| 800098 | [194210](https://svnweb.freebsd.org/changeset/base/194210) | 2009 年 6 月 14 日  | 导入 OpenSSL 0.9.8k 后的 8.0-CURRENT。                                                                                                          |
| 800099 | [194675](https://svnweb.freebsd.org/changeset/base/194675) | 2009 年 6 月 22 日  | 8.0-CURRENT 在 NGROUPS 更新后，并将路由虚拟化移入其自己的 VImage 模块中。                                                                                        |
| 800100 | [194920](https://svnweb.freebsd.org/changeset/base/194920) | 2009 年 6 月 24 日  | 8.0-CURRENT 在 SYSVIPC ABI 更改之后。                                                                                                            |
| 800101 | [195175](https://svnweb.freebsd.org/changeset/base/195175) | 2009 年 6 月 29 日  | 在删除每个接口的 **/dev/net/**\* 字符设备后的 8.0-CURRENT。                                                                                               |
| 800102 | [195634](https://svnweb.freebsd.org/changeset/base/195634) | 2009 年 7 月 12 日  | 添加填充到结构 sackhint 、结构 tcpcb 和结构 tcpstat 后的 8.0-CURRENT 。                                                                                    |
| 800103 | [195654](https://svnweb.freebsd.org/changeset/base/195654) | 2009 年 7 月 13 日  | 在 TOE 驱动程序接口中用结构 toeopt 替换结构 tcpopt 后的 8.0-CURRENT 到 TCP syncache 。                                                                        |
| 800104 | [195699](https://svnweb.freebsd.org/changeset/base/195699) | 2009 年 7 月 14 日  | 在添加基于链接器集的每个虚拟网络分配器后的 8.0-CURRENT。                                                                                                         |
| 800105 | [195767](https://svnweb.freebsd.org/changeset/base/195767) | 2009 年 7 月 19 日  | 8.0-CURRENT 在为未打开符号版本的所有共享库版本增加后。                                                                                                          |
| 800106 | [195852](https://svnweb.freebsd.org/changeset/base/195852) | 2009 年 7 月 24 日  | 8.0-CURRENT 在引入 OBJT\_SG VM 对象类型后。                                                                                                         |
| 800107 | [196037](https://svnweb.freebsd.org/changeset/base/196037) | 2009 年 8 月 2 日   | 在添加新总线 sxlock 和 8.0-RELEASE 后，使新总线子系统 Giant 免费的 8.0-CURRENT。                                                                               |
| 800108 | [199627](https://svnweb.freebsd.org/changeset/base/199627) | 2009 年 11 月 21 日 | 在实现 EVFILT\_USER kevent 过滤器后的 8.0-STABLE。                                                                                                  |
| 800500 | [201749](https://svnweb.freebsd.org/changeset/base/201749) | 2010 年 1 月 7 日   | 在 \_\_FreeBSD\_version 提升后，使 pkg\_add -r 使用 packages-8-stable 的 8.0-STABLE。                                                                |
| 800501 | [202922](https://svnweb.freebsd.org/changeset/base/202922) | 2010 年 1 月 24 日  | 更改 scandir(3)和 alphasort(3)原型以符合 SUSv4 后的 8.0-STABLE。                                                                                      |
| 800502 | [203299](https://svnweb.freebsd.org/changeset/base/203299) | 2010 年 1 月 31 日  | 添加 sigpause(2)后的 8.0-STABLE。                                                                                                               |
| 800503 | [204344](https://svnweb.freebsd.org/changeset/base/204344) | 2010 年 2 月 25 日  | 在网络接口中添加 SIOCGIFDESCR 和 SIOCSIFDESCR ioctl 后的 8.0-STABLE。这些 ioctl 可用于操纵接口描述，受 OpenBSD 启发。                                                  |
| 800504 | [204546](https://svnweb.freebsd.org/changeset/base/204546) | 2010 年 3 月 1 日   | 在将 x86emu 引入 MFC 后的 8.0-STABLE，从 OpenBSD 导入实模式 x86 CPU 的软件仿真器。                                                                             |
| 800505 | [208259](https://svnweb.freebsd.org/changeset/base/208259) | 2010 年 5 月 18 日  | 添加 liblzma、xz、xzdec 和 lzmainfo 后的 8.0-STABLE MFC。                                                                                          |
| 801000 | [209150](https://svnweb.freebsd.org/changeset/base/209150) | 2010 年 6 月 14 日  | 8.1-RELEASE                                                                                                                                |
| 801500 | [209146](https://svnweb.freebsd.org/changeset/base/209146) | 2010 年 6 月 14 日  | 8.1-STABLE 在 8.1-RELEASE 之后。                                                                                                               |
| 801501 | [214762](https://svnweb.freebsd.org/changeset/base/214762) | 2010 年 11 月 3 日  | 在结构 sysentvec 的 KBI 更改后，以及对 ptrace(PT\_LWPINFO)实现 PL\_FLAG\_SCE/SCX/EXEC/SI 和 pl\_siginfo 之后的 8.1-STABLE。                                  |
| 802000 | [216639](https://svnweb.freebsd.org/changeset/base/216639) | 2010 年 12 月 22 日 | 8.2-RELEASE                                                                                                                                |
| 802500 | [216654](https://svnweb.freebsd.org/changeset/base/216654) | 2010 年 12 月 22 日 | 8.2-RELEASE 后的 8.2-STABLE。                                                                                                                 |
| 802501 | [219107](https://svnweb.freebsd.org/changeset/base/219107) | 2011 年 2 月 28 日  | 自合并 DTrace 更改后的 8.2-STABLE 版本，包括对用户空间跟踪的支持。                                                                                                |
| 802502 | [219324](https://svnweb.freebsd.org/changeset/base/219324) | 2011 年 3 月 6 日   | 合并 log2 和 log2f 到 libm 后的 8.2-STABLE。                                                                                                      |
| 802503 | [221275](https://svnweb.freebsd.org/changeset/base/221275) | 2011 年 5 月 1 日   | 将 gcc 升级到 FSF gcc-4\_2-branch 的最新 GPLv2 版本后的 8.2-STABLE。                                                                                   |
| 802504 | [222401](https://svnweb.freebsd.org/changeset/base/222401) | 2011 年 5 月 28 日  | 在引入 KPI 和支持模块化拥塞控制基础设施后的 8.2-STABLE。                                                                                                       |
| 802505 | [222406](https://svnweb.freebsd.org/changeset/base/222406) | 2011 年 5 月 28 日  | 引入 Hhook 和 Khelp KPIs 后的 8.2-STABLE。                                                                                                       |
| 802506 | [222408](https://svnweb.freebsd.org/changeset/base/222408) | 2011 年 5 月 28 日  | 在 struct tcpcb 中添加 OSD 后的 8.2-STABLE。                                                                                                      |
| 802507 | [222741](https://svnweb.freebsd.org/changeset/base/222741) | 2011 年 6 月 6 日   | 在 ZFS v28 导入后的 8.2-STABLE。                                                                                                                 |
| 802508 | [222846](https://svnweb.freebsd.org/changeset/base/222846) | 2011 年 6 月 8 日   | 在从 schedtail 事件处理程序中移除并向结构 sysvec 添加 sv\_schedtail 方法后的 8.2-STABLE。                                                                        |
| 802509 | [224017](https://svnweb.freebsd.org/changeset/base/224017) | 2011 年 7 月 14 日  | 在将 SSSE3 支持合并到 binutils 后的 8.2-STABLE。                                                                                                     |
| 802510 | [224214](https://svnweb.freebsd.org/changeset/base/224214) | 2011 年 7 月 19 日  | 在添加 RFTSIGZMB 标志给 rfork(2)后的 8.2-STABLE。                                                                                                   |
| 802511 | [225458](https://svnweb.freebsd.org/changeset/base/225458) | 2011 年 9 月 9 日   | 添加自动检测不支持禁止同步高速缓存 SCSI 命令的 USB 大容量存储设备后的 8.2-STABLE。                                                                                       |
| 802512 | [225470](https://svnweb.freebsd.org/changeset/base/225470) | 2011 年 9 月 10 日  | 合并重新调整自动特性的 8.2-STABLE。                                                                                                                    |
| 802513 | [226763](https://svnweb.freebsd.org/changeset/base/226763) | 2011 年 10 月 25 日 | 在将 MAP\_PREFAULT\_READ 标志合并到 mmap(2)后的 8.2-STABLE 版本。                                                                                      |
| 802514 | [227573](https://svnweb.freebsd.org/changeset/base/227573) | 2011 年 11 月 16 日 | 合并了 posix\_fallocate(2)系统调用的 8.2-STABLE。                                                                                                   |
| 802515 | [229725](https://svnweb.freebsd.org/changeset/base/229725) | 2012 年 1 月 6 日   | 合并了 posix\_fadvise(2)系统调用的 8.2-STABLE。                                                                                                     |
| 802516 | [230239](https://svnweb.freebsd.org/changeset/base/230239) | 2012 年 1 月 16 日  | 合并 gperf 3.0.3 后的 8.2-STABLE 版本                                                                                                            |
| 802517 | [231769](https://svnweb.freebsd.org/changeset/base/231769) | 2012 年 2 月 15 日  | 引入新的可扩展 sysctl(3)接口 NET\_RT\_IFLISTL 后的 8.2-STABLE 用于查询地址列表。                                                                               |
| 803000 | [232446](https://svnweb.freebsd.org/changeset/base/232446) | 2012 年 3 月 3 日   | 8.3-RELEASE.                                                                                                                               |
| 803500 | [232439](https://svnweb.freebsd.org/changeset/base/232439) | 2012 年 3 月 3 日   | 分支 releng/8.3 后的 8.3-STABLE（RELENG\_8\_3）。                                                                                                 |
| 803501 | [247091](https://svnweb.freebsd.org/changeset/base/247091) | 2013 年 2 月 21 日  | 在两个 USB 修复（修订版 246616 和 246759）MFC 后的 8.3-STABLE。                                                                                          |
| 804000 | [248850](https://svnweb.freebsd.org/changeset/base/248850) | 2013 年 3 月 28 日  | 8.4-RELEASE.                                                                                                                               |
| 804500 | [248819](https://svnweb.freebsd.org/changeset/base/248819) | 2013 年 3 月 28 日  | 8.4-发布后的 STABLE。                                                                                                                           |
| 804501 | [259449](https://svnweb.freebsd.org/changeset/base/259449) | 2013 年 12 月 16 日 | 在上游 Heimdal 编码修复合并后的 8.4-STABLE 版本。                                                                                                        |
| 804502 | [265123](https://svnweb.freebsd.org/changeset/base/265123) | 2014 年 4 月 30 日  | FreeBSD-SA-14:08.tcp 后的 8.4-STABLE 版本。                                                                                                     |
| 804503 | [268444](https://svnweb.freebsd.org/changeset/base/268444) | 2014 年 7 月 9 日   | FreeBSD-SA-14:17.kmem 之后的 8.4-STABLE。                                                                                                      |
| 804504 | [271341](https://svnweb.freebsd.org/changeset/base/271341) | 2014 年 9 月 9 日   | FreeBSD-SA-14:18（修订版 271305）后的 8.4-STABLE。                                                                                                 |
| 804505 | [271686](https://svnweb.freebsd.org/changeset/base/271686) | 2014 年 9 月 16 日  | FreeBSD-SA-14:19（修订版 271668）后的 8.4-STABLE。                                                                                                 |
| 804506 | [273432](https://svnweb.freebsd.org/changeset/base/273432) | 2014 年 10 月 21 日 | FreeBSD-SA-14:21（修订版 273413）后的 8.4-STABLE。                                                                                                 |
| 804507 | [274162](https://svnweb.freebsd.org/changeset/base/274162) | 2014 年 11 月 4 日  | 在 FreeBSD-SA-14:23、FreeBSD-SA-14:24 和 FreeBSD-SA-14:25 之后的 8.4-STABLE。                                                                     |
| 804508 | [279287](https://svnweb.freebsd.org/changeset/base/279287) | 2015 年 2 月 25 日  | 在 FreeBSD-EN-15:01.vt、FreeBSD-EN-15:02.openssl、FreeBSD-EN-15:03.freebsd-update、FreeBSD-SA-15:04.igmp 和 FreeBSD-SA-15:05.bind 之后的 8-STABLE。 |
| 804509 | [305736](https://svnweb.freebsd.org/changeset/base/305736) | 2016 年 9 月 12 日  | 在解决 device\_detach() 和 usbd\_do\_request\_flags(9)之间的死锁后，8-STABLE。                                                                         |

## 18.10. FreeBSD 7 版本

**表 10. FreeBSD 7 \_\_FreeBSD\_version 值**

| 值      | 修订                                                         | 日期               | 发布                                                                                                                                                   |
| ------ | ---------------------------------------------------------- | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| 700000 | [147925](https://svnweb.freebsd.org/changeset/base/147925) | 2005 年 7 月 11 日  | 7.0-CURRENT.                                                                                                                                         |
| 700001 | [148341](https://svnweb.freebsd.org/changeset/base/148341) | 2005 年 7 月 23 日  | 在所有自 RELENG\_5 以来未更改的共享库版本提升后的 7.0-CURRENT。                                                                                                          |
| 700002 | [149039](https://svnweb.freebsd.org/changeset/base/149039) | 2005 年 8 月 13 日  | 在添加凭据参数到 dev\_clone 事件处理程序后的 7.0-CURRENT。                                                                                                            |
| 700003 | [149470](https://svnweb.freebsd.org/changeset/base/149470) | 2005 年 8 月 25 日  | 在 memmem(3) 添加到 libc 后的 7.0-CURRENT。                                                                                                                 |
| 700004 | [151888](https://svnweb.freebsd.org/changeset/base/151888) | 2005 年 10 月 30 日 | 7.0-CURRENT 在修改 solisten(9)内核参数以接受 backlog 参数之后。                                                                                                     |
| 700005 | [152296](https://svnweb.freebsd.org/changeset/base/152296) | 2005 年 11 月 11 日 | 在 IFP2ENADDR() 更改为返回 IF\_LLADDR() 后的 7.0-CURRENT。                                                                                                    |
| 700006 | [152315](https://svnweb.freebsd.org/changeset/base/152315) | 2005 年 11 月 11 日 | 在添加 if\_addr 成员到 struct ifnet 并移除 IFP2ENADDR() 之后的 7.0-CURRENT 版本。                                                                                   |
| 700007 | [153027](https://svnweb.freebsd.org/changeset/base/153027) | 2005 年 12 月 2 日  | 在将来自 local\_startup 目录中的脚本纳入基本 rcorder(8)之后的 7.0-CURRENT 版本。                                                                                         |
| 700008 | [153107](https://svnweb.freebsd.org/changeset/base/153107) | 2005 年 12 月 5 日  | 删除 MNT\_NODEV 挂载选项后的 7.0-CURRENT。                                                                                                                    |
| 700009 | [153519](https://svnweb.freebsd.org/changeset/base/153519) | 2005 年 12 月 19 日 | ELF-64 类型更改和符号版本化后的 7.0-CURRENT。                                                                                                                     |
| 700010 | [153579](https://svnweb.freebsd.org/changeset/base/153579) | 2005 年 12 月 20 日 | 添加 hostb 和 vgapci 驱动程序后，添加 pci\_find\_extcap() ，并将 AGP 驱动程序更改为不再映射孔。                                                                                 |
| 700011 | [153936](https://svnweb.freebsd.org/changeset/base/153936) | 2005 年 12 月 31 日 | 在除 Alpha 外的所有平台上将 `tv_sec` 改为 `time_t` 后的 7.0-CURRENT。                                                                                               |
| 700012 | [154114](https://svnweb.freebsd.org/changeset/base/154114) | 2006 年 1 月 8 日   | 7.0-CURRENT 在 ldconfig\_local\_dirs 更改后。                                                                                                             |
| 700013 | [154269](https://svnweb.freebsd.org/changeset/base/154269) | 2006 年 1 月 12 日  | 在更改 **/etc/rc.d/abi** 以支持 **/compat/linux/etc/ld.so.cache** 作为只读文件系统中的符号链接后的 7.0-CURRENT。                                                            |
| 700014 | [154863](https://svnweb.freebsd.org/changeset/base/154863) | 2006 年 1 月 26 日  | pts 导入后的 7.0-CURRENT。                                                                                                                                |
| 700015 | [157144](https://svnweb.freebsd.org/changeset/base/157144) | 2006 年 3 月 26 日  | 引入 hwpmc(4)版本 2 ABI 后的 7.0-CURRENT。                                                                                                                  |
| 700016 | [157962](https://svnweb.freebsd.org/changeset/base/157962) | 2006 年 4 月 22 日  | 7.0-CURRENT 在将 fcloseall(3) 添加到 libc 后。                                                                                                              |
| 700017 | [158513](https://svnweb.freebsd.org/changeset/base/158513) | 2006 年 5 月 13 日  | 7.0-CURRENT 删除 ip6fw 后。                                                                                                                              |
| 700018 | [160386](https://svnweb.freebsd.org/changeset/base/160386) | 2006 年 7 月 15 日  | 导入 snd\_emu10kx 后的 7.0-CURRENT。                                                                                                                      |
| 700019 | [160821](https://svnweb.freebsd.org/changeset/base/160821) | 2006 年 7 月 29 日  | 导入 OpenSSL 0.9.8b 后的 7.0-CURRENT。                                                                                                                    |
| 700020 | [161931](https://svnweb.freebsd.org/changeset/base/161931) | 2006 年 9 月 3 日   | 添加 bus\_dma\_get\_tag 功能后的 7.0-CURRENT                                                                                                               |
| 700021 | [162023](https://svnweb.freebsd.org/changeset/base/162023) | 2006 年 9 月 4 日   | 导入 libpcap 0.9.4 和 tcpdump 3.9.4 后的 7.0-CURRENT                                                                                                      |
| 700022 | [162170](https://svnweb.freebsd.org/changeset/base/162170) | 2006 年 9 月 9 日   | 在 dlsym 更改后的 7.0-CURRENT 中，查找请求的符号时会同时在指定的 DSO 和其隐式依赖项中查找。                                                                                           |
| 700023 | [162588](https://svnweb.freebsd.org/changeset/base/162588) | 2006 年 9 月 23 日  | 7.0-CURRENT 在为 OSSv4 混音器 API 添加新的声音 IOCTL 后。                                                                                                         |
| 700024 | [162919](https://svnweb.freebsd.org/changeset/base/162919) | 2006 年 9 月 28 日  | 7.0-CURRENT 在导入 OpenSSL 0.9.8d 后。                                                                                                                    |
| 700025 | [164190](https://svnweb.freebsd.org/changeset/base/164190) | 2006 年 11 月 11 日 | 在添加 libelf 之后的 7.0-CURRENT。                                                                                                                          |
| 700026 | [164614](https://svnweb.freebsd.org/changeset/base/164614) | 2006 年 11 月 26 日 | 最近在声音 sysctl 上的重大更改后的 7.0-CURRENT。                                                                                                                   |
| 700027 | [164770](https://svnweb.freebsd.org/changeset/base/164770) | 2006 年 11 月 30 日 | 在添加 Wi-Spy 特性后的 7.0-CURRENT。                                                                                                                         |
| 700028 | [165242](https://svnweb.freebsd.org/changeset/base/165242) | 2006 年 12 月 15 日 | 在向 libc 添加 sctp 调用之后的 7.0-CURRENT                                                                                                                    |
| 700029 | [166259](https://svnweb.freebsd.org/changeset/base/166259) | 2007 年 1 月 26 日  | 7.0-CURRENT 在用来自 NetBSD 移植的 BSD 许可版本替换 GNU gzip(1)实现之后。                                                                                              |
| 700030 | [166549](https://svnweb.freebsd.org/changeset/base/166549) | 2007 年 2 月 7 日   | 从 IPv4 多播转发代码中移除 IPIP 隧道封装(VIFF\_TUNNEL)后的 7.0-CURRENT。                                                                                              |
| 700031 | [166907](https://svnweb.freebsd.org/changeset/base/166907) | 2007 年 2 月 23 日  | 在 bus\_setup\_intr() （newbus）修改后的 7.0-CURRENT。                                                                                                       |
| 700032 | [167165](https://svnweb.freebsd.org/changeset/base/167165) | 2007 年 3 月 2 日   | 7.0-CURRENT 包含 ipw(4) 和 iwi(4) 固件后。                                                                                                                  |
| 700033 | [167360](https://svnweb.freebsd.org/changeset/base/167360) | 2007 年 3 月 9 日   | 7.0-CURRENT 包含 ncurses 宽字符支持后。                                                                                                                       |
| 700034 | [167684](https://svnweb.freebsd.org/changeset/base/167684) | 2007 年 3 月 19 日  | 在对 insmntque() ， getnewvnode() 和 vfs\_hash\_insert() 的工作方式进行更改后，7.0-CURRENT。                                                                         |
| 700035 | [167906](https://svnweb.freebsd.org/changeset/base/167906) | 2007 年 3 月 26 日  | 添加了用于 CPU 频率变化通知机制的 7.0-CURRENT。                                                                                                                     |
| 700036 | [168413](https://svnweb.freebsd.org/changeset/base/168413) | 2007 年 4 月 6 日   | 导入 ZFS 文件系统后的 7.0-CURRENT。                                                                                                                           |
| 700037 | [168504](https://svnweb.freebsd.org/changeset/base/168504) | 2007 年 4 月 8 日   | 在添加 CAM 'SG'外围设备后的 7.0-CURRENT，该设备实现了 Linux SCSI SG 透传设备 API 的子集。                                                                                    |
| 700038 | [169151](https://svnweb.freebsd.org/changeset/base/169151) | 2007 年 4 月 30 日  | 在将 getenv(3)、putenv(3)、setenv(3) 和 unsetenv(3) 更改为符合 POSIX 标准后的 7.0-CURRENT。                                                                         |
| 700039 | [169190](https://svnweb.freebsd.org/changeset/base/169190) | 2007 年 5 月 1 日   | 在撤销了 700038 中的更改后的 7.0-CURRENT。                                                                                                                      |
| 700040 | [169453](https://svnweb.freebsd.org/changeset/base/169453) | 2007 年 5 月 10 日  | 在将 flopen(3)添加到 libutil 之后的 7.0-CURRENT。                                                                                                             |
| 700041 | [169526](https://svnweb.freebsd.org/changeset/base/169526) | 2007 年 5 月 13 日  | 7.0-CURRENT 启用符号版本控制，并将默认线程库更改为 libthr。                                                                                                              |
| 700042 | [169758](https://svnweb.freebsd.org/changeset/base/169758) | 2007 年 5 月 19 日  | 7.0-CURRENT 在导入 gcc 4.2.0 后。                                                                                                                         |
| 700043 | [169830](https://svnweb.freebsd.org/changeset/base/169830) | 2007 年 5 月 21 日  | 在升级所有自 RELENG\_6 以来未更改的共享库版本后的 7.0-CURRENT。                                                                                                          |
| 700044 | [170395](https://svnweb.freebsd.org/changeset/base/170395) | 2007 年 6 月 7 日   | 在从文件描述符索引更改为结构文件\*后的 7.0-CURRENT 中 vn\_open() / VOP\_OPEN() 参数。                                                                                      |
| 700045 | [170510](https://svnweb.freebsd.org/changeset/base/170510) | 2007 年 6 月 10 日  | 在将 pam\_nologin(8)更改为向 PAM 框架提供帐户管理功能而不是认证功能后的 7.0-CURRENT。                                                                                          |
| 700046 | [170530](https://svnweb.freebsd.org/changeset/base/170530) | 2007 年 6 月 11 日  | 更新后的 802.11 无线支持 7.0-CURRENT。                                                                                                                        |
| 700047 | [170579](https://svnweb.freebsd.org/changeset/base/170579) | 2007 年 6 月 11 日  | 添加 TCP LRO 接口功能后的 7.0-CURRENT。                                                                                                                       |
| 700048 | [170613](https://svnweb.freebsd.org/changeset/base/170613) | 2007 年 6 月 12 日  | 在 IPv4 栈中添加了 RFC 3678 API 支持后的 7.0-CURRENT。现移除 IP\_MULTICAST\_IF ioctl 的传统 RFC 1724 行为；不再可以使用 0.0.0.0/8 来指定接口索引。请改用结构 ipmreqn 。                      |
| 700049 | [171175](https://svnweb.freebsd.org/changeset/base/171175) | 2007 年 7 月 3 日   | 从 OpenBSD 4.1 导入 pf 后的 7.0-CURRENT                                                                                                                   |
| （未更改）  | [171167](https://svnweb.freebsd.org/changeset/base/171167) |                  | 7.0-CURRENT 在为 FAST\_IPSEC 添加 IPv6 支持之后，删除 KAME IPSEC 并将 FAST\_IPSEC 更名为 IPSEC。                                                                      |
| 700050 | [171195](https://svnweb.freebsd.org/changeset/base/171195) | 2007 年 7 月 4 日   | 7.0-CURRENT 在将 setenv/putenv 等函数调用从传统 BSD 转换为 POSIX 之后。                                                                                              |
| 700051 | [171211](https://svnweb.freebsd.org/changeset/base/171211) | 2007 年 7 月 4 日   | 添加新的 mmap/lseek 等系统调用后的 7.0-CURRENT。                                                                                                                 |
| 700052 | [171275](https://svnweb.freebsd.org/changeset/base/171275) | 2007 年 7 月 6 日   | 7.0-CURRENT 将 I4B 标头移至 include/i4b 后。                                                                                                                |
| 700053 | [172394](https://svnweb.freebsd.org/changeset/base/172394) | 2007 年 9 月 30 日  | 7.0-CURRENT 在添加对 PCI 域支持之后。                                                                                                                          |
| 700054 | [172988](https://svnweb.freebsd.org/changeset/base/172988) | 2007 年 10 月 25 日 | 在宽字符和单字节字符类型分离合并后的 7.0-STABLE。                                                                                                                       |
| 700055 | [173104](https://svnweb.freebsd.org/changeset/base/173104) | 2007 年 10 月 28 日 | 7.0-RELEASE，并在 ABI 向后兼容性到 FreeBSD 4/5/6 版本的 PCIOCGETCONF、PCIOCREAD 和 PCIOCWRITE IOCTLs 之后，需要再次破坏 PCIOCGETCONF IOCTL 的 ABI，这是在 7.0-CURRENT 之后 MFCed 的 |
| 700100 | [174864](https://svnweb.freebsd.org/changeset/base/174864) | 2007 年 12 月 22 日 | 7.0-RELEASE 之后的 7.0-STABLE                                                                                                                           |
| 700101 | [176111](https://svnweb.freebsd.org/changeset/base/176111) | 2008 年 2 月 8 日   | m\_collapse() 合并后的 7.0-STABLE 。                                                                                                                      |
| 700102 | [177735](https://svnweb.freebsd.org/changeset/base/177735) | 2008 年 3 月 30 日  | kdb\_enter\_why() 后的 7.0-STABLE 。                                                                                                                    |
| 700103 | [178061](https://svnweb.freebsd.org/changeset/base/178061) | 2008 年 4 月 10 日  | 将 l\_sysid 添加到 struct flock 后的 7.0-STABLE 。                                                                                                          |
| 700104 | [178108](https://svnweb.freebsd.org/changeset/base/178108) | 2008 年 4 月 11 日  | 在 procstat(1) 的 MFC 之后的 7.0-STABLE。                                                                                                                  |
| 700105 | [178120](https://svnweb.freebsd.org/changeset/base/178120) | 2008 年 4 月 11 日  | 在 umtx 功能的 MFC 之后的 7.0-STABLE。                                                                                                                       |
| 700106 | [178225](https://svnweb.freebsd.org/changeset/base/178225) | 2008 年 4 月 15 日  | 在将 write(2)支持 MFC 到 psm(4)之后的 7.0-STABLE 版本。                                                                                                         |
| 700107 | [178353](https://svnweb.freebsd.org/changeset/base/178353) | 2008 年 4 月 20 日  | 7.0-STABLE 在将 F\_DUP2FD 命令 MFC 到 fcntl(2) 之后。                                                                                                        |
| 700108 | [178783](https://svnweb.freebsd.org/changeset/base/178783) | 2008 年 5 月 5 日   | 7.0-STABLE 在一些 lockmgr(9) 更改之后，使用 lockmgr(9) 必须包括 sys/lock.h。                                                                                        |
| 700109 | [179367](https://svnweb.freebsd.org/changeset/base/179367) | 2008 年 5 月 27 日  | memrchr(3)函数的 MFC 后，7.0-STABLE。                                                                                                                      |
| 700110 | [181328](https://svnweb.freebsd.org/changeset/base/181328) | 2008 年 8 月 5 日   | 在内核 NFS lockd 客户端 MFC 后的 7.0-STABLE。                                                                                                                 |
| 700111 | [181940](https://svnweb.freebsd.org/changeset/base/181940) | 2008 年 8 月 20 日  | 在添加物理连续巨帧支持后的 7.0-STABLE。                                                                                                                            |
| 700112 | [182294](https://svnweb.freebsd.org/changeset/base/182294) | 2008 年 8 月 27 日  | 内核 DTrace 支持 MFC 后的 7.0-STABLE。                                                                                                                      |
| 701000 | [185315](https://svnweb.freebsd.org/changeset/base/185315) | 2008 年 11 月 25 日 | 7.1-RELEASE                                                                                                                                          |
| 701100 | [185302](https://svnweb.freebsd.org/changeset/base/185302) | 2008 年 11 月 25 日 | 7.1-RELEASE 后的 7.1-STABLE。                                                                                                                           |
| 701101 | [187023](https://svnweb.freebsd.org/changeset/base/187023) | 2009 年 1 月 10 日  | 7.1-STABLE 合并 strndup(3)后。                                                                                                                           |
| 701102 | [187370](https://svnweb.freebsd.org/changeset/base/187370) | 2009 年 1 月 17 日  | 添加 cpuctl(4)支持后的 7.1-STABLE。                                                                                                                         |
| 701103 | [188281](https://svnweb.freebsd.org/changeset/base/188281) | 2009 年 2 月 7 日   | 多/无-IPv4/v6jails合并后的 7.1-STABLE。                                                                                                                     |
| 701104 | [188625](https://svnweb.freebsd.org/changeset/base/188625) | 2009 年 2 月 14 日  | 在挂载结构所有者的存储之后，将 7.1-STABLE 引入 struct mount，并将 vfs\_susp\_clean 方法引入 struct vfsops 中。                                                                 |
| 701105 | [189740](https://svnweb.freebsd.org/changeset/base/189740) | 2009 年 3 月 12 日  | 在 64 位体系结构上，通过对 kern.ipc.shmsegs sysctl 的不兼容更改允许分配更大的 SysV 共享内存段后，将 7.1-STABLE 引入。                                                                   |
| 701106 | [189786](https://svnweb.freebsd.org/changeset/base/189786) | 2009 年 3 月 14 日  | 在合并了对 POSIX 信号量等待操作修复后的 7.1-STABLE 版本。                                                                                                               |
| 702000 | [191099](https://svnweb.freebsd.org/changeset/base/191099) | 2009 年 4 月 15 日  | 7.2-RELEASE                                                                                                                                          |
| 702100 | [191091](https://svnweb.freebsd.org/changeset/base/191091) | 2009 年 4 月 15 日  | 7.2-RELEASE 后的 7.2-STABLE。                                                                                                                           |
| 702101 | [192149](https://svnweb.freebsd.org/changeset/base/192149) | 2009 年 5 月 15 日  | 在 ichsmb(4)被更改为使用左调整的次级寻址以匹配其他 SMBus 控制器驱动程序之后的 7.2-STABLE。                                                                                          |
| 702102 | [193020](https://svnweb.freebsd.org/changeset/base/193020) | 2009 年 5 月 28 日  | 在 fdopendir(3)函数合并后的 7.2-STABLE。                                                                                                                     |
| 702103 | [193638](https://svnweb.freebsd.org/changeset/base/193638) | 2009 年 6 月 6 日   | 在 PmcTools 合并后的 7.2-STABLE 版本。                                                                                                                       |
| 702104 | [195694](https://svnweb.freebsd.org/changeset/base/195694) | 2009 年 7 月 14 日  | 在 closefrom(2) 系统调用的 MFC 后 7.2-STABLE。                                                                                                               |
| 702105 | [196006](https://svnweb.freebsd.org/changeset/base/196006) | 2009 年 7 月 31 日  | 在 SYSVIPC ABI 更改的 MFC 后 7.2-STABLE。                                                                                                                  |
| 702106 | [197198](https://svnweb.freebsd.org/changeset/base/197198) | 2009 年 9 月 14 日  | 在添加了 x86 PAT 增强和 d\_mmap\_single() 以及分散/聚集列表 VM 对象类型后，7.2-STABLE                                                                                     |
| 703000 | [203740](https://svnweb.freebsd.org/changeset/base/203740) | 2010 年 2 月 9 日   | 7.3-RELEASE                                                                                                                                          |
| 703100 | [203742](https://svnweb.freebsd.org/changeset/base/203742) | 2010 年 2 月 9 日   | 7.3-RELEASE 后的 7.3-STABLE。                                                                                                                           |
| 704000 | [216647](https://svnweb.freebsd.org/changeset/base/216647) | 2010 年 12 月 22 日 | 7.4-RELEASE                                                                                                                                          |
| 704100 | [216658](https://svnweb.freebsd.org/changeset/base/216658) | 2010 年 12 月 22 日 | 7.4-RELEASE 后的 7.4-STABLE。                                                                                                                           |
| 704101 | [221318](https://svnweb.freebsd.org/changeset/base/221318) | 2011 年 5 月 2 日   | 在 rev 221317 之后的 gcc MFC 之后的 7.4-STABLE。                                                                                                             |

## 18.11. FreeBSD 6 版本

**表 11. FreeBSD 6 \_\_FreeBSD\_version 值**

| 值      | 修订                                                         | 日期               | 发布                                                                                                                                          |
| ------ | ---------------------------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| 600000 | [133921](https://svnweb.freebsd.org/changeset/base/133921) | 2004 年 8 月 18 日  | 6.0-CURRENT                                                                                                                                 |
| 600001 | [134396](https://svnweb.freebsd.org/changeset/base/134396) | 2004 年 8 月 27 日  | 在内核中永久启用 PFIL\_HOOKS 后的 6.0-CURRENT 。                                                                                                       |
| 600002 | [134514](https://svnweb.freebsd.org/changeset/base/134514) | 2004 年 8 月 30 日  | 初次添加 `ifi_epoch` 到 `struct if_data` 后的 6.0-CURRENT。几天后撤回。请勿使用此值。                                                                            |
| 600003 | [134933](https://svnweb.freebsd.org/changeset/base/134933) | 2004 年 9 月 8 日   | 重新添加 `struct if_data` 的 `ifi_epoch` 成员后的 6.0-CURRENT。                                                                                       |
| 600004 | [135920](https://svnweb.freebsd.org/changeset/base/135920) | 2004 年 9 月 29 日  | 向 pfil API 添加 `struct inpcb` 参数后的 6.0-CURRENT。                                                                                              |
| 600005 | [136172](https://svnweb.freebsd.org/changeset/base/136172) | 2004 年 10 月 5 日  | 向 newsyslog 添加 `-d DESTDIR` 参数后的 6.0-CURRENT。                                                                                               |
| 600006 | [137192](https://svnweb.freebsd.org/changeset/base/137192) | 2004 年 11 月 4 日  | 添加 glibc 风格的 strftime(3) 填充选项后的 6.0-CURRENT。                                                                                                |
| 600007 | [138760](https://svnweb.freebsd.org/changeset/base/138760) | 2004 年 12 月 12 日 | 添加 802.11 框架更新后的 6.0-CURRENT。                                                                                                               |
| 600008 | [140809](https://svnweb.freebsd.org/changeset/base/140809) | 2005 年 1 月 25 日  | 更改 `VOP_*VOBJECT()` 函数和为无 Giant 文件系统引入 `MNTK_MPSAFE` 标志后的 6.0-CURRENT。                                                                      |
| 600009 | [141250](https://svnweb.freebsd.org/changeset/base/141250) | 2005 年 2 月 4 日   | 添加 cpufreq 框架和驱动程序后的 6.0-CURRENT。                                                                                                           |
| 600010 | [141394](https://svnweb.freebsd.org/changeset/base/141394) | 2005 年 2 月 6 日   | 在导入 OpenBSD 的 nc(1)后的 6.0-CURRENT。                                                                                                          |
| 600011 | [141727](https://svnweb.freebsd.org/changeset/base/141727) | 2005 年 2 月 12 日  | 移除 SVID2 `matherr()` 支持后的 6.0-CURRENT。                                                                                                      |
| 600012 | [141940](https://svnweb.freebsd.org/changeset/base/141940) | 2005 年 2 月 15 日  | 默认线程栈大小增加后的 6.0-CURRENT。                                                                                                                    |
| 600013 | [142089](https://svnweb.freebsd.org/changeset/base/142089) | 2005 年 2 月 19 日  | 在 **\<src/include/stdbool.h>** 和 **\<src/sys/i386/include/\_types.h>** 修复后的 6.0-CURRENT，可以使用 Intel C/C++ 编译器的 GCC 兼容性。                      |
| 600014 | [142184](https://svnweb.freebsd.org/changeset/base/142184) | 2005 年 2 月 21 日  | 在 vswprintf(3)中修复 EOVERFLOW 检查后的 6.0-CURRENT。                                                                                               |
| 600015 | [142501](https://svnweb.freebsd.org/changeset/base/142501) | 2005 年 2 月 25 日  | 将 `struct if_data` 成员 `ifi_epoch` 从挂钟时间更改为正常运行时间后的 6.0-CURRENT。                                                                             |
| 600016 | [142582](https://svnweb.freebsd.org/changeset/base/142582) | 2005 年 2 月 26 日  | LC\_CTYPE 磁盘格式更改后的 6.0-CURRENT。                                                                                                             |
| 600017 | [142683](https://svnweb.freebsd.org/changeset/base/142683) | 2005 年 2 月 27 日  | NLS 目录磁盘格式更改后的 6.0-CURRENT。                                                                                                                 |
| 600018 | [142686](https://svnweb.freebsd.org/changeset/base/142686) | 2005 年 2 月 27 日  | LC\_COLLATE 磁盘格式更改后的 6.0-CURRENT。                                                                                                           |
| 600019 | [142752](https://svnweb.freebsd.org/changeset/base/142752) | 2005 年 2 月 28 日  | 将 `acpica` 的头文件安装到 **/usr/include** 中。                                                                                                      |
| 600020 | [143308](https://svnweb.freebsd.org/changeset/base/143308) | 2005 年 3 月 9 日   | 向 send(2) API 添加 MSG\_NOSIGNAL 标志。                                                                                                          |
| 600021 | [143746](https://svnweb.freebsd.org/changeset/base/143746) | 2005 年 3 月 17 日  | 添加字段到 cdevsw                                                                                                                                |
| 600022 | [143901](https://svnweb.freebsd.org/changeset/base/143901) | 2005 年 3 月 21 日  | 从基本系统中删除了 gtar。                                                                                                                             |
| 600023 | [144980](https://svnweb.freebsd.org/changeset/base/144980) | 2005 年 4 月 13 日  | 将 LOCAL\_CREDS、LOCAL\_CONNWAIT 套接字选项添加到 unix(4)。                                                                                            |
| 600024 | [145565](https://svnweb.freebsd.org/changeset/base/145565) | 2005 年 4 月 19 日  | 将 hwpmc(4) 和相关工具添加到 6.0-CURRENT 中。                                                                                                          |
| 600025 | [145565](https://svnweb.freebsd.org/changeset/base/145565) | 2005 年 4 月 26 日  | 将 `struct icmphdr` 添加到 6.0-CURRENT。                                                                                                         |
| 600026 | [145843](https://svnweb.freebsd.org/changeset/base/145843) | 2005 年 5 月 3 日   | pf 更新到 3.7。                                                                                                                                 |
| 600027 | [145966](https://svnweb.freebsd.org/changeset/base/145966) | 2005 年 5 月 6 日   | 内核 libalias 和 ng\_nat 被引入。                                                                                                                  |
| 600028 | [146191](https://svnweb.freebsd.org/changeset/base/146191) | 2005 年 5 月 13 日  | POSIX ttyname\_r(3) 通过 unistd.h 和 libc 可用。                                                                                                  |
| 600029 | [146780](https://svnweb.freebsd.org/changeset/base/146780) | 2005 年 5 月 29 日  | libpcap 更新到 v0.9.1 alpha 096 后的 6.0-CURRENT。                                                                                                |
| 600030 | [146988](https://svnweb.freebsd.org/changeset/base/146988) | 2005 年 6 月 5 日   | 导入 NetBSD 的 if\_bridge(4)后的 6.0-CURRENT。                                                                                                    |
| 600031 | [147256](https://svnweb.freebsd.org/changeset/base/147256) | 2005 年 6 月 10 日  | 将 `struct ifnet` 从驱动程序 `softcs` 中拆分出来后的 6.0-CURRENT。                                                                                        |
| 600032 | [147898](https://svnweb.freebsd.org/changeset/base/147898) | 2005 年 7 月 11 日  | 导入 libpcap v0.9.1 后的 6.0-CURRENT。                                                                                                           |
| 600033 | [148388](https://svnweb.freebsd.org/changeset/base/148388) | 2005 年 7 月 25 日  | 提升 RELENG\_5 以来所有未更改的共享库版本号后的 6.0-STABLE。                                                                                                   |
| 600034 | [149040](https://svnweb.freebsd.org/changeset/base/149040) | 2005 年 8 月 13 日  | 向 `dev_clone` 事件处理程序添加凭证参数后的 6.0-STABLE。6.0-RELEASE。                                                                                        |
| 600100 | [151958](https://svnweb.freebsd.org/changeset/base/151958) | 2005 年 11 月 1 日  | 6.0-RELEASE 后的 6.0-STABLE                                                                                                                   |
| 600101 | [153601](https://svnweb.freebsd.org/changeset/base/153601) | 2005 年 12 月 21 日 | 从 local\_startup 目录中的脚本合并到基本 rcorder(8) 后的 6.0-STABLE。                                                                                      |
| 600102 | [153912](https://svnweb.freebsd.org/changeset/base/153912) | 2005 年 12 月 30 日 | 更新 ELF 类型和常量后的 6.0-STABLE。                                                                                                                  |
| 600103 | [154396](https://svnweb.freebsd.org/changeset/base/154396) | 2006 年 1 月 15 日  | MFC pidfile(3) API 后的 6.0-STABLE。                                                                                                           |
| 600104 | [154453](https://svnweb.freebsd.org/changeset/base/154453) | 2006 年 1 月 17 日  | MFC ldconfig\_local\_dirs 更改后的 6.0-STABLE。                                                                                                  |
| 600105 | [156019](https://svnweb.freebsd.org/changeset/base/156019) | 2006 年 2 月 26 日  | NLS 目录支持 csh(1) 后的 6.0-STABLE。                                                                                                              |
| 601000 | [158330](https://svnweb.freebsd.org/changeset/base/158330) | 2006 年 5 月 6 日   | 6.1-RELEASE                                                                                                                                 |
| 601100 | [158331](https://svnweb.freebsd.org/changeset/base/158331) | 2006 年 5 月 6 日   | 6.1-RELEASE 后的 6.1-STABLE。                                                                                                                  |
| 601101 | [159861](https://svnweb.freebsd.org/changeset/base/159861) | 2006 年 6 月 22 日  | 导入 csup 后的 6.1-STABLE 。                                                                                                                     |
| 601102 | [160253](https://svnweb.freebsd.org/changeset/base/160253) | 2006 年 7 月 11 日  | iwi(4) 更新后的 6.1-STABLE。                                                                                                                     |
| 601103 | [160429](https://svnweb.freebsd.org/changeset/base/160429) | 2006 年 7 月 17 日  | 解析器更新到 BIND9，并暴露 `netdb` 函数的可重入版本后的 6.1-STABLE。                                                                                             |
| 601104 | [161098](https://svnweb.freebsd.org/changeset/base/161098) | 2006 年 8 月 8 日   | 在 OpenSSL 中启用 DSO（动态共享对象）支持后的 6.1-STABLE。                                                                                                   |
| 601105 | [161900](https://svnweb.freebsd.org/changeset/base/161900) | 2006 年 9 月 2 日   | 802.11 修复更改 IEEE80211\_IOC\_STA\_INFO ioctl 的 API 后的 6.1-STABLE。                                                                            |
| 602000 | [164312](https://svnweb.freebsd.org/changeset/base/164312) | 2006 年 11 月 15 日 | 6.2-RELEASE                                                                                                                                 |
| 602100 | [162329](https://svnweb.freebsd.org/changeset/base/162329) | 2006 年 9 月 15 日  | 6.2-RELEASE 后的 6.2-STABLE。                                                                                                                  |
| 602101 | [165122](https://svnweb.freebsd.org/changeset/base/165122) | 2006 年 12 月 12 日 | 添加 Wi-Spy quirk 后的 6.2-STABLE。                                                                                                              |
| 602102 | [165596](https://svnweb.freebsd.org/changeset/base/165596) | 2006 年 12 月 28 日 | 添加 pci\_find\_extcap() 后的 6.2-STABLE。                                                                                                       |
| 602103 | [166039](https://svnweb.freebsd.org/changeset/base/166039) | 2007 年 1 月 16 日  | MFC `dlsym` 更改以在指定的 DSO 及其隐式依赖项中查找请求的符号后的 6.2-STABLE。                                                                                       |
| 602104 | [166314](https://svnweb.freebsd.org/changeset/base/166314) | 2007 年 1 月 28 日  | MFC ng\_deflate(4) 和 ng\_pred1(4) netgraph 节点以及 ng\_ppp(4) 节点的新压缩和加密模式后的 6.2-STABLE。                                                        |
| 602105 | [166840](https://svnweb.freebsd.org/changeset/base/166840) | 2007 年 2 月 20 日  | MFC 从 NetBSD 移植的 BSD 许可版本 gzip(1) 后的 6.2-STABLE。                                                                                            |
| 602106 | [168133](https://svnweb.freebsd.org/changeset/base/168133) | 2007 年 3 月 31 日  | MFC PCI MSI 和 MSI-X 支持后的 6.2-STABLE。                                                                                                        |
| 602107 | [168438](https://svnweb.freebsd.org/changeset/base/168438) | 2007 年 4 月 6 日   | MFC ncurses 5.6 和宽字符支持后的 6.2-STABLE。                                                                                                        |
| 602108 | [168611](https://svnweb.freebsd.org/changeset/base/168611) | 2007 年 4 月 11 日  | MFC CAM 'SG' 外围设备后的 6.2-STABLE，该设备实现了 Linux SCSI SG 直通设备 API 的子集。                                                                           |
| 602109 | [168805](https://svnweb.freebsd.org/changeset/base/168805) | 2007 年 4 月 17 日  | MFC readline 5.2 补丁集 002 后的 6.2-STABLE。                                                                                                     |
| 602110 | [169222](https://svnweb.freebsd.org/changeset/base/169222) | 2007 年 5 月 2 日   | MFC amd64 和 i386 的 `pmap_invalidate_cache()`、`pmap_change_attr()`、`pmap_mapbios()`、`pmap_mapdev_attr()` 和 `pmap_unmapbios()` 后的 6.2-STABLE。 |
| 602111 | [170556](https://svnweb.freebsd.org/changeset/base/170556) | 2007 年 6 月 11 日  | MFC BOP\_BDFLUSH 并导致文件系统模块 KBI 破坏后的 6.2-STABLE。                                                                                             |
| 602112 | [172284](https://svnweb.freebsd.org/changeset/base/172284) | 2007 年 9 月 21 日  | MFC libutil(3) 后的 6.2-STABLE。                                                                                                               |
| 602113 | [172986](https://svnweb.freebsd.org/changeset/base/172986) | 2007 年 10 月 25 日 | MFC 宽字节和单字节 ctype 分离后的 6.2-STABLE。引用 ctype.h 的新编译二进制文件可能需要一个新符号 `__mb_sb_limit`，这在旧系统上不可用。                                                  |
| 602114 | [173170](https://svnweb.freebsd.org/changeset/base/173170) | 2007 年 10 月 30 日 | 恢复 ctype ABI 向前兼容性后的 6.2-STABLE。                                                                                                            |
| 602115 | [173794](https://svnweb.freebsd.org/changeset/base/173794) | 2007 年 11 月 21 日 | 回退宽字符和单字节 ctype 分离后的 6.2-STABLE。                                                                                                            |
| 603000 | [173897](https://svnweb.freebsd.org/changeset/base/173897) | 2007 年 11 月 25 日 | 6.3-RELEASE                                                                                                                                 |
| 603100 | [173891](https://svnweb.freebsd.org/changeset/base/173891) | 2007 年 11 月 25 日 | 6.3-RELEASE 后的 6.3-STABLE。                                                                                                                  |
| （未更改）  | [174434](https://svnweb.freebsd.org/changeset/base/174434) | 2007 年 12 月 7 日  | 修复位宏中的多字节类型支持后的 6.3-STABLE。                                                                                                                 |
| 603102 | [178459](https://svnweb.freebsd.org/changeset/base/178459) | 2008 年 4 月 24 日  | 向 `struct flock` 添加 `l_sysid` 后的 6.3-STABLE。                                                                                                |
| 603103 | [179367](https://svnweb.freebsd.org/changeset/base/179367) | 2008 年 5 月 27 日  | MFC memrchr(3) 函数后的 6.3-STABLE。                                                                                                             |
| 603104 | [179810](https://svnweb.freebsd.org/changeset/base/179810) | 2008 年 6 月 15 日  | MFC 支持 make(1) 中的 `:u` 变量修改器后的 6.3-STABLE。                                                                                                  |
| 604000 | [183583](https://svnweb.freebsd.org/changeset/base/183583) | 2008 年 10 月 4 日  | 6.4-RELEASE                                                                                                                                 |
| 604100 | [183584](https://svnweb.freebsd.org/changeset/base/183584) | 2008 年 10 月 4 日  | 6.4-RELEASE 后的 6.4-STABLE。                                                                                                                  |

## 18.12. FreeBSD 5 版本

**表 12. FreeBSD 5 \_\_FreeBSD\_version 值**

| 值      | 修订                                                         | 日期               | 发布                                                                                                                 |
| ------ | ---------------------------------------------------------- | ---------------- | ------------------------------------------------------------------------------------------------------------------ |
| 500000 | [58009](https://svnweb.freebsd.org/changeset/base/58009)   | 2000 年 3 月 13 日  | 5.0-CURRENT                                                                                                        |
| 500001 | [59348](https://svnweb.freebsd.org/changeset/base/59348)   | 2000 年 4 月 18 日  | 添加额外 ELF 头字段，并更改 ELF 二进制品牌方法后的 5.0-CURRENT。                                                                        |
| 500002 | [59906](https://svnweb.freebsd.org/changeset/base/59906)   | 2000 年 5 月 2 日   | kld 元数据更改后的 5.0-CURRENT。                                                                                           |
| 500003 | [60688](https://svnweb.freebsd.org/changeset/base/60688)   | 2000 年 5 月 18 日  | buf/bio 更改后的 5.0-CURRENT。                                                                                          |
| 500004 | [60936](https://svnweb.freebsd.org/changeset/base/60936)   | 2000 年 5 月 26 日  | binutils 升级后的 5.0-CURRENT。                                                                                         |
| 500005 | [61221](https://svnweb.freebsd.org/changeset/base/61221)   | 2000 年 6 月 3 日   | 将 libxpg4 代码合并到 libc 后，以及 TASKQ 接口引入后的 5.0-CURRENT。                                                                |
| 500006 | [61500](https://svnweb.freebsd.org/changeset/base/61500)   | 2000 年 6 月 10 日  | 添加 AGP 接口后的 5.0-CURRENT。                                                                                           |
| 500007 | [62235](https://svnweb.freebsd.org/changeset/base/62235)   | 2000 年 6 月 29 日  | 在将 Perl 升级到 5.6.0 后的 5.0-CURRENT                                                                                   |
| 500008 | [62764](https://svnweb.freebsd.org/changeset/base/62764)   | 2000 年 7 月 7 日   | 在将 KAME 代码更新到 2000/07 源码后的 5.0-CURRENT                                                                             |
| 500009 | [63154](https://svnweb.freebsd.org/changeset/base/63154)   | 2000 年 7 月 14 日  | `ether_ifattach()` 和 `ether_ifdetach()` 更改后的 5.0-CURRENT。                                                          |
| 500010 | [63265](https://svnweb.freebsd.org/changeset/base/63265)   | 2000 年 7 月 16 日  | 将 mtree 默认值改回原始变体，添加 `-L` 以跟随符号链接后的 5.0-CURRENT。                                                                   |
| 500011 | [63459](https://svnweb.freebsd.org/changeset/base/63459)   | 2000 年 7 月 18 日  | 更改 kqueue API 后的 5.0-CURRENT。                                                                                      |
| 500012 | [65353](https://svnweb.freebsd.org/changeset/base/65353)   | 2000 年 9 月 2 日   | setproctitle(3) 从 libutil 移动到 libc 后的 5.0-CURRENT。                                                                 |
| 500013 | [65671](https://svnweb.freebsd.org/changeset/base/65671)   | 2000 年 9 月 10 日  | 第一次 SMPng 提交后的 5.0-CURRENT。                                                                                        |
| 500014 | [70650](https://svnweb.freebsd.org/changeset/base/70650)   | 2001 年 1 月 4 日   | **\<sys/select.h>** 移至 **\<sys/selinfo.h>** 后的 5.0-CURRENT。                                                        |
| 500015 | [70894](https://svnweb.freebsd.org/changeset/base/70894)   | 2001 年 1 月 10 日  | 合并 libgcc.a 和 libgcc\_r.a 以及相关的 GCC 链接更改后的 5.0-CURRENT。                                                            |
| 500016 | [71583](https://svnweb.freebsd.org/changeset/base/71583)   | 2001 年 1 月 24 日  | 允许 libc 和 libc\_r 链接在一起的更改后，弃用 -pthread 选项的 5.0-CURRENT。                                                           |
| 500017 | [72650](https://svnweb.freebsd.org/changeset/base/72650)   | 2001 年 2 月 18 日  | 从 `struct ucred` 切换到 `struct xucred` 以稳定内核导出 API 供 mountd 及其相关结构使用后的 5.0-CURRENT。                                  |
| 500018 | [72975](https://svnweb.freebsd.org/changeset/base/72975)   | 2001 年 2 月 24 日  | 添加用于控制 CPU 特定优化的 CPUTYPE make 变量后的 5.0-CURRENT。                                                                    |
| 500019 | [77937](https://svnweb.freebsd.org/changeset/base/77937)   | 2001 年 6 月 9 日   | 将 **machine/ioctl\_fd.h** 移至 **sys/fdcio.h** 后的 5.0-CURRENT                                                        |
| 500020 | [78304](https://svnweb.freebsd.org/changeset/base/78304)   | 2001 年 6 月 15 日  | 区域名称重命名后的 5.0-CURRENT                                                                                              |
| 500021 | [78632](https://svnweb.freebsd.org/changeset/base/78632)   | 2001 年 6 月 22 日  | Bzip2 导入后的 5.0-CURRENT。还表示 S/Key 的移除。                                                                              |
| 500022 | [83435](https://svnweb.freebsd.org/changeset/base/83435)   | 2001 年 7 月 12 日  | SSE 支持后的 5.0-CURRENT。                                                                                              |
| 500023 | [83435](https://svnweb.freebsd.org/changeset/base/83435)   | 2001 年 9 月 14 日  | KSE 里程碑 2 后的 5.0-CURRENT。                                                                                          |
| 500024 | [84324](https://svnweb.freebsd.org/changeset/base/84324)   | 2001 年 10 月 1 日  | 引入 `d_thread_t`，并将 UUCP 移动到 Ports 后的 5.0-CURRENT。                                                                  |
| 500025 | [84481](https://svnweb.freebsd.org/changeset/base/84481)   | 2001 年 10 月 4 日  | 64 位平台上描述符和 `creds` 传递的 ABI 更改后的 5.0-CURRENT。                                                                      |
| 500026 | [84710](https://svnweb.freebsd.org/changeset/base/84710)   | 2001 年 10 月 9 日  | 默认为软件包构建移至 XFree86 4，并添加新的 libc `strnstr()` 函数后的 5.0-CURRENT。                                                      |
| 500027 | [84743](https://svnweb.freebsd.org/changeset/base/84743)   | 2001 年 10 月 10 日 | 添加新的 libc `strcasestr()` 函数后的 5.0-CURRENT。                                                                         |
| 500028 | [87879](https://svnweb.freebsd.org/changeset/base/87879)   | 2001 年 12 月 14 日 | 导入 smbfs 用户空间组件后的 5.0-CURRENT。                                                                                     |
| （未更改）  |                                                            |                  | 新增 C99 特定宽度整数类型后的 5.0-CURRENT。                                                                                     |
| 500029 | [89938](https://svnweb.freebsd.org/changeset/base/89938)   | 2002 年 1 月 29 日  | sendfile(2) 返回值更改后的 5.0-CURRENT。                                                                                   |
| 500030 | [90711](https://svnweb.freebsd.org/changeset/base/90711)   | 2002 年 2 月 15 日  | 引入 `fflags_t` 类型后的 5.0-CURRENT，该类型是文件标志的适当大小。                                                                      |
| 500031 | [91203](https://svnweb.freebsd.org/changeset/base/91203)   | 2002 年 2 月 24 日  | usb 结构元素重命名后的 5.0-CURRENT。                                                                                         |
| 500032 | [92453](https://svnweb.freebsd.org/changeset/base/92453)   | 2002 年 3 月 16 日  | 引入 Perl 5.6.1 后的 5.0-CURRENT。                                                                                      |
| 500033 | [93722](https://svnweb.freebsd.org/changeset/base/93722)   | 2002 年 4 月 3 日   | `sendmail_enable` rc.conf(5) 变量可以取值 `NONE` 后的 5.0-CURRENT。                                                         |
| 500034 | [95831](https://svnweb.freebsd.org/changeset/base/95831)   | 2002 年 4 月 30 日  | `mtx_init()` 增加第三个参数后的 5.0-CURRENT。                                                                                |
| 500035 | [96498](https://svnweb.freebsd.org/changeset/base/96498)   | 2002 年 5 月 13 日  | 5.0-CURRENT 使用 Gcc 3.1。                                                                                            |
| 500036 | [96781](https://svnweb.freebsd.org/changeset/base/96781)   | 2002 年 5 月 17 日  | **/usr/src** 中没有 Perl 的 5.0-CURRENT。                                                                               |
| 500037 | [97516](https://svnweb.freebsd.org/changeset/base/97516)   | 2002 年 5 月 29 日  | 添加 dlfunc(3) 后的 5.0-CURRENT                                                                                        |
| 500038 | [100591](https://svnweb.freebsd.org/changeset/base/100591) | 2002 年 7 月 24 日  | 修改部分 `struct sockbuf` 成员类型并重新排序结构后的 5.0-CURRENT                                                                    |
| 500039 | [102757](https://svnweb.freebsd.org/changeset/base/102757) | 2002 年 9 月 1 日   | 导入 GCC 3.2.1 后的 5.0-CURRENT。还停止在头文件中使用 `_BSD_FOO_T_`，开始使用 `_FOO_T_DECLARED`。这个值也可以作为支持 bzip2(1) 软件包开始的保守估计。        |
| 500040 | [103675](https://svnweb.freebsd.org/changeset/base/103675) | 2002 年 9 月 20 日  | 对磁盘功能进行各种更改后的 5.0-CURRENT，旨在消除对 disklabel 结构内部的依赖。                                                                 |
| 500041 | [104250](https://svnweb.freebsd.org/changeset/base/104250) | 2002 年 10 月 1 日  | 将 getopt\_long(3) 添加到 libc 后的 5.0-CURRENT。                                                                         |
| 500042 | [105178](https://svnweb.freebsd.org/changeset/base/105178) | 2002 年 10 月 15 日 | 升级 Binutils 2.13 后的 5.0-CURRENT，包括新的 FreeBSD 仿真、`vec` 和输出格式。                                                       |
| 500043 | [106289](https://svnweb.freebsd.org/changeset/base/106289) | 2002 年 11 月 1 日  | 向 libc 添加弱 pthread\_XXX 存根后的 5.0-CURRENT，废弃了 libXThrStub.so。5.0-RELEASE。                                           |
| 500100 | [109405](https://svnweb.freebsd.org/changeset/base/109405) | 2003 年 1 月 17 日  | 为 RELENG\_5\_0 分支后的 5.0-CURRENT                                                                                    |
| 500101 | [111120](https://svnweb.freebsd.org/changeset/base/111120) | 2003 年 2 月 19 日  | \<sys/dkstat.h>是空的。不要包含它。                                                                                          |
| 500102 | [111482](https://svnweb.freebsd.org/changeset/base/111482) | 2003 年 2 月 25 日  | d\_mmap\_t 接口更改后的 5.0-CURRENT。                                                                                     |
| 500103 | [111540](https://svnweb.freebsd.org/changeset/base/111540) | 2003 年 2 月 26 日  | `taskqueue_swi` 更改为在没有 Giant 的情况下运行，并添加 `taskqueue_swi_giant` 以在 Giant 的情况下运行后的 5.0-CURRENT。                       |
| 500104 | [111600](https://svnweb.freebsd.org/changeset/base/111600) | 2003 年 2 月 27 日  | cdevsw\_add() 和 cdevsw\_remove() 不再存在。出现了 MAJOR\_AUTO 分配设施。                                                        |
| 500105 | [111864](https://svnweb.freebsd.org/changeset/base/111864) | 2003 年 3 月 4 日   | 新的 cdevsw 初始化方法后的 5.0-CURRENT。                                                                                     |
| 500106 | [112007](https://svnweb.freebsd.org/changeset/base/112007) | 2003 年 3 月 8 日   | devstat\_add\_entry() 被 devstat\_new\_entry() 替换。                                                                  |
| 500107 | [112288](https://svnweb.freebsd.org/changeset/base/112288) | 2003 年 3 月 15 日  | devstat 接口更改；请参阅 sys/sys/param.h 1.149                                                                             |
| 500108 | [112300](https://svnweb.freebsd.org/changeset/base/112300) | 2003 年 3 月 15 日  | 令牌环接口更改。                                                                                                           |
| 500109 | [112571](https://svnweb.freebsd.org/changeset/base/112571) | 2003 年 3 月 25 日  | vm\_paddr\_t 的添加。                                                                                                  |
| 500110 | [112741](https://svnweb.freebsd.org/changeset/base/112741) | 2003 年 3 月 28 日  | realpath(3) 成为线程安全后的 5.0-CURRENT                                                                                   |
| 500111 | [113273](https://svnweb.freebsd.org/changeset/base/113273) | 2003 年 4 月 9 日   | usbhid(3) 与 NetBSD 同步后的 5.0-CURRENT                                                                                |
| 500112 | [113597](https://svnweb.freebsd.org/changeset/base/113597) | 2003 年 4 月 17 日  | 新的 NSS 实现和添加 POSIX.1 getp&#x77;*\_r、getgr*\_r 函数后的 5.0-CURRENT                                                     |
| 500113 | [114492](https://svnweb.freebsd.org/changeset/base/114492) | 2003 年 5 月 2 日   | 移除旧的 rc 系统后的 5.0-CURRENT。                                                                                          |
| 501000 | [115816](https://svnweb.freebsd.org/changeset/base/115816) | 2003 年 6 月 4 日   | 5.1-RELEASE.                                                                                                       |
| 501100 | [115710](https://svnweb.freebsd.org/changeset/base/115710) | 2003 年 6 月 2 日   | RELENG\_5\_1 分支后的 5.1-CURRENT。                                                                                     |
| 501101 | [117025](https://svnweb.freebsd.org/changeset/base/117025) | 2003 年 6 月 29 日  | 纠正 sigtimedwait(2) 和 sigwaitinfo(2) 语义后的 5.1-CURRENT。                                                              |
| 501102 | [117191](https://svnweb.freebsd.org/changeset/base/117191) | 2003 年 7 月 3 日   | 向 bus\_dma\_tag\_create(9) 添加 `lockfunc` 和 `lockfuncarg` 字段后的 5.1-CURRENT。                                         |
| 501103 | [118241](https://svnweb.freebsd.org/changeset/base/118241) | 2003 年 7 月 31 日  | GCC 3.3.1-pre 20030711 快照集成后的 5.1-CURRENT。                                                                         |
| 501104 | [118511](https://svnweb.freebsd.org/changeset/base/118511) | 2003 年 8 月 5 日   | 5.1-CURRENT 3ware API 更改为 twe。                                                                                     |
| 501105 | [119021](https://svnweb.freebsd.org/changeset/base/119021) | 2003 年 8 月 17 日  | 5.1-CURRENT 动态链接 `/bin` 和 `/sbin` 支持，并将库移动到 `/lib`。                                                                |
| 501106 | [119881](https://svnweb.freebsd.org/changeset/base/119881) | 2003 年 9 月 8 日   | 为 Coda 6.x 添加内核支持后的 5.1-CURRENT。                                                                                   |
| 501107 | [120180](https://svnweb.freebsd.org/changeset/base/120180) | 2003 年 9 月 17 日  | 5.1-CURRENT 在 16550 UART 常量从 **\<dev/sio/sioreg.h>** 移动到 **\<dev/ic/ns16550.h>** 后。同时也是 rtld 无条件支持 libmap 功能之时。    |
| 501108 | [120386](https://svnweb.freebsd.org/changeset/base/120386) | 2003 年 9 月 23 日  | 5.1-CURRENT 在 PFIL\_HOOKS API 更新后。                                                                                 |
| 501109 | [120503](https://svnweb.freebsd.org/changeset/base/120503) | 2003 年 9 月 27 日  | 添加 kiconv(3) 后的 5.1-CURRENT                                                                                        |
| 501110 | [120556](https://svnweb.freebsd.org/changeset/base/120556) | 2003 年 9 月 28 日  | 更改 cdevsw 中打开和关闭的默认操作后的 5.1-CURRENT                                                                                |
| 501111 | [121125](https://svnweb.freebsd.org/changeset/base/121125) | 2003 年 10 月 16 日 | 更改 cdevsw 布局后的 5.1-CURRENT                                                                                         |
| 501112 | [121129](https://svnweb.freebsd.org/changeset/base/121129) | 2003 年 10 月 16 日 | 添加 kobj 多重继承后的 5.1-CURRENT                                                                                         |
| 501113 | [121816](https://svnweb.freebsd.org/changeset/base/121816) | 2003 年 10 月 31 日 | struct ifnet 中 `if_xname` 更改后的 5.1-CURRENT                                                                         |
| 501114 | [122779](https://svnweb.freebsd.org/changeset/base/122779) | 2003 年 11 月 16 日 | 将 `/bin` 和 `/sbin` 更改为动态链接后的 5.1-CURRENT                                                                           |
| 502000 | [123198](https://svnweb.freebsd.org/changeset/base/123198) | 2003 年 12 月 7 日  | 5.2-RELEASE                                                                                                        |
| 502010 | [126150](https://svnweb.freebsd.org/changeset/base/126150) | 2004 年 2 月 23 日  | 5.2.1-RELEASE                                                                                                      |
| 502100 | [123196](https://svnweb.freebsd.org/changeset/base/123196) | 2003 年 12 月 7 日  | 为 RELENG\_5\_2 进行分支后的 5.2-CURRENT                                                                                  |
| 502101 | [123677](https://svnweb.freebsd.org/changeset/base/123677) | 2003 年 12 月 19 日 | 向 libc 添加 `__cxa_atexit`/`__cxa_finalize` 函数后的 5.2-CURRENT                                                         |
| 502102 | [125236](https://svnweb.freebsd.org/changeset/base/125236) | 2004 年 1 月 30 日  | 默认线程库从 libc\_r 更改为 libpthread 后的 5.2-CURRENT。                                                                      |
| 502103 | [126083](https://svnweb.freebsd.org/changeset/base/126083) | 2004 年 2 月 21 日  | 设备驱动程序 API 大补丁后的 5.2-CURRENT。                                                                                      |
| 502104 | [126208](https://svnweb.freebsd.org/changeset/base/126208) | 2004 年 2 月 25 日  | 添加 getopt\_long\_only() 后的 5.2-CURRENT。                                                                            |
| 502105 | [126644](https://svnweb.freebsd.org/changeset/base/126644) | 2004 年 3 月 5 日   | C 中将 NULL 改为 ((void \*)0) 后的 5.2-CURRENT，会产生更多警告。                                                                  |
| 502106 | [126757](https://svnweb.freebsd.org/changeset/base/126757) | 2004 年 3 月 8 日   | pf 被链接到构建并安装后的 5.2-CURRENT。                                                                                        |
| 502107 | [126819](https://svnweb.freebsd.org/changeset/base/126819) | 2004 年 3 月 10 日  | time\_t 在 sparc64 上更改为 64 位值后的 5.2-CURRENT。                                                                        |
| 502108 | [126891](https://svnweb.freebsd.org/changeset/base/126891) | 2004 年 3 月 12 日  | 在某些头文件中添加 Intel C/C++ 编译器支持，并使 execve(2) 更严格地符合 POSIX 标准后的 5.2-CURRENT。                                            |
| 502109 | [127312](https://svnweb.freebsd.org/changeset/base/127312) | 2004 年 3 月 22 日  | 引入 `bus_alloc_resource_any` API 后的 5.2-CURRENT                                                                     |
| 502110 | [127475](https://svnweb.freebsd.org/changeset/base/127475) | 2004 年 3 月 27 日  | 添加 UTF-8 本地化后的 5.2-CURRENT                                                                                         |
| 502111 | [128144](https://svnweb.freebsd.org/changeset/base/128144) | 2004 年 4 月 11 日  | 移除 getvfsent(3) API 后的 5.2-CURRENT                                                                                 |
| 502112 | [128182](https://svnweb.freebsd.org/changeset/base/128182) | 2004 年 4 月 13 日  | 添加 make 的 `.warning` 指令后的 5.2-CURRENT。                                                                             |
| 502113 | [130057](https://svnweb.freebsd.org/changeset/base/130057) | 2004 年 6 月 4 日   | 强制 `ttyioctl()` 成为串行驱动程序必需项后的 5.2-CURRENT。                                                                         |
| 502114 | [130418](https://svnweb.freebsd.org/changeset/base/130418) | 2004 年 6 月 13 日  | 导入 ALTQ 框架后的 5.2-CURRENT。                                                                                          |
| 502115 | [130481](https://svnweb.freebsd.org/changeset/base/130481) | 2004 年 6 月 14 日  | 更改 `sema_timedwait(9)` 为成功时返回 0、失败时返回非零错误代码后的 5.2-CURRENT。                                                         |
| 502116 | [130585](https://svnweb.freebsd.org/changeset/base/130585) | 2004 年 6 月 16 日  | 将内核 `dev_t` 更改为指向 `struct cdev *` 的指针后的 5.2-CURRENT。                                                               |
| 502117 | [130640](https://svnweb.freebsd.org/changeset/base/130640) | 2004 年 6 月 17 日  | 将内核 `udev_t` 更改为 `dev_t` 后的 5.2-CURRENT。                                                                           |
| 502118 | [130656](https://svnweb.freebsd.org/changeset/base/130656) | 2004 年 6 月 17 日  | 为 `clock_gettime(2)` 和 `clock_getres(2)` 添加 `CLOCK_VIRTUAL` 和 `CLOCK_PROF` 支持后的 5.2-CURRENT。                       |
| 502119 | [130934](https://svnweb.freebsd.org/changeset/base/130934) | 2004 年 6 月 22 日  | 更改网络接口克隆大修后的 5.2-CURRENT。                                                                                          |
| 502120 | [131429](https://svnweb.freebsd.org/changeset/base/131429) | 2004 年 7 月 2 日   | 将软件包工具更新到 20040629 修订版后的 5.2-CURRENT。                                                                              |
| 502121 | [131883](https://svnweb.freebsd.org/changeset/base/131883) | 2004 年 7 月 9 日   | 将蓝牙代码标记为非 `i386` 专属后的 5.2-CURRENT。                                                                                 |
| 502122 | [131971](https://svnweb.freebsd.org/changeset/base/131971) | 2004 年 7 月 11 日  | 引入 KDB 调试器框架、将 DDB 转换为后端以及引入 GDB 后端后的 5.2-CURRENT。                                                                 |
| 502123 | [132025](https://svnweb.freebsd.org/changeset/base/132025) | 2004 年 7 月 12 日  | 更改 `VFS_ROOT` 使其接受 `struct thread` 参数，就像 `vflush` 一样后的 5.2-CURRENT。`kinfo_proc` 结构现在有一个用户数据指针。同时默认 X 实现切换到 `xorg`。 |
| 502124 | [132597](https://svnweb.freebsd.org/changeset/base/132597) | 2004 年 7 月 24 日  | 分开 Ports `rc.d` 和传统脚本启动方式后的 5.2-CURRENT。                                                                           |
| 502125 | [132726](https://svnweb.freebsd.org/changeset/base/132726) | 2004 年 7 月 28 日  | 撤销先前更改后的 5.2-CURRENT。                                                                                              |
| 502126 | [132914](https://svnweb.freebsd.org/changeset/base/132914) | 2004 年 7 月 31 日  | 移除 `kmem_alloc_pageable()` 和导入 gcc 3.4.2 后的 5.2-CURRENT。                                                           |
| 502127 | [132991](https://svnweb.freebsd.org/changeset/base/132991) | 2004 年 8 月 2 日   | 将 UMA 内核 API 更改为允许构造函数/初始化失败后的 5.2-CURRENT。                                                                        |
| 502128 | [133306](https://svnweb.freebsd.org/changeset/base/133306) | 2004 年 8 月 8 日   | 更改 `vfs_mount` 签名以及为 `suser(9)` API 全局替换 `PRISON_ROOT` 为 `SUSER_ALLOWJAIL` 后的 5.2-CURRENT。                         |
| 503000 | [134189](https://svnweb.freebsd.org/changeset/base/134189) | 2004 年 8 月 23 日  | 在 pfil API 更改之前的 5.3-BETA/RC                                                                                       |
| 503001 | [135580](https://svnweb.freebsd.org/changeset/base/135580) | 2004 年 9 月 22 日  | 5.3-RELEASE                                                                                                        |
| 503100 | [136595](https://svnweb.freebsd.org/changeset/base/136595) | 2004 年 10 月 16 日 | 为 RELENG\_5\_3 分支后的 5.3-STABLE                                                                                     |
| 503101 | [138459](https://svnweb.freebsd.org/changeset/base/138459) | 2004 年 12 月 3 日  | 添加 glibc 风格的 `strftime(3)` 填充选项后的 5.3-STABLE。                                                                      |
| 503102 | [141788](https://svnweb.freebsd.org/changeset/base/141788) | 2005 年 2 月 13 日  | MFC OpenBSD 的 `nc(1)` 导入后的 5.3-STABLE。                                                                             |
| 503103 | [142639](https://svnweb.freebsd.org/changeset/base/142639) | 2005 年 2 月 27 日  | MFC \<src/include/stdbool.h> 和 \<src/sys/i386/include/\_types.h> 中的修复以使用英特尔 C/C++ 编译器的 GCC 兼容性后的 5.4-PRERELEASE。   |
| 503104 | [142835](https://svnweb.freebsd.org/changeset/base/142835) | 2005 年 2 月 28 日  | MFC `ifi_epoch` 从挂钟时间到正常运行时间的更改后的 5.4-PRERELEASE。                                                                  |
| 503105 | [143029](https://svnweb.freebsd.org/changeset/base/143029) | 2005 年 3 月 2 日   | MFC `vswprintf(3)` 中 `EOVERFLOW` 检查修复后的 5.4-PRERELEASE。                                                            |
| 504000 | [144575](https://svnweb.freebsd.org/changeset/base/144575) | 2005 年 4 月 3 日   | 5.4-RELEASE.                                                                                                       |
| 504100 | [144581](https://svnweb.freebsd.org/changeset/base/144581) | 2005 年 4 月 3 日   | 为 RELENG\_5\_4 分支后的 5.4-STABLE                                                                                     |
| 504101 | [146105](https://svnweb.freebsd.org/changeset/base/146105) | 2005 年 5 月 11 日  | 增大默认线程栈大小后的 5.4-STABLE                                                                                             |
| 504102 | [504101](https://svnweb.freebsd.org/changeset/base/504101) | 2005 年 6 月 24 日  | 添加 `sha256` 后的 5.4-STABLE                                                                                          |
| 504103 | [150892](https://svnweb.freebsd.org/changeset/base/150892) | 2005 年 10 月 3 日  | MFC `if_bridge` 后的 5.4-STABLE                                                                                      |
| 504104 | [152370](https://svnweb.freebsd.org/changeset/base/152370) | 2005 年 11 月 13 日 | MFC `bsdiff` 和 `portsnap` 后的 5.4-STABLE                                                                            |
| 504105 | [154464](https://svnweb.freebsd.org/changeset/base/154464) | 2006 年 1 月 17 日  | MFC `ldconfig_local_dirs` 更改后的 5.4-STABLE。                                                                         |
| 505000 | [158481](https://svnweb.freebsd.org/changeset/base/158481) | 2006 年 5 月 12 日  | 5.5-RELEASE.                                                                                                       |
| 505100 | [158482](https://svnweb.freebsd.org/changeset/base/158482) | 2006 年 5 月 12 日  | 为 RELENG\_5\_5 分支后的 5.5-STABLE                                                                                     |

## 18.13. FreeBSD 4 版本

**表 13. FreeBSD 4 \_\_FreeBSD\_version 值**

| 值      | 修订                                                         | 日期               | 发布                                                                                  |
| ------ | ---------------------------------------------------------- | ---------------- | ----------------------------------------------------------------------------------- |
| 400000 | [43041](https://svnweb.freebsd.org/changeset/base/43041)   | 1999 年 1 月 22 日  | 3.4 分支后的 4.0-CURRENT                                                                |
| 400001 | [44177](https://svnweb.freebsd.org/changeset/base/44177)   | 1999 年 2 月 20 日  | 动态链接处理更改后的 4.0-CURRENT                                                              |
| 400002 | [44699](https://svnweb.freebsd.org/changeset/base/44699)   | 1999 年 3 月 13 日  | C++ 构造函数/析构函数顺序更改后的 4.0-CURRENT                                                     |
| 400003 | [45059](https://svnweb.freebsd.org/changeset/base/45059)   | 1999 年 3 月 27 日  | 完成 `dladdr(3)` 功能后的 4.0-CURRENT                                                     |
| 400004 | [45321](https://svnweb.freebsd.org/changeset/base/45321)   | 1999 年 4 月 5 日   | `__deregister_frame_info` 动态链接器错误修复后的 4.0-CURRENT（也是 EGCS 1.1.2 集成后的 4.0-CURRENT）   |
| 400005 | [46113](https://svnweb.freebsd.org/changeset/base/46113)   | 1999 年 4 月 27 日  | `suser(9)` API 更改后的 4.0-CURRENT（也是 `newbus` 后的 4.0-CURRENT）                         |
| 400006 | [47640](https://svnweb.freebsd.org/changeset/base/47640)   | 1999 年 5 月 31 日  | `cdevsw` 注册更改后的 4.0-CURRENT                                                         |
| 400007 | [47992](https://svnweb.freebsd.org/changeset/base/47992)   | 1999 年 6 月 17 日  | 添加 `so_cred` 用于套接字级凭据后的 4.0-CURRENT                                                 |
| 400008 | [48048](https://svnweb.freebsd.org/changeset/base/48048)   | 1999 年 6 月 20 日  | 添加 poll syscall 包装器到 `libc_r` 后的 4.0-CURRENT                                        |
| 400009 | [48936](https://svnweb.freebsd.org/changeset/base/48936)   | 1999 年 7 月 20 日  | 内核 `dev_t` 类型更改为 `struct specinfo` 指针后的 4.0-CURRENT                                 |
| 400010 | [51649](https://svnweb.freebsd.org/changeset/base/51649)   | 1999 年 9 月 25 日  | 修复 `jail(2)` 中的一个漏洞后的 4.0-CURRENT                                                   |
| 400011 | [51791](https://svnweb.freebsd.org/changeset/base/51791)   | 1999 年 9 月 29 日  | `sigset_t` 数据类型更改后的 4.0-CURRENT                                                     |
| 400012 | [53164](https://svnweb.freebsd.org/changeset/base/53164)   | 1999 年 11 月 15 日 | 切换到 GCC 2.95.2 编译器后的 4.0-CURRENT                                                    |
| 400013 | [54123](https://svnweb.freebsd.org/changeset/base/54123)   | 1999 年 12 月 4 日  | 添加可插拔的 Linux 模式 `ioctl` 处理程序后的 4.0-CURRENT                                          |
| 400014 | [56216](https://svnweb.freebsd.org/changeset/base/56216)   | 2000 年 1 月 18 日  | 导入 OpenSSL 后的 4.0-CURRENT                                                           |
| 400015 | [56700](https://svnweb.freebsd.org/changeset/base/56700)   | 2000 年 1 月 27 日  | GCC 2.95.2 中 C++ ABI 从 `-fvtable-thunks` 更改为默认的 `-fno-vtable-thunks` 后的 4.0-CURRENT |
| 400016 | [57529](https://svnweb.freebsd.org/changeset/base/57529)   | 2000 年 2 月 27 日  | 导入 OpenSSH 后的 4.0-CURRENT                                                           |
| 400017 | [58005](https://svnweb.freebsd.org/changeset/base/58005)   | 2000 年 3 月 13 日  | 4.0-RELEASE                                                                         |
| 400018 | [58170](https://svnweb.freebsd.org/changeset/base/58170)   | 2000 年 3 月 17 日  | 4.0-RELEASE 后的 4.0-STABLE                                                           |
| 400019 | [60047](https://svnweb.freebsd.org/changeset/base/60047)   | 2000 年 5 月 5 日   | 引入延迟校验和后的 4.0-STABLE。                                                               |
| 400020 | [61262](https://svnweb.freebsd.org/changeset/base/61262)   | 2000 年 6 月 4 日   | 将 `libxpg4` 代码合并到 `libc` 后的 4.0-STABLE。                                             |
| 400021 | [62820](https://svnweb.freebsd.org/changeset/base/62820)   | 2000 年 7 月 8 日   | 将 Binutils 升级到 2.10.0，ELF 品牌更改以及基本系统中的 tcsh 后的 4.0-STABLE。                          |
| 410000 | [63095](https://svnweb.freebsd.org/changeset/base/63095)   | 2000 年 7 月 14 日  | 4.1-RELEASE                                                                         |
| 410001 | [64012](https://svnweb.freebsd.org/changeset/base/64012)   | 2000 年 7 月 29 日  | 4.1-RELEASE 后的 4.1-STABLE                                                           |
| 410002 | [65962](https://svnweb.freebsd.org/changeset/base/65962)   | 2000 年 9 月 16 日  | `setproctitle(3)` 从 `libutil` 移动到 `libc` 后的 4.1-STABLE。                             |
| 411000 | [66336](https://svnweb.freebsd.org/changeset/base/66336)   | 2000 年 9 月 25 日  | 4.1.1-RELEASE                                                                       |
| 411001 |                                                            |                  | 4.1.1-RELEASE 后的 4.1.1-STABLE                                                       |
| 420000 | [68066](https://svnweb.freebsd.org/changeset/base/68066)   | 2000 年 10 月 31 日 | 4.2-RELEASE                                                                         |
| 420001 | [70895](https://svnweb.freebsd.org/changeset/base/70895)   | 2001 年 1 月 10 日  | 合并 `libgcc.a` 和 `libgcc_r.a` 后的 4.2-STABLE，以及相关的 GCC 链接更改。                          |
| 430000 | [73800](https://svnweb.freebsd.org/changeset/base/73800)   | 2001 年 3 月 6 日   | 4.3-RELEASE                                                                         |
| 430001 | [76779](https://svnweb.freebsd.org/changeset/base/76779)   | 2001 年 5 月 18 日  | 引入 `wint_t` 后的 4.3-STABLE。                                                          |
| 430002 | [80157](https://svnweb.freebsd.org/changeset/base/80157)   | 2001 年 7 月 22 日  | PCI 电源状态 API 合并后的 4.3-STABLE。                                                       |
| 440000 | [80923](https://svnweb.freebsd.org/changeset/base/80923)   | 2001 年 8 月 1 日   | 4.4-RELEASE                                                                         |
| 440001 | [85341](https://svnweb.freebsd.org/changeset/base/85341)   | 2001 年 10 月 23 日 | 引入 `d_thread_t` 后的 4.4-STABLE。                                                      |
| 440002 | [86038](https://svnweb.freebsd.org/changeset/base/86038)   | 2001 年 11 月 4 日  | 挂载结构更改后的 4.4-STABLE（影响文件系统 `klds`）。                                                 |
| 440003 | [88130](https://svnweb.freebsd.org/changeset/base/88130)   | 2001 年 12 月 18 日 | 导入 `smbfs` 用户空间组件后的 4.4-STABLE。                                                     |
| 450000 | [88271](https://svnweb.freebsd.org/changeset/base/88271)   | 2001 年 12 月 20 日 | 4.5-RELEASE                                                                         |
| 450001 | [91203](https://svnweb.freebsd.org/changeset/base/91203)   | 2002 年 2 月 24 日  | `usb` 结构元素重命名后的 4.5-STABLE。                                                         |
| 450002 | [92151](https://svnweb.freebsd.org/changeset/base/92151)   | 2002 年 3 月 12 日  | 区域设置更改后的 4.5-STABLE。                                                                |
| 450003 |                                                            |                  | （从未创建）                                                                              |
| 450004 | [94840](https://svnweb.freebsd.org/changeset/base/94840)   | 2020 年 4 月 16 日  | `sendmail_enable` `rc.conf(5)` 变量设置为 `NONE` 后的 4.5-STABLE。                          |
| 450005 | [95555](https://svnweb.freebsd.org/changeset/base/95555)   | 2002 年 4 月 27 日  | 默认转移到 XFree86 4 用于软件包构建后的 4.5-STABLE。                                               |
| 450006 | [95846](https://svnweb.freebsd.org/changeset/base/95846)   | 2002 年 5 月 1 日   | 修复接受过滤后的 4.5-STABLE，不再容易受到简单 DoS 攻击。                                                |
| 460000 | [97923](https://svnweb.freebsd.org/changeset/base/97923)   | 2002 年 6 月 21 日  | 4.6-RELEASE                                                                         |
| 460001 | [98730](https://svnweb.freebsd.org/changeset/base/98730)   | 2002 年 6 月 21 日  | 修复 `sendfile(2)` 以符合文档的 4.6-STABLE，不将发送的任何标头计入要从文件发送的数据量。                           |
| 460002 | [100366](https://svnweb.freebsd.org/changeset/base/100366) | 2002 年 7 月 19 日  | 4.6.2-RELEASE                                                                       |
| 460100 | [98857](https://svnweb.freebsd.org/changeset/base/98857)   | 2002 年 6 月 26 日  | 4.6-STABLE                                                                          |
| 460101 | [98880](https://svnweb.freebsd.org/changeset/base/98880)   | 2002 年 6 月 26 日  | MFC `sed -i` 后的 4.6-STABLE。                                                         |
| 460102 | [102759](https://svnweb.freebsd.org/changeset/base/102759) | 2002 年 9 月 1 日   | MFC `HEAD` 中许多新 `pkg_install` 功能后的 4.6-STABLE。                                      |
| 470000 | [104655](https://svnweb.freebsd.org/changeset/base/104655) | 2002 年 10 月 8 日  | 4.7-RELEASE                                                                         |
| 470100 | [104717](https://svnweb.freebsd.org/changeset/base/104717) | 2002 年 10 月 9 日  | 4.7-STABLE                                                                          |
| 470101 | [106732](https://svnweb.freebsd.org/changeset/base/106732) | 2002 年 11 月 10 日 | 开始生成 `__std{in,out,err}p` 引用而不是 `__sF`。这将 `std{in,out,err}` 从编译时表达式更改为运行时表达式。       |
| 470102 | [109753](https://svnweb.freebsd.org/changeset/base/109753) | 2003 年 1 月 23 日  | MFC `mbuf` 更改以将 `m_aux` mbuf 替换为 `m_tag` 后的 4.7-STABLE。                             |
| 470103 | [110887](https://svnweb.freebsd.org/changeset/base/110887) | 2003 年 2 月 14 日  | 4.7-STABLE 获得 OpenSSL 0.9.7。                                                        |
| 480000 | [112852](https://svnweb.freebsd.org/changeset/base/112852) | 2003 年 3 月 30 日  | 4.8-RELEASE                                                                         |
| 480100 | [113107](https://svnweb.freebsd.org/changeset/base/113107) | 2003 年 4 月 5 日   | 4.8-STABLE                                                                          |
| 480101 | [115232](https://svnweb.freebsd.org/changeset/base/115232) | 2003 年 5 月 22 日  | 线程安全化 `realpath(3)` 后的 4.8-STABLE                                                   |
| 480102 | [118737](https://svnweb.freebsd.org/changeset/base/118737) | 2003 年 8 月 10 日  | 4.8-STABLE 3ware API 更改为 `twe`。                                                     |
| 490000 | [121592](https://svnweb.freebsd.org/changeset/base/121592) | 2003 年 10 月 27 日 | 4.9-RELEASE                                                                         |
| 490100 | [121593](https://svnweb.freebsd.org/changeset/base/121593) | 2003 年 10 月 27 日 | 4.9-STABLE                                                                          |
| 490101 | [124264](https://svnweb.freebsd.org/changeset/base/124264) | 2004 年 1 月 8 日   | 添加 `e_sid` 到 `struct kinfo_eproc` 后的 4.9-STABLE。                                    |
| 490102 | [125417](https://svnweb.freebsd.org/changeset/base/125417) | 2004 年 2 月 4 日   | MFC `libmap` 功能用于 `rtld` 后的 4.9-STABLE。                                             |
| 491000 | [129700](https://svnweb.freebsd.org/changeset/base/129700) | 2004 年 5 月 25 日  | 4.10-RELEASE                                                                        |
| 491100 | [129918](https://svnweb.freebsd.org/changeset/base/129918) | 2004 年 6 月 1 日   | 4.10-STABLE                                                                         |
| 491101 | [133506](https://svnweb.freebsd.org/changeset/base/133506) | 2004 年 8 月 11 日  | MFC 包工具 20040629 修订版后的 4.10-STABLE。                                                 |
| 491102 | [137786](https://svnweb.freebsd.org/changeset/base/137786) | 2004 年 11 月 16 日 | 处理虚构页面解除连接的 VM 修复后的 4.10-STABLE。                                                    |
| 492000 | [138960](https://svnweb.freebsd.org/changeset/base/138960) | 2004 年 12 月 17 日 | 4.11-RELEASE                                                                        |
| 492100 | [138959](https://svnweb.freebsd.org/changeset/base/138959) | 2004 年 12 月 17 日 | 4.11-STABLE                                                                         |
| 492101 | [157843](https://svnweb.freebsd.org/changeset/base/157843) | 2006 年 4 月 18 日  | 添加 `libdata/ldconfig` 目录到 `mtree` 文件后的 4.11-STABLE。                                 |

## 18.14. FreeBSD 3 版本

**表 14. FreeBSD 3 \_\_FreeBSD\_version 值**

| 值      | 修订                                                       | 日期               | 发布                                     |
| ------ | -------------------------------------------------------- | ---------------- | -------------------------------------- |
| 300000 | [22917](https://svnweb.freebsd.org/changeset/base/22917) | 1996 年 2 月 19 日  | 3.0-CURRENT 在 `mount(2)` 更改之前          |
| 300001 | [36283](https://svnweb.freebsd.org/changeset/base/36283) | 1997 年 9 月 24 日  | `mount(2)` 更改后的 3.0-CURRENT            |
| 300002 | [36592](https://svnweb.freebsd.org/changeset/base/36592) | 1998 年 6 月 2 日   | `semctl(2)` 更改后的 3.0-CURRENT           |
| 300003 | [36735](https://svnweb.freebsd.org/changeset/base/36735) | 1998 年 6 月 7 日   | `ioctl` 参数更改后的 3.0-CURRENT             |
| 300004 | [38768](https://svnweb.freebsd.org/changeset/base/38768) | 1998 年 9 月 3 日   | 转换为 `ELF` 后的 3.0-CURRENT               |
| 300005 | [40438](https://svnweb.freebsd.org/changeset/base/40438) | 1998 年 10 月 16 日 | 3.0-RELEASE                            |
| 300006 | [40445](https://svnweb.freebsd.org/changeset/base/40445) | 1998 年 10 月 16 日 | 3.0-RELEASE 后的 3.0-CURRENT             |
| 300007 | [43042](https://svnweb.freebsd.org/changeset/base/43042) | 1999 年 1 月 22 日  | 3/4 分支后的 3.0-STABLE                    |
| 310000 | [43807](https://svnweb.freebsd.org/changeset/base/43807) | 1999 年 2 月 9 日   | 3.1-RELEASE                            |
| 310001 | [45060](https://svnweb.freebsd.org/changeset/base/45060) | 1999 年 3 月 27 日  | 3.1-RELEASE 后的 3.1-STABLE              |
| 310002 | [45689](https://svnweb.freebsd.org/changeset/base/45689) | 1999 年 4 月 14 日  | C++ 构造函数/析构函数顺序更改后的 3.1-STABLE         |
| 320000 |                                                          |                  | 3.2-RELEASE                            |
| 320001 | [46742](https://svnweb.freebsd.org/changeset/base/46742) | 1999 年 5 月 8 日   | 3.2-STABLE                             |
| 320002 | [50563](https://svnweb.freebsd.org/changeset/base/50563) | 1999 年 8 月 29 日  | 二进制不兼容的 `IPFW` 和套接字更改后的 3.2-STABLE     |
| 330000 | [50813](https://svnweb.freebsd.org/changeset/base/50813) | 1999 年 9 月 2 日   | 3.3-RELEASE                            |
| 330001 | [51328](https://svnweb.freebsd.org/changeset/base/51328) | 1999 年 9 月 16 日  | 3.3-STABLE                             |
| 330002 | [53671](https://svnweb.freebsd.org/changeset/base/53671) | 1999 年 11 月 24 日 | 向 `libc` 添加 `mkstemp(3)` 后的 3.3-STABLE |
| 340000 | [54166](https://svnweb.freebsd.org/changeset/base/54166) | 1999 年 12 月 5 日  | 3.4-RELEASE                            |
| 340001 | [54730](https://svnweb.freebsd.org/changeset/base/54730) | 1999 年 12 月 17 日 | 3.4-STABLE                             |
| 350000 | [61876](https://svnweb.freebsd.org/changeset/base/61876) | 2000 年 6 月 20 日  | 3.5-RELEASE                            |
| 350001 | [63043](https://svnweb.freebsd.org/changeset/base/63043) | 2000 年 7 月 12 日  | 3.5-STABLE                             |

## 18.15. FreeBSD 2.2 版本

**表 15. FreeBSD 2.2 \_\_FreeBSD\_version 值**

| 值      | 修订                                                       | 日期               | 发布                              |
| ------ | -------------------------------------------------------- | ---------------- | ------------------------------- |
| 220000 | [22918](https://svnweb.freebsd.org/changeset/base/22918) | 1997 年 2 月 19 日  | 2.2-RELEASE                     |
| （未更改）  |                                                          |                  | 2.2.1-RELEASE                   |
| （未更改）  |                                                          |                  | 2.2.1-RELEASE 后的 2.2-STABLE     |
| 221001 | [24941](https://svnweb.freebsd.org/changeset/base/24941) | 1997 年 4 月 15 日  | texinfo-3.9 后的 2.2-STABLE       |
| 221002 | [25325](https://svnweb.freebsd.org/changeset/base/25325) | 1997 年 4 月 30 日  | top 后的 2.2-STABLE               |
| 222000 | [25851](https://svnweb.freebsd.org/changeset/base/25851) | 1997 年 5 月 16 日  | 2.2.2-RELEASE                   |
| 222001 | [25921](https://svnweb.freebsd.org/changeset/base/25921) | 1997 年 5 月 19 日  | 2.2.2-RELEASE 后的 2.2-STABLE     |
| 225000 | [30053](https://svnweb.freebsd.org/changeset/base/30053) | 1997 年 10 月 2 日  | 2.2.5-RELEASE                   |
| 225001 | [31300](https://svnweb.freebsd.org/changeset/base/31300) | 1997 年 11 月 20 日 | 2.2.5-RELEASE 后的 2.2-STABLE     |
| 225002 | [32019](https://svnweb.freebsd.org/changeset/base/32019) | 1997 年 12 月 27 日 | `ldconfig` `-R` 合并后的 2.2-STABLE |
| 226000 | [34445](https://svnweb.freebsd.org/changeset/base/34445) | 1998 年 3 月 24 日  | 2.2.6-RELEASE                   |
| 227000 | [37803](https://svnweb.freebsd.org/changeset/base/37803) | 1998 年 7 月 21 日  | 2.2.7-RELEASE                   |
| 227001 | [37809](https://svnweb.freebsd.org/changeset/base/37809) | 1998 年 7 月 21 日  | 2.2.7-RELEASE 后的 2.2-STABLE     |
| 227002 | [39489](https://svnweb.freebsd.org/changeset/base/39489) | 1998 年 9 月 19 日  | `semctl(2)` 更改后的 2.2-STABLE     |
| 228000 | [41403](https://svnweb.freebsd.org/changeset/base/41403) | 1998 年 11 月 29 日 | 2.2.8-RELEASE                   |
| 228001 | [41418](https://svnweb.freebsd.org/changeset/base/41418) | 1998 年 11 月 29 日 | 2.2.8-RELEASE 后的 2.2-STABLE     |

> **注意**
>
> 注意，2.2-STABLE 有时在 2.2.5-RELEASE 发布后以"2.2.5-STABLE"的形式标识自身。之前的模式是年份后跟月份，但社区决定改为从 2.2 开始采用更直接的主/次系统。这是因为在几个分支上的并行开发使得仅凭实际发布日期来分类发布变得不可行。不要担心旧的-CURRENT 版本；它们仅列在此供参考。

## 18.16. FreeBSD 2 在 2.2-RELEASE 版本之前

**表 16. FreeBSD 2 在 2.2-RELEASE 之前的 \_\_FreeBSD\_version 值**

| 值      | 修订                                                       | 日期               | 发布                    |
| ------ | -------------------------------------------------------- | ---------------- | --------------------- |
| 119411 |                                                          |                  | 2.0-RELEASE           |
| 199501 | [7153](https://svnweb.freebsd.org/changeset/base/7153)   | 1995 年 3 月 19 日  | 2.1-CURRENT           |
| 199503 | [7310](https://svnweb.freebsd.org/changeset/base/7310)   | 1995 年 3 月 24 日  | 2.1-CURRENT           |
| 199504 | [7704](https://svnweb.freebsd.org/changeset/base/7704)   | 1995 年 4 月 9 日   | 2.0.5-RELEASE         |
| 199508 | [10297](https://svnweb.freebsd.org/changeset/base/10297) | 1995 年 8 月 26 日  | 2.2-CURRENT 之前的 2.1   |
| 199511 | [12189](https://svnweb.freebsd.org/changeset/base/12189) | 1995 年 11 月 10 日 | 2.1.0-RELEASE         |
| 199512 | [12196](https://svnweb.freebsd.org/changeset/base/12196) | 1995 年 11 月 10 日 | 2.2-CURRENT 之前的 2.1.5 |
| 199607 | [17067](https://svnweb.freebsd.org/changeset/base/17067) | 1996 年 7 月 10 日  | 2.1.5-RELEASE         |
| 199608 | [17127](https://svnweb.freebsd.org/changeset/base/17127) | 1996 年 7 月 12 日  | 2.2-CURRENT 之前的 2.1.6 |
| 199612 | [19358](https://svnweb.freebsd.org/changeset/base/19358) | 1996 年 11 月 15 日 | 2.1.6-RELEASE         |
| 199612 |                                                          |                  | 2.1.7-RELEASE         |


