仅本页所有页面
由 GitBook 提供支持
1 / 91

FreeBSD Port 开发者手册

Loading...

Loading...

Loading...

Loading...

Loading...

第 1 章 简介

Loading...

第 2 章 制作新的 port

Loading...

第 3 章 简单的 port

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

第 4 章 复杂的 Port

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

第 5 章 配置 Makefile

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

第 6 章 特殊情况

Loading...

第 7 章 Flavors

Loading...

Loading...

Loading...

Loading...

Loading...

第 8 章 高级 pkg-plist 实践

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

第 9 章 pkg-*

Loading...

Loading...

Loading...

Loading...

Loading...

第 10 章 测试 port

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

Loading...

第 11 章 升级 port

Loading...

Loading...

第 12 章 安全

Loading...

Loading...

Loading...

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

Loading...

第14章 一个简单的 port

Loading...

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

Loading...

第 16 章 保持更新

Loading...

第 17 章 使用 USES 宏

Loading...

第 18 章 __FreeBSD_version 的值

Loading...

编辑日志

FreeBSD Port 开发者手册翻译项目

警告

除已校对部分外,本项目目前翻译错漏百出,不适合用于生产。

本项目目前处于低维护状态,主要维护者因精力所限仅处理 PR。欢迎社区通过 PR 贡献力量。

原文地址:FreeBSD Porter's Handbook

4.3.修改 port

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

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

注意

除非明确说明,所有为 FreeBSD Ports 创建和第三方软件的补丁文件、脚本及其他文件,都假设遵守标准的 BSD 版权条件。

3.1.编写 Makefile

本节说明了如何快速创建一个新的 Port。对于那些快速方法不够充分的应用程序,完整的“慢速移植”过程在 慢速移植 中有详细说明。

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

注意

这些步骤假设软件可以开箱即用编译运行。换句话说,应用程序在 FreeBSD 系统上工作时完全不需要修改。如果需要修改,请参考 慢速移植。

注意

建议在进行移植之前,在 /etc/make.conf 中设置 make(1) 变量 DEVELOPER 。

# echo DEVELOPER=yes >> /etc/make.conf

此设置启用“开发者模式”,该模式会显示弃用警告,并在调用 make 时激活一些额外的质量检查。


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

尝试理解它。更详细的示例请参见 部分。

4.6.处理用户输入

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

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

3.5.用 portlint 来检查 port

请使用 portlint 检查 Port 是否符合我们的规范。ports-mgmt/portlint 程序是 Ports 的一部分。特别是,检查 Makefile 是否符合规范,以及 package 是否命名得当。

警告

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

3.3.创建校验和文件

只需键入 make makesum。Ports 框架将自动生成 distinfo。不要尝试手动生成该文件。

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 项目意识到了商标声明,则这些名称后面将跟随“™”或“®”符号。

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

MAINTAINER=	[email protected]
COMMENT=	Cat chasing a mouse all over the screen
WWW=		http://www.daidouji.com/oneko/

.include <bsd.port.mk>
示例 Makefile

10.5.Port 工具

Ports 中有 ports-mgmt/porttools。

port 是前端脚本,能帮助简化测试工作。每当需要测试新的 Port 或更新现有 Port 时,可以使用 port test 来进行测试,包括 portlint 检查。此命令还会检测并列出任何未在 pkg-plist 中列出的文件。例如:

# port test /usr/ports/net/csup

3.6.提交新的 port

在提交新的 Port 之前,请阅读 部分。

如果你对 Port 满意,剩下的就是将它放入 FreeBSD 的主 Ports 树,并让其他人也为它高兴。

重要

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

接下来,创建一个 文件。假设该 Port 名为 oneko,并位于 games 分类下。

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

使用 git add . 添加所有文件,然后用 git diff

4.1 Port 工作原理

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


首先,当用户在 Port 目录下输入 make 时,会发生以下事件。阅读 bsd.port.mk 的相关内容能帮助更好地理解这一过程,建议在另一个窗口打开 bsd.port.mk 进行参考。

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

  1. fetch 目标运行。fetch 目标负责确保 tarball 文件存在于本地的 DISTDIR 中。如果 fetch

5.1.原始来源

配置 Makefile 非常简单,再次建议在开始之前查看现有的示例。此外,本手册中有个 ,请查看并遵循该模板中的变量和部分的顺序,以便其他人更容易阅读 Port。

在设计新的 Makefile 时,请按顺序考虑以下问题:


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

9.4.修改 pkg-* 文件的名字

所有的 pkg-* 文件名都使用变量定义,如果需要,可以在 Makefile 中更改这些变量。这对于在多个 Port 之间共享相同的 pkg-* 文件或当需要写入其中一个文件时特别有用。请参见 ,了解为什么直接写入包含 pkg-* 文件的目录是一个坏主意。

以下是变量名及其默认值的列表。(PKGDIR 默认为 ${MASTERDIR}。)

变量
默认值

7.4.USES=python 和 Flavors

当使用 并设置了 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,那么以下写法:

将获得这些 flavor:py27 和 py36。

将获得这些 flavor:py27、py34、

3.4.测试 port

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

  • pkg-plist 中不应包含任何未由 Port 安装的文件。

  • pkg-plist 中应包含 Port 安装的所有文件。

  • 可以使用 install 目标安装 Port。这验证了安装脚本是否正确工作。

7.3.USES=php 和 Flavors

当使用 并带有以下参数之一:phpize、ext、zend 或 pecl,该 Port 会自动填充 FLAVORS,其中包含它支持的 PHP 版本。

示例 5:简单的 USES=php 扩展

以下写法将为所有支持的版本生成包:

以下写法将为所有支持的版本生成包,但排除 7.2:

在
DISTDIR
找不到所需的文件,它会查找
Makefile
中定义的
MASTER_SITES
URL,或者我们将 distfiles 放入的 FTP 镜像站点作为备份。它将尝试使用
FETCH
下载指定的分发文件,假设请求的站点可以直接访问互联网。如果下载成功,文件将保存在
DISTDIR
中供将来使用,然后继续进行下一步。
  • extract 目标运行。该目标会在 DISTDIR 中查找 Port 的分发文件(通常是压缩的 tarball 文件),并将其解压到指定的临时子目录 WRKDIR 中(默认是 work)。

  • patch 目标运行。首先,应用在 PATCHFILES 中定义的补丁。其次,如果在 PATCHDIR 中找到任何名为 patch-* 的补丁文件(默认位于 files 子目录中),则按字母顺序在此时应用它们。

  • configure 目标运行。这个目标可以执行许多不同的操作。

    1. 如果存在,则运行 scripts/configure。

    2. 如果设置了 HAS_CONFIGURE 或 GNU_CONFIGURE,则运行 WRKSRC/configure。

  • build 目标运行。该目标负责进入 Port 的私有工作目录(WRKSRC)并进行编译。

  • stage 目标运行。这个目标将最终构建好的文件放入一个临时目录(STAGEDIR,请参见 Staging)。该目录的层级结构与将要安装该包的系统相似。

  • package 目标运行。这个目标会根据 stage 目标期间创建的临时目录中的文件以及 Port 的 pkg-plist 来创建一个包。

  • 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。

    可以使用 deinstall 目标正确卸载 Port。这验证了卸载脚本是否正确工作。

  • Port 仅在 fetch 目标阶段才能访问网络资源。这对于包构建器非常重要,比如 ports-mgmt/poudriere。

  • 确保 make package 可以作为普通用户运行(即,不是作为 root)。如果失败,软件可能需要打补丁。另请参见 fakeroot 和 uidfix。

  • 推荐的测试顺序:

    1. make stage

    2. make stage-qa

    3. make package

    4. make install

    5. make deinstall

    6. make package(作为用户)

    确保所有阶段没有警告。

    可以通过 ports-mgmt/poudriere 进行彻底的自动化测试,详细信息请参见 poudriere。它维护了 jails,可以在不影响主机系统状态的情况下测试上述所有步骤。

    或
    DISTFILES
    中的一个或多个。

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

    示例 Makefile

    2.1.制作新的 port

    想要创建一个新的 Port,或升级现有的 Port?太好了!

    接下来是一些为 FreeBSD 创建新 Port 的指导方针。要升级现有的 Port,请阅读本文,然后阅读升级 Port。

    当本文档内容不够详细时,请参考 /usr/ports/Mk/bsd.port.mk,该文件包含在所有 Port 的 Makefile 中。即使不是每天修改 Makefile 的人,也能从中获得很多有用的知识。此外,具体的问题可以发送到 FreeBSD ports 邮件列表。

    注意

    本文仅提到了一小部分可以被覆盖的变量(VAR)。大部分(如果不是全部的话)已在 /usr/ports/Mk/bsd.port.mk 的开头文档中说明;其他的可能也应该被说明。请注意,该文件使用了非标准的制表符设置:Emacs 和 Vim 会在加载该文件时识别该设置。加载文件后,使用 vi(1) 和 ex(1) 可以通过输入 :set tabstop=4 来设置为正确的值。

    想找一些简单的入门项目?看看 请求的 Port 列表,看看你是否能着手做其中一个(或多个)。

    12.1.安全为何如此重要

    软件中偶尔会引入漏洞。可以说,其中最危险的是那些会导致安全漏洞的漏洞。从技术角度来看,这类漏洞需要通过消除导致它们的漏洞来关闭。然而,处理普通漏洞和安全漏洞的政策是非常不同的。

    一个典型的小漏洞只影响那些启用了某些选项组合的用户,这些选项触发了该漏洞。开发者最终会发布一个修复补丁,然后发布一个新的软件版本,修复了该漏洞,但大多数用户不会立即升级,因为该漏洞从未困扰过他们。一个可能导致数据丢失的严重漏洞代表了一个更严重的问题。然而,谨慎的用户知道,除了软件漏洞,很多可能的事故也有可能导致数据丢失,因此他们会备份重要数据;此外,严重漏洞很快就会被发现。

    安全漏洞则完全不同。首先,它可能会保持不被注意多年,因为它通常不会导致软件故障。其次,恶意方可以利用它获得对易受攻击系统的未经授权的访问,销毁或更改敏感数据;在最坏的情况下,用户甚至不会注意到造成的损害。第三,暴露一个易受攻击的系统通常会帮助攻击者入侵其他本来无法突破的系统。因此,修复一个漏洞本身是不够的:需要以最清晰、最全面的方式通知受众,让他们评估风险并采取适当的行动。

    7.1.Flavors 简介

    Flavors 是实现一个 Port 多种变体的一种方式。该 Port 会被构建多次,每次带有不同的变体。

    例如,一个 Port 可以有一个带有许多功能和较多依赖的普通版本,也可以有一个只包含基本功能和最少依赖的轻量级“lite”版本。

    另一个例子是,一个 Port 可以有 GTK flavor 和 QT flavor,取决于它使用的是哪种工具包。

    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

    DESCR

    ${PKGDIR}/pkg-descr

    PLIST

    写入 WRKDIR 之外的地方

    ${PKGDIR}/pkg-plist

    4.5.配置

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

    查看差异。例如:

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

    使用 git format-patch 生成的补丁会包括作者的身份和电子邮件地址,使开发人员能够更容易地应用补丁(使用 git am),并给予适当的信用。

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

    通过 问题报告提交表单 提交 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 后,我们会根据需要回复,并将其提交到树中。提交者的名字也会被添加到 Additional FreeBSD Contributors 和其他文件的列表中。

    重要

    之前提交新 Port 的补丁可以使用 shar(1) 文件;但随着 git(1) 的发展,这已经不再是有效的方式。提交者现在不再接受 shar(1) 文件,因为它容易出错,并且不会在分类的 Makefile 中添加相关条目。

    DOs 和 DON’Ts
    patch(1)
    py35
    和
    py36
    。

    示例 8:带版本要求的 USES=python

    假设当前支持的 Python 版本是 2.7、3.4、3.5 和 3.6,且默认的 Python 2 和 Python 3 版本分别是 2.7 和 3.6,那么以下写法:

    将获得这个 flavor:py27。

    将获得这些 flavor:py27、py34 和 py35。

    将获得这个 flavor:py36。

    将获得这些 flavor:py34、py35 和 py36。

    可以使用 PY_FLAVOR 来依赖正确版本的 Python 模块。所有对支持 flavor 的 Python Port 的依赖都应使用 PY_FLAVOR,而不是直接使用 FLAVOR。

    示例 9:适用于未使用 distutils 的 Port

    如果默认的 Python 3 版本是 3.6,以下写法将把 PY_FLAVOR 设置为 py36:

    USES=	python
    USE_PYTHON=	distutils
    python
    7.3.1. 带 PHP 应用的 PHP Flavors

    PHP 应用也可以支持 flavor。

    这样可以为所有 PHP 版本生成包,方便用户在其服务器上使用所需的 PHP 版本。

    技巧

    支持 flavor 的 PHP 应用必须在其包名中追加 PHP_PKGNAMESUFFIX。

    示例 6:为 PHP 应用添加 Flavors 支持

    为 PHP 应用添加 flavor 支持非常简单:

    重要

    当添加对支持 PHP flavor 的 Port 的依赖时,使用 @${PHP_FLAVOR}。绝不要直接使用 FLAVOR。

    PORTNAME=	some-ext
    PORTVERSION=	0.0.1
    PKGNAMEPREFIX=	${PHP_PKGNAMEPREFIX}
    
    USES=		php:ext
    PORTNAME=	some-ext
    PORTVERSION=	0.0.1
    PKGNAMEPREFIX=	${PHP_PKGNAMEPREFIX}
    
    USES=		php:ext
    IGNORE_WITH_PHP=	72
    php
    % git add .
    % git diff --staged
    % git commit
    % git format-patch origin/main
    USES=	python
    USE_PYTHON=	distutils allflavors
    USES=	python:-3.5
    USE_PYTHON=	distutils
    USES=	python:-3.5
    USE_PYTHON=	distutils allflavors
    USES=	python:3.4+
    USE_PYTHON=	distutils
    USES=	python:3.4+
    USE_PYTHON=	distutils allflavors
    RUN_DEPENDS=	${PYTHON_PKGNAMEPREFIX}mutagen>0:audio/py-mutagen@${PY_FLAVOR}
    
    USES=	python:3.5+
    PKGNAMESUFFIX=	${PHP_PKGNAMESUFFIX}
    
    USES=	php:flavors

    5.18. 使用 BINARY_ALIAS 来重命名命令,而不是在编译中打补丁

    5.17.6. BINARY_ALIAS 用法

    当定义了 BINARY_ALIAS 时,它会在一个目录中创建所给命令的符号链接,并将该目录添加到 PATH 中。

    使用它可以替换构建阶段依赖的硬编码命令,而无需修补任何构建文件。

    示例 48. 使用 BINARY_ALIAS 让 gsed 作为 sed 使用

    某些 Port 期望 sed 行为像 GNU sed,并使用 不提供的功能。GNU sed 可以通过 在 FreeBSD 上获得。

    使用 BINARY_ALIAS 将 sed 替换为 gsed 以便在构建期间使用:

    示例 49. 使用 BINARY_ALIAS 为硬编码的 python3 命令提供别名

    一个 Port 如果在其构建脚本中硬编码了对 python3 的引用,需要在构建时使其在 PATH 中可用。使用 BINARY_ALIAS 创建一个指向正确 Python 3 二进制文件的别名:

    更多关于 USES=python 的信息,请参见 。

    注意

    二进制别名是在处理完 BUILD_DEPENDS 和 LIB_DEPENDS 提供的依赖关系之后,以及 configure 目标之前创建的。这会导致一些限制。例如,通过 TEST_DEPENDS 安装的程序不能用于创建二进制别名,因为此方式指定的测试依赖关系是在创建二进制别名之后处理的。

    3.2.编写描述文件

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

    3.2.1. pkg-descr

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

    注意

    这不是手册,也不是如何使用或编译 Port 的详细描述!请在复制自 README

    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

    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 脚本。通过

    10.8.调试 port

    有时,程序在运行时会出现问题,导致 Port 失败。为了帮助调试 Ports,FreeBSD 提供了一些工具。这些工具的功能是有限的,因为调试 Port 的方式很大程度上取决于使用的技术。以下变量有助于调试 Ports:

    • WITH_DEBUG:如果设置此变量,Ports 将会在构建时包含调试符号。

    • WITH_DEBUG_PORTS:指定要使用 WITH_DEBUG 选项构建的 Ports 列表。

    10.2.运行 make test

    哪怕 Port 构建正常,确保软件正确执行其预期功能也是一个好主意。如果原始上游项目随软件一起提供了测试,最好运行这些测试并检查一切是否按预期工作。

    Port 可以通过使用 TEST_TARGET 变量自动启用测试。设置该变量时,它包含 Port 的测试目标名称。通常为 test,但也可以是其他名称,例如 tests、check,或者在特定情况下类似 run_tests.py 之类的名称。

    除了 TEST_TARGET 变量,框架还提供了以下变量来控制测试的执行:

    • TEST_WRKSRC

    5.7.项目网站

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

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

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

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

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

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

    4.2.获取源代码

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

    将变量 MASTER_SITES 设置为原始 tarball 存放的位置。对于大多数主流站点,bsd.sites.mk 中有快捷方式定义。如果可能的话,请使用这些站点及其相关定义,以避免在源代码中重复相同的信息。由于这些站点会随着时间的推移发生变化,因此如果不使用这些快捷方式,可能会给每个人带来维护上的噩梦。有关详细信息,请参见 。

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

    如果找不到合适且可靠的地方来存放 distfile,我们可以将其“寄存”在 ftp.FreeBSD.org 上;然而,这种方法是最不推荐的。distfile 必须放在某个 freefall 账户的 ~/public_distfiles/ 目录下。请向提交该 Port 的人请求帮助。这个人还会将 MASTER_SITES 设置为 LOCAL/username

    5.9.PORTSCOUT

    Portscout 是 FreeBSD Ports 的自动化 distfile 检查工具,详细描述见 。

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

    设置 PORTSCOUT 时的情况包括:

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

    • 当需要完全禁用 distfile 版本检查时。例如,如果一个 Port 永远不会再更新,可以添加:

    译者说明

    术语翻译对照表

    英语
    中文/翻译
    原因
    其他说明
    应用

    7.5.USES=lua 和 Flavors

    当使用 或 时,Port 会自动填充 FLAVORS,其中包含它所支持的 Lua 版本。不过,普通的应用程序(而不是 Lua 模块)通常不应使用这个功能;大多数嵌入或使用 Lua 的应用程序只需简单地使用 USES=lua。

    LUA_FLAVOR 是可用的(并且必须使用)变量,用于依赖正确版本的依赖项,无论该 Port 是否使用了 flavors 或 module 参数。

    有关更多信息,请参见 。

    是进行测试的目录。
  • TEST_ENV 包含在测试阶段传递的附加变量。

  • TEST_ARGS 包含传递给测试阶段的任何额外参数。

  • 这些变量的使用示例可以在 cad/xyce、www/libjwt 等 Port 中找到。

    注意

    请确保在更新 Port 时测试不会出现故障。

    ,其中
    username
    是他们的 FreeBSD 集群登录名。

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

    如果 Port 需要额外的补丁,并且这些补丁可以从互联网下载,请同样将它们下载并放入 DISTDIR。即使这些补丁来自与主要源代码 tarball 不同的网站,也不需要担心,我们有办法处理这种情况(请参见下文对 PATCHFILES 的描述)。

    MASTER_SITES
    lua:module
    lua:flavors
    使用 Lua

    无实际意义

    单个软件包组为 port,不加 s

    Ports

    Ports

    pkg
    运行的 Lua 脚本提供了一些扩展功能和一些限制,这些都在
    中进行了说明。

    注意

    推荐使用 pkg-pre-install(或 pkg-pre-install.lua)和 pkg-post-install(或 pkg-post-install.lua),而不是使用 pkg-install。

    这些脚本会自动添加到打包列表中。

    重要

    这些脚本用于简化包安装后的配置。不能 滥用它们来启动服务、停止服务或运行任何其他会修改当前运行系统的命令。

    pkg-lua-script(5)
    sed(1)
    textproc/gsed
    使用 Python
    WWW=		https://ffmpeg.org/
    WWW=		https://sourceforge.net/projects/mpd/
    或手册页时小心
    。它们往往不是对 Port 的简洁描述,或者格式不合适。例如,手册页有对齐空格,这在等宽字体下看起来特别难看。

    另一方面,pkg-descr 的内容必须比 Makefile 中的 COMMENT 行 更长。它必须更深入地解释该 Port 的功能。

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

    注意

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

    3.2.2. pkg-plist

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

    下面是个小示例:

    有关打包列表的详细信息,请参阅 pkg-create(8) 手册页。

    注意

    推荐将此文件中的所有文件名按字母顺序排列。这样在升级 Port 时验证更改会更容易。排序应在变量展开后进行。框架在 自动生成 包列表时会正确地进行排序。

    技巧

    手动创建打包列表可能是一个非常繁琐的任务。如果 Port 安装了大量文件,自动创建打包列表 可能会节省时间。

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

    注意

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

    技巧

    如果 Port 需要创建一个空目录,或者在安装过程中在 ${PREFIX} 外部创建目录,请参考 清理空目录 以获取更多信息。

    技巧

    由于 PLIST_FILES 是一个 make(1) 变量,因此任何包含空格的条目都必须加上引号。例如,如果使用 pkg-create(8) 和 通过关键字扩展包列表 中描述的关键字,条目必须加上引号。

    稍后我们将看到如何使用 pkg-plist 和 PLIST_FILES 来完成 更复杂的任务。

    的完整版本号(例如
    5.8.9
    )。还有其他一些与 Port 文档文件相关的
    %%VARS%%
    替换项,在
    中有说明。

    要进行自定义替换,可以在 Makefile 中设置 PLIST_SUB 为 VAR=VALUE 形式的列表,pkg-plist 中出现的 %%VAR%% 就会被替换为 VALUE。

    例如,如果一个 Port 在按版本划分的子目录中安装了多个文件,可以使用占位符表示版本号,这样 Port 升级时就无需每次都重新生成 pkg-plist。可以这样设置:

    然后在 pkg-plist 中使用 %%OCTAVE_VERSION%% 来代表版本号出现的位置。这样当 Port 升级时,就无需编辑成百上千的 plist 行。

    如果文件的安装是取决于 Port 的选项设置,则常见的处理方法是在 pkg-plist 行前加上 %%OPT%%(表示启用该选项时需要安装该文件),或 %%NO_OPT%%(表示禁用该选项时需要安装该文件),并在 Makefile 中添加 OPTIONS_SUB=yes。详见 OPTIONS_SUB。

    例如,如果有些文件只在启用了 X11 选项时才安装,并且 Makefile 中有:

    则在 pkg-plist 中,应在仅在启用该选项时才安装的行前加上 %%X11%%,例如:

    这种替换是在 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 时才会被安装,可以这样设置:

    相关章节
    DEBUG_FLAGS:用于指定要添加到 CFLAGS 的附加标志,默认值为 -g。

    当 WITH_DEBUG 被设置时,无论是全局设置还是针对某些 Ports 设置,生成的二进制文件都不会被剥离调试信息。

    这些变量可以在 make.conf 或命令行中指定:

    注意

    如果使用 ports-mgmt/poudriere 构建 Port,调试变量必须在 poudriere 的 make.conf 中指定,而不是在 /etc/make.conf 中指定。有关详细信息,请参阅 ports-mgmt/poudriere 文档。

    有关更多调试工具的信息,请参阅 Developer’s Handbook。

    # cd category/port && make -DWITH_DEBUG DEBUG_FLAGSS="-g -O0"
  • 当必须检查特定版本或特定主次版本的 distfile 时。例如,如果只有版本 0.6.4 需要监控,因为较新版本与 FreeBSD 存在兼容性问题,可以添加:

    PORTSCOUT=	limit:^0\.6\.4
  • 当列出可用版本的 URL 与下载 URL 不同时时。例如,限制 distfile 版本检查仅限于 databases/pgtune Port 的下载页面,可以添加:

    PORTSCOUT=	site:http://www.renpy.org/dl/release/
  • PORTSCOUT=	skipv:8.2,8.3
    Portscout: the FreeBSD Ports Distfile Scanner
    BUILD_DEPENDS=	gsed:textproc/gsed
    ...
    BINARY_ALIAS=	sed=gsed
    USES=	python:3.4+,build
    ...
    BINARY_ALIAS=	python3=${PYTHON_CMD}
    PLIST_FILES=	"@sample ${ETCDIR}/oneko.conf.sample"
    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=	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
    OCTAVE_VERSION=	${PORTREVISION}
    PLIST_SUB=	OCTAVE_VERSION=${OCTAVE_VERSION}
    OPTIONS_DEFINE=	X11
    OPTIONS_SUB=	yes
    %%X11%%bin/foo-gui
    .include <bsd.port.pre.mk>
    
    .if ${PORT_OPTIONS:MX11} && ${ARCH} == "i386"
    PLIST_SUB+=	X11I386=""
    .else
    PLIST_SUB+=	X11I386="@comment "
    .endif
    PORTSCOUT=	ignore:1

    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 键值对。在每个文件中的 %%VAR%% 会被替换为 VALUE。几个常见的键值对会自动定义:PREFIX、LOCALBASE、DATADIR、DOCSDIR、EXAMPLESDIR、WWWDIR 和 ETCDIR。任何以 @comment 开头并后跟空格的行,在变量替换后将从结果文件中删除。

    以下示例将 %%ARCH%% 替换为系统架构,并插入到 pkg-message 中:

    注意:在这个例子中,pkg-message.in 必须存在于 FILESDIR 中。

    一个良好的 pkg-message.in 示例:

    11.2.UPDATING 和 MOVED

    11.2.1. /usr/ports/UPDATING

    如果升级 Port 需要特定步骤,例如更改配置文件或运行特定程序,必须在此文件中记录。文件中的条目格式如下:

    技巧

    在包含确切的 portmaster、portupgrade、pkg 指令时,请确保正确处理 shell 转义。例如,不要 使用:

    如上所示,此命令仅在 Bourne Shell 下有效。或使用如下形式,该形式在 Bourne Shell 和 C-Shell 下均可正常工作:

    SUB_FILES=	pkg-message
    SUB_LIST=	ARCH=${ARCH}
    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.
    注意

    推荐 AFFECTS 行包含一个匹配所有受此条目影响的 Port 的 glob,以便自动化工具可以尽可能轻松地解析它。如果更新涉及所有现有的 BIND 9 版本,则 AFFECTS 内容应为 users of dns/bind9*,而不应为 users of BIND 9。

    11.2.2. /usr/ports/MOVED

    此文件用于列出被移动或删除的 Ports。文件中的每一行由 Port 的名称、该 Port 移动到的位置、移动日期以及原因组成。如果 Port 被删除,可以将移动位置部分留空。每个部分必须用 |(管道)字符分隔,如下所示:

    日期必须以 YYYY-MM-DD 的形式输入。新条目会被添加到列表的末尾,以保持按时间顺序排列,最旧的条目位于顶部。

    如果某个 Port 被删除但后来又恢复了,删除该文件中记录其被删除的行。

    如果某个 Port 被重命名后又恢复为原名称,需将中间的名称条目添加到旧名称的条目下,并删除旧的条目以避免形成循环。

    注意

    任何更改都必须通过 Tools/scripts/MOVEDlint.awk 进行验证。如果使用的是 /usr/ports 以外的 Ports 目录,使用以下命令:

    % cd /home/user/ports
    % env PORTSDIR=$PWD Tools/scripts/MOVEDlint.awk
    # pkg delete -g -f docbook-xml* docbook-sk* docbook[2345]??-* docbook-4*
    YYYYMMDD:
      AFFECTS: users of portcategory/portname
      AUTHOR: 你的名字 <你的电子邮箱地址>
    
      Special instructions
    # pkg delete -g -f docbook-xml\* docbook-sk\* docbook\[2345\]\?\?-\* docbook-4\*
    old name|new name (blank for deleted)|date of move|reason

    9.1.pkg-message(安装二进制包时显示的消息文件)

    为了在安装包时显示一条消息,可以将消息放在 pkg-message 文件中。此功能通常用于在执行 pkg install 或 pkg upgrade 后显示安装过程中需要采取的额外步骤。


    重要

    • pkg-message 必须只包含对 FreeBSD 设置和操作至关重要的信息,并且该信息必须是特定于该 Port 的。

    • 设置信息应仅在首次安装时显示。升级说明应仅在从相关版本升级时显示。

    • 请勿在消息中添加空格或符号行(如 ----------、`` 或 ==========)。将格式设置交给 。

    • 提交者有权使用 UCL 格式规范将现有消息限制为安装或升级范围。

    • 请务必使用正确的工具来处理服务。

    • 使用 service name start 启动服务,而不是使用 /usr/local/etc/rc.d/name start。

    • 使用 sysrc name_enable=YES 修改 rc.conf 中的选项。

    pkg-message 支持两种格式:

    • raw 普通的纯文本文件。其消息仅在安装时显示。

    • UCL 如果文件以“[”开头,则它会被视为 UCL 文件。UCL 格式的详细说明请参见 。

    注意

    请不要在 pkg-plist 中添加 pkg-message 的条目。

    9.1.1. pkg-message UCL

    该格式如下。它应为对象的数组。每个对象可以包含以下关键字:

    • message 要显示的实际消息。此关键字是强制性的。

    • type 消息应显示的时机。

    • maximum_version 仅在 type 为 upgrade 时使用。仅在升级自严格低于指定版本的情况下显示。

    maximum_version 和 minimum_version 可以组合使用。

    type 关键字可以有三种值:

    • install 仅在安装包时显示该消息。

    • remove 仅在删除包时显示该消息。

    • upgrade 仅在升级包时显示该消息。

    重要

    为了与非 UCL 格式的 pkg-message 文件保持兼容,UCL pkg-message 的第一行 必须是 一个单独的“[”,最后一行 必须是 一个单独的“]”。

    示例 1. UCL 短字符串

    消息由双引号 " " 分隔,用于简单的单行字符串:

    示例 2. UCL 多行字符串

    多行字符串使用标准的 here 文档语法。多行定界符 必须 紧跟在 << 符号后,没有任何空格,并且 必须 只包含大写字母。要结束多行字符串,在单独的一行中添加定界符字符串,不带任何空格。来自 的消息可以写成:

    示例 3. 在安装/卸载时显示消息

    当消息仅需要在安装或卸载时显示时,设置 type:

    示例 4. 显示升级时的消息

    当升级 Port 时,显示的消息可以更加符合 Port 的需要。

    当显示升级时的消息时,限制显示给用户的时机非常重要。大多数时候,这是通过使用 maximum_version 来限制消息的使用,以确保它仅在从某个特定版本之前的版本进行升级时显示。

    目录

    第 14 章 一个简单的 port

    这里是一个可以用来创建新 Port 的 Makefile 示例。确保删除所有多余的注释(即括号中的注释)。

    所示的格式是推荐的变量排序方式,部分之间的空行等。这种格式设计的目的是使最重要的信息容易找到。我们推荐使用 来检查 Makefile。

    1.1.简介

    FreeBSD Ports 是几乎所有人安装应用程序(“Ports”)的方式。和 FreeBSD 的其他一切一样,它主要由志愿者推动。在阅读本文档时,记住这一点是很重要的。

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

    minimum_version 仅在 type 为 upgrade 时使用。仅在升级自严格高于指定版本的情况下显示。

    pkg(8)
    libucl 的 GitHub 页面
    UCL 短字符串
    [描述 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 被分配给 "[email protected]"。]
    MAINTAINER=	[email protected]
    COMMENT=	DVI Previewer for the X Window System
    WWW=		http://xdvi.sourceforge.net/
    
    [许可证 -- 不应为空]
    LICENSE=	BSD2CLAUSE
    LICENSE_FILE=	${WRKSRC}/LICENSE
    
    [依赖关系 -- 可以为空]
    RUN_DEPENDS=	gs:print/ghostscript
    
    [如果需要 GNU make,而不是 /usr/bin/make,来进行构建...]
    USES= gmake
    [如果是 X 应用程序,并且需要运行 "xmkmf -a"...]
    USES= imake
    
    [此部分用于其他不属于上述任何类别的标准 bsd.port.mk 变量]
    [如果在配置、构建、安装过程中会询问问题...]
    IS_INTERACTIVE=	yes
    [如果解压到与 ${DISTNAME} 不同的目录...]
    WRKSRC=		${WRKDIR}/xdvi-new
    [如果需要运行由 GNU autoconf 生成的 "configure" 脚本]
    GNU_CONFIGURE=	yes
    [等等...]
    
    [如果需要选项,此部分用于选项]
    OPTIONS_DEFINE=	DOCS EXAMPLES FOO
    OPTIONS_DEFAULT=	FOO
    [如果选项会更改 plist 中的文件]
    OPTIONS_SUB=yes
    
    FOO_DESC=		启用 foo 支持
    
    FOO_CONFIGURE_ENABLE=	foo
    
    [用于规则中的非标准变量]
    MY_FAVORITE_RESPONSE=	"yeah, right"
    
    [然后是特殊规则,按调用顺序排列]
    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>
    portlint
    [
    { type: install
      message: "Simple message"
    }
    ]
    [
    { type: install
      message: <<EOM
    Simple message
    EOM
    }
    ]
    [
    {
      type: remove
      message: "package being removed."
    }
    { type: install, message: "package being installed."}
    ]
    [
    {
      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."
    }
    ]

    目录

    第 1 章 简介

    • 1.1.简介

    第 2 章 制作新的 port

    • 2.1.制作新的 port

    第 3 章 简单的 port

    • 3.1.编写 Makefile

    • 3.2.编写描述文件

    • 3.3.创建校验和文件

    • 3.4.测试 port

    第 4 章 复杂的 Port

    • 4.1 Port 工作原理

    • 4.2.获取源代码

    • 4.3.修改 port

    • 4.4.打补丁

    第 5 章 配置 Makefile

    • 5.1.原始来源

    • 5.2.命名

    • 5.3.归类

    • 5.4.源代码包文件

    第 6 章 特殊情况

    • 第 6 章 特殊情况

    第 7 章 Flavors

    • 7.1.Flavors 简介

    • 7.2.使用 FLAVORS

    • 7.3.USES=php 和 Flavors

    • 7.4.USES=python 和 Flavors

    第 8 章 高级 pkg-plist 实践

    • 8.1.根据 make 变量对 pkg-plist 进行修改

    • 8.2.空目录

    • 8.3.配置文件

    • 8.4.动态与静态软件包列表

    第 9 章 pkg-*

    • 9.1.pkg-message(安装二进制包时显示的消息文件)

    • 9.2.pkg-install、pkg-pre-install 和 pkg-post-install(安装二进制包时执行的脚本文件)

    • 9.3.pkg-deinstall、pkg-pre-deinstall 和 pkg-post-deinstall(卸载时执行的脚本文件)

    • 9.4.修改 pkg-* 文件的名字

    第 10 章 测试 port

    • 10.1.运行 make describe

    • 10.2.运行 make test

    • 10.3.Portclippy / Portfmt

    • 10.4.Portlint

    第 11 章 升级 port

    • 11.1.使用 Git 制作补丁

    • 11.2.UPDATING 和 MOVED

    第 12 章 安全

    • 12.1.安全为何如此重要

    • 12.2.修复安全漏洞

    • 12.3.向社区通报情况

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

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

    第14章 一个简单的 port

    • 第 14 章 一个简单的 port

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

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

    第 16 章 保持更新

    • 第 16 章 保持更新

    第 17 章 使用 USES 宏

    • 第 17 章 使用 USES 宏

    第 18 章 __FreeBSD_version 的值

    • 第 18 章 __FreeBSD_version 的值

    FreeBSD Port 开发者手册翻译项目
    编辑日志
    译者说明
    FreeBSD Port 开发者手册

    11.1.使用 Git 制作补丁

    当某 Port 不是作者发布的最新版本时,请更新本地工作副本 /usr/ports。该 Port 可能已经被更新到新版本。

    如果要处理多个 Port,使用 Git 来保持整个 Ports 最新可能会更加方便,正如在 中所描述的。这还可以跟踪所有 Port 的依赖项。

    接下来的步骤是检查是否已经有一个更新待处理。为此,有两种方法。可以通过可搜索的界面访问 ,在 Product 的多选菜单中选择 Ports & Packages,然后在 Summary 字段中输入 Port 的名称。

    如果没有待处理的 PR,接下来的步骤是向 Port 的维护者发送电子邮件,如通过 make maintainer 显示的那样。维护者可能已经在进行升级,或者有不升级该 Port 的理由(例如新版本可能存在稳定性问题),这时就没有必要重复他们的工作。注意,未维护的 Ports 会列出 [email protected] 作为维护者,这是一个通用的 Ports 邮件列表,因此在这种情况下发送邮件可能没有帮助。

    如果维护者要求你进行升级,或者该 Port 没有维护者,那么可以帮助 FreeBSD 准备更新!可以使用基本系统中的 命令来完成。

    8.4.动态与静态软件包列表

    静态包列表是指在 Ports 中可用的包列表,可以是 pkg-plist(无论是否使用变量替换)或通过 PLIST_FILES 和 PLIST_DIRS 嵌入在 Makefile 中。即使内容是通过工具或 Makefile 中的目标在加入 Ports 集合之前自动生成的(例如,使用 make makeplist),它仍然被视为静态列表,因为在不下载或编译源文件的情况下,可以检查其内容。

    动态包列表是指在编译 Port 时根据安装的文件和目录生成的包列表。在下载和编译源代码或运行 make clean 后,它将无法被检查。

    尽管使用动态包列表并不被禁止,但维护者应尽可能使用静态包列表,因为这样可以使用户通过 查询现有 Port,从而发现例如哪些 Port 安装了某个特定的文件。动态包列表主要应当用于复杂的 Port,在这些 Port 中,包列表会根据 Port 的可选特性(因此维护静态包列表不可行)或使用的依赖软件版本发生重大变化。例如,生成 Javadoc 文档的 Port。

    3.5.用 portlint 来检查 port
    3.6.提交新的 port
    4.5.配置
    4.6.处理用户输入
    5.5.维护者(MAINTAINER)
    5.6.一句话说明(COMMENT)
    5.7.项目网站
    5.8.许可证
    5.9.PORTSCOUT
    5.10.依赖
    5.11.从属 port 和 MASTERDIR
    5.12.man 手册
    5.13.info 文件
    5.14.Makefile 参数
    5.15.特殊的工作目录
    5.16.解决冲突
    5.17.安装文件
    5.18. 使用 BINARY_ALIAS 来重命名命令,而不是在编译中打补丁
    7.5.USES=lua 和 Flavors
    8.5.自动创建软件包列表
    8.6.用关键词扩展软件包列表
    9.5.使用 SUB_FILES 和 SUB_LIST
    10.5.Port 工具
    10.6.PREFIX 和 DESTDIR
    10.7.Poudriere
    10.8.调试 port
    grep(1)
    要为单个补丁创建合适的 diff,将需要修补的文件复制为 something.orig,保存更改为 something,然后创建补丁:

    否则,可以使用 git diff 方法(请参阅 Using Git to Make Patches)或者将 Port 的内容复制到另一个目录,并使用新的和旧的 Port 目录的递归 diff(1) 输出结果(例如,如果修改过的 Port 目录称为 superedit,原目录为 superedit.bak,则保存 diff -ruN superedit.bak superedit 的结果)。统一或上下文 diff 都可以,但 Port 提交者通常更喜欢统一格式的 diff。注意使用 -N 选项——这是处理新文件添加或旧文件删除的标准方法。在提交 diff 之前,请检查输出,确保所有更改都合理。(特别是,确保首先使用 make clean 清理工作目录。)

    注意

    如果有文件被添加、复制、移动或删除,请将此信息添加到问题报告中,以便提交补丁的提交者知道需要执行哪些 git(1) 命令。

    为了简化常见的补丁操作,可以使用 make makepatch,如在 Patching 中所述。还可以使用其他工具,如 /usr/ports/Tools/scripts/patchtool.py。在使用之前,请阅读 /usr/ports/Tools/scripts/README.patchtool。

    如果该 Port 没有维护者,并且你正在积极使用它,请考虑自愿成为它的维护者。FreeBSD 有超过 4000 个没有维护者的 Ports,这是一个总是需要更多志愿者的领域。(有关维护者职责的详细描述,请参阅 Developer’s Handbook 章节。)

    要提交 diff,请使用 bug 提交表单(产品 Ports & Packages,组件 Individual Port(s))。始终在 Port 名称后附上类别,并简要描述问题。例如:category/portname:<span> </span>add FOO option;category/portname:<span> </span>Update to X.Y。请在消息中提到任何添加或删除的文件,因为在提交时需要明确指定这些文件给 git(1)。不要压缩或编码 diff。

    在提交问题报告之前,请查看 Writing the problem report 章节中的问题报告编写指南。它包含了有关如何编写有用问题报告的更多信息。

    重要

    如果升级是出于安全考虑或当前提交的 Port 存在严重缺陷,请通知 Ports 管理团队 <[email protected]>,以请求立即重新构建和重新分发该 Port 的包。否则,使用 pkg 的用户将继续通过 pkg install 安装旧版本,可能会持续几周。

    注意

    请使用 diff(1) 或 git diff 来创建现有 Ports 的更新。其他格式可能包括整个文件,使得无法仅查看更改内容。当没有包含 diff 时,整个更新可能会被忽略。

    完成这些工作后,请阅读 Keeping Up 中关于如何保持更新的内容。


    如果可能,请提交 git(1) 补丁或 diff。相比于“新旧”目录之间的 diff,它们更容易处理。这样更容易看到变更内容,并且如果在开始工作后 Ports 集合中有所修改,或者提交者要求修复某些内容,可以更容易地更新 diff。此外,使用 git-format-patch(1) 或 git-diff(1) 生成的补丁,可以通过 git-am(1) 或 git-apply(1) 轻松应用,并节省提交者的一些时间。最后,通过 git-format-patch(1) 生成的 Git 补丁包含你的作者信息和提交消息。这些信息将记录在仓库的日志中,这是提交更改的推荐方式。

    • ① 当然,这个路径可以是任何位置。构建 Ports 并不限于 /usr/ports/。

    • ② git.FreeBSD.org 是 FreeBSD 的公共 Git 服务器。有关更多信息,请参阅 FreeBSD Git Repository URL Table。

    在 Port 目录中,进行必要的更改。如果是添加、移动或删除文件,请使用 git 来跟踪这些更改:

    确保使用 Testing the Port 和 Checking the Port with portlint 中的检查清单来检查该 Port。

    同时,使用 make makesum 更新 distinfo 中的校验和引用。

    在制作补丁之前,获取最新的仓库并将更改 rebase 到其之上。仔细观察并跟踪输出。如果有任何文件 rebase 失败,意味着在你编辑同一个文件时,源文件发生了变化,需要手动解决冲突。

    检查待提交的更改:

    最后一步是生成统一的 diff 或补丁:

    要使用 git-format-patch(1) 生成补丁:

    这将生成一个类似于 0001-foo.patch 的补丁文件。这是推荐的方式,因为它包含了作者身份信息,而且当你进行一系列不打算合并在一起的更改时也更方便。

    另外,要使用 git-diff(1) 生成统一的 diff,可以执行:

    这将生成一个类似于 foo-1.2.3.diff 的 diff 文件,其中 foo 替换为提交消息的第一行,即提交消息的主题。

    补丁创建完成后,你可以切换回主分支开始其他开发工作。

    补丁被接受并合并后,你可以删除本地开发分支(如果你想的话):

    注意

    如果文件已添加、移动或删除,请包含使用的 git(1) add、mv 和 rm 命令。必须在补丁应用之前运行 git mv。应用补丁后,必须运行 git add 或 git rm。

    按照 问题报告提交指南 提交补丁。

    Using the Ports Collection
    FreeBSD 问题报告(PR)或 bug 数据库
    diff(1)
    % diff -u something.orig something > something.diff
    % git clone https://git.FreeBSD.org/ports.git ~/my_wrkdir  ①②
    % cd ~/my_wrkdir
    % git add new_file
    % git mv old_name new_name
    % git rm deleted_file
    % git fetch origin main
    % git rebase origin/main
    % git status
    % git diff --staged
    % git checkout -b my_branch
    % git commit
    % git format-patch main
    % git diff --staged > ../`make -VPKGNAME`.diff
    % git checkout main
    % git branch -D my_branch

    10.6.PREFIX 和 DESTDIR

    PREFIX 决定了 Port 的安装位置。默认情况下,它是 /usr/local,但用户可以设置为自定义路径,如 /opt。Port 必须遵守该变量的值。

    DESTDIR 如果由用户设置,决定了完整的替代环境,通常是 jail 或者是挂载在 / 以外的安装系统。Port 实际上会安装到 DESTDIR/PREFIX,并在 DESTDIR/var/db/pkg 中注册到包数据库。DESTDIR 由 Ports 基础设施通过 自动处理。无需修改或额外注意编写 DESTDIR 合规的 Ports。

    PREFIX 的值将被设置为 LOCALBASE(默认值为 /usr/local)。如果设置了 USE_LINUX_PREFIX,PREFIX

    5.13.info 文件

    如果包需要安装 GNU info 文件,请将它们列在 INFO 中(不包括 .info 后缀),每个文档一项。这些文件假定安装到 PREFIX/INFO_PATH。如果包使用不同的位置,请更改 INFO_PATH。不过,这并不推荐。这些条目仅包含相对于 PREFIX/INFO_PATH 的路径。例如, 将 info 文件安装到 PREFIX/INFO_PATH/gcc34,并且 INFO 可能如下所示:

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

    INFO=	gcc34/cpp gcc34/cppinternals gcc34/g77 ...
    lang/gcc34
    将是
    LINUXBASE
    (默认值为
    /compat/linux
    )。

    避免在源代码中硬编码 /usr/local 路径,可以使 Port 更加灵活,能够满足其他站点的需求。通常可以通过将 Port 中各种 Makefile 中的 /usr/local 替换为 ${PREFIX} 来实现这一点。这个变量会自动传递到构建和安装过程的每个阶段。

    确保应用程序没有将文件安装到 /usr/local 而不是 PREFIX。一种快速检查硬编码路径的方法是:

    如果安装了任何不在 PREFIX 中的文件,包创建过程将提示找不到这些文件。

    此外,还值得检查使用阶段目录支持(见 Staging)的情况:

    • 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}:

    使用 LOCALBASE 的路径在管理员将整个 /usr/local 树移动到其他地方时,更有可能仍然有效。

    技巧

    所有这些测试都在运行 poudriere testport 或 poudriere bulk -t 时自动完成。强烈建议每个 Port 贡献者安装并用其测试自己的 Port。有关更多信息,请参见 poudriere。

    chroot(8)
    % make clean; make package PREFIX=/var/tmp/`make -V PORTNAME`
    % make stage && make check-plist && make stage-qa && make package
    -DPAGER=\"${LOCALBASE}/bin/less\"

    第 16 章 保持更新

    FreeBSD Ports 不断变化。以下是一些保持更新的方式。

    16.1. FreshPorts

    通过订阅 是了解已提交更新的最简单方式之一。可以监控多个 Port。强烈建议维护者订阅,因为他们不仅会收到自己更改的通知,还会收到其他 FreeBSD 提交者的更改通知。(这些通常是保持更新 Ports 框架所必需的——尽管提前通知这些更改的提交者是很礼貌的做法,但有时会被忽视或不切实际。此外,在某些情况下,所做的更改是非常小的。我们期望大家在这些情况下使用最佳判断。)

    要使用 FreshPorts,需要一个账户。使用 @FreeBSD.org 注册邮箱的人会在网页的右侧看到选择加入的链接。如果已有 FreshPorts 账户但没有使用 @FreeBSD.org 邮箱地址,可以将邮箱改为 @FreeBSD.org,然后订阅,再改回去。

    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 脚本提供了一些扩展功能和一些限制,这些都在

    10.4.Portlint

    在提交之前,请使用 检查该 Port。portlint 会告警许多常见的错误,包括功能性和风格上的问题。对于新 Port,portlint -A 是最全面的;对于现有 Port,portlint -C 足矣。

    由于 portlint 使用启发式方法来检测错误,它可能会产生误报。此外,有时标记为问题的内容由于 Port 框架的限制,无法以其他方式解决。如果有疑问,最好的做法是向 提问。

    FreshPorts 还具有一个健全性测试功能,会自动测试每次提交到 FreeBSD Ports 树中的文件。如果订阅了此服务,提交者将收到 FreshPorts 在对提交进行健全性测试时发现的任何错误通知。

    16.2. 源代码库的 Web 界面

    可以通过 Web 界面浏览源代码库中的文件。影响整个 Port 系统的更改现在已记录在 CHANGES 文件中。影响单个 Port 的更改记录在 UPDATING 文件中。然而,解决任何问题的权威答案无疑是阅读 bsd.port.mk 和相关文件的源代码。

    16.3. FreeBSD Ports 邮件列表

    作为 Port 维护者,考虑订阅 FreeBSD ports 邮件列表。有关 Ports 工作方式的重要更改将在那里发布,并随后提交到 CHANGES。

    如果邮件列表的消息量太大,可以考虑关注 FreeBSD ports announce 邮件列表,该列表只包含公告。

    16.4. FreeBSD Port 构建集群

    FreeBSD 的一项不太为人所知的强大功能是,有一个集群的机器专门用于持续构建 Ports,涵盖每个主要的操作系统版本以及每个 Tier-1 架构。

    除非特别标记为 IGNORE,否则会构建每个独立的 Port。标记为 BROKEN 的 Port 仍然会尝试构建,以查看底层问题是否已经解决。(这是通过将 TRYBROKEN 传递给 Port 的 Makefile 来完成的。)

    16.5. Portscout: FreeBSD Ports Distfile 扫描器

    构建集群专门用于构建每个 Port 的最新版本,使用已经抓取的 distfile。然而,随着互联网的不断变化,distfile 很快就会消失。Portscout 是 FreeBSD Ports 的 distfile 扫描器,它尝试查询每个 Port 的每个下载站点,查看每个 distfile 是否仍然可用。Portscout 可以生成 HTML 报告并向请求的人发送有关新可用 Port 的电子邮件。除非没有订阅,否则建议维护者定期检查更改,可以手动检查或使用 RSS 提要。

    Portscout 的首页显示了 Port 维护者的电子邮件地址、维护者负责的 Ports 数量、其中有新 distfile 的 Port 数量,以及这些 Port 中过期的百分比。搜索功能允许按电子邮件地址搜索特定的维护者,并选择仅显示过期的 Ports。

    点击维护者的电子邮件地址后,将显示其所有 Port 的列表,包括 Port 分类、当前版本号、是否有新版本、Port 上次更新的时间以及最后检查的时间。此页面上的搜索功能允许用户搜索特定的 Port。

    点击列表中的 Port 名称后,会显示该 Port 在 FreshPorts 上的信息。

    附加文档可在 Portscout 仓库 中找到。

    FreshPorts
    中进行了说明。

    注意

    推荐使用 pkg-pre-deinstall(或 pkg-pre-deinstall.lua)和 pkg-post-deinstall(或 pkg-post-deinstall.lua),而不是使用 pkg-deinstall。

    这些脚本会自动添加到打包列表中。

    重要

    这些脚本用于简化包卸载后的清理工作。不能 滥用它们来启动服务、停止服务或运行任何其他会修改当前运行系统的命令。

    pkg-lua-script(5)
    portlint
    FreeBSD ports 邮件列表

    12.3.向社区通报情况

    12.3.1. VuXML 数据库

    在发现安全漏洞后,尽早通知 Port 用户社区是非常重要且紧急的步骤。这样的通知有两个目的。首先,如果风险真的很严重,最好立即采取临时解决方案。例如,停止受影响的网络服务,或者在漏洞修复前完全卸载该 Port。其次,很多用户通常只偶尔升级已安装的包。他们会从通知中得知,一旦有修复版本发布,就必须立即更新包。

    鉴于 Ports 树中 Port 数量庞大,不能在每个事件发生时都发布安全公告,这样会造成信息泛滥,导致观众对真正严重的事件失去关注。因此,发现的 Ports 中的安全漏洞会被记录在 FreeBSD VuXML 数据库 中。安全官员团队成员也会监视它,处理需要他们干预的问题。

    提交者可以自己更新 VuXML 数据库,协助安全官员团队,并更快速地向社区提供关键信息。对于那些不是提交者,或者发现了特别严重的漏洞的人,应当毫不犹豫地直接联系安全官员团队,联系方式可以在 FreeBSD 安全信息 页面上找到。

    VuXML 数据库是一个 XML 文档。其源文件 vuln.xml 保存在 Port security/vuxml 中。因此,该文件的完整路径将是 PORTSDIR/security/vuxml/vuln.xml。每当发现一个新的 Port 安全漏洞时,请将该条目添加到该文件中。在熟悉 VuXML 之前,最好先找到一个现有条目作为模板,复制并使用它。

    12.3.2. VuXML 简介

    完整的 XML 格式非常复杂,超出了本书的范围。然而,要基本了解 VuXML 条目的结构,只需要了解标签的概念。XML 标签名称用尖括号括起来。每个打开的 <tag> 必须有一个匹配的关闭标签 </tag>。标签可以嵌套。如果是嵌套的,必须先关闭内部标签,再关闭外部标签。标签有层次结构,即更复杂的嵌套规则。这与 HTML 类似。主要的区别在于,XML 是 eXtensible(可扩展的),即基于定义自定义标签。由于 XML 的固有结构,它将原本无序的数据整理成形。VuXML 特别为标记安全漏洞描述而设计。

    现在考量一个实际的 VuXML 条目:

    标签名称应该是不言自明的,因此我们只详细说明需要填写的字段:

    • ① 这是 VuXML 条目的顶层标签。它有一个必需的属性 vid,指定该条目的通用唯一标识符(UUID,用引号括起来)。每个新的 VuXML 条目都应生成一个 UUID(并且不要忘记用其替换模板 UUID,除非是从头编写条目)。使用 来生成 VuXML UUID。

    • ② 这是所发现问题的一行描述。

    • ③ 这里列出受影响的包名称。可以列出多个名称,因为多个包可能基于同一个主 Port 或软件产品。这可能包括稳定版和开发版、本地化版本,以及具有不同重要构建配置选项的从属 Port。

    • ④ 这里以一个或多个范围形式指定受影响包的版本,使用 <lt>

    12.3.3. 测试对 VuXML 数据库的更改

    本例描述了一个关于 dropbear 包的新漏洞条目,该漏洞在版本 dropbear-2013.59 中已修复。

    前提是安装最新版的 Port。

    首先检查是否已有该漏洞的条目。如果已有,该条目应能匹配该包的前一个版本 2013.58:

    如果未找到匹配条目,则为此漏洞添加一个新条目:

    如果该漏洞具有 标识符,可以使用以下命令代替:

    其中 CVE-YYYYY-XXXX 是有效的 CVE 标识符。

    如果该漏洞是 FreeBSD 安全公告,可使用以下命令代替:

    其中 FreeBSD-SA-YY-XXXXXX.asc 是已发布的 。

    验证语法和格式是否正确:

    上述命令会生成 vuln-flat.xml 文件,也可以使用以下命令生成:

    注意

    至少需要安装以下其中一个包:、。

    验证条目中的 <affected> 区块是否能匹配正确的包版本:

    确保该条目不会错误地匹配不受影响的版本。

    现在检查是否匹配正确的版本范围:

    能匹配旧版本,不会匹配新版本则。

    12.3.4. 交叉检查衍生项目

    如果上游项目存在已知漏洞,应检查 Ports 树中该项目的衍生版本或分支是否也受影响。例如,如果在 中发现漏洞,应评估类似的衍生项目,如 、 或其他类似项目是否也存在相同漏洞。请在 VuXML 条目中列出所有受影响的衍生项目,以确保这些 Ports 的用户也能获知相关信息。

    8.5.自动创建软件包列表

    首先,确保 Port 几近完工,仅缺失 pkg-plist。运行 make makeplist 会显示 pkg-plist 的示例。makeplist 的输出必须仔细检查其正确性,因为它会自动猜测一些内容,可能会出错。

    用户配置文件应该安装为 filename.sample,如 Configuration Files 中所述。info/dir 不能列出,并且必须按照 info files 部分的说明添加适当的 install-info 行。Port 安装的任何库必须按 shared libraries 部分的说明列出。

    8.5.1. 使用正则表达式扩展 PLIST_SUB

    有时要替换的字符串需要非常具体,以避免不必要的替换。这是一个常见的问题,特别是对于较短的值。

    为了解决这个问题,可以为每个 PLACEHOLDER=value 设置 PLACEHOLDER_regex=regex,其中 regex 部分会更精确地匹配 value。

    示例 1. 使用正则表达式的 PLIST_SUB

    Perl Port 可以在特定的树中安装依赖于架构的文件。在 FreeBSD 上,为了简化 Port 移植,这个树叫做 mach。例如,一个安装文件路径中包含 mach 的 Port,可能会错误地替换路径字符串中的一部分。考虑以下 Makefile:

    该 Port 安装的文件如下:

    运行 make makeplist 错误地生成:

    将 Makefile 中的 PLIST_SUB 行更改为:

    现在 make makeplist 正确生成:

    5.6.一句话说明(COMMENT)

    评论是显示在 pkg info 中的 Port 的一行描述。在编写评论时,请遵循以下规则:

    1. COMMENT 字符串不应超过 70 个字符。

    2. 不要包含软件的包名或版本号。

    3. 评论应以大写字母开头,且末尾不加句号。

    4. 不要以不定冠词(如 A 或 An)开头。

    5. 对于名称,如 Apache、JavaScript 或 Perl,要使用大写字母。

    6. 列表中的单词应使用串联逗号:例如 green, red, and blue。

    7. 检查拼写错误。

    示例:

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

    8.2.空目录

    8.2.1. 清理空目录

    在卸载 Port 时,必须删除它所创建的空目录。大多数目录会被 pkg(8) 自动删除,但对于在 ${PREFIX} 之外创建的目录或本身为空的目录,则需要额外处理。通常通过为这些目录添加 @dir 行来实现。删除时必须先删除子目录,再删除父目录。

    [...]
    @dir /var/games/oneko/saved-games
    @dir /var/games/oneko

    8.2.2. 创建空目录

    Port 安装过程中创建的空目录需要特别注意。在生成软件包时,这些目录必须存在。如果 Port 的代码没有自动创建这些目录,就需要在 Makefile 中显式创建:

    像对待其他条目一样将该目录添加进 pkg-plist:

    7.2.使用 FLAVORS

    要声明一个具有多个 flavor 的 Port,需要在其 Makefile 中添加 FLAVORS。FLAVORS 中的第一个 flavor 是默认的 flavor。

    技巧

    同时定义 FLAVOR 为 FLAVOR?= ${FLAVORS:[1]} 有助于简化 Makefile 的逻辑。

    重要

    为了将 flavor 与总是大写字母的选项区别开来,flavor 名称只能包含小写字母、数字和下划线 _

    5.11.从属 port 和 MASTERDIR

    如果 port 需要通过使变量(例如分辨率或纸张大小)取不同的值来构建略有不同版本的包,则为每个包创建一个子目录,以便用户更容易理解该怎么做,但尽量使尽可能多的文件在 ports 之间共享。通常,通过巧妙使用变量,除了一个目录外,其他目录只需要非常简短的 Makefile。在唯一的 Makefile 中,使用 MASTERDIR 来指定其他文件所在的目录。同时,使用变量作为 的一部分,以便使包具有不同的名称。

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

    还包含所有常规的补丁、包文件等。在该目录中运行 make,它将采用分辨率的默认值(300)并正常构建 port。

    至于其他分辨率,以下是整个 print/pkfonts360/Makefile:

    (print/pkfonts118/Makefile、print/pkfonts600/Makefile,以及所有其他类似的文件)。MASTERDIR 定义告诉 bsd.port.mk,像 FILESDIR

    5.15.特殊的工作目录

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

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

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

    5.15.1. WRKSRC

    10.3.Portclippy / Portfmt

    这些工具来自 。

    Portclippy 是一款代码检查工具,用于检查 Makefile 中的变量是否按照 正确排列。

    Portfmt 是一款自动格式化 Makefile 的工具。

    ports-mgmt/portfmt
    Port Makefiles 中变量的顺序

    10.1.运行 make describe

    FreeBSD 的一些 Port 维护工具,例如 portupgrade(1),依赖于一个名为 /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。)

    如果 make describe 输出一个字符串而不是错误信息,通常意味着一切正常。具体字符串的含义可以参考 bsd.port.mk。

    还要注意,运行较新的 portlint(如下一节所述)将自动触发 make describe 的执行。

    5.12.man 手册

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

    ,
    <le>
    ,
    <gt>
    ,
    <ge>
    , 和
    <range>
    元素的组合。请检查给出的版本范围是否没有重叠。在范围说明中,
    *
    (星号)表示最小的版本号。特别地,
    2.*
    小于
    2.a
    。因此可以使用星号来匹配所有可能的
    alpha
    、
    beta
    和
    RC
    版本。例如,
    2.3.*
    会选择性地匹配每个
    2.x
    版本,而
    2.03.0
    不会,因为它跳过了
    2.r3
    并匹配了
    3.b
    。上述示例表示受影响的版本包括
    1.6
    到但不包括
    1.9
    ,
    2.x
    版本中小于
    2.4_1
    的部分,以及版本
    3.0b1
    。
  • ⑤ 在 <package> 区块中可以列出若干相关包组(本质上是 Ports)。当多个软件产品(比如 FooBar、FreeBar 和 OpenBar)源自同一代码库并共享其漏洞时可使用此方式。请注意这与在一个 <name> 区块中列出多个名称的不同。

  • ⑥ 版本范围必须考虑 PORTEPOCH 和 PORTREVISION(如适用)。请记住,根据排序规则,带有非零 PORTEPOCH 的版本大于任何没有 PORTEPOCH 的版本,例如,3.0,1 大于 3.1,甚至大于 8.9。

  • ⑦ 这是问题的摘要说明。本字段使用 XHTML。至少要有包裹内容的 <description> 和 </description> 标签。可以使用更复杂的标记,但仅限于准确性和清晰性的目的:请勿添加视觉效果装饰。

  • ⑧ 本节包含相关文档的引用。建议尽可能多地提供适用的引用。

  • ⑨ 这是一个 FreeBSD 安全公告。

  • ⑩ 这是一个 FreeBSD 问题报告。

  • ⑪ 这是一个 MITRE CVE 标识符。

  • ⑫ 这是一个 US-CERT 漏洞说明。

  • ⑬ 这是一个 US-CERT 技术网络安全警报。

  • ⑭ 这是邮件列表中存档帖子的 URL。可选属性 msgid 可用于指定该帖子的消息 ID。

  • ⑮ 这是一个通用 URL,仅在其他引用类别都不适用时才使用。

  • ⑯ 这是问题公开披露的日期(YYYY-MM-DD)。

  • ⑰ 这是该条目添加的日期(YYYY-MM-DD)。

  • ⑱ 这是该条目中任意信息最后一次修改的日期(YYYY-MM-DD)。新条目不得包含该字段。仅在编辑现有条目时添加。

  • uuidgen(1)
    security/vuxml
    MITRE CVE
    FreeBSD 安全公告
    textproc/libxml2
    textproc/jade
    www/firefox
    www/librewolf
    www/waterfox
    /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
    COMMENT=	Cat chasing a mouse all over the screen
    post-install:
    	${MKDIR} ${STAGEDIR}${PREFIX}/some/directory
    @dir some/directory
    和
    SCRIPTDIR
    这样的常规子目录位于
    pkfonts300
    下。
    RESOLUTION=360
    这一行将覆盖
    pkfonts300/Makefile
    中的
    RESOLUTION=300
    ,并且该 port 将以分辨率设置为 360 来构建。
    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
    RESOLUTION=	360
    MASTERDIR=	${.CURDIR}/../pkfonts300
    
    .include	"${MASTERDIR}/Makefile"
    PKGNAMESUFFIX
    print/pkfonts300
    。

    示例 1:基本的 Flavors 用法

    如果某个 Port 有一个“精简版”从属 Port,那么可以移除该从属 Port,并将该 Port 转换为 flavors,如下所示:

    示例 2:另一种基本的 Flavors 用法

    如果某个 Port 有一个 -nox11 从属 Port,那么可以移除该从属 Port,并将该 Port 转换为 flavors,如下所示:

    示例 3:更复杂的 Flavors 用法

    以下是经过略微修改的 devel/libpeas 的一段内容节选,这是一个使用了 Python flavors 的 Port。由于默认的 Python 2 和 3 版本是 2.7 和 3.6,它会自动获得 FLAVORS=py27 py36

    这个 Port 没有使用 USE_PYTHON=distutils,但仍然需要 Python flavors。为了防止 FLAVOR 为空(这会导致 make(1) 出错),应在字符串比较中使用 ${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 版本,因此要使用 辅助机制 为这三个版本设置 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 可以轻松实现:

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

    或者可能是:

    5.15.2. WRKSRC_SUBDIR

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

    5.15.3. NO_WRKSUBDIR

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

    注意

    由于 WRKDIR 是构建过程中唯一应当可写的目录,并且用于存储记录构建状态的许多文件,因此 Port 的提取将被强制进入一个子目录。

    PORTNAME=	foo
    DISTVERSION=	1.0
    <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="[email protected]">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>
    % pkg audit dropbear-2013.58
    % cd ${PORTSDIR}/security/vuxml
    % make newentry
    % cd ${PORTSDIR}/security/vuxml
    % make newentry CVE_ID=CVE-YYYY-XXXXX
    % cd ${PORTSDIR}/security/vuxml
    % make newentry SA_ID=FreeBSD-SA-YY-XXXXXX.asc
    % make validate
    % make vuln-flat.xml
    % pkg audit -f ${PORTSDIR}/security/vuxml/vuln-flat.xml dropbear-2013.58
    % 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.
    PORTNAME=	Machine-Build
    DISTVERSION=	1
    CATEGORIES=	devel perl5
    MASTER_SITES=	CPAN
    PKGNAMEPREFIX=	p5-
    
    MAINTAINER=	[email protected]
    COMMENT=	Building machine
    WWW=		https://search.cpan.org/dist/Machine-Build
    
    USES=		perl5
    USE_PERL5=	configure
    
    PLIST_SUB=	PERL_ARCH=mach
    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
    PLIST_SUB=	PERL_ARCH=mach \
    		PERL_ARCH_regex=\bmach\b
    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
    FLAVORS=	default lite
    lite_PKGNAMESUFFIX=	-lite
    [...]
    .if ${FLAVOR:U} != lite
    [启用非 lite 功能]
    .endif
    FLAVORS=	x11 nox11
    FLAVOR?=	${FLAVORS:[1]}
    nox11_PKGNAMESUFFIX=	-nox11
    [...]
    .if ${FLAVOR} == x11
    [启用 x11 功能]
    .endif
    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
    FLAVORS=	normal lite
    lite_PKGNAMESUFFIX=	-lite
    WRKSRC=	${WRKDIR}/foo
    WRKSRC=	${WRKDIR}/${PORTNAME}
    WRKSRC_SUBDIR=	src
    NO_WRKSUBDIR=	yes

    8.3.配置文件

    如果 Port 将配置文件安装到 PREFIX/etc(或其他目录),不要在 pkg-plist 中列出这些文件。这样做会导致 pkg delete 删除用户精心编辑过的文件,而重新安装时也会将其覆盖。

    正确做法是安装带有 filename.sample 扩展名的示例文件。@sample 宏可以自动完成这一过程,详见 扩展关键字处理的文件列表。对于每个示例文件,在 pkg-plist 中添加如下行:

    @sample etc/orbit.conf.sample

    如果确有充分理由不默认安装一个可用的配置文件,仅在 pkg-plist 中列出示例文件名,不添加 @sample 前缀,并添加 消息提示,告知用户必须手动复制并编辑该文件以使软件正常工作。

    技巧

    如果 Port 的配置文件安装在 ${PREFIX}/etc 的某个子目录中,应使用 ETCDIR。该变量默认值为 ${PREFIX}/etc/${PORTNAME},但可以在 Port 的 Makefile 中重定义,以遵循 Port 所采用的目录规范。在 pkg-plist 中用 %%ETCDIR%% 来代替路径。

    注意

    示例配置文件应始终使用 .sample 后缀。如果出于历史原因无法使用标准后缀,或示例文件位于其他目录中,可以使用如下格式:

    或

    格式为 @sample sample-file actual-config-file。

    5.16.解决冲突

    有三个不同的变量用于注册包和 Port 之间的冲突:CONFLICTS、CONFLICTS_INSTALL 和 CONFLICTS_BUILD。

    注意

    冲突变量会自动设置 IGNORE 变量,详细说明请参见 。

    在删除多个冲突的 Port 之一时,建议在其他 Port 中保留 CONFLICTS 变量几个月,以便适应那些偶尔更新的用户。

    CONFLICTS_INSTALL 如果包无法与其他包共存(由于文件冲突、运行时不兼容等)。CONFLICTS_INSTALL

    @sample etc/orbit.conf-dist etc/orbit.conf
    @sample %%EXAMPLESDIR%%/orbit.conf etc/orbit.conf
    检查在构建阶段后,安装阶段前进行。

    CONFLICTS_BUILD 如果 Port 无法在安装了其他特定 Port 的情况下构建。构建冲突不会被记录到结果包中。

    CONFLICTS 如果在某个 Port 已安装的情况下,该 Port 无法构建,且结果包无法与其他包共存。CONFLICTS 检查在构建阶段前和安装阶段前进行。

    CONFLICTS* 变量值中的每个由空格分隔的项都会与包进行匹配,除了正在构建的包,使用的是 shell 通配符规则。这允许列出 Port 的所有变体作为冲突项,而不需要排除正在构建的变体。例如,如果安装了 git-lite,CONFLICTS_INSTALL=git git-lite 将允许执行:

    但是以下命令会报告冲突,因为安装的包基础名称是 git-lite,而 git 将被构建,但无法与 git-lite 一起安装:

    如果没有这个功能,Makefile 将需要为每个变体添加一个 _flavor__CONFLICTS_INSTALL,列出每个其他变体。

    这些变量最常见的内容是另一个 Port 的包基础名。包基础名是没有附加版本的包名,可以通过运行 make -V PKGBASE 获取。

    示例 46. CONFLICTS* 的基本用法

    dns/bind99 不能与 dns/bind910 一起安装,因为它们安装了相同的文件。首先获取要使用的包基础名:

    然后在 dns/bind99 的 Makefile 中添加:

    并在 dns/bind910 的 Makefile 中添加:

    有时,只有另一个 Port 的某些版本是不兼容的。当发生这种情况时,请使用完整的包名,包括版本。如果有必要,可以使用 shell 通配符,如 * 和 ?,以便匹配所有必要的版本。

    示例 47. 使用通配符的 CONFLICTS*

    从 2.0 版本到 2.4.1_2 版本,deskutils/gnotime 曾经安装一个捆绑的 databases/qof 版本。

    为了反映这一点,databases/qof 的 Makefile 包含:

    第一个条目匹配版本 2.0 到 2.3,第二个条目匹配所有 2.4.0 版本,第三个条目匹配精确的 2.4.1 版本,最后一个条目匹配 2.4.1 版本的第一个和第二个修订版。

    deskutils/gnotime 没有任何冲突行,因为它的当前版本与其他任何版本不冲突。

    DISABLE_CONFLICTS 变量可在执行不受冲突影响的目标时暂时设置。此变量不应在 Port 的 Makefile 中设置。

    使用 BROKEN 标记 Port 为不可安装
    % make -C devel/git FLAVOR=lite all deinstall install
    % make -C devel/git FLAVOR=default all deinstall install
    % make -C dns/bind99 -V PKGBASE
    bind99
    % make -C dns/bind910 -V PKGBASE
    bind910
    CONFLICTS_INSTALL=	bind910
    CONFLICTS_INSTALL=	bind99
    CONFLICTS_INSTALL=	gnotime-2.[0-3]* \
    			gnotime-2.4.0* gnotime-2.4.1 \
    			gnotime-2.4.1_[12]
    % make -DDISABLE_CONFLICTS patch

    5.5.维护者(MAINTAINER)

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

    只允许使用没有注释部分的单一地址作为 MAINTAINER 值。使用的格式为 用户名@主机名.域名。请不要在此条目中包含任何描述性文本(如真实姓名)。这会让 Ports 基础设施和大多数使用它的工具感到困惑。

    维护者负责保持 Port 的更新,并确保其正常工作。如需详细了解 Port 维护者的责任,请参阅 。

    注意

    维护者自愿保持 Port 的正常运行。维护者对其 Port 负主要责任,但并不拥有独占权。Ports 是为了社区的利益而存在的,实际上属于社区。这意味着除了维护者之外,其他人也可以对 Port 进行修改。对于 Ports 中的重大更改,可能需要更改许多 Port。FreeBSD Ports 管理团队或其他团队的成员可能会修改 Port,以解决依赖问题或其他问题,例如更新共享库的版本。

    如果某些类型的修复有“普遍批准”,例如从 Ports 管理团队 <> 获得批准,那么任何提交者都可以修复这些类别的问题,而无需维护者的批准。这些修复不需要维护者的批准。

    大多数 Port 都会获得“普遍批准”,适用于基础设施更改或简单且 经过测试 的构建和运行时修复。当前列表可在 中查看。

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

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

    Ports 管理团队 [email protected] 保留因任何原因撤销或覆盖任何人维护权限的权利,安全官团队 [email protected] 保留因安全原因撤销或覆盖维护权限的权利。

    Port 维护者的挑战
    [email protected]
    提交者指南的 Ports 部分

    10.7.Poudriere

    对于 Port 贡献者来说,poudriere 是最重要且最有用的测试和构建工具之一。它的主要功能包括:

    • 批量构建整个 Ports 树、Ports 树的特定子集或单个 Port 及其依赖项

    • 自动打包构建结果

    • 每个 Port 的构建日志文件生成

    • 提供签名的 仓库

    • 在向 FreeBSD bug 跟踪器提交补丁或向 Ports 树提交时测试 Port 构建

    • 测试不同选项下 Port 构建的成功与否

    由于 poudriere 在干净的 环境中执行构建并使用 功能,因此相比传统的主机系统测试,它具有以下几个优势:

    • 不污染主机环境:没有残留文件,没有意外删除,没有现有配置文件的更改。

    • 验证 pkg-plist 是否有缺失或多余的条目

    • Ports 提交者有时会要求在提交补丁时附上 poudriere 日志,以评估补丁是否准备好集成到 Ports 树中

    poudriere 的设置和使用也非常简单,它没有依赖关系,并且可以在任何受支持的 FreeBSD 版本上运行。本节将展示如何作为 Ports 贡献者的一部分安装、配置和使用 poudriere。

    本节中的示例显示的是 FreeBSD 中的默认文件布局,请根据需要替换任何本地更改。Ports 树(由 ${PORTSDIR} 表示)位于 /usr/ports。默认情况下,${LOCALBASE} 和 ${PREFIX} 都是 /usr/local。

    10.7.1. 安装 poudriere

    可以在 Ports 树中的 中找到 poudriere。可以通过 或从 Ports 安装:

    或者

    还有一个开发中的版本,最终将成为下个发布版。可在 中找到它。这个开发版本用于官方的 FreeBSD 包构建,因此经过了充分的测试,并且通常包含更新的有趣功能。Ports 提交者会希望使用开发版本,因为它是用于生产环境的,并且拥有所有新的功能,能够确保一切完全正确。贡献者不一定需要这些功能,因为最重要的修复会回溯到发布版本。使用开发版本构建官方包的主要原因是它更快,在高端 32 CPU 服务器和 128GB 内存的情况下,完整构建时间将从 18 小时缩短到 17 小时。而这些优化在桌面机器上构建 Ports 时影响不大。

    10.7.2. 设置 poudriere

    该程序安装了默认的配置文件 /usr/local/etc/poudriere.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:

    从 poudriere.conf 中指定的 FTP 服务器获取 13.1-RELEASE 版本的 amd64,创建 ZFS 文件系统 tank/poudriere/jails/131Ramd64,将其挂载到 /poudriere/jails/131Ramd64,并将 13.1-RELEASE 的 tarballs 提取到该文件系统中。

    创建 tank/poudriere/jails/12i386,将其挂载到 /poudriere/jails/12i386,然后从 poudriere.conf 中指定的 GIT_HOST 或默认的 git.freebsd.org 获取 FreeBSD-12-STABLE 的 Git 分支的最新代码,检出到 /poudriere/jails/12i386/usr/src,然后完成 buildworld 并将其安装到 /poudriere/jails/12i386 中。

    注意

    尽管可以在较旧的版本上构建较新的 FreeBSD 版本,但大多数情况下它无法运行。例如,如果需要 stable/13 jail,则主机也必须运行 stable/13,仅运行 13.1-RELEASE 不够。

    注意

    要为 14.0-CURRENT 创建 poudriere jail:

    要运行 14.0-CURRENT 的 poudriere jail,主机必须运行 14.0-CURRENT。通常情况下,较新的内核可以构建并运行较旧的 jails。例如,14.0-CURRENT 内核可以构建并运行 12.4-STABLE,前提是已编译 COMPAT_FREEBSD12 内核选项(默认启用,14.0-CURRENT 的 GENERIC 内核配置中已启用)。

    可以使用 poudriere jail -l 显示当前 poudriere 知道的 jail 列表:

    10.7.4. 保持 poudriere Jail 更新

    管理更新非常简单。使用以下命令:

    该命令会将指定的 jail 更新到最新版本。对于 FreeBSD 版本更新,可以使用 更新到最新的补丁级别。对于从源代码构建的 FreeBSD 版本,可以更新到分支中的最新 git 修订版。

    注意

    对于采用 git+* 方法的 jail,添加 -J NumberOfParallelBuildJobs 有助于通过增加并行编译作业数来加速构建。例如,如果构建机器有 6 个 CPU,使用:

    10.7.5. 为 poudriere 设置 Ports Trees

    在 poudriere 中使用 Ports Trees 有多种方法。最直接的方法是让 poudriere 为自己创建一个默认的 ports tree,使用 :

    这些命令会创建 tank/poudriere/ports/default,将其挂载到 /poudriere/ports/default,并使用 Git 填充它。之后,它会被包括在已知的 ports trees 列表中:

    注意

    请注意,“default”ports tree 是特殊的。除非明确指定,否则后续解释的所有构建命令将隐式使用此 ports tree。如果要使用其他树,可以在命令中添加 -p treename。

    处理本地修改的最佳方法是使用 。与创建 jail 类似,可以使用不同的方法来创建 ports tree。为了测试本地修改和开发 Port,最好通过 git 检出树(如上所述)来添加额外的 ports tree。

    10.7.6. 使用手动管理的 Ports Trees 与 poudriere

    根据工作流的不同,使用手动维护的 ports trees 可能非常有用。例如,如果有一个位于 /work/ports 的本地 ports tree,可以将 poudriere 指向该位置:

    这将会在已知树的表格中列出:

    注意

    METHOD 列中的破折号或 null 表示 poudriere 永远不会更新或更改该 ports tree。用户完全负责维护此树,包括所有用于测试新 Port 和提交补丁的本地修改。

    10.7.7. 保持 poudriere Ports 更新

    更新 ports 与上述 jail 更新一样简单:

    该命令会将指定的 PORTSTREE(由 poudriere -l 输出的树)更新到官方服务器上最新的修订版。

    注意

    没有指定更新方式的 ports,参见 ,无法像这样更新,必须由维护者手动更新。

    10.7.8. 测试 Ports

    在设置好 jails 和 ports trees 后,可以测试贡献者对 ports tree 的修改。

    例如,本地修改位于 /work/ports/www/firefox 的 Port,可以在之前创建的 13.1-RELEASE jail 中进行测试:

    这将构建 Firefox 的所有依赖项。如果某个依赖项已构建并且仍是最新的,则会安装预构建的包。如果依赖项没有最新的包,poudriere 将在 jail 中使用默认选项构建该依赖项。然后会构建 Firefox 本身。

    每个 Port 的完整构建过程会记录在 /poudriere/data/logs/bulk/131Ri386-development/build-time/logs 中。

    目录名 131Ri386-development 是根据 -j 和 -p 参数生成的。为了方便起见,还维护了一个符号链接 /poudriere/data/logs/bulk/131Ri386-development/latest,该链接指向最新的 build-time 目录。该目录中还有一个 index.html,可以通过网页浏览器观察构建过程。

    默认情况下,poudriere 会清理 jails 并将日志文件保留在上述目录中。为了便于调查,可以通过在 testport 命令中添加 -i 来保持 jail 在构建后继续运行:

    构建完成后,无论是否成功,都会提供一个 shell 进入 jail。可以使用该 shell 进一步调查。poudriere 可以通过 -I 选项在构建完成后保持 jail 运行。构建完成后,poudriere 会显示退出 jail 的命令。此时可以使用 进入 jail:

    FreeBSD ports 构建基础设施的一个重要组成部分是能够根据个人喜好调整 Port 的选项。也可以使用 poudriere 测试这些选项。添加 -c 选项:

    这会在构建 Port 之前显示 Port 配置对话框。-o 后面的 Port 将使用指定的选项,所有依赖项将使用默认选项。可以使用集合测试带有非默认选项的依赖 Port,参见 。

    技巧

    当在构建过程中根据所选选项修改 pkg-plist 时,建议分别进行一个测试运行,选中所有选项 和 不选任何选项。

    10.7.9. 使用 Sets

    对于所有涉及构建的操作,可以使用 -z <setname> 指定一个所谓的 set。set 表示一个完全独立的构建。例如,这允许在依赖 Port 使用非标准选项时,使用 testport。

    为了使用 sets,poudriere 需要一个类似于 PORT_DBDIR 的现有目录结构,默认情况下为 /var/db/ports,该目录位于其配置目录中。然后,使用 将该目录挂载到构建 jails 中的 Port 及其依赖项的位置。通常,可以通过递归复制现有的 PORT_DBDIR 到 /usr/local/etc/poudriere.d/jailname-portname-setname-options 来获得合适的起始点。详情请见 。例如,要在名为 devset 的特定 set 中测试 ,只需在 testport 命令中添加 -z devset 参数:

    poudriere 将按以下顺序查找这些目录的存在:

    • /usr/local/etc/poudriere.d/131Ramd64-development-devset-options

    • /usr/local/etc/poudriere.d/131Ramd64-devset-options

    • /usr/local/etc/poudriere.d/131Ramd64-development-options

    • /usr/local/etc/poudriere.d/devset-options

    从这个列表中,poudriere 会 挂载 第一个存在 的目录树到构建 jail 中的 /var/db/ports 目录。因此,所有自定义选项将用于此运行中的所有 Port。

    提供 set 的目录结构后,可以更改特定 Port 的选项。例如:

    这将显示 的配置对话框,并可以编辑选项。所选选项将保存到 devset set 中。

    注意

    poudriere 在选项配置方面非常灵活。poudriere 可以针对特定的 jails、ports trees 以及多个 Port 通过一个命令进行设置。有关详情,请参见 。

    10.7.10. 提供自定义 make.conf 文件

    与使用 sets 类似,poudriere 还可以使用提供的自定义 make.conf 文件。如果提供了该文件,则无需特殊的命令行参数。相反,poudriere 会根据命令行中的名称模式查找现有文件。例如:

    这将导致 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/131Ramd64-make.conf

    与 sets 不同,所有找到的文件将 按顺序 追加到构建 jails 中的一个 make.conf 文件中。因此,可以在 /usr/local/etc/poudriere.d/make.conf 中设置影响所有构建的通用 make 变量。特定 jails 或 sets 的特殊变量可以在专用的 make.conf 文件中进行设置,例如 /usr/local/etc/poudriere.d/131Ramd64-development-devset-make.conf。

    示例 1. 使用 make.conf 更改默认 Perl 版本

    例如,要使用名为 perl5-20 的 set 构建一个非默认的 Perl 版本 5.20,可以创建一个 perl5-20-make.conf 文件,并添加以下内容:

    注意使用 +=,这样即使该变量在默认 make.conf 中已设置,其内容也不会被覆盖。

    10.7.11. 清理不再需要的 distfiles

    poudriere 提供了一种内建机制,用于删除不再被任何 Port 使用的过时 distfiles。使用以下命令:

    该命令将扫描 poudriere.conf 中的 DISTFILES_CACHE 文件夹,并与通过 -p <portstree> 参数指定的 Ports 树进行对比,提示删除那些不再使用的 distfiles。如果希望跳过提示,直接无条件删除所有未使用的文件,可以添加 -y 参数:

    5.17.安装文件

    重要

    install 阶段对最终用户非常重要,因为它将文件添加到他们的系统中。Port Makefile 中的 *-install 目标运行的所有附加命令应回显到屏幕上。不要 使用 @ 或 .SILENT 来隐藏这些命令。

    5.17.1. INSTALL_* 宏

    使用 bsd.port.mk 提供的宏来确保在 Port 的 *-install 目标中正确设置文件的权限。通过相应的条目(例如 @(owner,group,)、@owner<span> </span>owner 和 @group<span> </span>group)在 pkg-plist 中直接设置所有权。这些操作符在被重写之前有效,或者直到 pkg-plist 的结尾为止,因此请记得在不再需要时重置它们。默认的所有权是 root:wheel。有关更多信息,请参见 。

    • INSTALL_PROGRAM 是安装二进制可执行文件的命令。

    • INSTALL_SCRIPT 是安装可执行脚本的命令。

    • INSTALL_LIB 是安装共享库(但不是静态库)的命令。

    这些变量会被设置为 命令,并根据不同情况使用相应的标志。

    重要

    不要使用 INSTALL_LIB 来安装静态库,因为去除符号表会使它们变得无用。请改用 INSTALL_DATA。

    5.17.2. 去除二进制文件和共享库的符号表

    已安装的二进制文件应该去除符号表。除非绝对必要,否则不要手动去除符号表。INSTALL_PROGRAM 宏会同时安装并去除二进制文件的符号表。INSTALL_LIB 宏对共享库也执行相同的操作。

    当必须去除符号表,但不希望使用 INSTALL_PROGRAM 或 INSTALL_LIB 宏时,可以使用 ${STRIP_CMD} 来去除程序或共享库的符号表。这通常是在 post-install 目标中执行。例如:

    当需要去除多个文件的符号表时:

    使用 命令可以确定文件是否已去除符号表。二进制文件会被 报告为 stripped 或 not stripped。此外, 将检测到已去除符号表的程序,并平稳退出。

    重要

    当定义了 WITH_DEBUG 时,elf 文件 不得 被去除符号表。

    框架提供的变量(如 STRIP_CMD、INSTALL_PROGRAM、INSTALL_LIB 等)和 会自动处理这个问题。

    如果某些软件在其 LDFLAGS 中添加了 -s,则在这种情况下,要么在设置了 WITH_DEBUG 时删除 -s,要么无条件地删除它,并在 post-install 中使用 STRIP_CMD

    5.17.3. 安装整个文件树

    有时,需要安装大量文件,并保持其层次结构不变。例如,将整个目录树从 WRKSRC 复制到 PREFIX 下的目标目录。请注意,PREFIX、EXAMPLESDIR、DATADIR 以及其他路径变量必须始终以 STAGEDIR 为前缀,以遵循 staging 机制(参见 )。

    针对这种情况,有两个宏。使用这些宏的优点是,它们能确保目标文件的正确所有权和权限。第一个宏,COPYTREE_BIN,会将所有安装的文件设置为可执行,因此适用于安装到 PREFIX/bin 目录下。第二个宏,COPYTREE_SHARE,不会为文件设置可执行权限,因此适合安装到 PREFIX/share 目标目录下。

    此示例会将供应商分发文件中的 examples 目录的内容安装到 Port 的适当示例位置。

    这个示例会将夏季月份的数据安装到 DATADIR 下的 summer 子目录。

    可以通过 COPYTREE_* 宏的第三个参数传递额外的 find 参数。例如,要安装来自第一个示例的所有文件,但排除 Makefile,可以使用以下命令:

    这些宏不会将已安装的文件自动添加到 pkg-plist 中。必须手动添加它们。对于可选文档(PORTDOCS,参见 )和示例(PORTEXAMPLES),必须在 pkg-plist 中的条目前加上 %%PORTDOCS%% 或 %%PORTEXAMPLES%% 前缀。

    5.17.4. 安装附加文档

    如果软件有除标准 man 页面和 info 页面之外的其他文档,并且对用户有用,可以将其安装到 DOCSDIR 下。这可以像前面的示例一样,在 post-install 目标中进行。

    为 Port 创建一个新目录。该目录名为 DOCSDIR,通常等于 PORTNAME。但是,如果用户可能希望同时安装不同版本的 Port,则可以使用整个 PKGNAME。

    由于只有在 pkg-plist 中列出的文件才会被安装,因此始终将文档安装到 STAGEDIR 是安全的(参见 )。因此,.if 块仅在安装的文件足够大,可能导致显著的 I/O 开销时才需要。

    另一方面,如果 Port 中有 DOCS 选项,则应在 post-install-DOCS-on 目标中安装文档。这些目标在 中有所描述。

    以下是一些有用的变量及其在 Makefile 中使用时的默认展开方式:

    • DATADIR 展开为 PREFIX/share/PORTNAME。

    • DATADIR_REL 展开为 share/PORTNAME。

    • DOCSDIR 展开为 PREFIX/share/doc/PORTNAME。

    注意

    DOCS 选项仅控制安装到 DOCSDIR 中的附加文档。它不适用于标准的 man 页面和 info 页面。安装到 EXAMPLESDIR 中的文件由 EXAMPLES 选项控制。

    这些变量会被导出到 PLIST_SUB 中。如果可能,它们的值会作为相对 PREFIX 的路径出现在那里。也就是说,share/doc/PORTNAME 将默认替换 %%DOCSDIR%%,以此类推。(有关 pkg-plist 替换的更多信息,请参见 。)

    所有有条件安装的文档文件和目录都会在 pkg-plist 中以 %%PORTDOCS%% 前缀列出,例如:

    作为列出文档文件的替代方法,Port 可以将变量 PORTDOCS 设置为文件名和 shell glob 模式的列表,以将其添加到最终的 packing list 中。这些文件名将相对于 DOCSDIR。因此,使用 PORTDOCS 并使用非默认位置存放文档的 Port 必须相应地设置 DOCSDIR。如果目录在 PORTDOCS 中列出或通过该变量的 glob 模式匹配,则将整个包含的文件和目录的子树注册到最终的 packing list 中。如果未设置 DOCS 选项,则列在 PORTDOCS 中的文件和目录将不会被安装或添加到 Port 的 packing list 中。安装文档到 PORTDOCS 如上所示,仍然由 Port 自身决定。典型的 PORTDOCS 使用示例如下:

    注意

    安装到 DATADIR 和 EXAMPLESDIR 下的文件对应的 PORTDOCS 变量分别是 PORTDATA 和 PORTEXAMPLES。

    pkg-message 中的内容会在安装时显示。有关使用 pkg-message 的详细信息,请参见 。pkg-message 不需要添加到 pkg-plist 中。

    5.17.5. PREFIX 下的子目录

    尽量让 Port 将文件放置在 PREFIX 的正确子目录下。某些 Port 会将所有内容都放在一个以 Port 名称命名的子目录中,这是不正确的。此外,许多 Port 会将除了二进制文件、头文件和手册页面之外的所有文件都放在 lib 的子目录下,但这与 BSD 的理念并不兼容。许多文件必须被移动到以下这些目录中的一个:etc(设置/配置文件)、libexec(内部启动的可执行文件)、sbin(供超级用户/管理员使用的可执行文件)、info(用于 info 浏览器的文档)或 share(与架构无关的文件)。有关详细信息,请参见 ;适用于 /usr 的规则也适用于 /usr/local。唯一的例外是处理 USENET "news" 的 Port,它们可以将文件放置在 PREFIX/news 目录中。

    /usr/local/etc/poudriere.d/development-options

  • /usr/local/etc/poudriere.d/131Ramd64-options

  • /usr/local/etc/poudriere.d/options

  • /usr/local/etc/poudriere.d/131Ramd64-development-make.conf

  • /usr/local/etc/poudriere.d/131Ramd64-devset-make.conf

  • /usr/local/etc/poudriere.d/131Ramd64-development-devset-make.conf

  • pkg(8)
    jail(8)
    zfs(8)
    ports-mgmt/poudriere
    pkg(8)
    ports-mgmt/poudriere-devel
    freebsd-update(8)
    Git
    Git
    使用手动管理的 Ports 与 poudriere
    www/firefox
    jexec(8)
    使用集合
    nullfs(5)
    poudriere(8)
    www/firefox
    nullfs(5)
    www/firefox
    poudriere(8)
    INSTALL_KLD 是安装内核可加载模块的命令。有些架构不喜欢将模块去除符号表,因此请使用此命令,而不是 INSTALL_PROGRAM。
  • INSTALL_DATA 是安装可共享数据(包括静态库)的命令。

  • INSTALL_MAN 是安装手册页和其他文档的命令(它不进行压缩)。

  • 。

    DOCSDIR_REL 展开为 share/doc/PORTNAME。

  • EXAMPLESDIR 展开为 PREFIX/share/examples/PORTNAME。

  • EXAMPLESDIR_REL 展开为 share/examples/PORTNAME。

  • Base Keywords
    install(1)
    file(1)
    file(1)
    strip(1)
    USES
    Staging
    安装附加文档
    Staging
    附加构建目标
    这里
    pkg-message 部分
    hier(7)
    # pkg install poudriere
    # make -C /usr/ports/ports-mgmt/poudriere install clean
    ZPOOL=zroot
    BASEFS=/usr/local/poudriere
    DISTFILES_CACHE=/usr/ports/distfiles
    RESOLV_CONF=/etc/resolv.conf
    # poudriere jail -c -j 131Ramd64 -v 13.1-RELEASE -a amd64
    # poudriere jail -c -j 12i386 -v stable/12 -a i386 -m git+https
    # poudriere jail -c -j 14amd64 -v main -a amd64 -m git+https
    # poudriere jail -l
    JAILNAME             VERSION              ARCH    METHOD
    131Ramd64            13.1-RELEASE         amd64   ftp
    12i386               12.4-STABLE          i386    git+https
    # poudriere jail -u -j JAILNAME
    # poudriere jail -u -J 6 -j JAILNAME
    # poudriere ports -c -m git+https -B main
    # poudriere ports -l
    PORTSTREE METHOD    TIMESTAMP           PATH
    default   git+https 2020-07-20 04:23:56 /poudriere/ports/default
    # poudriere ports -c -m null -M /work/ports -p development
    # poudriere ports -l
    PORTSTREE   METHOD    TIMESTAMP           PATH
    development null      2020-07-20 05:06:33 /work/ports
    # poudriere ports -u -p PORTSTREE
    # poudriere testport -j 131Ramd64 -p development -o www/firefox
    # poudriere testport -j 131Ramd64 -p development -i -o www/firefox
    # poudriere testport -j 131Ramd64 -p development -I -o www/firefox
    [...]
    ====>> Installing local Pkg repository to /usr/local/etc/pkg/repos
    ====>> Leaving jail 131Ramd64-development-n running, mounted at /poudriere/data/.m/131Ramd64-development/ref for interactive run testing
    ====>> To enter jail: jexec 131Ramd64-development-n env -i TERM=$TERM /usr/bin/login -fp root
    ====>> To stop jail: poudriere jail -k -j 131Ramd64 -p development
    # jexec 131Ramd64-development-n env -i TERM=$TERM /usr/bin/login -fp root
    # [在 jail 中做一些操作]
    # exit
    # poudriere jail -k -j 131Ramd64 -p development
    ====>> Umounting file systems
    # poudriere testport -j 131Ramd64 -c -o www/firefox
    # poudriere testport -j 131Ramd64 -p development -z devset -o www/firefox
    # poudriere options -c www/firefox -z devset
    # poudriere testport -j 131Ramd64 -p development -z devset -o www/firefox
    DEFAULT_VERSIONS+= perl=5.20
    # poudriere distclean -p portstree
    # poudriere distclean -p portstree -y
    post-install:
    	${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/xdl
    post-install:
    .for l in geometry media body track world
    	${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/lib${PORTNAME}-${l}.so.0
    .endfor
    post-install:
    	${MKDIR} ${STAGEDIR}${EXAMPLESDIR}
    	(cd ${WRKSRC}/examples && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR})
    post-install:
    	${MKDIR} ${STAGEDIR}${DATADIR}/summer
    	(cd ${WRKSRC}/temperatures && ${COPYTREE_SHARE} "June July August" ${STAGEDIR}${DATADIR}/summer)
    post-install:
    	${MKDIR} ${STAGEDIR}${EXAMPLESDIR}
    	(cd ${WRKSRC}/examples && \
    	${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR} "! -name Makefile")
    post-install:
    	${MKDIR} ${STAGEDIR}${DOCSDIR}
    	${INSTALL_DATA} ${WRKSRC}/docs/xvdocs.ps ${STAGEDIR}${DOCSDIR}
    %%PORTDOCS%%%%DOCSDIR%%/AUTHORS
    %%PORTDOCS%%%%DOCSDIR%%/CONTACT
    PORTDOCS=	README.* ChangeLog docs/*

    4.4.打补丁

    在准备 Port 时,可以使用 diff(1) 记录已添加或修改的文件,稍后将这些差异提供给 patch(1)。对典型文件进行此操作时,需要在进行任何更改之前保存原始文件的副本,并使用 .orig 后缀。

    在所有更改完成后,cd 回到 Port 目录。使用 make makepatch 生成更新的补丁文件,并将其存储在 files 目录中。

    技巧

    使用 BINARY_ALIAS 在构建过程中替代硬编码命令,避免修改构建文件。有关更多信息,请参阅 使用 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

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

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

    4.4.2. 手动生成补丁

    注意

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

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

    修改文件后,使用 记录原始文件和修改后文件之间的差异。-u 选项使 生成“统一”格式的差异,这是首选格式。

    当为新添加的文件生成补丁时,使用 -N 告诉 将不存在的原始文件视为空文件:

    使用 的递归选项 (-r) 生成补丁是可以的,但请检查生成的补丁,确保其中没有不必要的内容。特别是,当两个备份文件、使用 Imake 或 GNU configure 的 Makefile 之间的差异是没有必要的,并且应该删除。如果需要编辑 configure.in 并运行 autoconf 以重新生成 configure,不要对 configure 进行差异比较(它通常会变得很大,达到几千行!)。相反,定义 USES=autoreconf,并对 configure.in 进行差异比较。

    4.4.3. 简单自动替换

    可以通过 Port 的 Makefile 直接使用 的原地模式进行简单的替换。这对于需要使用变量值的更改非常有用:

    重要

    仅使用 来替换变量内容。必须使用补丁文件而不是 来替换静态内容。

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

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

    使用 DOS2UNIX_REGEX 可以跨子目录转换一组文件。其参数是一个与 兼容的正则表达式。有关格式的更多信息,请参阅 。此选项对于转换所有具有特定扩展名的文件非常有用。例如,转换所有源代码文件,而保持二进制文件不变:

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

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

    4.4.4. 条件性打补丁

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

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

    示例 2. 可选地应用补丁

    当一个 需要补丁时,可以使用 opt_EXTRA_PATCHES 和 opt_EXTRA_PATCHES_OFF 使补丁依赖于 opt 选项。有关更多信息,请参阅 。

    示例 3. 使用 EXTRA_PATCHES 与目录

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

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

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

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

    % cp file file.orig
    可以自动生成正确的名称。
  • 如果更改相关,补丁可以修改多个文件,并且补丁名称应适当命名。例如,patch-add-missing-stdlib.h。

  • 补丁名称只能使用字符 [-+._a-zA-Z0-9]。特别地,不要使用 :: 作为路径分隔符,应使用 _ 代替。

  • diff(1)
    diff(1)
    diff(1)
    diff(1)
    sed(1)
    sed(1)
    sed(1)
    find(1)
    re_format(7)
    选项
    通用变量替换
    % diff -u file.orig file > patch-pathname-file
    % diff -u -N newfile.orig newfile > patch-pathname-newfile
    post-patch:
    	@${REINPLACE_CMD} -e 's|/usr/local|${PREFIX}|g' ${WRKSRC}/Makefile
    USES=	dos2unix
    USES=	dos2unix
    DOS2UNIX_FILES=	util.c util.h
    USES=	dos2unix
    DOS2UNIX_REGEX=	.*\.([ch]|cpp)
    USES=	dos2unix
    DOS2UNIX_GLOB=	*.c *.cpp *.h
    USES=	dos2unix
    DOS2UNIX_WRKSRC=	${WRKDIR}
    .include <bsd.port.options.mk>
    
    # 在此之前打上 iconv const 限定符
    .if ${OPSYS} == FreeBSD && ${OSVERSION} < 1100069
    EXTRA_PATCHES=	${PATCHDIR}/extra-patch-fbsd10
    .endif
    
    .include <bsd.port.mk>
    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
    % 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
    OPTIONS_DEFINE=	FOO
    FOO_EXTRA_PATCHES=	${PATCHDIR}/foo-patches

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

    Makefile 的开头各段必须始终按固定顺序排列。这个标准让任何人都能轻松阅读任意一个 Port,而无需在混乱顺序中查找变量。

    注意

    此处所述的各段和变量在一个普通 Port 中是强制性的。在一个从属 Port 中,许多段和变量可以省略。

    重要

    每个以下代码块之间必须以一个空行分隔。

    在每个代码块中,仅设置该 Port 所必需的变量。请按照下列顺序定义这些变量。

    15.1. PORTNAME 段

    这是最重要的一段。它定义了 Port 的名称、版本、源代码分发文件的位置和分类。变量必须按如下顺序排列:

    • * []

    • * []

    重要

    PORTVERSION 和 DISTVERSION 只能择一而用。

    15.2. PATCHFILES 段

    此段为可选项。变量如下:

    15.3. MAINTAINER 段

    此段为强制项。变量如下:

    15.4. LICENSE 段

    这一段是可选的,但强烈建议使用。变量包括:

    • 或 LICENSE_GROUPS_NAME

    • 或 LICENSE_NAME_NAME

    如果存在多个许可证,需按许可证名称对各个 LICENSE_VAR_NAME 变量进行排序。

    15.5. 通用 BROKEN / IGNORE / DEPRECATED 信息段

    这一段是可选的。变量包括:

    重要

    BROKEN_* 和 IGNORE_* 可以是任意通用变量,例如 IGNORE_amd64、BROKEN_FreeBSD_10 等。除了依赖于 的变量以外,后者应放在 中。例如,IGNORE_WITH_PHP 仅在设置了 时才生效,BROKEN_SSL 仅在设置了 时才生效。

    如果 Port 仅在满足某些条件时才应标记为 BROKEN,并且这些条件只能在包含 bsd.port.options.mk 或 bsd.port.pre.mk 之后才能判断,那么应在 中设置这些变量。

    15.6. 依赖关系段

    这一段是可选的。变量包括:

    15.7. Flavors

    这一段是可选的。

    以定义 FLAVORS 开始此段,然后继续定义可用的 Flavors 助手。请参阅 了解更多信息。

    对于不能通过助手设置的变量,应使用 .if ${FLAVOR:U} == foo 结构,并将其置于各自所属的段落中。

    15.8. USES 和 USE_x

    以定义 USES 开始本段,然后继续定义可能的 USE_x。

    请将相关变量紧密排列。例如使用 时,务必将所有 GH_* 变量紧跟其后。

    15.9. 标准 bsd.port.mk 变量

    这一段用于定义可以在 bsd.port.mk 中使用、但不属于前述各段的变量。

    虽然变量的顺序并不重要,但请尽量将相似的变量归类在一起。例如,用户和用户组变量 USERS 和 GROUPS;配置变量 CONFIGURE_* 与 *_CONFIGURE;文件与目录列表变量如 PORTDOCS 与 PORTEXAMPLES。

    15.10. Options 与 Helpers

    如果该 Port 使用了 ,请先定义 OPTIONS_DEFINE 和 OPTIONS_DEFAULT,然后是其它 OPTIONS_* 变量,再之后是 *_DESC 描述,最后是选项 helpers。尽量将上述所有内容按字母顺序排列。

    示例 1:Options 变量排序示例

    FOO 和 BAR 选项没有标准描述,因此需要编写。其他选项已经在 Mk/bsd.options.desc.mk 中定义好了描述,无需重复编写。DOCS 和 EXAMPLES 使用目标 helpers 来安装它们的文件,在此处也给出以示完整,尽管它们应归属 ,因此其前可插入其他变量和目标。

    15.11. 其余变量

    然后定义所有未在上述各段中提及的其它变量。

    15.12. 目标

    在所有变量定义之后,可以定义可选的 目标。请确保 pre-<strong></strong>** 排在 post-** 之前,并按照不同阶段的执行顺序排列:

    • fetch

    • extract

    • patch

    • configure

    技巧

    使用选项 helpers 时,保持它们按字母顺序排序,但确保 -on 排在 -off 之前。若同时使用主目标,则主目标应排在可选目标之前:

    5.10.依赖

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

    重要

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

    5.10.1. LIB_DEPENDS

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

    将检查是否存在共享的 jpeg 库,并且如果找不到,将深入 graphics/jpeg 子目录以构建和安装该库。

    该依赖项会被检查两次,第一次在 build 目标中,第二次在 install 目标中。此外,依赖项的名称会被放入包中,以便如果用户系统中没有该库,pkg install(参见 )会自动安装它。

    5.10.2. RUN_DEPENDS

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

    例如:

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

    注意

    在这种情况下,innd 实际上是一个可执行文件;如果可执行文件的位置不在预期的搜索路径中,可以使用完整路径。

    注意

    在 Ports 构建集群中使用的官方搜索 PATH 是

    该依赖项会在 install 目标中进行检查。此外,依赖项的名称会被放入包中,以便如果用户的系统中没有该文件或程序,pkg install(参见 )会自动安装它。如果 target 部分与 DEPENDS_TARGET 相同,则可以省略该部分。

    一个常见的情况是,当 RUN_DEPENDS 与 BUILD_DEPENDS 实际上是一样的,尤其是在 Ported 软件是用脚本语言编写的,或者它要求相同的构建和运行时环境时。在这种情况下,人们常常会直接将它们互相赋值:

    然而,这种赋值可能会污染运行时依赖项,使其包含原始 BUILD_DEPENDS 中未定义的条目。这是因为 对变量赋值的懒惰求值。考虑一个包含 USE_* 的 Makefile,这些变量由 ports/Mk/bsd.*.mk 处理,用来增强初始构建依赖项。例如,USES= gmake 会将 添加到 BUILD_DEPENDS 中。为了防止这些额外的依赖项污染 RUN_DEPENDS,可以创建另一个变量,将 BUILD_DEPENDS 的当前内容赋值给它,并将其赋给 BUILD_DEPENDS 和 RUN_DEPENDS:

    重要

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

    5.10.3. BUILD_DEPENDS

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

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

    注意

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

    5.10.4. FETCH_DEPENDS

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

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

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

    5.10.5. EXTRACT_DEPENDS

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

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

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

    注意

    仅在提取操作无法正常工作时使用此变量(默认假定使用 tar)。如果提取操作无法通过 USES=tar、USES=lha 或 USES=zip(参见 )来解决,则使用此变量。

    5.10.6. PATCH_DEPENDS

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

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

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

    5.10.7. USES

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

    有关完整的值列表,请参见 。

    重要

    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_* 是 始终 不正确的。例如,设置

    (其中 X.Y 是版本号)将为每个 Port(包括 lang/gccXY 本身)添加对 gccXY 的依赖!

    表 8. USE_*

    变量
    说明

    与 gmake 和 configure 相关的变量在 中有描述,而 autoconf、automake 和 libtool 在 中有描述。与 Perl 相关的变量在 中有描述。X11 相关的变量列在 中。 讨论了 GNOME,而 讨论了与 KDE 相关的变量。 记录了 Java 相关变量,而 中包含了关于 Apache、PHP 和 PEAR 模块的信息。Python 在 中讨论,Ruby 在 中讨论。 提供了用于 SDL 应用程序的变量,最后, 包含了有关 Xfce 的信息。

    5.10.9. 依赖项的最小版本

    可以使用以下语法在任何 *_DEPENDS 中指定依赖项的最小版本,LIB_DEPENDS 除外:

    第一个字段包含一个依赖包名称,它必须与包数据库中的条目匹配,后跟一个比较符号和一个包版本。依赖项得到满足的条件是机器上安装了 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 的源代码时,才使用此方法。通过指定目标也可以节省编译时间。例如:

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

    5.10.11. 循环依赖是致命的

    重要

    不要在 Ports 树中引入任何循环依赖!

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

    5.10.12. 自动依赖引起的问题

    依赖项必须显式声明或使用 声明。使用自动检测等其他方法会使索引变得复杂,从而导致 port 和包管理的问题。

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

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

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

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

    PORTEPOCH

  • CATEGORIES

  • MASTER_SITES

  • MASTER_SITE_SUBDIR(已弃用)

  • PKGNAMEPREFIX

  • PKGNAMESUFFIX

  • DISTNAME

  • EXTRACT_SUFX

  • DISTFILES

  • DIST_SUBDIR

  • EXTRACT_ONLY

  • LICENSE_TEXT 或 LICENSE_TEXT_NAME

  • LICENSE_FILE 或 LICENSE_FILE_NAME

  • LICENSE_PERMS 或 LICENSE_PERMS_NAME_

  • LICENSE_DISTFILES 或 LICENSE_DISTFILES_NAME

  • BROKEN_*
  • IGNORE

  • IGNORE_*

  • ONLY_FOR_ARCHS

  • ONLY_FOR_ARCHS_REASON*

  • NOT_FOR_ARCHS

  • NOT_FOR_ARCHS_REASON*

  • LIB_DEPENDS
  • RUN_DEPENDS

  • TEST_DEPENDS

  • build

  • install

  • test

  • PORTNAME
    PORTVERSION
    1
    DISTVERSIONPREFIX
    DISTVERSION
    1
    DISTVERSIONSUFFIX
    PORTREVISION
    PATCH_SITES
    PATCHFILES
    PATCH_DIST_STRIP
    MAINTAINER
    COMMENT
    WWW
    LICENSE
    LICENSE_COMB
    LICENSE_GROUPS
    LICENSE_NAME
    DEPRECATED
    EXPIRATION_DATE
    FORBIDDEN
    BROKEN
    USES
    USES 和 USE_x
    php
    ssl
    其余变量段
    FETCH_DEPENDS
    EXTRACT_DEPENDS
    PATCH_DEPENDS
    BUILD_DEPENDS
    使用 FLAVORS
    USE_GITHUB
    选项框架
    目标段
    make(1)

    USE_GCC

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

    例如:

    注意 USE_GCC=any 已被弃用,不应在新 Port 中使用

    pkg-install(8)
    pkg-install(8)
    make(1)
    devel/gmake
    使用 USES 宏
    使用 USES 宏
    构建机制
    使用 GNU Autotools
    使用 Perl
    使用 X11
    使用 GNOME
    使用 KDE
    使用 Java
    Web 应用程序
    使用 Python
    使用 Ruby
    使用 SDL
    使用 Xfce
    OPTIONS 框架
    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}
    post-install:
      # 安装通用部分
    
    post-install-DOCS-on:
      # 安装文档
    
    post-install-X11-on:
      # 安装与 X11 相关的部分
    
    post-install-X11-off:
      # 安装在 X11 禁用时应存在的部分
    LIB_DEPENDS=   libjpeg.so:graphics/jpeg
    RUN_DEPENDS=	${LOCALBASE}/news/bin/innd:news/inn \
    		xmlcatmgr:textproc/xmlcatmgr
    /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
    RUN_DEPENDS=	${BUILD_DEPENDS}
    MY_DEPENDS=	some:devel/some \
    		other:lang/other
    BUILD_DEPENDS=	${MY_DEPENDS}
    RUN_DEPENDS=	${MY_DEPENDS}
    BUILD_DEPENDS=	unzip:archivers/unzip
    FETCH_DEPENDS=	ncftp2:net/ncftp2
    EXTRACT_DEPENDS=	unzip:archivers/unzip
    PATCH_DEPENDS=	${NONEXISTENT}:java/jfc:extract
    USES= feature[:arguments]
    USE_GCC=X.Y
    USE_GCC=yes		#  Port 需要当前版本的
     GCC USE_GCC=11:build	  #  Port 仅在构建时需要 GCC 11
    p5-Spiffy>=0.26:devel/p5-Spiffy
    BUILD_DEPENDS=	${NONEXISTENT}:graphics/jpeg:extract
    .include <bsd.port.pre.mk>
    
    .if exists(${LOCALBASE}/bin/foo)
    LIB_DEPENDS=	libbar.so:foo/bar
    .endif
    OPTIONS_DEFINE=	BAR
    BAR_DESC=	Calling cellphones via bar
    
    BAR_LIB_DEPENDS=	libbar.so:foo/bar

    5.3.归类

    5.3.1. CATEGORIES

    当一个软件包被创建时,它被放置在 /usr/ports/packages/All 目录下,并且从 /usr/ports/packages 的一个或多个子目录创建链接。这些子目录的名称由变量 CATEGORIES 指定。这样做旨在使用户在浏览 FTP 站点或 CDROM 上的软件包堆时更加方便。请查看当前的分类列表,并选择适合 port 的分类。

    该列表还确定了 ports 树中导入 port 的位置。如果这里有多于一个类别,则 port 文件必须放在以第一个类别名称命名的子目录中。有关如何选择正确类别的更多讨论,请参见下文。

    5.3.2. 当前类别列表

    这是当前 port 类别列表。用星号标记( * )的是虚拟类别 - 在 ports 树中没有相应子目录的类别。它们仅用作辅助类别,仅供搜索目的使用。

    分类
    说明
    备注

    5.3.3. 选择正确的类别

    由于许多类别重叠,选择 port 的主要类别可能会很繁琐。有几条规则管辖着这个问题。以下是按优先顺序递减的优先级列表:

    • 第一个类别必须是一个物理类别(见上文)。这是使包装工作的必要条件。之后可以混合使用虚拟类别和物理类别。

    • 语言特定的类别总是首先出现。例如,如果 port 安装日语 X11 字体,那么 CATEGORIES 行将会是 japanese x11-fonts。

    • 具体类别在不太具体的类别之前列出。例如,HTML 编辑器被列为 www 编辑器,而不是反过来。而且,当 port 属于 irc、mail、news、security 或 www 中的任何一个时,不要列出 net,因为 net 会隐式包含在内。

    • x11 仅用作辅助类别,当主类别为自然语言时。特别是,不要在 X 应用程序的类别行中放置 x11。

    如果类别没有明确定义,请在 bug 数据库中 port 提交时添加一条评论,以便在导入之前讨论。作为提交者,请发送一封邮件到 FreeBSD ports 邮件列表,以便我们可以首先讨论。太多情况下,新的 ports 被导入到错误的类别,然后立即移动。

    5.3.4. 提出新分类

    随着 Ports 的增长,引入了各种新分类。新分类可以是虚拟分类 - 即不在 ports 树中具有相应子目录的分类 - 或物理分类 - 即在 ports 树中具有相应子目录的分类。本节讨论了创建新物理分类涉及的问题。在提出新分类之前,请仔细阅读。

    我们现有的做法是避免创建新的物理分类,除非逻辑上大量的 ports 应属于该分类,或者应属于该分类的 ports 是一个逻辑上独特且受到有限普遍兴趣的群体(例如,与口头人类语言有关的分类),或者最好两者兼而有之。

    这样做的理由是,这样的变化会给所有跟踪 Ports Collection 变化的提交者和用户带来相当多的工作量。此外,拟议的类别变动似乎自然而然地会引起争议。(也许这是因为对于何时一个类别“太大”没有明确的共识,或者类别是否应该适合浏览(以及理想的类别数量是多少),等等。)

    这是程序:

    1. 在 FreeBSD ports 邮件列表上提出新类别。包括新类别的详细理由,包括为什么现有类别不够用,以及要移动的现有 ports 列表。(如果在 Bugzilla 中有适合该类别的新 ports,也将它们列出。)如果你是维护者和/或提交者,请提及,因为这可能有助于案例。

    2. 参与讨论

    3. 如果看起来支持这个想法,请提交包括理由和需要移动的现有 ports 列表的 PR。理想情况下,这个 PR 还会包括以下补丁:

      • 一旦它们被复制,为新的 ports 创建 Makefiles

    提议新建虚拟类别类似于上述过程,但涉及较少操作,因为不必移动任何 ports。在这种情况下,将包括在 PR 中的唯一补丁是那些将新类别添加到受影响 ports 的 CATEGORIES 中。

    5.3.5. 提议重新组织所有类别

    有时候有人提议用 2 级结构或其他一些关键字结构重新组织类别。到目前为止,这些提议都没有任何进展,因为虽然很容易提出,但要将现有的 ports 整体重新组织的工作量令人望而却步。在发布这个想法之前,请阅读邮件列表存档中关于这些提议的历史。此外,请准备好接受挑战,以提供一个工作原型。

    8.6.用关键词扩展软件包列表

    所有关键字也可以带有可选的括号参数。这些参数是所有者、组和模式。该参数用于文件或目录的引用。要更改配置文件的所有者、组和模式,请使用:

    这些参数是可选的。如果只需要更改组和模式,请使用:

    警告

    如果关键字用于 项目,必须在助手之后添加:%%FOO%%@sample etc/orbit.conf.sample。这是因为选项 plist 帮助器用于注释该行,因此它们需要放在前面。有关更多信息,请参见 。

    8.6.1. @desktop-file-utils

    12.2.修复安全漏洞

    在谈到 Ports 和包时,安全漏洞可能最初出现在原始发行版或 Port 文件中。在前一种情况下,原始软件开发者可能会立即发布补丁或新版本。根据作者的修复,及时更新 Port。如果由于某种原因修复被延迟,你可以 或向 Port 引入一个补丁文件。在易受攻击的 Port 的情况下,尽快修复该 Port。在这两种情况下,除非有权直接提交到 Ports 树,否则应遵循。

    重要

    成为 Ports 提交者并不足以随意提交 Port。切记,Port 通常有各自维护者,必须尊重他们。

    请确保在漏洞修复后,尽快更新该 Port 的版本号。这样,定期升级已安装包的用户就能看到他们需要运行更新。此外,新的包将通过 FTP 和 WWW 镜像重新构建并分发,替换掉易受攻击的版本。如果修复漏洞过程中 DISTVERSION 没有变化,则增加 PORTREVISION。也就是说,如果向 Port 添加了补丁文件,则增加 PORTREVISION,但如果更新 Port 到最新软件版本并已修改 DISTVERSION,则不增加它。更多信息请参考。

    标记该 Port 为 FORBIDDEN
    提交更改的标准流程
    相关部分

    安装和卸载后将运行 update-desktop-database -q。永远不要直接使用,应该在 Makefile 中添加 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 Files。

    8.6.5. @kld directory

    在安装和卸载时对该目录运行 kldxref。此外,在卸载时,如果目录为空,还会删除该目录。

    8.6.6. @rmtry file

    在卸载时删除该文件,如果文件不存在,则不报错。

    8.6.7. @sample file [file]

    用于通过软件包中捆绑的示例文件处理配置文件的安装。非示例文件(实际文件)是第二个文件名(如果存在),或者是第一个文件名去掉 .sample 后缀的版本。

    这三件事会发生。首先,将作为参数传递的第一个文件(示例文件)添加到 plist。然后,在安装时,如果找不到实际文件,则将示例文件复制到实际文件。最后,在卸载时,如果实际文件没有被修改,则删除该文件。有关更多信息,请参见 Configuration Files。

    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。

    在安装和卸载时,如果 tic 存在,则从 ${PREFIX}/shared/misc 中的 *.terminfo 文件刷新 ${PREFIX}/shared/misc/terminfo.db。

    8.6.11. 基本关键字

    有一些硬编码的关键字,并且在 pkg-create(8) 中有详细文档。为了完整性,本文也会记录这些关键字。

    8.6.11.1. @ [file]

    空关键字是一个占位符,用于在需要更改文件的所有者、组或模式时使用。例如,要将文件的组设置为 games 并添加 setgid 位,请添加:

    8.6.11.2. @preexec command, @postexec command, @preunexec command, @postunexec command

    在包安装或卸载过程中执行 command。

    @preexeccommand 在 pre-install 脚本中执行 command。

    @postexeccommand 在 post-install 脚本中执行 command。

    @preunexeccommand 在 pre-deinstall 脚本中执行 command。

    @postunexeccommand 在 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) 使用的格式相同。使用时若不带参数,则设置为默认权限(打包时文件的权限模式)。

    重要

    这必须是数字模式,例如 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 以外的目录需要注册。例如,/var/db/${PORTNAME} 需要有一个 @dir 条目,而 ${PREFIX}/shared/${PORTNAME} 如果包含文件或使用默认所有者、组和权限,则不需要。

    8.6.11.8. @exec command, @unexec command(已弃用)

    在安装或卸载过程中执行 command。请改用 @preexec command。

    8.6.11.9. @dirrm directory(已弃用)

    声明要在卸载时删除的目录名称。默认情况下,通过包安装创建的目录会在包卸载时被删除。

    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。值分别为用户名、组名和文件模式。例如:

    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 等。例如,对于以下行:

    %1 和 %2 将分别包含:

    它还会影响 action 条目的工作方式。当有多个参数时,必须指定参数的编号。例如:

    8.6.12.4. pre-install、post-install、pre-deinstall、post-deinstall、pre-upgrade、post-upgrade

    这些关键字包含一个 sh(1) 脚本,在安装、卸载或升级包之前或之后执行。除了通常的 @exec %foo 占位符(如 @preexec command 中描述的)外,还有一个新占位符 %@,它表示该关键字的参数。

    8.6.12.5. 自定义关键字示例

    示例 2. @dirrmtryecho 关键字示例

    此关键字执行两项操作:它向打包列表添加一个 @dirrmtry<span> </span>directory 行,并在卸载包时回显删除该目录的消息。

    示例 3. 真实示例,如何实现 @sample

    此关键字执行三项操作:它将第一个作为参数传递给 @sample 的 filename 添加到打包列表中;它将指令添加到 post-install 脚本中,以便在目标配置文件不存在时,将示例文件复制到实际配置文件中;它将指令添加到 post-deinstall 脚本中,在配置文件未被修改的情况下删除该配置文件。

    可选
    OPTIONS_SUB
    @sample(games,games,640) etc/config.sample
    @sample(,games,660) etc/config.sample
    @(,games,2755) sbin/daemon
    attributes: { owner: "games", group: "games", mode: 0555 }
    @foo some.content other.content
    some.content
    other.content
    actions: [file(1)]
    actions: [dirrmtry]
    post-deinstall: <<EOD
      echo "Directory %D/%@ removed."
    EOD
    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

    astro

    天文学相关的 Port。

    audio

    音频支持。

    benchmarks

    基准测试工具。

    biology

    生物学相关的软件。

    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。

    finance

    与货币、金融相关的应用程序。

    french

    法语语言支持。

    ftp

    FTP 客户端和服务器工具。

    如果 Port 同时支持 FTP 和 HTTP,应将其放入 ftp 分类,并加上 www 作为第二分类。

    games

    游戏。

    geography*

    与地理相关的软件。

    german

    德语语言支持。

    gnome*

    来自 项目的 Port。

    gnustep*

    与 GNUstep 桌面环境相关的软件。

    graphics

    图形工具。

    hamradio*

    业余无线电相关软件。

    haskell*

    与 Haskell 语言相关的软件。

    hebrew

    希伯来语语言支持。

    hungarian

    匈牙利语语言支持。

    irc

    互联网中继聊天工具。

    japanese

    日语语言支持。

    java

    与 Java™ 语言相关的软件。

    java 分类不应是 Port 唯一的分类。除非是直接与 Java 语言相关的 Port,否则不建议使用 java 作为 Port 的主要分类。

    kde*

    来自 项目的 Port(通用)。

    kde-applications*

    来自 项目的应用程序。

    kde-frameworks*

    项目的 Qt 编程附加库。

    kde-plasma*

    来自 项目的桌面环境。

    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*

    来自 的各种程序。

    polish

    波兰语语言支持。

    ports-mgmt

    用于管理、安装和开发 FreeBSD Ports 和包的工具。

    portuguese

    葡萄牙语语言支持。

    print

    打印软件。

    包括桌面出版工具(如预览器等)。

    python*

    与 语言相关的软件。

    ruby*

    与 语言相关的软件。

    rubygems*

    包的 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*

    与 桌面环境相关的 Port。

    zope*

    支持。

    Emacs 模式与模式支持的应用程序放在同一个 ports 类别中,而不是在 editors 中。例如,用于编辑某些编程语言的源文件的 Emacs 模式放入 lang。

  • Ports 安装可加载内核模块也在它们的 CATEGORIES 行中有虚拟类别 kld。这是通过添加 USES=kmod 自动处理的事项之一。

  • 如果与其他非虚拟类别中没有出现 misc,则表示如果在 CATEGORIES 中有 misc 与其他内容,则可以安全删除 misc 并将 port 仅放置在另一个子目录中。

  • 如果 port 真的没有其他适合的地方,请放入 misc。

  • 新类别的 Makefile

  • 旧类别的 ports 的 Makefile

  • 依赖旧 ports 的 ports 的 Makefiles

  • 对于额外的学分,请包括根据提交者指南中的程序需要更改的其他文件。

  • 由于它影响 ports 基础架构并涉及移动和修补许多 ports,还可能在构建集群上运行回归测试,因此请将 PR 分配给 Ports 管理团队[email protected]。

  • 如果该 PR 获得批准,一个 committer 需要按照提交者指南中概述的其余程序继续操作。

  • accessibility

    帮助残障用户的 Port。

    afterstep*

    支持 AfterStep 窗口管理器的 Port。

    arabic

    阿拉伯语语言支持。

    archivers

    压缩与归档工具。

    5.8.许可证

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

    5.8.1. LICENSE

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

    如果它是 中列出的许可证,则只能设置 LICENSE_FILE 和 LICENSE_DISTFILES 变量。

    如果这是一个在 ports 框架中尚未定义的许可证(见

    GNOME
    KDE
    KDE
    KDE
    KDE
    Plan9
    Python
    Ruby
    RubyGems
    Xfce
    Zope
    ),则必须设置
    LICENSE_PERMS
    和
    LICENSE_NAME
    ,并且必须设置
    LICENSE_FILE
    或
    LICENSE_TEXT
    。
    LICENSE_DISTFILES
    和
    LICENSE_GROUPS
    也可以设置,但不是必需的。

    预定义许可证列出在 预定义许可证列表 中。当前列表始终可在 Mk/bsd.licenses.db.mk 中找到。

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

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

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

    对于预定义的许可证,默认权限为 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

    5.8.2. LICENSE_PERMS 和 LICENSE_PERMS_NAME_

    权限。如果为空,使用 none。

    许可证权限列表

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

    no-dist-mirror 禁止分发发行文件。这等同于设置 RESTRICTED。发行文件将 不会 添加到 FreeBSD MASTER_SITE_BACKUP CDN。

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

    no-dist-sell 禁止出售发行文件。这等同于设置 NO_CDROM。

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

    no-pkg-mirror 禁止自由分发软件包。等同于设置 NO_PACKAGE。该软件包将 不会 从 FreeBSD 软件包 CDN https://pkg.freebsd.org/ 分发。

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

    no-pkg-sell 禁止出售软件包。这等同于设置 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. 非标准许可证

    阅读许可证条款,并使用可用权限进行翻译。

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

    阅读许可证条款,并使用可用权限进行表达。如果有疑问,请在 FreeBSD Ports 邮件列表 上请求指导。

    当 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-permissions 会取消 permissions。最终的权限列表是 dist-mirror pkg-mirror auto-accept。发行文件和软件包将不会出现在安装映像中。

    5.8.3. LICENSE_GROUPS 和 LICENSE_GROUPS_NAME

    许可证所属的组。

    预定义的许可证组列表

    FSF Free Software Foundation 批准,见 FSF Licensing & Compliance Team。

    GPL 与 GPL 兼容

    OSI OSI 批准,见 Open Source Initiative 的 Open Source Licenses 页面。

    COPYFREE 符合 Copyfree 标准定义,见 Copyfree Licenses 页面。

    FONTS 字体许可证

    5.8.4. LICENSE_NAME 和 LICENSE_NAME_NAME

    许可证的完整名称。

    示例 31. LICENSE_NAME

    5.8.5. LICENSE_FILE 和 LICENSE_FILE_NAME

    包含许可证文本的文件的完整路径,通常是 ${WRKSRC}/some/file。如果文件不在分发包中,且其内容太长,无法放在 LICENSE_TEXT 中,请将其放入 ${FILESDIR} 中的新文件。

    示例 32. LICENSE_FILE

    5.8.6. LICENSE_TEXT 和 LICENSE_TEXT_NAME

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

    示例 33. LICENSE_TEXT

    5.8.7. LICENSE_DISTFILES 和 LICENSE_DISTFILES_NAME

    适用于的分发文件。默认为所有分发文件。

    示例 34. LICENSE_DISTFILES

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

    5.8.8. LICENSE_COMB

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

    示例 35. 双重许可证

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

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

    示例 36. 多个许可证

    当一个 Port 的一部分使用一个许可证,而另一部分使用不同的许可证时,使用 multi:

    预定义许可证列表
    预定义许可证列表
    LICENSE=	LGPL21+
    LICENSE=	LGPL21+
    LICENSE_FILE=	${WRKSRC}/COPYING
    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
    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
    LICENSE=        UNRAR
    LICENSE_NAME=   UnRAR License
    LICENSE_FILE=   ${WRKSRC}/license.txt
    LICENSE_PERMS=  dist-mirror dist-sell pkg-mirror pkg-sell auto-accept
    LICENSE=	GPLv3+
    LICENSE_FILE=	${WRKSRC}/COPYING
    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
    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
    LICENSE=	ART10 GPLv1
    LICENSE_COMB=   dual
    LICENSE=	ART10 GPLv1
    LICENSE_COMB=   dual
    LICENSE_FILE_ART10=     ${WRKSRC}/Artistic
    LICENSE_FILE_GPLv1=     ${WRKSRC}/Copying
    LICENSE=	GPLv2 LGPL21+
    LICENSE_COMB=	multi

    (默认)

    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 署名 - 相同方式共享 3.0

    (默认)

    CC-BY-SA-4.0

    Creative Commons Attribution 署名 - 相同方式共享 4.0

    (默认)

    CC0-1.0

    Creative Commons Attribution 零版权 1.0 通用

    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

    (默认)

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

    13.1. 介绍

    以下是移植过程中常见的一些注意事项和禁忌。请对照本清单检查 Port,同时也请查看其他人提交到 PR 数据库 中的 Ports。根据 Bug Reports and General Commentary 中的说明提交对 Ports 的任何意见。检查 PR 数据库中的 Ports 不仅可以加快我们提交的速度,还可以证明你熟悉相关操作。

    13.2. WRKDIR

    不要向 WRKDIR 之外的文件写入任何内容。WRKDIR 是构建 Port 过程中唯一保证可写的地方(参见 中只读树构建 Ports 的示例)。pkg-* 文件可以通过 的方式修改,而不是直接覆盖文件。

    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 版本的推荐方式是使用定义在 中的 __FreeBSD_version 和 __FreeBSD__ 宏。如果未包含该文件,请在对应的 .c 文件中添加如下代码:

    __FreeBSD__ 在所有版本的 FreeBSD 中都定义为其主版本号。例如,在 FreeBSD 9.x 中,__FreeBSD__ 被定义为 9。

    __FreeBSD_version 的完整值列表可参考 。

    13.5. 在 bsd.port.mk 之后写内容

    不要在 .include <bsd.port.mk> 这一行之后写任何内容。通常可以通过在 Makefile 中部引入 bsd.port.pre.mk,在末尾引入 bsd.port.post.mk 来避免这种情况。

    重要

    要么只使用 bsd.port.mk,要么使用 bsd.port.pre.mk/bsd.port.post.mk 配对;请不要混用这两种方式。

    bsd.port.pre.mk 只定义了一些变量,可以在 Makefile 中进行判断使用,而 bsd.port.post.mk 定义其余变量。

    下面是一些 bsd.port.pre.mk 定义的重要变量(不是完整列表,完整内容请参考 bsd.port.mk):

    变量名
    描述

    注意

    如果需要使用 MASTERDIR,务必在包含 bsd.port.pre.mk 之前定义它。

    以下是一些可以在 bsd.port.pre.mk 之后添加的示例:

    BROKEN= 后请始终使用 tab 而不是空格。

    13.6. 在封装脚本中使用 exec 语句

    如果 Port 安装了一个 shell 脚本,而该脚本的目的是启动另一个程序,并且启动该程序是脚本执行的最后一步,那么请务必使用 exec 语句来启动该程序,例如:

    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 示例。注意 ?= 的使用:

    以下是不遵守的示例:

    在 FreeBSD 系统中,CC 和 CXX 可以在 /etc/make.conf 中定义。第一个示例仅在变量未被预先定义时赋值,保留了系统范围的定义;而第二个示例则会覆盖已有定义。

    13.9. 遵守 CFLAGS

    Port 必须遵守 CFLAGS。这意味着不能直接覆盖该变量的值,而应在已有值的基础上追加所需内容。这样可以使影响所有 Ports 的构建选项可以全局设置。

    如果未遵守,请在 Makefile 中添加 NO_PACKAGE=ignores cflags。

    以下是一个遵守 CFLAGS 的 Makefile 示例。注意 += 的使用:

    以下是不遵守的示例:

    CFLAGS 在 FreeBSD 系统中定义于 /etc/make.conf。第一个示例将额外参数附加到已有的 CFLAGS 上,保留系统级定义;而第二个示例会覆盖原有定义。

    请从第三方 Makefile 中移除优化标志。系统的 CFLAGS 已包含系统范围的优化选项。以下是未修改的 Makefile 中的示例:

    使用系统优化标志后的 Makefile 应类似如下:

    13.10. 显示详细构建日志

    请确保 Port 的构建系统在构建阶段显示所有执行的命令。完整的构建日志对于调试 Port 问题至关重要。

    不具可读性的构建日志示例(错误):

    详细的构建日志示例(正确):

    某些构建系统(如 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 的自动化系统(如 和 )也是如此。

    13.13.1. 各变量说明

    • BROKEN:用于目前无法编译、安装、卸载或正常运行的 Port。适用于预计问题是暂时性的情形。 如果设置,构建集群在收到指示的情况下仍可能尝试构建以查看问题是否已经解决。(但通常构建集群不会这样做。)

      例如,当一个 Port:

      • 无法编译;

      • 配置或安装过程失败;

    13.13.2. 实现注意事项

    不要给 BROKEN、IGNORE 及相关变量的值加引号。由于这些信息最终会显示给用户,每个变量所使用的消息措辞是不同的:

    这样,make describe 的输出如下所示:

    13.14. 架构相关注意事项

    13.14.1. 架构通用说明

    FreeBSD 支持的处理器架构远不止常见的 x86 架构。一些 Port 仅适用于某些特定架构,或者在某些架构下会有问题。

    要查看支持的架构列表,请执行以下命令:

    返回的值为 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。示例:

      可使用 ONLY_FOR_ARCHS_REASON 和 NOT_FOR_ARCHS_REASON 设置自定义的 IGNORE 消息。也可以针对特定架构使用 ONLY_FOR_ARCHS_REASON_ARCH 和 NOT_FOR_ARCHS_REASON_ARCH 设定说明。

    13.14.4. 与构建集群相关的注意事项

    • 某些 Port 会尝试通过向编译器传递 -march=native 参数来针对当前构建机器做出优化。这种做法应避免:要么作为默认关闭的选项列出,要么彻底删除该参数。 否则,由构建集群构建的默认软件包可能无法在该架构下的所有机器上运行。

    13.15. 使用 DEPRECATED 和 EXPIRATION_DATE 标记待移除的 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 maintainer,也会因此失败。这种行为是不可接受的。

    示例 1:如何避免使用 .error

    下面两个 Makefile 片段中,第一个会导致 make index 失败,而第二个不会:

    13.17. 使用 sysctl

    除非用于目标(targets)中,通常不应在 Makefile 中使用 sysctl。这是因为在处理 makevar(例如运行 make index 时)时会执行该命令,从而进一步拖慢处理速度。

    仅应通过 SYSCTL 使用 ,因为它包含完整路径,并且在必要时可以被覆盖。

    13.18. 重新打包 distfile

    有时软件作者会在不更改文件名的情况下,修改已发布的 distfile 内容。应验证这些更改是官方行为,且确实由作者执行。过去曾有 distfile 在下载服务器上被暗地里篡改,意图造成损害或危及终端用户的安全。

    请将旧的 distfile 备份,下载新的文件,解压后使用 比较内容。如果确认没有可疑之处,再更新 distinfo。

    重要

    请务必在 PR 和提交日志中简要说明差异,这样其他人可以了解没有发生恶意行为。

    联系软件作者并向他们确认这些更改。

    13.19. 遵循 POSIX 标准

    FreeBSD Ports 通常期望软件遵循 POSIX 标准。有些软件和构建系统依赖某些特定操作系统或环境的行为,这会在作为 Port 使用时引发问题。

    如果有其他方式获取信息,不要使用 /proc。例如,可以在 main() 中使用 setprogname(argv[0]),随后调用 来获取可执行文件名称。

    不要依赖 POSIX 没有文档化的行为。

    如果应用程序在没有时间戳的情况下也能正常工作,就不要在关键路径中记录时间戳。获取时间戳可能较慢,具体取决于操作系统的时间戳精度。如果确实需要时间戳,应确定所需精度,并使用明确能提供该精度的 API。

    一些简单的系统调用(例如 、)在 Linux® 上因为缓存和 vsyscall 优化而非常快,但在其他操作系统上就没有这些优势。在性能敏感的程序中,不要假设这些调用是廉价的。总的来说,应尽可能避免使用系统调用。

    不要依赖 Linux® 特有的 socket 行为。特别是默认的 socket 缓冲区大小不同(应通过调用 设置 SO_SNDBUF 和 SO_RCVBUF),并且在 socket 缓冲区已满时,Linux® 的 会阻塞,而 FreeBSD 会返回失败并设置 errno 为 ENOBUFS。

    如果确实需要依赖非标准行为,请将其正确封装为通用 API,并在配置阶段检测该行为,若不满足则中止。

    请通过查阅 的“STANDARDS”部分来确认所使用的函数是否为 POSIX 接口。

    不要假设 /bin/sh 是 bash。应确保传递给 的命令行可以在 POSIX 兼容的 shell 下正常执行。

    常见 bash 主义列表可见于 。

    请检查头文件是否按照 POSIX 或 man 页面推荐的方式包含。例如,经常会忘记包含 sys/types.h,这在 Linux® 上问题不大,但在 FreeBSD 上就不行。

    13.20. 其他注意事项

    请务必反复检查 pkg-descr 和 pkg-plist。如果在审查 Port 时发现可以改进其措辞,请进行修正。

    请务必注意任何法律问题!不要让我们非法分发软件!

    你是否在维护 Ports 时遇到过具体的非 POSIX 行为或仅 Linux 依赖?

    将文件安装到 ${PREFIX} 之外;
  • 卸载时未能清除所有文件(不过如果留下的是用户已修改的文件,可能是可以接受甚至是期望的);

  • 在本应能正常运行的系统上运行失败;

  • 应使用 BROKEN。

  • FORBIDDEN:用于含有安全漏洞,或对 FreeBSD 系统安全构成严重隐患的 Port(例如:臭名昭著的不安全程序,或提供易被攻击的服务的程序)。一旦发现某个软件存在漏洞且无可用升级版本,应立即将相关 Port 标记为 FORBIDDEN。理想情况下,发现安全问题时应尽快升级 Port,以减少 FreeBSD 主机的漏洞数量(我们以安全著称)。除安全问题外,请勿使用 FORBIDDEN。

  • IGNORE:用于因其他原因绝不能构建的 Port。适用于认为问题具有结构性特征的情形。构建集群在任何情况下都不会构建被标记为 IGNORE 的 Port。例如,在以下情况下应使用 IGNORE:

    • Port 不支持当前安装的 FreeBSD 版本;

    • distfile 因许可证限制不能自动获取;

    • 与当前已安装的其他 Port 不兼容(例如:该 Port 依赖 ,而系统已安装的是 );

    注意

    如果 Port 与当前安装的其他 Port 冲突(例如,它们安装了具有不同功能但同名的文件),。CONFLICTS 会自动设置 IGNORE。

  • 若 Port 下载并安装的是 i386 的二进制文件,应设置 IA32_BINARY_PORT。若设置了该变量,则系统必须存在 /usr/lib32 以提供 IA32 库,同时内核必须支持 IA32 兼容性。如果这两个条件之一未满足,则将自动设置 IGNORE。

    ARCH

    架构类型,uname -m 返回的结果(例如,i386)

    OPSYS

    操作系统类型,uname -s 返回的结果(例如,FreeBSD)

    OSREL

    操作系统的发布版本(例如,2.1.5 或 2.2.7)

    OSVERSION

    操作系统的数字版本;与 __FreeBSD_version 相同

    LOCALBASE

    “本地”目录的根目录(例如,/usr/local)

    PREFIX

    Port 安装的位置(详见 关于 PREFIX 的更多信息)

    从光盘安装 Ports
    重新定义变量
    sys/param.h
    __FreeBSD_version 值
    Ports 构建集群
    FreshPorts
    运行 make describe
    sysctl(8)
    diff(1)
    getprogname(3)
    gettimeofday(2)
    getpid(2)
    setsockopt(2)
    send(2)
    man 页面
    system(3)
    此处
    #include <sys/param.h>
    #if __FreeBSD__ >= 9
    #  if __FreeBSD_version >= 901000
    	 /* 9.1+ 版本特有的代码 */
    #  endif
    #endif
    # 如果系统中已有 perl5,就无需编译 lang/perl5
    .if ${OSVERSION} > 300003
    BROKEN=	perl is in system
    .endif
    #!/bin/sh
    exec %%LOCALBASE%%/bin/java -jar %%DATADIR%%/foo.jar "$@"
    CC?= gcc
    CXX?= g++
    CC= gcc
    CXX= g++
    CFLAGS+= -Wall -Werror
    CFLAGS= -Wall -Werror
    CFLAGS= -O3 -funroll-loops -DHAVE_SOUND
    CFLAGS+= -DHAVE_SOUND
    CC     source1.o
      CC     source2.o
      CCLD   someprogram
    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
    BROKEN=	fails to link with base -lcrypto
    IGNORE=	unsupported on recent versions
    ===>  foobar-0.1 is marked as broken: fails to link with base -lcrypto.
    ===>  foobar-0.1 is unsupported on recent versions.
    cd ${SRCDIR}; make targets
    ONLY_FOR_ARCHS=	i386 amd64
    NOT_FOR_ARCHS=	ia64 sparc64
    .error "option is not supported"
    IGNORE=option is not supported
    www/drupal7
    www/drupal8
    请使用 CONFLICTS

    5.14.Makefile 参数

    许多应用程序可以通过可选或不同的配置进行构建。示例包括选择自然(人类)语言、图形界面与命令行界面,或支持的数据库类型。用户可能需要不同于默认配置的版本,因此 Ports 系统提供了 hook,port 作者可以使用这些 hook 来控制将构建哪种变体。正确支持这些选项将使用户满意,并有效地提供多个 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。

    当用户运行 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 列表。这些选项是独立的,彼此之间没有分组:

    定义后,OPTIONS 应该进行描述(可选,但强烈推荐):

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

    技巧

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

    重要

    选项名称始终使用全大写字母,不能使用混合大小写或小写字母。

    OPTIONS 可以作为单选组进行分组,每组只能选择一个选项:

    警告

    每次选项有效时,必须选择每个 OPTIONS_SINGLE 组中的一个选项。每个组的一个选项 必须 被添加到 OPTIONS_DEFAULT。

    OPTIONS 也可以作为单选组进行分组,每组可以选择零个或一个选项:

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

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

    默认情况下,OPTIONS 是未设置的,除非它们列在 OPTIONS_DEFAULT 中:

    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 的简单使用

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

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

    示例 41. OPTIONS 的实际使用

    5.14.1.3. 默认选项

    以下选项默认始终开启:

    • DOCS - 构建并安装文档。

    • NLS - 本地语言支持。

    • EXAMPLES - 构建并安装示例。

    注意

    不需要将这些选项添加到 OPTIONS_DEFAULT 中。然而,为了使它们生效并在选项选择对话框中显示,它们必须添加到 OPTIONS_DEFINE 中。

    5.14.2. 功能自动激活

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

    示例 42. 错误的选项处理

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

    示例 43. 正确的选项处理

    注意

    在某些情况下,简写的条件语法可能会导致复杂构造的问题。通常会出现 Malformed conditional 错误,可以使用替代语法

    作为

    的替代。

    5.14.3. 选项帮助工具

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

    • PLIST_SUB, SUB_LIST 有关自动生成 %%OPT%% 和 %%NOOPT%%,请参见 。

      对于更复杂的用法,请参见 。

    • CONFIGURE_ARGS 对于 --enable-x 和 --disable-x

    5.14.3.1. OPTIONS_SUB

    如果将 OPTIONS_SUB 设置为 yes,则会将所有添加到 OPTIONS_DEFINE 中的选项添加到 PLIST_SUB 和 SUB_LIST 中,例如:

    等同于:

    注意

    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 未被选中时。示例:

    等同于:

    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 配置选项。例如:

    等同于:

    5.14.3.3.2. OPT_CONFIGURE_WITH

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

    等同于:

    5.14.3.3.3. OPT_CONFIGURE_ON 和 OPT_CONFIGURE_OFF

    当选中选项 OPT 时,OPT_CONFIGURE_ON 的值(如果已定义)会附加到 CONFIGURE_ARGS。OPT_CONFIGURE_OFF 的工作方式相同,但当 OPT 未被选中时。示例:

    等同于:

    技巧

    大多数情况下,OPT_CONFIGURE_ENABLE 和 OPT_CONFIGURE_WITH 中的帮助工具提供了更简洁和全面的功能。

    5.14.3.4. CMAKE_ARGS Helpers

    5.14.3.4.1. OPT_CMAKE_ON 和 OPT_CMAKE_OFF

    当选中选项 OPT 时,如果定义了 OPT_CMAKE_ON,则该值会附加到 CMAKE_ARGS。OPT_CMAKE_OFF 的工作方式相同,但当 OPT 未被选中时。例如:

    等同于:

    技巧

    当值为布尔型时,请参考 以获取更简洁的帮助工具。

    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。例如:

    等同于:

    5.14.3.5. MESON_ARGS Helpers

    5.14.3.5.1. OPT_MESON_ON 和 OPT_MESON_OFF

    当选中选项 OPT 时,如果定义了 OPT_MESON_ON,则该值会附加到 MESON_ARGS。OPT_MESON_OFF 的工作方式相同,但当 OPT 未被选中时。例如:

    等同于:

    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。例如:

    等同于:

    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。例如:

    等同于:

    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。例如:

    等同于:

    5.14.3.6. OPT_QMAKE_ON 和 OPT_QMAKE_OFF

    当选中选项 OPT 时,如果定义了 OPT_QMAKE_ON,则该值会附加到 QMAKE_ARGS。OPT_QMAKE_OFF 的工作方式相同,但当 OPT 未被选中时。例如:

    等同于:

    5.14.3.7. OPT_IMPLIES

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

    当选中选项 OPT 时,此变量中列出的所有选项也将被选中。以下是使用之前描述的 来举例说明:

    等同于:

    示例 44. OPT_IMPLIES 的简单使用

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

    5.14.3.8. OPT_PREVENTS 和 OPT_PREVENTS_MSG

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

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

    大致等同于:

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

    示例 45. OPT_PREVENTS 的简单使用

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

    5.14.3.9. OPT_VARS 和 OPT_VARS_OFF

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

    警告

    在使用 OPT_VARS 和 OPT_VARS_OFF 之前,看看是否已经有更具体的助手可用,详情请见 。

    当选项 OPT 被选中,并且定义了 OPT_VARS 时,key=value 和 key+=value 对将会从 OPT_VARS 中进行评估。= 会覆盖 KEY 的现有值,而 += 会追加到该值。OPT_VARS_OFF 以相同的方式工作,但在选项 OPT 未被选中时。

    等同于:

    重要

    包含空格的值必须用引号括起来:

    这是因为 变量展开处理空格的方式。当 OPT_VARS= foo=bar baz 被展开时,变量会包含两个字符串,foo=bar 和 baz。但提交者可能只希望有一个字符串 foo=bar baz。通过引用该值,可以防止空格被当作分隔符使用。

    另外,不要 在 var= 符号和值之间添加额外的空格,这样也会将其分割成两个字符串。这将不起作用:

    5.14.3.10. 依赖关系,OPT_DEPTYPE 和 OPT_DEPTYPE_OFF

    对于以下任何依赖类型:

    • PKG_DEPENDS

    • EXTRACT_DEPENDS

    • PATCH_DEPENDS

    当选项 OPT 被选中时,如果定义了 OPT_DEPTYPE,则其值将被追加到 DEPTYPE。OPT_DEPTYPE_OFF 在选项 OPT 未被选中时以相同的方式工作。例如:

    等同于:

    5.14.3.11. 通用变量替换,OPT_VARIABLE 和 OPT_VARIABLE_OFF

    对于以下任意变量:

    • ALL_TARGET

    • BINARY_ALIAS

    • BROKEN

    • CATEGORIES

    当选项 OPT 被选中时,如果定义了 OPT_ABOVEVARIABLE,则其值将追加到 ABOVEVARIABLE。OPT_ABOVEVARIABLE_OFF 在选项 OPT 未选中时以相同的方式工作。例如:

    等同于:

    注意

    某些变量不在此列表中,特别是 PKGNAMEPREFIX 和 PKGNAMESUFFIX。这是故意的。一个 Port 不得 在选项集更改时更改其名称。

    警告

    其中一些变量,至少 ALL_TARGET、DISTFILES 和 INSTALL_TARGET,它们的默认值是在选项处理后设置的。使用以下行在 Makefile 中:

    如果启用了 DOCS 选项,ALL_TARGET 最终值将为 all doc;如果该选项被禁用,则为 all。

    仅使用选项帮助行在 Makefile 中:

    如果启用了 DOCS 选项,ALL_TARGET 最终值将为 doc;如果该选项被禁用,则为 all。

    5.14.3.12. 额外构建目标,target-OPT-on 和 target-OPT-off

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

    • pre-fetch

    • do-fetch

    • post-fetch

    当选项 OPT 被选中时,如果定义了目标 TARGET-OPT-on,则在 TARGET 之后执行该目标。TARGET-OPT-off 在选项 OPT 未选中时以相同的方式工作。例如:

    等同于:

    IPV6 - IPv6 协议支持。
    ,请参见
    。

    对于 --with-x 和 --without-x,请参见 OPT_CONFIGURE_WITH。

    对于所有其他情况,请参见 OPT_CONFIGURE_ON 和 OPT_CONFIGURE_OFF。

  • CMAKE_ARGS 对于布尔类型的参数(on、off、true、false、0、1),请参见 OPT_CMAKE_BOOL 和 OPT_CMAKE_BOOL_OFF。

    对于所有其他情况,请参见 OPT_CMAKE_ON 和 OPT_CMAKE_OFF。

  • MESON_ARGS 对于接受 true 或 false 的参数,参见 OPT_MESON_TRUE 和 OPT_MESON_FALSE。

    对于接受 yes 或 no 的参数,使用 OPT_MESON_YES 和 OPT_MESON_NO。

    对于接受 enabled 或 disabled 的参数,参见 OPT_MESON_ENABLED 和 OPT_MESON_DISABLED。

    对于所有其他情况,请使用 OPT_MESON_ON 和 OPT_MESON_OFF。

  • QMAKE_ARGS 参见 OPT_QMAKE_ON 和 OPT_QMAKE_OFF。

  • USE_* 参见 OPT_USE 和 OPT_USE_OFF。

  • *_DEPENDS 参见 依赖项。

  • * (任何变量) 最常用的变量有直接的帮助工具,参见 通用变量替换。

    对于没有特定帮助工具的任何变量,请参见 OPT_VARS 和 OPT_VARS_OFF。

  • FETCH_DEPENDS
  • BUILD_DEPENDS

  • LIB_DEPENDS

  • RUN_DEPENDS

  • 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

  • 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

  • dns/bind99
    OPTIONS_SUB
    通用变量替换
    OPT_CMAKE_BOOL 和 OPT_CMAKE_BOOL_OFF
    OPT_CONFIGURE_ENABLE
    通用变量替换
    make(1)
    OPT_CONFIGURE_ENABLE
    OPTIONS_DEFINE=	OPT1 OPT2
    OPT1_DESC=	描述 OPT1
    OPT2_DESC=	描述 OPT2
    OPT3_DESC=	描述 OPT3
    OPT4_DESC=	描述 OPT4
    OPT5_DESC=	描述 OPT5
    OPT6_DESC=	描述 OPT6
    OPTIONS_SINGLE=		SG1
    OPTIONS_SINGLE_SG1=	OPT3 OPT4
    OPTIONS_RADIO=		RG1
    OPTIONS_RADIO_RG1=	OPT7 OPT8
    OPTIONS_MULTI=		MG1
    OPTIONS_MULTI_MG1=	OPT5 OPT6
    OPTIONS_GROUP=		GG1
    OPTIONS_GROUP_GG1=	OPT9 OPT10
    OPTIONS_DEFAULT=	OPT1 OPT3 OPT6
    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>
    .if ! ${PORT_OPTIONS:MEXAMPLES}
    CONFIGURE_ARGS+=--without-examples
    .endif
    # 将添加 --with-examples / --without-examples
    EXAMPLES_CONFIGURE_WITH=	examples
    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>
    .if ${PORT_OPTIONS:MFOO}
    LIB_DEPENDS+=		libfoo.so:devel/foo
    CONFIGURE_ARGS+=	--enable-foo
    .endif
    FOO_LIB_DEPENDS=		libfoo.so:devel/foo
    # 将添加 --enable-foo / --disable-foo
    FOO_CONFIGURE_ENABLE=	foo
    .if !empty(VARIABLE:MVALUE)
    .if ${VARIABLE:MVALUE}
    OPTIONS_DEFINE=	OPT1
    OPTIONS_SUB=	yes
    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_DEFINE=	OPT1
    OPT1_USES=	xorg
    OPT1_USE=	mysql=yes xorg=x11,xextproto,xext,xrandr
    OPT1_USE_OFF=	openssl=yes
    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
    OPTIONS_DEFINE=	OPT1 OPT2
    OPT1_CONFIGURE_ENABLE=	test1 test2
    OPT2_CONFIGURE_ENABLE=	test2=exhaustive
    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
    OPTIONS_DEFINE=	OPT1 OPT2
    OPT1_CONFIGURE_WITH=	test1
    OPT2_CONFIGURE_WITH=	test2=exhaustive
    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
    OPTIONS_DEFINE=	OPT1
    OPT1_CONFIGURE_ON=	--add-test
    OPT1_CONFIGURE_OFF=	--no-test
    OPTIONS_DEFINE=	OPT1
    
    .include <bsd.port.options.mk>
    
    .if ${PORT_OPTIONS:MOPT1}
    CONFIGURE_ARGS+=	--add-test
    .else
    CONFIGURE_ARGS+=	--no-test
    .endif
    OPTIONS_DEFINE=	OPT1
    OPT1_CMAKE_ON=	-DTEST:BOOL=true -DDEBUG:BOOL=true
    OPT1_CMAKE_OFF=	-DOPTIMIZE:BOOL=true
    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
    OPTIONS_DEFINE=	OPT1
    OPT1_CMAKE_BOOL=	TEST DEBUG
    OPT1_CMAKE_BOOL_OFF=	OPTIMIZE
    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
    OPTIONS_DEFINE=	OPT1
    OPT1_MESON_ON=	-Dopt=1
    OPT1_MESON_OFF=	-Dopt=2
    OPTIONS_DEFINE=	OPT1
    
    .include <bsd.port.options.mk>
    
    .if ${PORT_OPTIONS:MOPT1}
    MESON_ARGS+=	-Dopt=1
    .else
    MESON_ARGS+=	-Dopt=2
    .endif
    OPTIONS_DEFINE=	OPT1
    OPT1_MESON_TRUE=	test debug
    OPT1_MESON_FALSE=	optimize
    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
    OPTIONS_DEFINE=	OPT1
    OPT1_MESON_YES=	test debug
    OPT1_MESON_NO=	optimize
    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
    OPTIONS_DEFINE=	OPT1
    OPT1_MESON_ENABLED=	test
    OPT1_MESON_DISABLED=	debug
    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
    OPTIONS_DEFINE=	OPT1
    OPT1_QMAKE_ON=	-DTEST:BOOL=true
    OPT1_QMAKE_OFF=	-DPRODUCTION:BOOL=true
    OPTIONS_DEFINE=	OPT1
    
    .include <bsd.port.options.mk>
    
    .if ${PORT_OPTIONS:MOPT1}
    QMAKE_ARGS+=	-DTEST:BOOL=true
    .else
    QMAKE_ARGS+=	-DPRODUCTION:BOOL=true
    .endif
    OPTIONS_DEFINE=	OPT1 OPT2
    OPT1_IMPLIES=	OPT2
    
    OPT1_CONFIGURE_ENABLE=	opt1
    OPT2_CONFIGURE_ENABLE=	opt2
    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
    OPTIONS_DEFINE=	X11 GNOME
    OPTIONS_DEFAULT=	X11
    
    X11_USES=	xorg
    X11_USE=	xorg=xi,xextproto
    GNOME_USE=	gnome=gtk30
    GNOME_IMPLIES=	X11
    OPTIONS_DEFINE=	OPT1 OPT2
    OPT1_PREVENTS=	OPT2
    OPT1_PREVENTS_MSG=	OPT1 和 OPT2 启用冲突的选项
    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
    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 补丁冲突
    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}"
    OPTIONS_DEFINE=	OPT1 OPT2
    
    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:MOPT2}
    BIN3_BUILD=	yes
    .else
    BIN3_BUILD=	no
    .endif
    OPT_VARS=	foo="bar baz"
    OPT_VARS=	foo=	bar
    OPTIONS_DEFINE=	OPT1
    OPT1_LIB_DEPENDS=	liba.so:devel/a
    OPT1_LIB_DEPENDS_OFF=	libb.so:devel/b
    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
    OPTIONS_DEFINE=	OPT1
    OPT1_USES=	gmake
    OPT1_CFLAGS_OFF=	-DTEST
    OPTIONS_DEFINE=	OPT1
    
    .include <bsd.port.options.mk>
    
    .if ${PORT_OPTIONS:MOPT1}
    USES+=		gmake
    .else
    CFLAGS+=	-DTEST
    .endif
    ALL_TARGET=	all
    
    DOCS_ALL_TARGET=	doc
    DOCS_ALL_TARGET=	doc
    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
    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.4.源代码包文件

    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。

    通过使用 的 -t 参数检查 Port 框架和 pkg 对版本的排序:

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

    • ② < 符号表示传递给 -t 的第一个参数小于第二个参数。9.9.9 排在 9.9.9p1 前面。

    例如,在 Port Makefile 中,如 ,它通过以下方式实现:

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

    示例 7. 从 PORTVERSION 派生 DISTNAME

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

    在 中,分发文件中仅包含版本的最后一部分:

    其中,:E 是 修饰符,用于返回变量的后缀,在此示例中是 304。因此,分发文件会正确生成为 cku304-dev20.tar.gz。

    示例 8. 特殊情况 1

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

    例如在 中:

    示例 9. 特殊情况 2

    在 中,分发文件没有版本号,因此需要使用 :

    注意

    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 可以直接使用这些变量:

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

    这些值和变量定义在 中。此文件经常添加新的条目,因此在提交 Port 之前,确保检查该文件的最新版本。

    技巧

    对于任何 MASTER_SITE_FOO 变量,可以使用简写形式 FOO。例如,使用:

    如果需要 MASTER_SITE_SUBDIR,则使用:

    重要

    一些 MASTER_SITE_* 名称较长,为了便于使用,已定义了简写形式:MASTER_SITE_* 宏的简写

    宏
    简写

    5.4.2.2. Magic MASTER_SITES 宏

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

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

    也可以写成:

    表 4. 魔法 MASTER_SITES 宏

    宏
    假定子目录

    5.4.3. USE_GITHUB

    如果分发文件来自 上的特定提交或标签,而没有官方发布的文件,可以通过一种简单的方法自动设置正确的 DISTNAME 和 MASTER_SITES。

    重要

    从 2023 年 2 月 21 日起, 宣布源代码下载将稳定一年。请切换到发布的资产,如果没有发布,要求上游生成相应的资产。

    以下是可用的变量:

    表 5. USE_GITHUB 说明

    变量
    说明
    默认值

    重要

    不要使用 GH_TUPLE 来处理默认的分发文件,因为它没有默认值。

    示例 10. 简单使用 USE_GITHUB

    在为来自 GitHub 上 FreeBSD 用户的 pkg 版本 1.2.7 制作 Port 时,位于 上,Makefile 会像下面这样(为了示例做了略微简化):

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

    示例 11. 更完整地使用 USE_GITHUB

    在为来自 GitHub 上 FreeBSD 用户的 pkg 的最新版本制作 Port 时,位于 上,Makefile 会像下面这样(为了示例做了略微简化):

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

    20140411 是 GH_TAGNAME 中引用的提交的日期,而不是 Makefile 编辑的日期,也不是提交的日期。

    示例 12. 使用 USE_GITHUB 和 DISTVERSIONPREFIX

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

    它会自动将 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 中引用的提交的日期。

    这创建了一个随时间增长的版本控制方案,并且仍然处于版本 0 之前(参见 比较版本):

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

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

    如果当前版本的软件使用 Git 标签,而 Port 需要更新到一个没有标签的较新中间版本,可以使用 来找出要使用的版本:

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

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

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

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

    这创建了一个随着时间推移(实际上是随着提交增加)的版本控制方案,并且与创建 0.7.4 版本不会冲突。(参见 比较版本):

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

    5.4.3.1. 从 GitHub 获取多个文件

    USE_GITHUB 框架还支持从 GitHub 的不同位置获取多个分发文件。它的工作方式与 非常相似。

    多个值可以添加到 GH_ACCOUNT、GH_PROJECT 和 GH_TAGNAME 中。每个不同的值会分配到一个组。主值可以没有组,或者使用 :DEFAULT 组。如果值与默认值相同,可以省略(详细信息请参见 )。

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

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

    小心

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

    注意

    由于这是 DISTFILES 和 MASTER_SITES 之上的语法糖,组名必须遵循 中列出的组名限制。

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

    重要

    使用 USE_GITHUB=nodefault 时,Makefile 必须在其 中设置 DISTFILES。定义应为:

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

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

    这将从 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 不会已经存在。然后,它会执行如下操作:

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

    这与 功能相同,但使用了 GH_TUPLE:

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

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

    使用 GitHub 作为上游仓库的 Ports 有时会使用子模块。有关更多信息,请参见 。

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

    以 为例,其 GitHub 仓库为 。在根目录下有一个 文件。该文件描述了该仓库中使用的所有子模块,并列出了所需的附加仓库。该文件会告诉需要哪些附加仓库:

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

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

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

    现在已经收集到所有所需的信息,可以编写 Makefile(仅显示与 GitHub 相关的行):

    5.4.4. USE_GITLAB

    与 GitHub 类似,如果发行文件来自 或托管 GitLab 软件时,可以使用以下变量,并且可能需要设置它们。

    变量
    描述
    默认值

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

    在尝试为来自 gitlab.com 上的 accounts-sso 用户的 libsignon-glib 版本 1.14 创建 Port 时,位于 ,Makefile 的内容如下,用于获取发行文件:

    它将自动将 MASTER_SITES 设置为 并将 WRKSRC 设置为 ${WRKDIR}/libsignon-glib-e90302e342bfd27bc8c9132ab9d0ea3d8723fd03-e90302e342bfd27bc8c9132ab9d0ea3d8723fd03。

    示例 19. 更完整的使用 USE_GITLAB 的示例

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

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

    技巧

    20170906 是所引用的 GL_COMMIT 中提交的日期,而不是编辑 Makefile 的日期或提交到 FreeBSD Ports 树的日期。

    注意

    GL_SITE 的协议、Port 和网页根目录可以在同一个变量中修改。

    5.4.4.1. 从 GitLab 获取多个文件

    USE_GITLAB 框架还支持从 GitLab 和 GitLab 托管站点的不同位置获取多个分发文件。它的工作方式与 和 类似。

    可以将多个值添加到 GL_SITE、GL_ACCOUNT、GL_PROJECT 和 GL_COMMIT 中。每个不同的值分配一个组。 。

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

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

    小心

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

    注意

    由于这只是 DISTFILES 和 MASTER_SITES 的语法糖,因此组名称必须遵守 中规定的组名限制。

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

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

    这将从 gitlab.com 获取两个分发文件,从 gitlab.example.com 托管的 GitLab 获取一个。默认的一个来自 ,提交哈希为 c189207a55da45305c884fe2b50e086fcad4724b。第二个,属于 icons 组,来自 ,提交哈希为 ae7368cab1ca7ca754b38d49da064df87968ffe4。第三个来自 ,提交哈希为 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 不会提前存在。然后它会执行以下操作:

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

    这个示例与 功能上是等效的,但使用了 GL_TUPLE:

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

    5.4.5. EXTRACT_SUFX

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

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

    USES=tar[:xxx]、USES=lha 或 USES=zip 会自动根据需要设置 EXTRACT_SUFX 为最常见的归档扩展名,更多信息请参阅。如果没有设置这些,EXTRACT_SUFX 默认为 .tar.gz。

    注意

    由于 EXTRACT_SUFX 仅在 DISTFILES 中使用,因此只需设置其中之一。

    5.4.6. DISTFILES

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

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

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

    5.4.7. EXTRACT_ONLY

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

    当没有 DISTFILES 需要解压时,可以将 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 中的补丁名称旁边添加这些值,例如:

    这不会与冲突,添加分组也同样有效:

    注意

    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_] 的单词,并表示一个组的标识符。例如:

    在 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_] 范围的字符。这是因为,虽然 可以接受包含连字符的变量名,但 不允许。

    5.4.9.1. 简化信息

    本节解释了如何快速准备从不同站点和子目录下载多个分发文件和补丁的精细化获取。我们在这里描述了简化版 MASTER_SITES:n 的使用。这对于大多数场景来说已经足够了。更多详细信息请参见 。

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

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

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

    示例 22. 简化版 MASTER_SITES:n 使用(每个站点一个文件)

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

    示例 23. 简化版 MASTER_SITES:n 使用(每个站点多个文件)

    5.4.9.2. 详细信息

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

    1. 元素可以通过 :n 后缀,其中 n 是 <span class="^:">,也就是说,n 可以是任何字母数字字符串,但我们将其限制为 [a-zA-Z_][0-9a-zA-Z_]</span> 目前为止。 此外,字符串匹配是区分大小写的;也就是说,n 和 N 是不同的。

      然而,这些单词不能用于后缀化,因为它们具有特殊含义:default、all 和 ALL(它们在 项中被内部使用)。此外,DEFAULT 是一个特殊用途的单词(请查看

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

    1. 所有当前的 Ports 保持不变。只有当存在按上述语法规则附加 :n 后缀的元素时,MASTER_SITES:n 特性才会被激活,特别是在 中显示的那样。

    2. Port 目标保持不变:checksum、makesum、patch、configure、build 等。唯一的例外是 do-fetch、

    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 所需的所有文件放入该子目录中。

    它还会查看备份主站点上具有相同名称的子目录,网址为 (仅在 Makefile 中显式设置 DISTDIR 是无法实现这一点的,请使用 DIST_SUBDIR)。

    注意

    这不会影响 Makefile 中定义的 MASTER_SITES。

    SF

    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/^(<span class="0-9">\.[0-9]</span>).*/\1/}

    GNU

    ${PORTNAME}

    GNUPG

    ${PORTNAME}

    GNU_ALPHA

    ${PORTNAME}

    HORDE

    ${PORTNAME}

    LODEV

    ${PORTNAME}

    MATE

    ${PORTVERSION:C/^(<span class="0-9">\.[0-9]</span>).*/\1/}

    MOZDEV

    ${PORTNAME:tl}

    NL

    ${PORTNAME}

    QT

    archive/qt/${PORTVERSION:R}

    SAMBA

    ${PORTNAME}

    SAVANNAH

    ${PORTNAME:tl}

    SF

    ${PORTNAME:tl}/${PORTNAME:tl}/${PORTVERSION}

    GH_TUPLE

    GH_TUPLE 允许将 GH_ACCOUNT、GH_PROJECT、GH_TAGNAME 和 GH_SUBDIR 放入一个变量中。格式为 account:project:tagname:group/*subdir*。其中/`subdir 部分是可选的。当有多个 GitHub 项目需要获取时,这非常有用。

    GL_SUBDIR

    当软件需要从 ${WRKSRC} 中提取额外的分发文件时,可以使用此变量。有关更多信息,请参阅 。

    (none)

    GL_TUPLE

    GL_TUPLE 允许将 GL_SITE、GL_ACCOUNT、GL_PROJECT、GL_COMMIT 和 GL_SUBDIR 放入一个变量中,格式为 site:account:project:commit:group/subdir。其中site和

    项)。
  • 带有 :n 后缀的元素属于组 n,带有 :m 后缀的元素属于组 m,依此类推。

  • 没有后缀的元素没有分组,它们都属于特殊组 DEFAULT。任何带有 DEFAULT 后缀的元素都是冗余的,除非该元素同时属于 DEFAULT 和其他组(请参阅 5 项)。 这些示例是等效的,但第一个是首选:

  • 组不是互斥的,一个元素可以同时属于多个不同的组,一个组可以包含多个不同的元素,也可以没有元素。

  • 当一个元素同时属于多个组时,使用逗号操作符(,)。 我们可以一次列出多个组,而不是多次重复每次不同的后缀。例如,:m,n,o 表示该元素属于组 m、n 和 o。

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

  • 给定组内的所有站点按照 MASTER_SORT_AWK 排序。所有 MASTER_SITES 和 PATCH_SITES 中的组也会被排序。

  • 组语义可以在以下变量中使用: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 后缀。请参见 和 。示例 24. 在 MASTER_SITE_SUBDIR 中详细使用 MASTER_SITES:n

      • 属于 DEFAULT 组的目录 → old:n

      • 属于 NEW 组的目录 → new

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

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

      • file1 将从以下站点获取:

        • MASTER_SITE_OVERRIDE

  • 如何将 bsd.sites.mk 中的某个特殊宏分组,例如 SourceForge (SF)? 这已经尽可能简化。请参见 详细使用 MASTER_SITES:n 与 SourceForge (SF)。

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

    something.tar.gz 将从 SourceForge 中的所有站点获取。

  • 如何与 PATCH* 一起使用? 所有示例都使用了 MASTER*,但它们与 PATCH* 一样适用,正如在 简化使用 MASTER_SITES:n 与 PATCH_SITES 中所见。

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

  • fetch-list
    、
    master-sites
    和
    patch-sites
    。
    • do-fetch:部署新分组,并根据其匹配的组元素,在 MASTER_SITES 和 PATCH_SITES 中分别使用对应的分组元素,同时在 MASTER_SITE_SUBDIR 和 PATCH_SITE_SUBDIR 中使用匹配的组元素。请查看 使用逗号操作符的 MASTER_SITES:n 的详细用法。

    • 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 目标的更多信息,请参阅 。

  • 新的 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。

  • PERL_CPAN

    CPAN

    GITHUB

    GH

    GITHUB_CLOUD

    GHC

    LIBREOFFICE_DEV

    LODEV

    NETLIB

    NL

    RUBYGEMS

    RG

    APACHE_COMMONS_BINARIES

    ${PORTNAME:S,commons-,,}

    APACHE_COMMONS_SOURCE

    ${PORTNAME:S,commons-,,}

    APACHE_JAKARTA

    ${PORTNAME:S,-,/,}/source

    BERLIOS

    ${PORTNAME:tl}.berlios

    CHEESESHOP

    source/${DISTNAME:C/(.).*/\1/}/${DISTNAME:C/(.*)-[0-9].*/\1/}

    CPAN

    ${PORTNAME:C/-.*//}

    GH_ACCOUNT

    托管项目的 GitHub 用户名

    ${PORTNAME}

    GH_PROJECT

    GitHub 上的项目名称

    ${PORTNAME}

    GH_TAGNAME

    要下载的标签名称(例如 2.0.1、哈希值等)。这里使用分支名称是不正确的。也可以使用提交 ID 的哈希值来进行快照。

    ${DISTVERSIONPREFIX}${DISTVERSION}${DISTVERSIONSUFFIX}

    GH_SUBDIR

    当软件需要额外的分发文件并且这些文件需要在 ${WRKSRC} 内提取时,可以使用此变量。有关更多信息,请参见 从 GitHub 获取多个文件 的示例。

    (无)

    GL_SITE

    托管 GitLab 项目的站点名称

    https://gitlab.com/

    GL_ACCOUNT

    托管项目的 GitLab 用户的账户名

    ${PORTNAME}

    GL_PROJECT

    GitLab 上的项目名称

    ${PORTNAME}

    GL_COMMIT

    要下载的提交哈希值,必须是完整的 160 位、40 字符的十六进制 sha1 哈希值。对于 GitLab,这是一个必需的变量。

    (none)

    pkg-version(8)
    dns/bind99
    comms/kermit
    make(1)
    audio/libworkman
    comms/librs232
    DIST_SUBDIR
    Mk/bsd.sites.mk
    GitHub
    GitHub
    https://github.com/freebsd/pkg/
    https://github.com/freebsd/pkg/
    使用
    pkg-version\(8)
    git-describe(1)
    使用
    pkg-version\(8)
    从多个位置获取多个分发文件或补丁文件
    USE_GITHUB 描述
    从多个位置获取多个分发文件或补丁文件
    顶部块
    使用 USE_GITHUB 获取多个分发文件
    git-submodule(1)
    finance/moneymanagerex
    https://github.com/moneymanagerex/moneymanagerex/
    .gitmodules
    gitlab.com
    https://gitlab.com/accounts-sso/libsignon-glib/
    gitlab.com
    从多个位置获取多个分发文件或补丁文件
    从 GitLab 获取多个文件
    USE_GITLAB 描述
    从多个位置获取多个分发文件或补丁文件
    https://gitlab.com/foo/foo
    https://gitlab.example.com:9434/gitlab/bar/foo-icons
    https://gitlab.com/bar/foo-contrib
    使用 USE_GITLAB 获取多个分发文件
    使用 USES 宏
    主站分组功能
    make(1)
    sh(1)
    详细信息
    ii
    第 7 项
    http://distcache.FreeBSD.org

    SOURCEFORGE

    3
    MASTER_SITES=	alpha
    MASTER_SITES=	alpha:DEFAULT
    MASTER_SITES=	alpha alpha:SOME_SITE
    MASTER_SITES=	alpha:DEFAULT alpha:SOME_SITE
    MASTER_SITES=	alpha:SOME_SITE,DEFAULT
    MASTER_SITES=	alpha:DEFAULT,SOME_SITE
    MASTER_SITES=	http://site1/ SF/something/1.0:sourceforge,TEST
    DISTFILES=	something.tar.gz:sourceforge
    PATCH_SITES=	[http://site1/](http://site1/) [http://site2/\:test](http://site2/:test)
    PATCHFILES=	patch1\:test
    % pkg version -t 9.9.9 9.9.9.p1
    > ①
    % pkg version -t 9.9.9 9.9.9p1
    < ②
    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=	[email protected]
    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
    PORTNAME=	kermit
    PORTVERSION=	9.0.304
    CATEGORIES=	comms ftp net
    MASTER_SITES=	ftp://ftp.kermitproject.org/kermit/test/tar/
    DISTNAME=	cku${PORTVERSION:E}-dev20
    PORTNAME=       libworkman
    PORTVERSION=    1.4
    CATEGORIES=     audio
    MASTER_SITES=   LOCAL/jim
    DISTNAME=       ${PORTNAME}-1999-06-20
    PORTNAME=       librs232
    PORTVERSION=    20160710
    CATEGORIES=     comms
    MASTER_SITES=   http://www.teuniz.net/RS-232/
    DISTNAME=       RS-232
    DIST_SUBDIR=	${PORTNAME}-${PORTVERSION}
    MASTER_SITES=	GNU/make
    MASTER_SITES=		${MASTER_SITE_GNU}
    MASTER_SITE_SUBDIR=	make
    MASTER_SITES=	FOO
    MASTER_SITES=	FOO/bar
    MASTER_SITES=	SF
    MASTER_SITES=	SF/stardict/WyabdcRealPeopleTTS/${PORTVERSION}
    MASTER_SITES=	SF
    MASTER_SITE_SUBDIR=	stardict/WyabdcRealPeopleTTS/${PORTVERSION}
    PORTNAME=	pkg
    DISTVERSION=	1.2.7
    
    USE_GITHUB=	yes
    GH_ACCOUNT=	freebsd
    PORTNAME=	pkg-devel
    DISTVERSION=	1.3.0.a.20140411
    
    USE_GITHUB=	yes
    GH_ACCOUNT=	freebsd
    GH_PROJECT=	pkg
    GH_TAGNAME=	6dbb17b
    PORTNAME=	foo
    DISTVERSIONPREFIX=	v
    DISTVERSION=	1.0.2
    
    USE_GITHUB=	yes
    PORTNAME=	bar
    DISTVERSION=	g20140411
    
    USE_GITHUB=	yes
    GH_TAGNAME=	c472d66b
    % pkg version -t g20140411 0
    <
    % git describe --tags f0038b1
    v0.7.3-14-gf0038b1
    PORTNAME=	bar
    DISTVERSIONPREFIX=  v
    DISTVERSION=	0.7.3-14
    DISTVERSIONSUFFIX=  -gf0038b1
    
    USE_GITHUB=	yes
    % pkg version -t 0.7.3 0.7.3.14
    <
    % pkg version -t 0.7.3.14 0.7.4
    <
    % git describe --tags c66c71d
    v0.7.3
    
    % git describe --tags --long c66c71d
    v0.7.3-0-gc66c71d
    USE_GITHUB=	nodefault
    DISTFILES=    ${DISTNAME}${EXTRACT_SUFX}
    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}
    post-extract:
          @${MV} ${WRKSRC_icons} ${WRKSRC}/ext/icons
    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}
    [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
    [...]
    % 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)
    [...]
    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 \
    		[...]
    PORTNAME=	libsignon-glib
    DISTVERSION=	1.14
    
    USE_GITLAB=	yes
    GL_ACCOUNT=	accounts-sso
    GL_COMMIT=	e90302e342bfd27bc8c9132ab9d0ea3d8723fd03
    PORTNAME=	foobar
    DISTVERSION=	g20170906
    
    USE_GITLAB=	yes
    GL_SITE=	https://gitlab.example.com
    GL_ACCOUNT=	foo
    GL_PROJECT=	bar
    GL_COMMIT=	9c1669ce60c3f4f5eb43df874d7314483fb3f8a6
    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}
    post-extract:
            @${MV} ${WRKSRC_icons} ${WRKSRC}/ext/icons
    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}
    DISTNAME=	foo
    EXTRACT_SUFX=	.tar.gzip
    DISTFILES=	source1.tar.gz source2.tar.gz
    DISTFILES=	source.tar.gz manual.html
    EXTRACT_ONLY=	source.tar.gz
    EXTRACT_ONLY=
    PATCHFILES=	patch1 patch2:-p1
    PATCHFILES=	patch2:-p1:source2
    DISTFILES=	alpha:0 beta:1
    MASTER_SITES=	ftp://ftp1.example.com/:source1 \
    		http://www.example.com/:source2
    DISTFILES=	source1.tar.gz:source1 \
    		source2.tar.gz:source2
    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

    http://site1/directory/

  • http://site2/

  • http://site7/

  • MASTER_SITE_BACKUP

  • file2 将与 file1 完全相同地获取,因为它们属于相同的组

    • MASTER_SITE_OVERRIDE

    • http://site1/directory-trial:1/

    • http://site1/directory-one/

    • MASTER_SITE_BACKUP

  • file3 将从以下站点获取:

    • MASTER_SITE_OVERRIDE

    • http://site3/

    • MASTER_SITE_BACKUP

  • file4 将从以下站点获取:

    • MASTER_SITE_OVERRIDE

    • http://site4/

    • http://site5/

    • MASTER_SITE_BACKUP

  • file5 将从以下站点获取:

    • MASTER_SITE_OVERRIDE

    • MASTER_SITE_BACKUP

  • file6 将从以下站点获取:

    • MASTER_SITE_OVERRIDE

    • http://site8/

    • MASTER_SITE_BACKUP

  • subdir` 部分是可选的。当有多个 GitLab 项目需要获取时,它非常有用。
    详细使用 MASTER_SITES:n 在 MASTER_SITE_SUBDIR 中
    详细使用 MASTER_SITES:n 与逗号操作符
    http://site1/directory-trial:1/
    http://site1/directory-one/
    第 B 项
    从 GitLab 获取多个文件

    5.2.命名

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

    5.2.1. PORTNAME

    将 PORTNAME 设置为软件的基础名称。它作为 FreeBSD 包的基础名称,并用于 DISTNAME。

    重要

    包名称必须在整个 Ports 树中唯一。确保 PORTNAME 不被现有的 Port 使用,并且没有其他 Port 使用相同的 PKGBASE。如果该名称已被使用,可以添加 。

    5.2.2. 版本,DISTVERSION 或 PORTVERSION

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

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

    重要

    一次只能设置 PORTVERSION 和 DISTVERSION 其中一个。

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

    技巧

    在更新 Port 时,可以使用 的 -t 参数检查新版本是否大于或小于之前的版本。请参阅 。

    示例 1. 使用 比较版本

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

    • ① 1.2 在 1.3 之前。

    • ② 1.2 和 1.2 相等,因为它们版本相同。

    • ③ 1.2 和 1.2.0

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

    表 1. DISTVERSION 和派生的 PORTVERSION 示例

    DISTVERSION
    PORTVERSION

    示例 2. 使用 DISTVERSION

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

    这将生成 PORTVERSION 为 1.2.4。

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

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

    如果版本是 v1.2-4:

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

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

    或者同时使用这两者,例如 nekoto-1.2-4_RELEASE:

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

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

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

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

    这两者都会生成 PORTVERSION 为 1.2.p4,它在 1.2 之前。 可用于验证这一点:

    示例 5. 不使用 DISTVERSION 当版本包含字母表示 "Patch Level"

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

    在这种情况下,使用 DISTVERSION 是不可行的,因为它会生成 1.2.p4 的版本,这将排在 1.2 之前,而不是之后。 将验证这一点:

    • ① 1.2 在 1.2.p4 之后,这在这种情况下是 错误的。

    • ② 1.2 在 1.2p4 之前,这是所需的。

    对于一些更高级的设置 PORTVERSION 示例,当软件的版本管理方式与 FreeBSD 的版本方案不兼容,或者当分发文件本身不包含版本时,参见 。

    5.2.3. PORTREVISION 和 PORTEPOCH

    # 5.2.3.1. PORTREVISION

    PORTREVISION 是一个单调递增的值,每次 DISTVERSION 增加时都会重置为 0,通常是在有新的官方供应商发布版本时。如果 PORTREVISION 非零,则该值会附加到包名中。PORTREVISION 的更改会被自动化工具(如 )用于确定新包是否可用。

    每次对 Ports 进行更改,且该更改以某种方式影响生成的包时,都必须增加 PORTREVISION。这包括仅影响具有非默认 的包的更改。

    以下是需要增加 PORTREVISION 的示例:

    • 添加补丁以修复安全漏洞、错误或为 Ports 添加新功能。

    • 更改 Ports Makefile 以启用或禁用包中的编译时选项。

    • 更改包的打包清单或安装时的行为。例如,修改生成初始数据的脚本,如 主机密钥。

    • Ports 的共享库依赖项版本更新(在这种情况下,用户在安装依赖项的新版本后尝试安装旧包将失败,因为它会查找旧的 libfoo.x 而不是 libfoo.(x+1))。

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

    • 对 Ports 骨架的样式更改,没有影响最终包的功能。

    • 更改 MASTER_SITES 或其他 Ports 的功能性更改,不会影响生成的包。

    • 对分发文件进行微小的补丁,如拼写错误修正,这些不重要到需要用户进行升级。

    • 构建修复,使得原本无法编译的包变得可编译。只要这些更改不会在以前能够构建的其他平台上引入功能性变化。由于 PORTREVISION

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

    注意

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

    # 5.2.3.2. PORTEPOCH

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

    技巧

    版本号比较的结果并不总是显而易见的。可以使用 pkg version(请参见 )来测试两个版本号字符串的比较。例如:

    > 输出表示版本 0.031 被认为大于版本 0.29,这一点可能对 Ports 维护者来说并不显而易见。

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

    错误地丢弃或重置 PORTEPOCH 会导致不断的麻烦。如果上述讨论不够清晰,请参考 。

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

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

    # 5.2.3.3. PORTREVISION 和 PORTEPOCH 使用示例

    gtkmumble Ports,版本 0.10,已提交到 Ports:

    PKGNAME 变为 gtkmumble-0.10。

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

    PKGNAME 变为 gtkmumble-0.10_1

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

    PKGNAME 变为 gtkmumble-0.2,1

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

    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}。确保它符合我们的。特别地,PORTVERSION 中不允许使用连字符(-)。此外,如果包名中有 language- 或 -compiled.specifics 部分(见下文),则分别使用 PKGNAMEPREFIX 和 PKGNAMESUFFIX,不要将它们作为 PORTNAME 的一部分。

    5.2.5. 包命名规范

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

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

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

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

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

    语言- 部分由 PKGNAMEPREFIX 设置。

    名称 确保 Ports 的名称和版本清晰地分开并放入 PORTNAME 和 DISTVERSION 中。PORTNAME 中包含版本部分的唯一原因是如果上游发行版确实是按该方式命名的,例如 或 Ports。否则,PORTNAME 中不能包含任何版本特定的信息。多个 Ports 使用相同的 PORTNAME 是很常见的,就像 Ports 那样;在这种情况下,使用 PKGNAMEPREFIX 和 PKGNAMESUFFIX 值来区分不同的版本(以及不同的索引条目)。

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

    -编译特性 如果 Ports 可以通过不同的 来构建(通常是某个 Ports 家族的目录名称的一部分),那么 -compiled.specifics 部分表示已编译的默认值。连字符是可选的。示例包括纸张大小和字体单位。

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

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

    这样做的目的是为了便于通过版本字符串对 Ports 进行排序。特别地,确保版本号的各个部分始终由句点分隔,如果日期是版本字符串的一部分,则使用 dyyyy.mm.dd 格式,而不是 dd.mm.yyyy 或不符合 Y2K 的 yy.mm.dd 格式。如果版本前缀是字母,尤其是 d(表示日期),这样可以防止版本号低于 yyyy 的发布。

    重要

    包名必须在整个 Ports 树中唯一,检查是否已经存在相同的 PORTNAME,如果存在,则添加 之一。

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

    表 2. 包命名示例

    发行版名称
    PKGNAMEPREFIX
    PORTNAME
    PKGNAMESUFFIX
    DISTVERSION
    PORTVERSION
    原因或备注

    如果原始源代码中完全没有版本信息,并且原作者不太可能发布另一个版本,则将版本字符串设置为 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 上浏览成千上万的包时更轻松。请查看 ,选择适合该 Port 的分类。

    该列表还决定了 Port 在 Ports 树中的导入位置。如果有多个分类,Port 文件必须放在第一个分类名称的子目录中。更多关于如何选择正确分类的讨论,请参见 。

    5.3.2. 当前分类列表

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

    注意

    对于非虚拟分类,每个子目录的 Makefile 中会有一行描述,描述该分类的作用。

    分类
    说明
    备注

    5.3.3. 选择正确的分类

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

    • 第一个分类必须是物理分类(见)。这是为了使打包工作正常进行。虚拟分类和物理分类可以在之后混合使用。

    • 语言特定的分类总是优先。例如,如果该 Port 安装的是日语 X11 字体,则 CATEGORIES 行应写为 japanese x11-fonts。

    • 特定的分类应列在不太具体的分类之前。例如,一个 HTML 编辑器应该列为 www editors,而不是反过来。并且,如果 Port 属于 irc、mail、news、security 或 www 中的任何一个分类时,不要列出 net,因为 net 已经隐含包含在内。

    如果分类不明确,请在在 bug 数据库中加入评论,供我们讨论在导入前进行讨论。作为提交者,请向 发送通知,以便我们先进行讨论。很多时候,新的 Ports 被导入到错误的分类中,之后又立即被移动。

    5.3.4. 提议新分类

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

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

    这样做的原因是,这样的变更会给 带来相当大的工作量,特别是那些追踪 Ports 变化的用户。此外,提议的分类更改往往会引发争议。(也许这是因为对于分类何时“过大”以及分类是否应便于浏览(因此理想的分类数量是多少)等问题,缺乏明确的共识,等等。)

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

    1. 在 上提议新分类。提供详细的理由,说明现有分类不足之处,并列出拟迁移到该分类的现有 Ports。(如果有在 Bugzilla 中待处理的符合该分类的新 Ports,也请列出。)如果你是维护者和/或提交者,请提及这一点,因为这可能有助于你的提议。

    2. 参与讨论。

    3. 如果看起来有支持这一想法的声音,请提交一个 PR,包含新分类的理由和需要迁移的现有 Ports 列表。理想情况下,PR 还应包括以下补丁:

      • 新 Ports 的 Makefile,在它们被复制到新位置后

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

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

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

    MASTER_SITE_SUBDIR=	old:n new/:NEW
    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
    http://site1/directory/
    http://site2/
    http://site7/
    http://site6/
    http://site7/
    http://site8/directory-one/
    相等,因为零表示没有版本。
  • ④ 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 之前的版本。

  • 对 Ports 分发文件进行的无声更改,且这些更改具有重要的功能差异。例如,对 distinfo 进行的更改,未更改 DISTVERSION,但通过 diff -ru 命令对旧版和新版进行比较,代码中存在非平凡的差异。

  • 更改 MAINTAINER。

  • 反映了包的内容,如果包之前无法构建,则不需要增加
    PORTREVISION
    来标记更改。

    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 字体包

    astro

    天文学相关的 Port。

    audio

    音频支持。

    benchmarks

    基准测试工具。

    biology

    生物学相关的软件。

    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。

    finance

    与货币、金融相关的应用程序。

    french

    法语语言支持。

    ftp

    FTP 客户端和服务器工具。

    如果 Port 同时支持 FTP 和 HTTP,应将其放入 ftp 分类,并加上 www 作为第二分类。

    games

    游戏。

    geography*

    与地理相关的软件。

    german

    德语语言支持。

    gnome*

    来自 项目的 Port。

    gnustep*

    与 GNUstep 桌面环境相关的软件。

    graphics

    图形工具。

    hamradio*

    业余无线电相关软件。

    haskell*

    与 Haskell 语言相关的软件。

    hebrew

    希伯来语语言支持。

    hungarian

    匈牙利语语言支持。

    irc

    互联网中继聊天工具。

    japanese

    日语语言支持。

    java

    与 Java™ 语言相关的软件。

    java 分类不应是 Port 唯一的分类。除非是直接与 Java 语言相关的 Port,否则不建议使用 java 作为 Port 的主要分类。

    kde*

    来自 项目的 Port(通用)。

    kde-applications*

    来自 项目的应用程序。

    kde-frameworks*

    项目的 Qt 编程附加库。

    kde-plasma*

    来自 项目的桌面环境。

    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*

    来自 的各种程序。

    polish

    波兰语语言支持。

    ports-mgmt

    用于管理、安装和开发 FreeBSD Ports 和包的工具。

    portuguese

    葡萄牙语语言支持。

    print

    打印软件。

    包括桌面出版工具(如预览器等)。

    python*

    与 语言相关的软件。

    ruby*

    与 语言相关的软件。

    rubygems*

    包的 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*

    与 桌面环境相关的 Port。

    zope*

    支持。

    x11 仅在主要分类为自然语言时作为二级分类使用。特别是,不要将 x11 放在 X 应用程序的分类行中。

  • Emacs 模式应放置在与其支持的应用程序相同的 Ports 分类中,而不是放在 editors 中。例如,用于编辑某编程语言源文件的 Emacs 模式应放在 lang 分类下。

  • 安装可加载内核模块的 Ports 也应在 CATEGORIES 行中包含虚拟分类 kld。这可以通过添加 USES=kmod 自动处理。

  • misc 不应与任何其他非虚拟分类一起使用。如果 CATEGORIES 中出现了 misc 和其他分类,那就意味着可以安全地删除 misc,并将 Port 只放在另一个子目录下。

  • 如果该 Port 确实不属于任何其他分类,则将其放入 misc。

  • 新分类的 Makefile

  • 旧分类的 Makefile

  • 依赖旧 Ports 的 Makefile

  • (额外的奖励,提供根据提交者指南中程序要求需要更改的其他文件)

  • 由于它影响 Ports 基础设施,并涉及迁移和补丁许多 Ports,可能还需要在构建集群上运行回归测试,因此请将 PR 分配给 Ports 管理团队 [email protected]。

  • 如果该 PR 获得批准,提交者将需要按照 提交者指南 中概述的其余程序进行操作。

  • 0.7.1d

    0.7.1.d

    10Alpha3

    10.a3

    3Beta7-pre2

    3.b7.p2

    8:f_17

    8f.17

    mule-2.2.2

    (空)

    mule

    (空)

    2.2.2

    无需更改

    mule-1.0.1

    accessibility

    帮助残障用户的 Port。

    afterstep*

    支持 AfterStep 窗口管理器的 Port。

    arabic

    阿拉伯语语言支持。

    archivers

    压缩与归档工具。

    PKGNAMEPREFIX 或 PKGNAMESUFFIX
    pkg-version(8)
    使用
    pkg-version(8) 比较版本
    pkg-version(8)
    pkg-version(8)
    pkg-version(8)
    DISTNAME
    pkg-version(8)
    选项
    ssh(1)
    pkg-version(8)
    FreeBSD ports 邮件列表
    良好包名指南
    textproc/libxml2
    japanese/kinput2-freewnn
    www/apache*
    硬编码默认值
    PKGNAMEPREFIX 或 PKGNAMESUFFIX
    当前的分类列表
    下文
    上文
    提交 Port 时
    FreeBSD Ports 邮件列表
    提交者和用户
    FreeBSD Ports 邮件列表

    (空)

    % 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
    < ⑥
    PORTNAME=   nekoto
    DISTVERSION=	1.2-4
    PORTNAME=   nekoto
    DISTVERSIONPREFIX=  v
    DISTVERSION=	1_2_4
    PORTNAME=   nekoto
    DISTVERSIONPREFIX=  nekoto-
    DISTVERSION=	1.2_4
    PORTNAME=   nekoto
    DISTVERSION=	1.2-4
    DISTVERSIONSUFFIX=  _RELEASE
    PORTNAME=   nekoto
    DISTVERSIONPREFIX=  nekoto-
    DISTVERSION=	1.2-4
    DISTVERSIONSUFFIX=  _RELEASE
    PORTNAME=   nekoto
    DISTVERSION=	1.2-pre4
    PORTNAME=   nekoto
    DISTVERSION=	1.2p4
    % pkg version -t 1.2.p4 1.2
    < 
    PORTNAME=   nekoto
    PORTVERSION=	1.2p4
    % pkg version -t 1.2 1.2.p4
    > ①
    % pkg version -t 1.2 1.2p4
    < ②
    % pkg version -t 0.031 0.29
    >
    PORTNAME=	gtkmumble
    DISTVERSION=	0.10
    PORTNAME=	gtkmumble
    DISTVERSION=	0.10
    PORTREVISION=	1
    PORTNAME=	gtkmumble
    DISTVERSION=	0.2
    PORTEPOCH=	1
    PORTNAME=	gtkmumble
    DISTVERSION=	0.3
    PORTEPOCH=	1
    GNOME
    KDE
    KDE
    KDE
    KDE
    Plan9
    Python
    Ruby
    RubyGems
    Xfce
    Zope

    第 17 章 使用 USES 宏

    17.1. USES 的介绍

    USES 宏简化了声明 Ports 依赖和设置的过程。它们可以添加依赖关系、修改构建行为、向包添加元数据等,所有这些都通过选择简单的预设值来完成。

    本章的每个部分都描述了 USES 的一个可能值及其可能的参数。参数在值后通过冒号(:)附加。多个参数之间用逗号(,)分隔。

    示例 1. 使用多个值

    示例 2. 添加一个参数

    示例 3. 添加多个参数

    示例 4. 综合使用

    17.2. 7z

    可能的参数:(无),p7zip,partial

    使用 代替 提取文件,并将 EXTRACT_SUFX 设置为 .7z。如果基本系统中的 7z 无法提取文件,p7zip 选项会强制依赖于来自 的 7z。如果使用 partial 选项,则 EXTRACT_SUFX 不会改变,这对于主分发文件没有 .7z 扩展名时非常有用。

    17.3. ada

    可能的参数:(无),6,12,(run)

    依赖一个支持 Ada 的编译器,并相应地设置 CC。默认使用来自 Ports 的 gcc6-aux。

    17.4. angr

    可能的参数:binaries,nose

    为需要 的 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

    为依赖 的 Ports 提供支持。

    如果存在 env 参数,则该 Port 不依赖 ,但需要设置一些 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

    17.8. azurepy

    可能的参数:(无)

    为 py-azure* Ports 提供支持。移除 azure 命名空间并清理常见文件。

    17.9. blaslapack

    可能的参数:(无),atlas,netlib(默认),gotoblas,openblas

    添加对 Blas / Lapack 库的依赖。

    17.10. bdb

    可能的参数:(无),5(默认),18

    添加对 Berkeley DB 库的依赖。默认为 。在使用 :18 参数时,也可以依赖于 。可以声明一个接受值的范围,:5+ 会查找安装的最高版本,如果没有其他版本则回退到 5。INVALID_BDB_VER 可用于指定与此 Port 不兼容的版本。该框架向 Port 暴露以下变量:

    BDB_LIB_NAME:Berkeley DB 库的名称。例如,使用 时,它包含 db-5.3。

    BDB_LIB_CXX_NAME:Berkeley DBC++ 库的名称。例如,使用 时,它包含 db_cxx-5.3。

    BDB_INCLUDE_DIR:Berkeley DB 包含目录的位置。例如,使用 时,它包含 ${LOCALBASE}/include/db5。

    BDB_LIB_DIR:Berkeley DB 库目录的位置。例如,使用 时,它包含 ${LOCALBASE}/lib。

    BDB_VER:检测到的 Berkeley DB 版本。例如,如果使用 USES=bdb:5+ 并安装了 Berkeley DB 18,则它包含 18。

    重要

    已弃用并且不再支持。任何 Port 都不得使用它

    17.11. bison

    可能的参数:(无),build,run,both

    使用 。默认情况下,未指定参数或指定 build 参数时,表示 bison 是构建时依赖;run 表示运行时依赖;both 表示同时是构建时和运行时依赖。

    17.12. budgie

    可能的参数:(无)

    为 Budgie 桌面环境提供支持。使用 USE_BUDGIE 选择 Port 所需的组件。有关更多信息,请参见 。

    17.13. cabal

    重要

    不应为 Haskell 库创建 Port,详情见 。

    可能的参数:(无),hpack,nodefault

    设置用于构建 Haskell 软件的默认值和目标,使用 Cabal。添加对 Haskell 编译器 Port()的构建依赖。如果 BUILD_DEPENDS 变量中已经列出了其他版本的 GHC(例如 ),则使用该版本。如果提供了 hpack 参数,则添加对 的构建依赖,并在配置步骤中调用 hpack 生成 .cabal 文件。如果提供了 nodefault 参数,框架将不会尝试从 Hackage 拉取主分发文件。如果存在 USE_GITHUB 或 USE_GITLAB,则此参数会隐式添加。

    框架提供以下变量:

    CABAL_REVISION:Haskell 包在 Hackage 上可能有修订版本。将此选项设置为整数以拉取修订后的包描述。

    USE_CABAL:如果软件使用 Haskell 依赖项,则在此变量中列出它们。每个项目应以 packagename-0.1.2 的形式列出。依赖项也可以有修订版本,修订版本在 _ 符号后指定。支持自动生成依赖项列表,详情见 。

    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 应用程序。更多信息请参见 。

    17.15. charsetfix

    可能的参数:(无)

    防止 Port 安装 charset.alias。该文件必须仅由 安装。如果 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:依赖 。

    USE_ASDF_FASL:依赖 devel/cl-asdf-<FASL_TARGET>。

    USE_CCL:依赖 ;当 FASL_TARGET=ccl 时,隐式依赖。

    USE_CLISP:依赖 ;当 FASL_TARGET=clisp 时,隐式依赖。

    USE_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 并生成构建系统。

    默认情况下,执行的是源代码外构建,将源代码中的构建产物与源代码分离。使用 insource 参数时,将执行源代码内构建。该参数应仅作为例外,在常规的源代码外构建无法工作时使用。

    默认情况下,使用 Ninja()进行构建。在某些情况下,这可能无法正确工作。使用 noninja 参数时,构建将使用常规的 make。只有当基于 Ninja 的构建不工作时,才应使用此参数。

    使用 run 参数时,除了构建依赖外,还会注册一个运行时依赖。

    使用 testing 参数时,将添加一个测试目标,该目标使用 CTest。当运行测试时,Port 将为测试重新配置并重新构建。

    有关更多信息,请参见 。

    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:默认编译器版本的前两位数字。

    17.19. cpe

    可能的参数:(无)

    在包清单中包含 Common Platform Enumeration (CPE) 信息,以 CPE 2.3 格式的字符串表示。有关详细信息,请参见 。要将 CPE 信息添加到 Port,请按照以下步骤操作:

    1. 通过使用 NVD 的 或在 中搜索软件产品的官方 CPE 条目(警告,此文件为非常大的 XML 文件)。切勿自行编造 CPE 数据。

    2. 将 cpe 添加到 USES 中,并使用 make -V CPE_STR 检查结果,确保它与 CPE 字典条目一致。逐步调整直到 make -V CPE_STR 正确。

    3. 如果产品名称(第二个字段,默认为 PORTNAME

    17.20. cran

    可能的参数:(无),auto-plist,compiles

    使用综合 R 存档网络。指定 auto-plist 以自动生成 pkg-plist。如果 Port 包含需要编译的代码,请指定 compiles。

    17.21. desktop-file-utils

    可能的参数:(无)

    使用来自 的 update-desktop-database。在不干扰 Port Makefile 中任何其他安装后步骤的情况下,将运行额外的安装后步骤。会在 plist 中添加一行 。仅在 Port 提供包含 MimeType 条目的 .desktop 文件时使用此宏。

    17.22. desthack

    可能的参数:(无)

    更改 GNU configure 的行为,以便在原始软件不支持 DESTDIR 时正确处理。

    17.23. display

    可能的参数:(无),ARGS

    设置虚拟显示环境。如果环境变量 DISPLAY 未设置,则会将 Xvfb 添加为构建依赖,并将 CONFIGURE_ENV 扩展为当前运行的 Xvfb 实例的 Port 号。ARGS 参数默认值为 install,控制何时启动和停止虚拟显示。

    17.24. dos2unix

    可能的参数:(无)

    Port 中包含需要转换为 Unix 格式的 DOS 行结束符。可以设置多个变量来控制哪些文件将被转换。默认情况下,将转换 所有 文件,包括二进制文件。有关示例,请参见 。

    • DOS2UNIX_REGEX:根据正则表达式匹配文件名。

    • DOS2UNIX_FILES:匹配字面文件名。

    • DOS2UNIX_GLOB:根据 glob 模式匹配文件名。

    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

    添加对 的依赖。它允许通过使用 make.conf 中的 DEFAULT_VERSIONS 来透明地依赖 rust 或 legacy 版本。例如,要使用传统版本,可以在 DEFAULT_VERSIONS+=ebur128=legacy 中设置。

    当不使用任何参数时,行为与提供 lib 参数时相同。其余参数提供相应的依赖类别。

    17.27. eigen

    可能的参数:2,3,build(默认),run

    添加对 的依赖。

    17.28. electronfix

    可能的参数:31,32,33

    为容易移植以二进制形式分发的 Electron 应用程序提供支持。根据使用的参数,添加对 ,,或 的构建和运行时依赖。

    该框架提供以下变量,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

    featurelist 的格式描述见 。

    17.30. elixir

    可能的参数:(无)

    为使用 的 Port 提供支持。添加对 的构建和运行时依赖。

    框架提供的变量:

    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

    为 添加构建和运行时依赖。根据参数不同,添加额外的构建依赖。enc 添加对 的依赖,rebar 添加对 的依赖,rebar3 添加对 的依赖。

    此外,Port 可以使用以下变量:

    • ERL_APP_NAME:Erlang 应用程序名称,安装在 Erlang 的 lib 目录中(去掉版本)

    • ERL_APP_ROOT:此 Erlang 应用程序的根目录

    • REBAR_CMD:rebar 命令的路径

    17.33. fakeroot

    可能的参数:(无)

    更改构建系统的一些默认行为,以允许以用户身份安装。有关 fakeroot 的更多信息,请参见 。

    17.34. fam

    可能的参数:(无),fam,gamin

    使用文件修改监视器作为库依赖,可以选择使用 或 。最终用户可以设置 WITH_FAM_SYSTEM 来指定其首选项。

    17.35. firebird

    可能的参数:(无),25

    添加对 Firebird 数据库客户端库的依赖。

    17.36. fonts

    可能的参数:(无),fc,fontsdir(默认),none

    添加一个运行时依赖,所需工具用于注册字体。根据不同的参数,添加 @fc ${FONTSDIR} 行,@fontsdir ${FONTSDIR} 行,或者如果参数是 none 则不添加任何行到 plist。FONTSDIR 默认为 ${PREFIX}/share/fonts/${FONTNAME},FONTNAME 默认为 ${PORTNAME}。将 FONTSDIR 添加到 PLIST_SUB 和 SUB_LIST。

    17.37. fortran

    可能的参数:gcc(默认)

    使用 GNU Fortran 编译器。

    17.38. fpc

    可能的参数:(无),run

    为基于 Free Pascal 的 Port 提供支持。它将安装 Free Pascal 编译器和单元。

    添加对 的构建依赖。

    如果指定了 run 参数,则还会添加运行时依赖。

    17.39. fuse

    可能的参数:2(默认),3

    该 Port 将依赖 FUSE 库,并根据 FreeBSD 的版本处理对内核模块的依赖。

    17.40. gem

    可能的参数:(无),noautoplist

    处理 RubyGems 的构建。如果使用 noautoplist,则不会自动生成 packing list。

    这意味着需要使用 USES=ruby。

    17.41. gettext

    可能的参数:(无)

    已弃用。将同时包含 gettext-runtime 和 gettext-tools。

    17.42. gettext-runtime

    可能的参数:(无),lib(默认),build,run

    使用 devel/gettext-runtime。默认情况下,未指定参数或使用 lib 参数时,会添加对 libintl.so 的库依赖。build 和 run 参数分别表示构建时和运行时依赖 gettext。

    17.43. gettext-tools

    可能的参数:(无),build(默认),run

    使用 devel/gettext-tools。默认情况下,未指定参数或使用 build 参数时,会注册构建时依赖 msgfmt。使用 run 参数时,注册运行时依赖。

    17.44. ghostscript

    可能的参数:*X*,build,run,nox11

    可以使用特定版本 X。可选版本有 7,8,9,以及 agpl(默认)。nox11 表示需要使用 -nox11 版本的 Port。build 和 run 分别会添加构建时和运行时的 Ghostscript 依赖。默认情况下,两者都会添加。

    17.45. 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.46. gmake

    可能的参数:(无)

    使用 作为构建时依赖,并设置环境以使用 gmake 作为构建的默认 make。

    17.47. gnome

    可能的参数:(无)

    提供一种简便的方式来依赖 GNOME 组件。组件应列在 USE_GNOME 中。可用的组件有:

    • atk

    • atkmm

    • cairo

    • cairomm

    默认依赖是构建时和运行时依赖,可以通过 :build 或 :run 来更改。例如:

    有关更多信息,请参阅 。

    17.48. go

    重要

    不应为 Go 库创建 Ports,更多信息请参阅 。

    可能的参数:(无),N.NN,N.NN-devel,modules,no_targets,run

    设置用于构建 Go 软件的默认值和目标。添加对 Go 编译器 Port 的构建依赖,Port 维护者可以设置所需的版本。默认情况下,构建是在 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_TESTFLAGS 要传递给 go test 的额外构建参数。

    有关使用示例,请参阅 。

    17.49. gperf

    可能的参数:(无)

    如果 gperf 不在基本系统中,添加对 的构建时依赖。

    17.50. grantlee

    可能的参数:5,selfbuild

    处理对 Grantlee 的依赖。指定 5 以依赖基于 Qt5 的版本,。selfbuild 用于 来获取其版本号。

    17.51. groff

    可能的参数:build,run,both

    如果基本系统中没有 groff,则注册对 的依赖。

    17.52. gssapi

    可能的参数:(无),base(默认),heimdal,mit,flags,bootstrap

    处理 GSS-API 消费者所需的依赖项。仅提供 Kerberos 机制的库。默认情况下,或设置为 base,使用基本系统中的 GSS-API 库。也可以设置为 heimdal 来使用 ,或设置为 mit 来使用 。

    当本地 Kerberos 安装不在 LOCALBASE 中时,请设置 HEIMDAL_HOME(用于 heimdal)或 KRB5_HOME(用于 krb5)到 Kerberos 安装的位置。

    这些变量会被导出供 Port 使用:

    • GSSAPIBASEDIR

    • GSSAPICPPFLAGS

    • GSSAPIINCDIR

    flags 选项可以与 base、heimdal 或 mit 一起使用,以自动将 GSSAPICPPFLAGS、GSSAPILDFLAGS 和 GSSAPILIBS 添加到 CFLAGS、LDFLAGS 和 LDADD 中。例如,使用 base,flags。

    bootstrap 选项是一个仅供 和 使用的特殊前缀。例如,使用 bootstrap,mit。

    示例 6. 常见用法

    17.53. gstreamer

    可能的参数:(无)

    提供一种简便的方法来依赖 GStreamer 组件。组件应列在 USE_GSTREAMER 中。可用的组件有:

    • a52dec

    • aalib

    • amrnb

    • amrwbdec

    17.54. guile

    可能的参数:(无),X.Y,flavors,build,run,alias,conflicts

    添加对 Guile 的依赖。默认情况下,这是对适当的 libguile*.so 的库依赖,除非通过 build 和/或 run 选项覆盖。alias 选项根据需要配置 BINARY_ALIAS(请参见 )。

    默认版本通过常规的 DEFAULT_VERSIONS 机制设置;如果默认版本不是列表中的版本之一,则使用可用的最新版本。

    使用 Guile 的应用程序通常只构建单一版本的 Guile。然而,扩展或库模块应使用 flavors 选项,以构建多个版本的 Guile。

    更多信息请参见 。

    17.55. horde

    可能的参数:(无)

    添加对 的构建时和运行时依赖。如果需要,可以使用 USE_HORDE_BUILD 和 USE_HORDE_RUN 添加其他 Horde 依赖项。更多信息请参见 。

    17.56. iconv

    可能的参数:(无),lib,build,patch,translit,wchar_t

    使用 iconv 函数,来自 Port 的构建时和运行时依赖,或者来自基本系统的 iconv。默认情况下,如果没有指定参数或指定了 lib 参数,则表示使用 iconv 作为构建时和运行时依赖。build 表示仅作为构建时依赖,patch 表示仅作为补丁时依赖。如果 Port 使用 WCHAR_T 或 //TRANSLIT iconv 扩展,请添加相关参数以确保使用正确的 iconv。更多信息请参见 。

    17.57. imake

    可能的参数:(无),env,notall,noman

    将 添加为构建时依赖,并在 configure 阶段运行 xmkmf -a。如果指定了 env 参数,则不会设置 configure 目标。如果 -a 标志对 Port 有问题,请添加 notall 参数。如果 xmkmf 无法生成 install.man 目标,则添加 noman 参数。

    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[+],20[+],21[+],22[+])

    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 (default, implicit), build, run

    帮助处理对 jpeg 的依赖。

    如果提供了 lib 参数或没有提供参数,则会向 Port 添加库依赖。

    如果提供了 build 参数,则会向 Port 添加构建时依赖。

    如果提供了 run 参数,则会向 Port 添加运行时依赖。

    如果提供了 both 参数,则会向 Port 添加构建时依赖和运行时依赖。

    该框架提供了以下可以由 Port 设置的变量:

    JPEG_PORT 指定要使用的 JPEG 实现。可选值包括:

    • (默认)

    17.60. kde

    可能的参数:5

    添加对 KDE 组件的依赖。更多信息请参见 。

    17.61. kmod

    可能的参数:(none), debug

    为内核模块 Port 填充模板,当前包括:

    • 将 kld 添加到 CATEGORIES。

    • 设置 SSP_UNSAFE。

    • 如果在 SRC_BASE 中找不到内核源代码,则设置 IGNORE。

    17.62. kodi

    可能的参数:(none), noautoplist

    提供对 插件的支持。如果提供了 noautoplist 参数,则不会自动生成 plist。

    17.63. lazarus

    可能的参数:(none), gtk2 (default), qt5, qt6, flavors

    为 基础的 Port 提供支持。

    如果未提供参数或提供了 gtk2 参数,则 lazarus-app 将使用 gtk2 界面构建, 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。更多信息请参见 。默认值:空

    LAZARUS_NO_FLAVORS:不构建这些 lazarus flavors。如果未定义 LAZARUS_NO_FLAVORS,则假定构建所有有效的 lazarus flavors。

    WANT_LAZARUS_DEVEL:如果设置为 yes,则使用 作为构建依赖。

    17.64. ldap

    可能的参数:(none), <版本>, client, server

    注册对 的依赖。如果设置了特定的 <版本>(无点号表示法),则使用该版本。否则,它会尝试找到当前安装的版本。如果需要,它会回退到 bsd.default-versions.mk 中找到的默认版本。client 指定对客户端库的运行时依赖,这是默认行为。server 指定对服务器的运行时依赖。

    Port 可以访问以下变量:

    IGNORE_WITH_OPENLDAP:如果 Port 不支持某个版本的 OpenLDAP,可以定义此变量。

    WITH_OPENLDAP_VER:用户定义的变量,用于设置 OpenLDAP 版本。

    OPENLDAP_VER:检测到的 OpenLDAP 版本。

    17.65. lha

    可能的参数:(none)

    将 EXTRACT_SUFX 设置为 .lzh

    17.66. libarchive

    可能的参数:(none)

    注册对 的依赖。任何依赖 libarchive 的 Port 必须包含 USES=libarchive。

    17.67. libedit

    可能的参数:(none)

    注册对 的依赖。任何依赖 libedit 的 Port 必须包含 USES=libedit。

    17.68. libtool

    可能的参数:(none), keepla, build

    修补 libtool 脚本。所有使用 libtool 的 Port 必须添加此项。keepla 参数可用于保留 .la 文件。一些 Port 没有自己的 libtool 副本,需要对 进行构建时依赖,使用 :build 参数添加此依赖。

    17.69. linux

    可能的参数:c6, c7

    Linux 兼容性框架 Port。指定 c6 以依赖于 CentOS 6 包。指定 c7 以依赖于 CentOS 7 包。可用的包有:

    • allegro

    • alsa-plugins-oss

    • alsa-plugins-pulseaudio

    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 选项以构建多个版本。

    有关更多信息,请参见 。

    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)

    有关更多信息,请参见 。

    17.74. lxqt

    可能的参数: (无)

    处理 LXQt 桌面环境的依赖。使用 USE_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

    默认的依赖关系是构建和运行时的,可以通过 :build 或 :run 进行更改。例如:

    17.79. meson

    可能的参数: (无)

    为基于 Meson 的项目提供支持。有关更多信息,请参见 。

    17.80. metaport

    可能的参数: (无)

    设置以下变量以简化创建 metaport: MASTER_SITES,DISTFILES,EXTRACT_ONLY,NO_BUILD,NO_INSTALL,NO_MTREE,NO_ARCH。

    17.81. minizip

    可能的参数: (无), ng

    分别添加对 或 的库依赖。

    17.82. mlt

    可能的参数: 7, nodepend

    为依赖 的 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。

    该框架将 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

    可能的参数: (无)

    使用 作为库依赖。最终用户可以在 make.conf 中设置 WANT_LESSTIF 来使用 作为依赖,而不是 。同样,在 make.conf 中设置 WANT_OPEN_MOTIF_DEVEL 将添加对 的依赖。

    17.86. mpi

    可能的参数: mpich(默认), openmpi

    为依赖 MPI 的 Ports 提供支持。

    如果提供 mpich 参数,则添加对 的依赖。

    如果提供 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

    可能的参数: (无)

    通过添加对 的运行时依赖,添加对 Nextcloud 应用程序的支持。

    17.89. ninja

    可能的参数: (无), build, make(默认), run

    如果指定了 build 或 run 参数,则分别添加对 的构建或运行时依赖。如果提供 make 或没有参数,则使用 ninja 来构建该 Port,而不是 make。make 隐含了 build。如果 NINJA_DEFAULT 变量设置为 samurai,则将依赖关系设置为 。

    17.90. nodejs

    可能的参数: (无), build, run, current, lts, 10, 14, 16, 17

    使用 nodejs。添加对 的依赖。如果指定了受支持的版本,则必须同时指定 run 和/或 build。

    17.91. objc

    可能的参数: (无)

    如果基本系统不支持,则添加 Objective C 依赖(编译器、运行时库)。

    17.92. ocaml

    可能的参数: (无)、build、camlp4、dune、findlib、findplist、ldconfig、run、tk、tkbuild、tkrun、wash

    提供对 OCaml 的支持。

    如果没有提供任何参数,默认使用 build 和 run。

    如果提供 build 参数,则会将 添加到 BUILD_DEPENDS、EXTRACT 和 PATCH_DEPENDS。

    如果提供 camlp4 参数,则使用 来构建。

    如果提供 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 参数,则会添加 的构建和运行时依赖。此参数隐式包含 tkbuild 和 tkrun。

    如果提供 tkbuild 参数,则会将 添加到 BUILD_DEPENDS、EXTRACT 和 PATCH_DEPENDS。

    如果提供 tkrun 参数,则会将 添加到 RUN_DEPENDS。

    如果提供 wash 参数,则会在卸载时清理 Ocaml 的共享目录。当安装到非标准 PREFIX 时,使用此选项。

    可以由 port 设置以下变量:

    OCAML_PKGDIRS:如果指定了 findlib 参数,将处理 site-lib 下的目录。默认值:${PORTNAME}

    OCAML_LDLIBS:会自动添加/删除从 ld.conf 中的目录。默认值:${OCAML_SITELIBDIR}/${PORTNAME}

    OCAML_PACKAGES:要构建和安装的包列表。默认值:${PORTNAME}

    17.93. octave

    可能的参数: (无)、env

    使用 。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 使用了 ,则会查找 PATHFIX_WRKSRC 中的 CMakeLists.txt。如有需要,可以通过 PATHFIX_CMAKELISTSTXT 更改默认文件名。

    17.96. pear

    可能的参数:env

    添加对 的依赖。它将为使用 PHP 扩展和应用程序仓库的软件设置默认行为。使用 env 参数仅设置 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 是隐式的。

    有关更多信息,请参见 。

    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

    17.99. php

    可能的参数: (无)、phpize、ext、zend、build、cli、cgi、mod、web、embed、pecl、flavors、noflavors

    提供对 PHP 的支持。为默认的 PHP 版本 添加运行时依赖。

    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。除非出现在 中的 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。一些扩展可能需要在其他扩展之前加载,例如 。一些可能需要在优先级为 30 的扩展之后加载。在这种情况下,可以在 port 的 Makefile 中添加 PHP_MOD_PRIO=XX。例如:

    这些变量可以用于 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

    使用 。如果没有参数或使用 build 参数,则意味着将 pkg-config 作为构建时的依赖项。run 表示运行时依赖项,both 表示构建时和运行时的依赖项。

    17.101. pure

    可能的参数: (无)、ffi

    使用 。主要用于构建相关的 pure port。使用 ffi 参数时,它意味着将 作为运行时依赖项。

    17.102. pyqt

    可能的参数: (无)、4、5

    使用 PyQt。如果 port 是 PyQt 的一部分,请设置 PYQT_DIST。使用 USE_PYQT 来选择 port 需要的组件。可用的组件包括:

    • core

    • dbus

    • dbussupport

    • demo

    这些组件仅在 PyQt4 中可用:

    • assistant

    • declarative

    • help

    • phonon

    这些组件仅在 PyQt5 中可用:

    • multimediawidgets

    • printsupport

    • qml

    • serialport

    每个组件的默认依赖项是构建时和运行时的依赖项,要选择仅构建或仅运行,请在组件名称后添加 _build 或 _run。例如:

    17.103. pytest

    可能的参数: (无)、4

    引入了对 的新依赖。它定义了一个 do-test 目标,用于正确运行测试。使用该参数依赖于特定版本的 。对于使用 的 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。更多信息请参见 。

    USES=python:env 可以在需要框架导出的变量但不依赖于 Python 时使用。通常用于与 配合使用,目标是仅修复 shebang,而不是添加对 Python 的依赖。

    17.105. qmail

    可能的参数: (无)、build、run、both、vars

    使用 。使用 build 参数时,意味着将 qmail 作为构建时的依赖项。run 表示运行时依赖项。如果不带参数或使用 both 参数,则表示构建时和运行时的依赖项。vars 将仅设置 QMAIL 变量供 port 使用。

    17.106. qmake

    可能的参数: (无)、norecursive、outsource、no_env、no_configure

    使用 QMake 进行配置。更多信息请参见 。

    17.107. qt

    可能的参数: 5、6、no_env

    添加对 Qt 组件的依赖。no_env 参数直接传递给 USES= qmake。更多信息请参见 。

    17.108. qt-dist

    可能的参数: (无) 或 5 和 (无) 或 6 和 (无) 或下列之一: 3d、5compat、base、charts、connectivity、datavis3d、declarative、doc、languageserver、gamepad、graphicaleffects、imageformats

    提供构建 Qt 5 和 Qt 6 组件的支持。它负责为 port 构建设置适当的配置环境。

    示例 7. 构建 Qt 5 组件

    该 port 是 Qt 5 的 networkauth 组件,属于 networkauth 分发文件。

    示例 8. 构建 Qt 6 组件

    该 port 是 Qt 6 的 websockets 组件,属于 websockets 分发文件。

    如果 PORTNAME 与组件名称不匹配,则可以将其作为参数传递给 qt-dist。

    示例 9. 使用不同名称构建 Qt 5 组件

    该 port 是 Qt 5 的 gui 组件,属于 base 分发文件。

    17.109. readline

    可能的参数: (无)、port

    将 readline 作为库依赖项,并根据需要设置 CPPFLAGS 和 LDFLAGS。如果使用 port 参数,或如果基本系统中没有 readline,则会添加对 的依赖。

    17.110. ruby

    可能的参数: (无)、build、extconf、run、setup

    为 Ruby 相关的 Port 提供支持。(无) 参数时,会添加对 的运行时依赖。build 添加对 的构建时依赖。extconf 表示该 port 使用 extconf.rb 来配置。run 添加对 的运行时依赖,这是默认设置。setup 表示该 port 使用 setup.rb 来配置和构建。

    用户可以定义以下变量:

    RUBY_VERRuby 的替代短版本,以 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 的来源(例如, )。如果一个 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

    可能的参数: (无)

    为使用 提供支持。更多信息请参见 。

    17.113. sdl

    可能的参数: sdl

    为使用 SDL 软件包提供支持。变量 USE_SDL 是强制性的,并指定要添加为依赖的组件。

    当前支持的 SDL1.2 模块有:

    • sdl

    • console

    • gfx

    • image

    当前支持的 SDL2 模块有:

    • sdl2

    • gfx2

    • image2

    • mixer2

    当前支持的 SDL3 模块有:

    • sdl3

    • image3

    • ttf3

    17.114. shared-mime-info

    可能的参数: (无)

    使用来自 的 update-mime-database。此宏会自动在安装后步骤中添加,以确保该 port 在需要时仍能指定自己的安装后步骤。同时,它还会将 条目添加到 plist 中。

    17.115. shebangfix

    可能的参数: (无)

    许多软件使用错误的脚本解释器位置,特别是 /usr/bin/perl 和 /bin/bash。shebangfix 宏修复脚本中的 shebang 行,这些脚本包含在 SHEBANG_REGEX、SHEBANG_GLOB 或 SHEBANG_FILES 中。

    SHEBANG_REGEX 包含一个扩展正则表达式,并与 的 -iregex 参数一起使用。参见 。

    SHEBANG_GLOB 包含一个使用 的 -name 参数的模式列表。参见 。

    SHEBANG_FILES 包含文件列表或 模式。shebangfix 宏在 ${WRKSRC} 中运行,因此 SHEBANG_FILES 可以包含相对于 ${WRKSRC} 的路径。如果需要修补 ${WRKSRC} 之外的文件,也可以处理绝对路径。参见 。

    当前默认支持的解释器包括: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 包含多个值。任何包含空格的条目必须加引号。参见 。

    重要

    shebang 修复在 patch 阶段完成。如果在 build 阶段创建了错误的 shebang(例如,configure 脚本或 Makefiles),则必须修补或给定正确的路径(例如,通过 CONFIGURE_ENV、CONFIGURE_ARGS、MAKE_ENV 或 MAKE_ARGS)来生成正确的 shebang。

    支持的解释器的正确路径可以在 _interp__CMD 中找到。

    技巧

    当与 一起使用时,如果仅仅是修复 shebang,但不希望依赖于 Python 本身,可以使用 USES=python:env。

    示例 10. 向 USES=shebangfix 添加另一个解释器

    要添加另一个解释器,设置 SHEBANG_LANG。例如:

    示例 11. 在向 USES=shebangfix 添加解释器时指定所有路径

    如果未定义,并且 _interpOLD_CMD 和 _interp*CMD 没有默认值,则 Ksh 条目可以定义如下:

    示例 12. 添加一个解释器的奇怪位置

    有些软件使用解释器的奇怪位置。例如,应用程序可能期望 Python 位于 /opt/bin/python2.7。可以在 port Makefile 中声明需要替换的奇怪路径:

    示例 13. USES=shebangfix 与 SHEBANG_REGEX

    要修复 ${WRKSRC}/scripts 中所有以 .pl、.sh 或 .cgi 结尾的文件,可以执行:

    注意

    SHEBANG_REGEX 是通过运行 find -E 来使用的,它使用现代正则表达式,也称为扩展正则表达式。更多信息参见 。

    示例 14. USES=shebangfix 与 SHEBANG_GLOB

    要修复 ${WRKSRC} 中所有以 .pl 或 .sh 结尾的文件,可以执行:

    示例 15. USES=shebangfix 与 SHEBANG_FILES

    要修复 ${WRKSRC} 中的 script/foobar.pl 和 script/*.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_:

    17.119. 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.120. 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 库的路径

    17.121. terminfo

    可能的参数:(无)

    将 添加到 plist。当该 Port 安装 *.terminfo 文件到 ${PREFIX}/share/misc 时使用。

    17.122. tex

    可能的参数:(无)

    提供对 tex 的支持。加载所有与 TEX 相关的默认变量,并且不添加任何对其他 Ports 的依赖。

    变量用于指定需要哪些 TEX 模块。

    USE_TEX 运行时所需的 TEX 扩展列表。在扩展名后添加 :build 来添加构建时依赖,:run 添加运行时依赖,:test 添加测试时依赖,:extract 添加提取时依赖。例如:base texmf:build source:run

    当前可能的参数如下:

    • base

    • texmf

    • source

    • docs

    17.123. tk

    与 tcl 的参数相同

    当同时使用 Tcl 和 Tk 时的小包装器。返回的变量与使用 Tcl 时相同。

    17.124. trigger

    可能的参数:(无)

    提供对需要由 执行触发器的 Ports 的支持。触发器在事务结束时执行,如果条件满足。

    可以通过 Ports 设置以下变量:

    TRIGGERS 打包的触发器列表。默认为 ${PORTNAME}。

    触发器以 UCL 格式指定,通常放置在 Port 的 files/ 目录中。

    17.125. uidfix

    可能的参数:(无)

    更改构建系统的一些默认行为(主要是变量),以允许以普通用户身份安装该 Port。在使用 或补丁之前,请先尝试此方法。

    17.126. uniquefiles

    可能的参数:(无),dirs

    通过添加前缀或后缀使文件或目录“唯一”。如果使用 dirs 参数,Port 需要一个基于 UNIQUE_PREFIX 的前缀(且仅需前缀),适用于标准目录 DOCSDIR、EXAMPLESDIR、DATADIR、WWWDIR、ETCDIR。以下变量可供 Port 使用:

    • UNIQUE_PREFIX:用于目录和文件的前缀。默认值:${PKGNAMEPREFIX}。

    • UNIQUE_PREFIX_FILES:需要添加前缀的文件列表。默认值:空。

    • UNIQUE_SUFFIX:用于文件的后缀。默认值:${PKGNAMESUFFIX}。

    17.127. vala

    可能的参数:build,lib,no_depend

    添加对 的构建或库依赖。no_depend 参数保留给 本身。

    17.128. varnish

    可能的参数:4(默认),6,7

    处理 Varnish Cache 的依赖关系。添加对 的依赖。

    17.129. 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.130. webplugin

    可能的参数:(无),ARGS

    自动为支持 webplugin 框架的每个应用程序创建和删除符号链接。ARGS 可以是以下之一:

    • gecko:支持基于 Gecko 的插件

    • native:支持 Gecko、Opera 和 WebKit-GTK 插件

    • linux:支持 Linux 插件

    以下变量可以调整:

    • WEBPLUGIN_FILES:没有默认值,必须手动设置。要安装的插件文件。

    • WEBPLUGIN_DIR:安装插件文件的目录,默认值 PREFIX/lib/browser_plugins/WEBPLUGIN_NAME。如果 Port 安装插件文件到默认目录以外的地方,请设置此项,以避免损坏的符号链接。

    • WEBPLUGIN_NAME:安装插件文件的最终目录,默认值 PKGBASE。

    17.131. xfce

    可能的参数:(无),gtk2

    为 Xfce 相关 Ports 提供支持。有关详细信息,请参阅 。

    gtk2 参数指定该 Port 需要 GTK2 支持。它添加了一些核心组件提供的额外功能,例如 和 。

    17.132. xorg

    可能的参数:(无)

    提供一种简便的方法来依赖 X.org 组件。这些组件应列在 USE_XORG 中。可用的组件有:

    表 1. 可用的 X.Org 组件

    名称
    描述

    17.133. xorg-cat

    可能的参数:app,data,doc,driver,font,lib,proto,util,xserver 和(无)或单独的 autotools(默认),meson

    提供对构建 Xorg 组件的支持。它会设置所需的常见依赖项和适当的配置环境。此选项仅适用于 Xorg 组件。

    类别必须与上游类别匹配。

    第二个参数是要使用的构建系统。默认是 autotools,但也支持 meson。

    17.134. zip

    可能的参数:(无),infozip

    指示分发文件使用 ZIP 压缩算法。对于使用 InfoZip 算法的文件,必须传递 infozip 参数以设置适当的依赖关系。

    中不包含
    configure.ac
    的路径,可以通过设置
    AUTORECONF_WRKSRC
    来指定路径。
    ALT_COMPILER_VERSION:替代编译器的前两位版本数字(如果存在)。
  • CHOSEN_COMPILER_TYPE:选择的编译器,可能是 gcc 或 clang。

  • COMPILER_FEATURES:默认编译器支持的特性,目前列出 C++ 库。

  • )不正确,定义
    CPE_PRODUCT
    。
  • 如果厂商名称(第一个字段,默认为 CPE_PRODUCT)不正确,定义 CPE_VENDOR。

  • 如果版本字段(第三个字段,默认为 PORTVERSION)不正确,定义 CPE_VERSION。

  • 如果更新字段(第四个字段,默认为空)不正确,定义 CPE_UPDATE。

  • 如果仍然不正确,请检查 Mk/Uses/cpe.mk 以获取更多细节,或联系 Ports 安全团队 [[email protected]]。

  • 尽可能从现有变量(如 PORTNAME 和 PORTVERSION)中推导出 CPE 名称。使用变量修饰符提取这些变量的相关部分,而不是硬编码名称。

  • 始终在提交任何更改(如更改 PORTNAME 或 PORTVERSION 或任何其他用于推导 CPE_STR 的变量)之前,运行 make -V CPE_STR 并检查输出。

  • DOS2UNIX_WRKSRC:开始转换的目录,默认为 ${WRKSRC}。

    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:文档文件和目录列表

  • dconf

  • esound

  • evolutiondataserver3

  • gconf2

  • gconfmm26

  • gdkpixbuf

  • gdkpixbuf2

  • glib12

  • glib20

  • glibmm

  • gnomecontrolcenter3

  • gnomedesktop3

  • 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

  • GSSAPILDFLAGS
  • GSSAPILIBDIR

  • GSSAPILIBS

  • GSSAPI_CONFIGURE_ARGS

  • 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

  • 默认情况下,将 KMODDIR 定义为 /boot/modules,并将其添加到 PLIST_SUB 和 MAKE_ENV 中,安装时创建该目录。如果将 KMODDIR 设置为 /boot/kernel,则会重写为 /boot/modules。这样可以防止在升级内核时破坏包,因为 /boot/kernel 会在此过程中重命名为 /boot/kernel.old。

  • 在安装和卸载时处理内核模块的交叉引用,使用 @kld。

  • 如果提供了 debug 参数,则 Port 可以将调试版本的模块安装到 KERN_DEBUGDIR/KMODDIR 中。默认情况下,KERN_DEBUGDIR 从 DEBUGDIR 复制并设置为 /usr/lib/debug。框架将负责创建和删除所需的目录。

  • 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

  • desktop

  • dialogs

  • docutils

  • icontheme

  • intlhack

  • intltool

  • libmatekbd

  • libmateweather

  • marco

  • menus

  • notificationdaemon

  • panel

  • pluma

  • polkit

  • session

  • settingsdaemon

  • server
    和
    embedded
    会添加对 MySQL 服务器的构建和运行时依赖。在使用
    server
    或
    embedded
    时,添加
    client
    以同时添加对
    libmysqlclient.so
    的依赖。如果某些版本不受支持,Port 可以设置
    IGNORE_WITH_MYSQL
    。
  • plperl

  • plpython

  • pltcl

  • server

  • designer

  • designerplugin

  • doc

  • gui

  • multimedia

  • network

  • opengl

  • qscintilla2

  • sip

  • sql

  • svg

  • test

  • webkit

  • xml

  • xmlpatterns

  • script

  • scripttools

  • webkitwidgets

  • widgets

  • 、
    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
    。
    mixer
  • mm

  • net

  • pango

  • sound

  • ttf

  • net2
  • sound2

  • ttf2

  • 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 头文件的路径

  • 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

  • UNIQUE_SUFFIX_FILES:需要添加后缀的文件列表。默认值:空。

    all(默认,隐式):支持所有插件类型
  • (单独的条目):仅支持列出的浏览器

  • 低级像素操作库

    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 扩展

    dmx

    DMX 扩展库

    fontenc

    字体编码库

    fontutil

    在目录中创建 X 字体文件的索引

    ice

    X11 的客户端交换库

    libfs

    FS 库

    pciaccess

    通用 PCI 访问库

    7z(1)
    bsdtar(1)
    archivers/p7zip
    angrinary 分析平台
    sysutils/ansible
    sysutils/ansible
    databases/db5
    databases/db18
    databases/db5
    databases/db5
    databases/db5
    databases/db5
    databases/db48
    devel/bison
    使用 Budgie
    Haskell Libraries
    lang/ghc
    lang/ghc810
    devel/hs-hpack
    使用 Cabal 构建 Haskell 应用程序
    使用 cargo 构建 Rust 应用程序
    converters/libiconv
    devel/cl-asdf
    lang/ccl
    lang/clisp
    lang/sbcl
    devel/ninja
    使用 cmake
    CPE 规范
    CPE 搜索引擎
    官方 CPE 字典
    devel/desktop-file-utils
    @desktop-file-utils
    简单的自动替换
    audio/ebur128
    math/eigen
    devel/electron31
    devel/electron32
    devel/electron33
    elfctl(1)
    lang/elixir
    lang/elixir
    lang/erlang
    devel/erlang-native-compiler
    devel/rebar
    devel/rebar3
    https://wiki.debian.org/FakeRoot
    devel/fam
    devel/gamin
    lang/fpc
    devel/gmake
    Using GNOME
    Go Libraries
    Building Go Applications
    devel/gperf
    devel/grantlee5
    devel/grantlee5
    textproc/groff
    security/heimdal
    security/krb5
    security/krb5
    security/heimdal
    使用 BINARY_ALIAS
    使用 Guile
    devel/pear-channel-horde
    Horde 模块
    converters/libiconv
    使用 iconv
    devel/imake
    graphics/jpeg-turbo
    graphics/mozjpeg
    使用 KDE
    multimedia/kodi
    editors/lazarus
    editors/lazarus
    lazbuild(1)
    lazarus/devel
    net/openldap
    archivers/libarchive
    devel/libedit
    devel/libtool
    使用 Lua
    使用 Lua
    使用 LXQt
    使用 meson
    archivers/minizip
    archivers/minizip-ng
    multimedia/mlt7
    x11-toolkits/open-motif
    x11-toolkits/lesstif
    x11-toolkits/open-motif
    x11-toolkits/open-motif-devel
    net/mpich
    net/openmpi
    www/nextcloud
    devel/ninja
    devel/samurai
    www/node*
    lang/ocamlc
    devel/ocamlp4
    devel/ocaml-dune
    x11-toolkits/ocaml-labltk
    x11-toolkits/ocaml-labltk
    x11-toolkits/ocaml-labltk
    math/octave
    USES=cmake
    devel/pear
    PEAR 模块
    使用 Perl
    lang/php81
    IGNORE_WITH_PHP
    www/php56-opcache
    devel/pkgconf
    lang/pure
    devel/pure-ffi
    devel/pytest
    devel/pytest
    devel/pytest
    使用 Python
    USES=shebangfix
    mail/qmail
    使用 qmake
    使用 Qt
    devel/readline
    lang/ruby
    lang/ruby
    lang/ruby
    databases/ldb28
    devel/scons
    使用 scons
    misc/shared-mime-info
    @shared-mime-info
    find(1)
    USESshebangfix 与 SHEBANG_REGEX
    find(1)
    USESshebangfix 与 SHEBANG_GLOB
    sh(1)
    USESshebangfix 与 SHEBANG_FILES
    指定为 USESshebangfix 添加解释器时的所有路径
    USES=python
    re_format(7)
    @terminfo
    pkg(8)
    USES=fakeroot
    lang/vala
    lang/vala
    www/varnish*
    Using Xfce
    x11/libxfce4menu
    x11-wm/xfce4-panel

    pixman

    USES=	bison perl
    USES=	tar:xz
    USES=	drupal:7,theme
    USES=	pgsql:9.3+ cpe python:2.7,build
    ELF_FEATURES=	featurelist:path/to/file1 \
    		featurelist:path/to/file2
    USES=		gnome
    USE_GNOME=	gnomemenus3:build intlhack
    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
    USES=		mate
    USE_MATE=	menus:build intlhack
    USES=		php:ext
    USE_PHP=	wddx
    PHP_MOD_PRIO=	40
    USES=		pyqt
    USE_PYQT=	core doc_build designer_run
    PORTNAME=	networkauth
    DISTVERSION=	${QT5_VERSION}
    
    USES=		qt-dist:5
    PORTNAME=       websockets
    PORTVERSION=    ${QT6_VERSION}
    
    USES=           qt-dist:6
    PORTNAME=	gui
    DISTVERSION=	${QT5_VERSION}
    
    USES=		qt-dist:5,base
    SHEBANG_LANG=	lua
    SHEBANG_LANG=	ksh
    ksh_OLD_CMD=	"/usr/bin/env ksh" /bin/ksh /usr/bin/ksh
    ksh_CMD=	${LOCALBASE}/bin/ksh
    python_OLD_CMD=	/opt/bin/python2.7
    USES=	shebangfix
    SHEBANG_REGEX=	./scripts/.*\.(sh|pl|cgi)
    USES=	shebangfix
    SHEBANG_GLOB=	*.sh *.pl
    USES=	shebangfix
    SHEBANG_FILES=	scripts/foobar.pl scripts/*.sh
    BROKEN_SSL=	libressl
    BROKEN_SSL_REASON_libressl=	需要 OpenSSL 中才有的特性

    第 6 章 特殊情况

    6.1. 拆分长文件

    有时,Port 的 Makefile 可能会非常长。例如,Rust Port 的 CARGO_CRATES 列表可能很长,或者 Makefile 中可能包含根据架构不同而变化的代码。在这种情况下,将原始的 Makefile 拆分成多个文件可能会很方便。bsd.port.mk 会自动包含一些类型的 Makefile 到主 Port Makefile 中。

    框架会自动处理以下文件类型(如果发现它们的话):

    • Makefile.crates。可以在 中找到示例。

    • Makefile.inc。可以在 中找到示例。

    • Makefile.${ARCH}-${OPSYS}

    • Makefile.${OPSYS}。可以在 中找到示例。

    • Makefile.${ARCH}

    • Makefile.local

    通常的做法是,如果包装列表在不同架构之间变化很大,或者依赖于所选的 flavor,那么将 Port 的包装列表拆分成多个文件。在这种情况下,每个架构的 pkg-plist 文件命名遵循 pkg-plist.${ARCH} 或 pkg-plist.${FLAVOR} 的模式。如果存在多个 pkg-plist 文件,框架不会自动创建包装列表。Port 作者需要选择适当的 pkg-plist 文件并将其分配给 PLIST 变量。关于如何处理这个问题的示例可以在 和 中找到。

    6.2. Staging

    bsd.port.mk 要求 Port 使用 "阶段目录"。这意味着 Port 必须将文件安装到一个单独的目录,而不是直接安装到常规的目标目录(例如,PREFIX)。然后从这个阶段目录构建包,并将包安装到系统中。在许多情况下,这不需要 root 权限,从而使得可以作为非特权用户构建包。通过 staging,Port 被构建并安装到阶段目录 STAGEDIR 中。然后从该目录创建包,并安装到系统中。自动化工具称这一概念为 DESTDIR,但在 FreeBSD 中,DESTDIR 有不同的含义(见 )。

    重要

    没有任何 Port 真正 需要 root 权限。通过使用 大多数情况下可以避免。如果 Port 仍然运行像 、,或者通过 强制设置文件的所有者或组,则应使用 来伪造这些调用。此时可能需要对 Port 的 Makefiles 进行一些补丁。

    元 Port(即不安装文件,而是依赖于其他 Port 的 Port)必须避免不必要地将 提取到阶段目录。因为这是包的基本目录布局,这些空目录会被视为孤立的。为了防止 提取,可以添加这一行:

    技巧

    元 Port 应该使用 。它为不获取、构建或安装任何东西的 Port 设置默认值。

    Staging 通过在 pre-install、do-install 和 post-install 目标中使用 STAGEDIR 前缀来启用(参见本书中的示例)。通常,这包括 PREFIX、ETCDIR、DATADIR、EXAMPLESDIR、DOCSDIR 等。目录应该作为 post-install 目标的一部分创建。尽量避免使用绝对路径。

    技巧

    安装内核模块的 Port 必须默认在其目标路径前添加 STAGEDIR,例如 /boot/modules。

    6.2.1. 处理符号链接

    在创建符号链接时,强烈建议使用相对链接。使用 ${RLN} 可以自动创建相对符号链接。它在后台使用 ,自动计算要创建的相对链接。

    示例 1. 自动创建相对符号链接

    ${RLN} 使用 的相对符号链接功能,使得创建者不必手动计算相对路径。

    将生成:

    6.3. 捆绑的库

    本节解释了为什么捆绑的依赖库被认为是不好的,以及如何处理它们。

    6.3.1. 为什么捆绑的库不好

    一些软件要求开发者找到第三方库并将所需的依赖添加到 Port 中。其他软件则将所有必需的库打包在分发文件中。第二种方法看起来一开始更容易,但存在一些严重的缺点:

    以下列表 loosely 基于 和 的维基页面,均由 许可证授权。

    安全性

    如果在上游库中发现漏洞并进行修复,可能不会在与 Port 捆绑的库中修复这些漏洞。一个原因可能是作者没有意识到这个问题。这意味着开发者必须修复它们,或升级到一个无漏洞的版本,并向作者提交补丁。这一过程需要时间,导致软件在必要时被暴露在漏洞风险中。这也使得协调修复变得更加困难,且可能会泄漏漏洞的细节。

    错误

    这个问题类似于上一段提到的安全问题,但一般不如安全问题严重。

    分叉

    库被捆绑后,作者更容易对上游库进行分叉。虽然从表面上看,这样做更方便,但这意味着代码与上游分叉,使得解决安全问题或其他问题变得更加困难。原因之一是补丁变得更难以应用。

    分叉的另一个问题是,由于代码与上游分叉,bug 需要重复解决,而不是集中在一个地方解决。这违背了开源软件的初衷。

    符号冲突

    当系统中已安装了某个库时,它可能会与捆绑版本发生冲突。这可能会导致编译或链接时立即出错,也可能导致运行时错误,后者可能更难追踪。后一种问题可能是因为两个库的版本不兼容。

    许可问题

    当捆绑来自不同来源的项目时,许可问题可能更容易出现,尤其是当许可不兼容时。

    资源浪费

    捆绑的库在多个层面上浪费资源。特别是当这些库已经存在于系统上时,构建实际应用的时间会变得更长。在运行时,它们可能占用不必要的内存,而系统全局库已经被其他程序加载,而捆绑的库却由另一个程序加载。

    努力的浪费

    当一个库需要为 FreeBSD 打补丁时,这些补丁必须再次应用到捆绑库中。这浪费了开发者的时间,因为这些补丁可能无法干净地应用。并且很难发现这些补丁其实是必需的。

    6.3.2. 如何处理捆绑的库

    尽可能使用未捆绑版本的库,通过向 Port 添加 LIB_DEPENDS 来指定依赖。如果这种 Port 还不存在,考虑创建一个新的 Port。

    仅在上游有良好的安全记录并且使用未捆绑版本会导致过于复杂的补丁时,才使用捆绑库。

    重要

    在一些非常特殊的情况下,例如仿真器(如 Wine),Port 必须捆绑库,因为这些库属于不同架构,或者它们已被修改以适应软件的需求。在这种情况下,这些库不应该暴露给其他 Port 进行链接。可以在 Port 的 Makefile 中添加 BUNDLE_LIBS=yes。这将告诉 不计算提供的库。在将此添加到 Port 之前,请始终向 Ports 管理团队 <> 询问。

    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,以便用户安装软件包后能立即使用共享库,并且卸载时不会让系统仍然认为库存在。

    可以通过将 USE_LDCONFIG 设置为共享库安装目录的列表,来覆盖默认目录。例如,如果 Port 将共享库安装到 PREFIX/lib/foo 和 PREFIX/lib/bar,则在 Makefile 中使用以下设置:

    请仔细检查,通常这并不总是必要的,或者可以通过 -rpath 或在链接时设置 LD_RUN_PATH 来避免(参见 示例),或者通过像 那样的外壳脚本包装器,先设置 LD_LIBRARY_PATH 后再调用二进制文件。

    在 64 位系统上安装 32 位库时,使用 USE_LDCONFIG32。

    如果软件使用 ,特别是 libtool,则添加 。

    当库的主版本号在新版本 Port 更新时增加时,所有链接到受影响库的其他 Port 必须增加 PORTREVISION,以强制重新编译该库的新版本。

    6.5. 有分发限制或法律问题的 Ports

    许可证各不相同,其中一些对应用程序如何打包、是否可以盈利性销售等方面有一定限制。

    重要

    Port 维护者有责任阅读软件的许可条款,并确保 FreeBSD 项目不会因通过 FTP/HTTP 或 CD-ROM 再分发源代码或已编译的二进制文件而违反相关条款。如果有疑问,请联系 。

    在这种情况下,可以设置下节中说明的变量。

    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 必须手动获取”的首选方式如下:

    这不仅通知用户,还在用户的机器上设置了适当的元数据,供自动化程序使用。

    请注意,此段落必须在包含 bsd.port.pre.mk 后添加。

    6.6. 构建机制

    6.6.1. 并行构建 Port

    FreeBSD 的 Ports 框架支持通过使用多个 make 子进程来进行并行构建,这使得 SMP 系统可以利用所有可用的 CPU 功率,从而加快 Port 构建的速度和效果。

    这是通过将 -jX 标志传递给在供应商代码上运行的 来实现的。这是 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 来调用 Port 期望的软件的 make 实现。

    如果 Port 是使用 imake 来从 Imakefile 生成 Makefile 的 X 应用程序,则应设置 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 传递额外的环境变量。

    变量
    含义

    6.6.4. 使用 cmake

    对于使用 CMake 的 Port,定义 USES= cmake。

    变量
    含义

    表 3. 用户可以为 cmake 构建定义的变量

    变量
    说明

    CMake 支持以下构建配置:Debug、Release、RelWithDebInfo 和 MinSizeRel。Debug 和 Release 配置会遵循系统 *FLAGS,RelWithDebInfo 和 MinSizeRel 会分别将 CFLAGS 设置为 -O2 -g 和 -Os -DNDEBUG。CMAKE_BUILD_TYPE 的小写值会导出到 PLIST_SUB

    大多数基于 CMake 的项目支持源外构建方法。Port 的源外构建是默认设置。可以通过使用 :insource 后缀请求源内构建。在源外构建中,CONFIGURE_WRKSRC、BUILD_WRKSRC 和 INSTALL_WRKSRC 会被设置为 ${WRKDIR}/.build,并且该目录将用于存放在配置和构建阶段生成的所有文件,保持源代码目录完好。

    示例 2. USES= cmake 示例

    该片段演示了如何在 Port 中使用 CMake。通常不需要设置 CMAKE_SOURCE_PATH,但当源代码不在顶层目录中,或者 Port 只打算构建项目的一部分时,可以设置该值。

    示例 3. CMAKE_ON 和 CMAKE_OFF

    当向 CMAKE_ARGS 添加布尔值时,使用 CMAKE_ON 和 CMAKE_OFF 变量更为简便。例如:

    等同于:

    重要

    这仅适用于 CMAKE_ARGS 的默认值关闭。 中说明的辅助工具使用相同的语义,但适用于可选值。

    6.6.5. 使用 scons

    如果 Port 使用 SCons,请定义 USES=scons。

    为了让第三方 SConstruct 尊重传递给 SCons 的所有环境变量(即最重要的 CC/CXX/CFLAGS/CXXFLAGS),请修改 SConstruct,使得构建 Environment 如下构建:

    之后,可以使用 env.Append 和 env.Replace 进行修改。

    6.6.6. 使用 cargo 构建 Rust 应用程序

    对于使用 Cargo 的 Port,定义 USES=cargo。

    表 4. 用户可以为 cargo 构建定义的变量

    变量
    默认值
    说明

    示例 4. 创建一个简单的 Rust 应用程序 Port

    创建一个基于 Cargo 的 Port 是一个三阶段的过程。首先,我们需要提供一个 Port 模板来获取应用程序分发文件:

    生成初始的 distinfo:

    现在,分发文件已经准备好使用,我们可以继续从捆绑的 Cargo.lock 中提取 crate 依赖:

    此命令的输出需要直接粘贴到 Makefile 中:

    需要重新生成 distinfo 以包含所有的 crate 分发文件:

    该 Port 现在已准备好进行测试构建,并可以像正常情况一样进行进一步的调整,例如创建 plist、编写说明、添加许可信息、选项等。

    如果你没有在像 poudriere 这样的干净环境中测试 Port,记得在任何测试之前运行 make clean。

    示例 5. 启用额外的应用程序功能

    一些应用程序在其 Cargo.toml 中定义了额外的功能。可以通过在 Port 中设置 CARGO_FEATURES 来编译它们。

    在这里,我们启用 Tokei 的 json 和 yaml 功能:

    示例 6. 将应用程序功能编码为 Port 选项

    Cargo.toml 中的一个 [features] 部分可能如下所示:

    pulseaudio_backend 是一个默认功能,除非我们显式地通过将 --no-default-features 添加到 CARGO_FEATURES 来关闭它。这里,我们将 portaudio_backend 和 pulseaudio_backend 功能转化为 Port 选项:

    示例 7. 列出 Crate 许可证

    每个 Crate 都有自己的许可证。在为 Port 添加 LICENSE 块时,了解它们非常重要(参见 )。辅助目标 cargo-crates-licenses 将尝试列出 CARGO_CRATES 中定义的所有 Crate 的许可证。

    注意

    make cargo-crates-licenses 输出的许可证名称是 SPDX 2.1 许可证表达式,可能与 Ports 框架中定义的许可证名称不匹配。需要将它们翻译为 中的名称。

    6.6.7. 使用 meson

    对于使用 Meson 的 Port,请定义 USES=meson。

    表格 5. 使用 meson 的 Port 变量

    变量
    说明

    示例 8. USES=meson 示例

    此代码片段演示了在 Port 中使用 Meson。

    6.6.8. 构建 Go 应用程序

    对于使用 Go 的 Port,定义 USES=go。请参考 获取可以设置的变量列表,以控制构建过程。

    示例 9. 创建一个基于 Go 模块的应用程序 Port

    在大多数情况下,将 GO_MODULE 变量设置为 go.mod 中 module 指令指定的值就足够了:

    如果“简易”方法不适用,或者需要对依赖项进行更多控制,可以按照下面说明的完整 Port 过程。

    创建基于 Go 的 Port 是一个五阶段的过程。首先,我们需要提供一个 Port 模板来获取应用程序分发文件:

    生成初步的 distinfo 文件:

    现在,分发文件已经准备好使用,我们可以提取所需的 Go 模块依赖项。此步骤需要安装 :

    该命令的输出需要直接粘贴到 Makefile 中:

    distinfo 需要重新生成,以包含所有分发文件:

    现在,Port 已准备好进行测试构建,并可进行进一步调整,如创建 plist、编写说明、添加许可证信息、选项等,像平常一样进行。

    如果你没有在像 poudriere 这样的干净环境中测试 Port,请记得在任何测试之前运行 make clean。

    示例 10. 设置输出二进制名称或安装路径

    有些 Port 需要将生成的二进制文件安装到不同的名称或路径下,而不是默认的 ${PREFIX}/bin。可以通过使用 GO_TARGET 元组语法来实现,例如:

    这将把 ipfs 二进制文件安装为 ${PREFIX}/bin/ipfs-go,而

    将把 dnscrypt-proxy 安装到 ${PREFIX}/sbin。

    6.6.9. 使用 cabal 构建 Haskell 应用程序

    对于使用 Cabal 的 Ports,构建系统定义了 USES=cabal。参阅 获取可以设置的变量列表,以控制构建过程。

    示例 11. 创建一个 Hackage 托管的 Haskell 应用程序的 Port

    在准备一个 Haskell Cabal Port 时,必须先安装 和 程序。首先,我们需要定义一些常见的 Port 变量,以便 cabal-install 获取包的分发文件:

    这个最简 Makefile 使用 cabal-extract 辅助目标来获取分发文件:

    现在,我们已经在 ${WRKSRC} 下得到了 ShellCheck.cabal 包说明文件,可以使用 cabal-configure 生成构建计划:

    完成后,可以生成所需依赖关系的列表:

    Haskell 包可能包含版本修订,就像 FreeBSD 的 Port 一样。修订仅影响 .cabal 文件。请注意 _ 后面的附加版本号。将新生成的 USE_CABAL 列表替换旧的。

    最后,需要重新生成 distinfo 以包含所有分发文件:

    现在,Port 已准备好进行测试构建,并且可以根据需要进一步调整,例如创建 plist、编写说明、添加许可证信息、选项等。

    如果你没有在像 poudriere 这样的干净环境中测试 Port,请记得在任何测试前运行 make clean。

    某些 Haskell Port 会将各种数据文件安装到 share/${PORTNAME} 下。对于此类情况,Port 侧需要进行特殊处理。Port 应定义 CABAL_WRAPPER_SCRIPTS 变量,列出将使用数据文件的每个可执行文件。此外,在少数情况下,被移植的程序使用其他 Haskell 包的数据文件,此时 FOO_DATADIR_VARS 变量会派上用场。

    示例 12. 处理 Haskell Port 中的数据文件

    devel/hs-profiteur 是一个 Haskell 应用程序,它生成一个包含内容的单页 HTML。

    它将 HTML 模板安装到 share/profiteur 下,因此我们需要添加 CABAL_WRAPPER_SCRIPTS 选项:

    该程序还尝试访问 jquery.js 文件,这是 Haskell 包 js-jquery-3.3.1 的一部分。为了能够找到该文件,我们需要使包装脚本也在 share/profiteur 中查找 js-jquery 数据文件。我们使用 profiteur_DATADIR_VARS 来实现这一点:

    现在,该 Port 将把实际的二进制文件安装到 libexec/cabal/profiteur,并将脚本安装到 bin/profiteur。

    除了运行程序并检查一切是否正常工作外,没有简单的方法来确定 FOO_DATADIR_VARS 选项的正确值。幸运的是,使用 FOO_DATADIR_VARS 的情况非常少见。

    另一个在移植复杂的 Haskell 程序时可能遇到的特殊情况是 cabal.project 文件中存在 VCS 依赖项。

    示例 13. 移植具有 VCS 依赖项的 Haskell 应用程序

    net-p2p/cardano-node 是一个非常复杂的软件。在它的 cabal.project 中,有很多类似这样的块:

    source-repository-package 类型的依赖项会在构建过程中自动由 cabal 拉取。不幸的是,这使得在 fetch 阶段之后需要使用网络。这是 Ports 框架不允许的。因此,这些源需要在 Port 的 Makefile 中列出。make-use-cabal 辅助目标可以使 GitHub 上托管的包更容易处理。在常规的 cabal-extract 和 cabal-configure 后运行这个目标,不仅会生成 USE_CABAL 选项,还会生成 GH_TUPLE:

    将 make-use-cabal 生成的 GH_TUPLE 条目与其他条目分开可能会更有用,这样可以方便地更新 Port:

    对于具有 VCS 依赖项的 Haskell Port,目前还需要以下修复:

    6.7. 使用 GNU Autotools

    如果一个 Port 需要任何 GNU Autotools 软件,添加 USES=autoreconf。有关更多信息,请参阅 。

    6.8. 使用 GNU gettext

    6.8.1. 基本用法

    如果 Port 需要 gettext,请设置 USES=gettext,该 Port 将继承来自 的 libintl.so 依赖项。有关 gettext 用法的其他值,请参阅 。

    一个比较常见的情况是 Port 使用 gettext 和 configure。通常,GNU configure 应该能够自动定位 gettext。

    如果自动定位失败,可以通过 CPPFLAGS 和 LDFLAGS 传递 gettext 的位置,使用 localbase 如下:

    6.8.2. 可选用法

    一些软件产品允许禁用 NLS。例如,通过向 configure 传递 --disable-nls。在这种情况下,Port 必须根据 NLS 选项的状态有条件地使用 gettext。对于低到中等复杂度的 Port,可以使用以下惯用法:

    或者使用较旧的选项方法:

    接下来需要做的工作是安排使消息目录文件条件地包含在打包列表中。Makefile 部分的这个任务已经由惯用法提供。它在 部分中进行了说明。简而言之,pkg-plist 中每个出现的 %%NLS%% 将在 NLS 被禁用时替换为 "@comment",或者在 NLS 启用时替换为空字符串。因此,如果 NLS 关闭,以 %%NLS%% 为前缀的行将在最终的打包列表中变成注释;否则,前缀将直接被省略。然后,在 pkg-plist 中每个消息目录文件路径之前插入 %%NLS%%。例如:

    在高复杂度的情况下,可能需要更高级的技术,例如 。

    6.8.3. 处理消息目录

    有一点需要注意的是,安装消息目录文件时,目标目录必须位于 LOCALBASE/share/locale 下,并且这些目录不应由 Port 创建或删除。最常见的语言有各自的目录列在 PORTSDIR/Templates/BSD.local.dist 中。许多其他语言的目录由 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。可以在 上查看顶级层次结构。这会在模块的作者更改时保持 Port 的正常工作。

    这个规则的例外情况是相关目录不存在,或者该目录中没有 distfile。在这种情况下,允许使用作者的 ID 作为 MASTER_SITE_SUBDIR。可以使用 CPAN:AUTHOR 宏,它将转换为哈希作者目录。例如,CPAN:AUTHOR 将转换为 authors/id/A/AU/AUTHOR。

    当 Port 需要 Perl 支持时,必须设置 USES=perl5,并根据 使用可选的 USE_PERL5。

    表 6. 使用 Perl 的 Port 只读变量

    只读变量
    说明

    注意

    没有官方网站的 Perl 模块 Port 必须在 Makefile 的 WWW 行中链接到 cpan.org。推荐的 URL 形式是 https://search.cpan.org/dist/Module-Name/(包括尾部斜杠)。

    注意

    不要在依赖声明中使用 ${SITE_PERL}。这样做假设已经包含了 perl5.mk,但并非总是如此。如果 Port 的文件在升级过程中被移动,依赖于该 Port 的其他 Port 可能会有错误的依赖关系。正确声明 Perl 模块依赖关系的方法如下所示。

    示例 14. Perl 依赖示例

    对于安装手册页的 Perl Port,可以在 pkg-plist 中使用宏 PERL5_MAN3 和 PERL5_MAN1。例如,

    可以替换为

    注意

    对于其他部分(2 和 4 到 9)没有 PERL5_MAN_x_ 宏,因为这些文件会安装到常规目录中。

    示例 15. 仅在构建时需要 Perl 的 Port

    由于默认的 USE_PERL5 值为 build 和 run,应设置为:

    示例 16. 还需要 Perl 进行补丁处理的 Port

    有时,使用 进行补丁处理不足以满足要求。当使用 更加简便时,使用:

    示例 17. 需要 ExtUtils::MakeMaker 来构建的 Perl 模块

    大多数 Perl 模块带有 Makefile.PL 配置脚本。在这种情况下,设置:

    示例 18. 需要 Module::Build 来构建的 Perl 模块

    当 Perl 模块带有 Build.PL 配置脚本时,它可能需要 Module::Build,此时设置:

    如果它需要的是 Module::Build::Tiny,设置:

    6.10. 使用 X11

    6.10.1. X.Org 组件

    在 Ports 中提供的 X11 实现是 X.Org。如果应用程序依赖于 X 组件,添加 USES= xorg 并设置 USE_XORG 为所需的组件列表。完整的组件列表可以在 中找到。

    Mesa 项目旨在提供免费的 OpenGL 实现。要指定对该项目的不同组件的依赖,使用 USES= gl 和 USE_GL。有关可用组件的完整列表,请参见 。为了兼容性,yes 的值会映射为 glu。

    示例 19. USE_XORG 示例

    变量用于使用 X 的 Port

    示例 20. 使用 X11 相关变量

    6.10.2. 需要 Motif 的 Port

    如果 Port 需要 Motif 库,在 Makefile 中定义 USES= motif。默认的 Motif 实现是 。用户可以通过在 make.conf 中设置 WANT_LESSTIF 来选择 作为替代实现。同样,用户也可以通过设置 WANT_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 会传递给构建过程。有关可能的参数,请参见 。

    6.10.5. 桌面条目

    桌面条目()提供了一种在安装新程序时自动调整桌面功能的方法,无需用户干预。例如,新安装的程序会自动出现在兼容的桌面环境的应用程序菜单中。桌面条目起源于 GNOME 桌面环境,但现在已经成为标准,并且可以与 KDE 和 Xfce 一起使用。这种自动化功能对用户来说是一个真正的便利,建议可以在桌面环境中使用的应用程序采用桌面条目。

    6.10.5.1. 使用预定义的 .desktop 文件

    包含预定义 *.desktop 文件的 Port 必须在 pkg-plist 中包含这些文件,并将它们安装到 $LOCALBASE/share/applications 目录中。 可以用来安装这些文件。

    6.10.5.2. 更新桌面数据库

    如果 Port 的 portname.desktop 中包含 MimeType 条目,安装和卸载后必须更新桌面数据库。为此,定义 USES= desktop-file-utils。

    6.10.5.3. 使用 DESKTOP_ENTRIES 创建桌面条目

    可以通过使用 DESKTOP_ENTRIES 来轻松为应用程序创建桌面条目。一个名为 name.desktop 的文件将自动创建、安装,并添加到 pkg-plist 中。语法如下:

    可用的类别列表可以在 上找到。StartupNotify 表示该应用程序是否支持启动通知。启动通知通常是一个图形指示器,如出现在鼠标指针、菜单或面板上的时钟,表示程序正在启动。兼容启动通知的程序在启动后会清除指示器,而不兼容的程序则永远不会清除该指示器(可能会让用户困惑和恼火),因此必须将 StartupNotify 设置为 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 库,这是定义它的最简便方式:

    USE_GNOME 组件会自动添加它们所需的依赖项。有关所有 USE_GNOME 组件的详细列表,以及它们暗含的其他组件和依赖项,请参阅 。

    以下是一个使用了本文件中概述的许多技术的 GNOME Port 的 Makefile 示例。请将其作为创建新 Port 的指南。

    注意

    USE_GNOME 宏没有任何参数时不会向 Port 添加任何依赖项。USE_GNOME 不能在 bsd.port.pre.mk 之后设置。

    6.11.3. 变量

    本节解释了哪些宏是可用的,以及如何使用它们。就像在上述示例中使用的那样。更多关于 GNOME 组件 的详细说明可以在 中找到。必须设置 USE_GNOME 才能使这些宏生效。

    GLIB_SCHEMAS 列出 Port 安装的所有 glib 模式文件。该宏会将文件添加到 Port 的 pkg-plist 中,并在安装和卸载时处理这些文件的注册。

    glib 模式文件以 XML 格式编写,并以 gschema.xml 扩展名结尾。它们安装在 share/glib-2.0/schemas/ 目录下。这些模式文件包含所有应用程序配置值及其默认设置。实际由应用程序使用的数据库是通过 glib-compile-schema 构建的,该工具由 GLIB_SCHEMAS 宏运行。

    注意

    不要将 glib 模式文件添加到 pkg-plist 中。如果它们列在 pkg-plist 中,则不会被注册,应用程序可能无法正常工作。

    GCONF_SCHEMAS 列出所有 gconf 模式文件。该宏会将模式文件添加到 Port 的 pkg-plist 中,并在安装和卸载时处理这些文件的注册。

    GConf 是 GNOME 应用程序用于存储设置的基于 XML 的数据库。这些文件安装在 etc/gconf/schemas 目录下。该数据库由已安装的模式文件定义,这些文件用于生成 %gconf.xml 键文件。每个由 Port 安装的模式文件都必须在 Makefile 中有一个条目:

    注意

    GConf 模式文件应该列在 GCONF_SCHEMAS 宏中,而不是 pkg-plist 中。如果它们列在 pkg-plist 中,则不会被注册,应用程序可能无法正常工作。

    INSTALLS_OMF 开源元数据框架(OMF)文件通常由 GNOME 2 应用程序使用。这些文件包含应用程序帮助文件的信息,并需要通过 ScrollKeeper/rarian 进行特殊处理。为了在从软件包安装 GNOME 应用程序时正确注册 OMF 文件,请确保 omf 文件列在 pkg-plist 中,并且 Port 的 Makefile 中定义了 INSTALLS_OMF:

    设置后,bsd.gnome.mk 会自动扫描 pkg-plist,并为每个 .omf 文件添加适当的 @exec 和 @unexec 指令,以便在 OMF 注册数据库中进行跟踪。

    6.12. GNOME 组件

    要获得更多有关 GNOME Port 的帮助,可以参考一些 示例。如果需要更多帮助,访问 查找联系信息。这些组件分为当前正在使用的 GNOME 组件和旧版组件。如果组件支持参数,它们将列在说明中的括号中。第一个参数为默认值。如果组件默认添加到构建和运行依赖项中,则会显示“Both”。

    组件
    相关程序
    说明

    6.13. GNOME 宏组件

    组件
    说明

    6.14. GNOME 旧版组件

    组件
    相关程序
    说明

    表 11 废弃组件:请勿使用

    组件
    说明

    6.13. 使用 Qt

    注意

    有关 Qt 本身的一些 Port,请参阅 。

    6.13.1. 需要 Qt 的 Port

    Ports 提供了对 Qt 5 和 Qt 6 的支持,分别通过 USES+=qt:5 和 USES+=qt:6。将 USE_QT 设置为所需的 Qt 组件(库、工具、插件)列表。

    Qt 框架导出了一些可以供 Port 使用的变量,下面列出了一些:

    表 12. 使用 Qt 的 Port 提供的变量

    变量
    说明

    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 库组件

    名称
    说明

    表 14. 可用的 Qt 工具组件

    名称
    说明

    表 15. 可用的 Qt 插件组件

    名称
    说明

    示例 21. 选择 Qt 5 组件

    在这个示例中,移植的应用程序使用 Qt 5 图形用户界面库、Qt 5 核心库、所有 Qt 5 代码生成工具以及 Qt 5 的 Makefile 生成器。由于 gui 库已经暗示了对核心库的依赖,因此不需要单独指定 core。Qt 5 代码生成工具 moc、uic 和 rcc,以及 Makefile 生成器 qmake 只在构建时需要,因此它们被指定为带有 _build 后缀:

    6.13.3. 使用 qmake

    如果应用程序提供了 qmake 项目文件(*.pro),则定义 USES= qmake 和 USE_QT。USES= qmake 已经隐含了对 qmake 的构建依赖,因此可以省略 USE_QT 中的 qmake 组件。类似于 ,qmake 支持源代码外构建,可以通过指定 outsource 参数来启用(参见 )。另请参见 。

    表 16. USES= qmake 的可能参数

    变量
    说明

    表 17. 使用 qmake 的 Ports 变量

    变量
    说明

    使用 USES= qmake 时,将应用以下设置:

    某些配置脚本不支持上述参数。要禁止修改 CONFIGURE_ENV 和 CONFIGURE_ARGS,请设置 USES= qmake:no_env。

    示例 22. USES= qmake 示例

    这个示例展示了如何在 Qt 5 port 中使用 qmake:

    Qt 应用程序通常是跨平台编写的,很多时候 X11/Unix 并不是它们的开发平台,这会导致一些问题,比如:

    • 缺少附加的包含路径。许多应用程序都支持系统托盘图标,但却没有在 X11 目录中查找包含文件和/或库。为了通过命令行将目录添加到 qmake 的包含和库搜索路径中,可以使用:

    • 错误的安装路径。有时一些数据(如图标或 .desktop 文件)默认安装到 XDG 兼容应用程序不会扫描的目录中。 就是一个例子 - 查看该 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 组件

    名称
    说明

    示例 23. USE_KDE 示例

    这是一个简单的 KDE Port 示例。USES= cmake 指示 Port 使用 CMake,CMake 是一个被 KDE 项目广泛使用的配置工具(详细用法请参见 )。USE_KDE 会引入对 KDE 库的依赖。所需的 KDE 组件和其他依赖项可以通过配置日志来确定。USE_KDE 并不意味着 USE_QT。如果 Port 需要一些 Qt 组件,请在 USE_QT 中指定它们。

    6.15. 使用 LXQt

    依赖 LXQt 的应用程序应设置 USES+= lxqt 并将 USE_LXQT 设置为所需组件的列表,如下表所示。

    表 19. 可用的 LXQt 组件

    名称
    说明

    示例 24. USE_LXQT 示例

    这是一个简单的示例,USE_LXQT 会添加 LXQt 库的依赖。所需的 LXQt 组件和其他依赖项可以通过配置日志来确定。

    6.16. 使用 Java

    6.16.1. 变量定义

    如果 Port 需要 Java™ 开发工具包(JDK™)来构建、运行或甚至提取 distfile,则需要定义 USE_JAVA。

    Ports 中有多个 JDK,来自不同的供应商,并且有多个版本。如果 Port 必须使用特定版本,请使用 JAVA_VERSION 变量指定它。当前版本是 ,同时还提供有 、、、、、、、 和 可用。

    表 20. 使用 Java 的 Ports 可以设置的变量

    变量
    含义

    下面是设置 USE_JAVA 后,Port 将接收到的所有设置列表。

    表 21. 使用 Java 的 Ports 提供的变量

    变量
    值

    使用 java-debug make 目标可以获取调试 Port 所需的信息。它将显示之前列出许多变量的值。

    此外,定义了这些常量,以便所有 Java Port 可以一致地安装:

    表 22. 为使用 Java 的 Ports 定义的常量

    常量
    值

    相关条目在 PLIST_SUB(文档参见 )和 SUB_LIST 中定义。

    6.16.2. 使用 Ant 构建

    当 Port 需要使用 Apache Ant 构建时,它必须定义 USE_ANT。Ant 被认为是子构建命令。当 Port 未定义 do-build 目标时,系统将设置一个默认的目标,该目标根据 MAKE_ENV、MAKE_ARGS 和 ALL_TARGET 运行 Ant。这与 中文档说明的 USES= gmake 机制类似。

    6.16.3. 最佳实践

    在移植 Java 库时,Port 需要将 JAR 文件安装到 ${JAVAJARDIR},并将其他所有内容安装到 ${JAVASHAREDIR}/${PORTNAME} 目录下(文档除外,见下文)。为了减小打包文件的大小,应在 Makefile 中直接引用 JAR 文件。可以使用如下语句(其中 myport.jar 是 Port 安装的 JAR 文件名称):

    在移植 Java 应用程序时,Port 通常会将所有内容安装到单一目录下(包括其 JAR 依赖项)。在这种情况下,强烈推荐使用 ${JAVASHAREDIR}/${PORTNAME}。具体是否将额外的 JAR 依赖项安装到此目录下,还是使用已经安装的 JAR(来自 ${JAVAJARDIR}),由移植者决定。

    当移植需要应用服务器(如 )来运行服务的 Java™ 应用程序时,供应商通常会分发一个 .war 文件。.war 是 Web 应用程序存档文件,在应用程序调用时会被解压。避免将 .war 添加到 pkg-plist 中,这不是最佳实践。应用服务器会展开 war 存档,但如果 Port 被移除,它不会正确清理该存档。更好的做法是先解压存档文件,再安装文件,最后将这些文件添加到 pkg-plist 中。

    无论 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 中(文档参见 ),因此可以在 pkg-plist 中直接使用 %%DATADIR%%。

    至于从源代码构建 Java Port 还是直接从二进制分发安装,目前没有明确的政策。然而,来自 的成员建议移植者在任务简单时从源代码构建他们的 Port。

    本节介绍的所有功能都在 bsd.java.mk 中实现。如果 Port 需要更复杂的 Java 支持,请首先查看 ,因为通常需要一些时间才能记录最新功能。然后,如果缺少的支持对许多其他 Java Port 有益,请随时在 freebsd-java 上讨论。

    尽管存在一个 java 类别用于 PR,但它指的是来自 FreeBSD Java 项目的 JDK 移植工作。因此,除非问题与 JDK 实现或 bsd.java.mk 相关,否则应像处理其他 Port 一样,在 ports 类别中提交 Java Port。

    类似地,对于 Java Port 的 CATEGORIES,有一个定义明确的政策,详情请见 。

    6.17. Web 应用程序、Apache 和 PHP

    6.17.1. Apache

    变量
    说明

    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 的依赖。更多信息请参考 。

    6.17.4. PEAR 模块

    移植 PEAR 模块是一个非常简单的过程。

    在 Port 的 Makefile 中添加 USES=pear。该框架将把相关文件安装到正确的位置,并在安装时自动生成 plist。

    示例 25. PEAR 类的 Makefile 示例

    技巧

    PEAR 模块将使用 自动进行 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。

    示例 26. Horde 模块的 Makefile 示例

    技巧

    由于 Horde 模块也是 PEAR 模块,它们将使用 自动进行 flavor 化。

    6.18. 使用 Python

    Ports 支持多个 Python 版本的并行安装。Port 必须根据用户可设置的 PYTHON_VERSION 使用正确的 python 解释器。最重要的是,这意味着将脚本中的 python 可执行文件路径替换为 PYTHON_CMD 的值。

    将文件安装到 PYTHON_SITELIBDIR 下的 Port 必须使用 pyXY- 包名前缀,这样它们的包名就包含了 Python 的版本号。

    表 25. 使用 Python 的 Port 最有用的变量

    表 26. Python 模块依赖帮助程序

    完整的可用变量列表可以在 /usr/ports/Mk/Uses/python.mk 中找到。

    重要

    所有使用 的 Python Port 的依赖项(无论是使用 USE_PYTHON=distutils 还是 USE_PYTHON=flavors)都必须使用 @${PY_FLAVOR} 将 Python flavor 添加到它们的 origin 中。请参见 。

    示例 27. 简单 Python 模块的 Makefile

    一些 Python 应用程序声称支持 DESTDIR(这是 staging 所需的),但实际上它是破损的(例如,Mailman 版本 2.1.16 之前的版本)。可以通过重新编译脚本来解决此问题。可以在 post-build 目标中实现这一点。例如,假设 Python 脚本应该安装到 PYTHONPREFIX_SITELIBDIR,则可以应用以下解决方案:

    这将使用相对于阶段目录的路径重新编译源代码,并通过 -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 最有用的只读变量

    有关这些变量的完整说明,请参阅 和 以及 。这些变量的完整列表可在 /usr/ports/Mk/Uses/tcl.mk 中找到。

    6.20. 使用 SDL

    USE_SDL 用于自动配置使用 SDL 基础库的 Ports,例如 和 。

    SDL 1.2 版本的这些库被识别:

    • sdl:

    • console:

    • gfx:

    • image:

    SDL 2.0 版本的这些库被识别:

    • sdl:

    • gfx:

    • image:

    • mixer:

    因此,如果一个 port 依赖于 和 ,其语法为:

    依赖项 ,这是 和 所必需的,将会自动添加。

    使用 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 版本的变量

    变量
    说明
    默认值

    可用的 wxWidgets 版本及其在树中的对应 Port 如下:

    表 29. 可用的 wxWidgets 版本

    版本
    Port

    可以设置为这些组合之一,多个版本之间用空格分隔:

    表 30. wxWidgets 版本规范

    说明
    示例

    还有一些变量用于从可用版本中选择首选版本。它们可以设置为一个版本列表,列表中的第一个版本将具有更高的优先级。

    表 31. 选择首选 wxWidgets 版本的变量

    名称
    适用对象

    6.21.3. 组件选择

    还有一些应用程序,尽管不是 wxWidgets 库,但与它们相关。这些应用程序可以在 WX_COMPS 中指定。可用的组件如下:

    表 32. 可用的 wxWidgets 组件

    名称
    说明
    版本限制

    每个组件的依赖类型可以通过添加后缀来选择,后缀与组件名称之间用分号分隔。如果没有指定后缀,则会使用默认类型(请参见 )。可用的依赖类型如下:

    表 33. 可用的 wxWidgets 依赖类型

    名称
    说明

    组件的默认依赖类型在下表中列出:

    表 34. 默认 wxWidgets 依赖类型

    组件
    依赖类型

    示例 28. 选择 wxWidgets 组件

    以下片段对应一个使用 wxWidgets 版本 2.4 及其贡献库的 port:

    6.21.4. 检测已安装的版本

    要检测已安装的版本,可以定义 WANT_WX。如果没有设置为特定版本,则组件将带有版本后缀。检测后,HAVE_WX 将会被填充。

    示例 29. 检测已安装的 wxWidgets 版本和组件

    此片段可以用于一个使用 wxWidgets 的 port,如果它已安装,或者选择了某个选项。

    此片段可以用于一个启用 wxPython 支持的 port,如果 wxWidgets 已安装或者选中了相关选项,此外还包括版本 2.8。

    6.21.5. 已定义的变量

    这些变量可以在 port 中使用(在定义了 后)。

    表 35. 为使用 wxWidgets 的 Ports 定义的变量

    名称
    说明

    6.21.6. 在 bsd.port.pre.mk 中的处理

    定义 WX_PREMK 以便在包含 bsd.port.pre.mk 后可以使用这些变量。

    重要

    当定义了 WX_PREMK,则版本、依赖、组件和定义的变量在修改 wxWidgets port 变量 后 包含 bsd.port.pre.mk 时不会发生变化。

    示例 30. 在命令中使用 wxWidgets 变量

    此片段展示了如何通过运行 wx-config 脚本来获取完整的版本字符串,将其分配给变量并传递给程序,使用 WX_PREMK。

    注意

    当 wxWidgets 变量位于目标中时,无需使用 WX_PREMK,可以安全地在命令中使用这些变量。

    6.21.7. 额外的 configure 参数

    一些 GNU configure 脚本仅通过设置 WX_CONFIG 环境变量无法找到 wxWidgets,可能需要额外的参数。可以使用 WX_CONF_ARGS 提供这些参数。

    表 36. WX_CONF_ARGS 的合法值

    可能的值
    结果参数

    6.22. 使用 Lua

    本节介绍了 Lua 库在 Ports 树中的状态及其与 Ports 系统的集成。

    6.22.1. 引言

    Lua 库和对应的解释器有多个版本,它们之间存在冲突(安装文件时会使用相同的名称)。在 Ports 树中,通过使用版本号后缀将每个版本安装为不同的名称来解决这个问题。

    显而易见的缺点是,每个应用程序都需要修改以找到期望的版本。但是,可以通过向编译器和链接器添加一些额外的标志来解决此问题。

    使用 Lua 的应用程序通常应仅为一个版本构建。然而,针对 Lua 的可加载模块会为其支持的每个 Lua 版本构建单独的版本,并且依赖这些模块的 Port 应该通过在 Port 源中使用 @${LUA_FLAVOR} 后缀来指定版本。

    6.22.2. 版本选择

    使用 Lua 的 Port 应该有以下形式的行:

    如果需要特定版本的 Lua 或版本范围,可以按 XY(可以多次使用)、XY+、-XY 或 XY-ZA 的格式指定。如果 DEFAULT_VERSIONS 设置的默认 Lua 版本位于请求的范围内,则将使用它,否则将使用默认版本最接近请求的版本。例如:

    请注意,版本选择不会尝试基于已安装的 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. 版本 flavors

    一个安装 Lua 模块的 Port(而不是仅仅使用 Lua 的应用程序)应该为每个支持的 Lua 版本构建一个单独的 flavors。这可以通过添加 module 参数来完成:

    也可以指定版本号或版本范围;使用逗号分隔多个参数。

    由于每个 flavors 必须有不同的包名,因此提供了变量 LUA_PKGNAMEPREFIX,该变量将被设置为适当的值;其预期用法为:

    模块 Port 通常只应安装文件到 LUA_MODLIBDIR、LUA_MODSHAREDIR、LUA_DOCSDIR 和 LUA_EXAMPLESDIR,所有这些目录都已设置为引用特定版本的子目录。安装任何其他文件必须小心,以避免版本之间的冲突。

    一个希望为每个 Lua 版本构建单独包的 Port(而不是 Lua 模块)应该使用 flavors 参数:

    这与上述说明的 module 参数的工作方式相同,但不假设包应该作为 Lua 模块来记录(因此默认情况下不定义 LUA_DOCSDIR 和 LUA_EXAMPLESDIR)。不过,Port 可以选择定义 LUA_DOCSUBDIR 作为合适的子目录名称(通常是 Port 的 PORTNAME,只要它不与任何模块的 PORTNAME 冲突),在这种情况下,框架将定义 LUA_DOCSDIR 和 LUA_EXAMPLESDIR。

    与模块 Port 一样,flavors Port 应避免安装可能在版本之间冲突的文件。通常通过将 LUA_VER_STR 作为程序名称的后缀来完成此操作(例如使用 ),并在其他文件或子目录中使用 LUA_VER 或 LUA_VER_STR,这些文件或子目录位于 LUA_MODLIBDIR 和 LUA_MODSHAREDIR 之外。

    6.22.5. 定义的变量

    在 Port 中可以使用以下变量。

    表 37. 使用 Lua 的 Port 中定义的变量

    名称
    说明

    对于指定了 module 参数的 Port,还有以下附加变量:

    表 38. Lua 模块 Port 中定义的变量

    名称
    说明

    6.22.6. 示例

    示例 31. 使用 Lua 的应用程序 Makefile

    此示例展示了如何引用运行时所需的 Lua 模块。请注意,引用必须指定一个 flavors。

    32. 简单 Lua 模块的 Makefile

    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 版本分别构建一个 flavors,并且这些模块的依赖关系应该使用 @${GUILE_FLAVOR} 后缀来指定 Port 来源。

    6.23.2. 版本选择

    使用 Guile 的 Port 应该定义 USES=guile:arg,arg…,并根据以下参数选择适当的值:

    表 39. 使用 Guile 的 Ports 定义的参数

    名称
    说明

    有一些额外的参数可用于处理特殊情况;详细信息请参见 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

    对于某些 Port,可能需要通过其他方式指定版本,例如通过 CONFIGURE_ARGS 或 MESON_ARGS,具体取决于 Port。

    如果这些方法都无法在存在其他版本的情况下使 Port 选择指定的 Guile 版本,最好是修补 Port 以实现此目的。如果不可行,则应指定 conflicts 选项,以防止在错误版本被检测到的情况下构建 Port。

    6.23.4. 版本 flavors

    安装 Guile 扩展或库的 Port,或为 Guile 预编译的 Scheme 库,应为每个支持的 Guile 版本构建一个单独的 flavors。通过添加 flavors 选项来实现此目的。

    由于每个 flavors 必须具有不同的包名称,因此这些 Port 必须设置 PKGNAMESUFFIX,通常为:

    这些 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。

    任何由 flavors Port 安装的其他文件也必须位于版本特定的目录中,或使用版本特定的文件名。对于文档和,GUILE_DOCS_DIR 和 GUILE_EXAMPLES_DIR 指定了适合的位置,在这些位置 Port 应创建子目录,详见下文。

    6.23.5. 已定义的变量

    这些变量在 Port 中可用。

    表 40. 使用 Guile 的 Port 所定义的变量

    名称
    值
    说明

    6.23.6. 路径替代

    以下内容定义了作为变量和 PLIST_SUB 条目的路径替代。变量形式以 _DIR 作为后缀,并且是完整路径(以 GUILE_PREFIX 为前缀)。

    表 41. 使用 Guile 的 Port 定义的路径替代

    名称
    值
    说明

    6.24. 使用 iconv

    FreeBSD 操作系统自带了本地的 iconv。

    对于需要 iconv 的软件,定义 USES=iconv。

    当一个 Port 定义了 USES=iconv 时,以下变量将可用:

    这两个自动为使用 或本地 iconv 的系统填充正确的变量值:

    34. 简单的 iconv 使用

    35. 使用 iconv 配置

    如上所示,当存在本地 iconv 时,ICONV_LIB 为空。这可以用来检测本地 iconv 并作出适当响应。

    有时,程序的 Makefile 或配置脚本中会硬编码 ld 参数或搜索路径。可以通过以下方法解决此问题:

    36. 修复硬编码的 -liconv

    在某些情况下,可能需要根据是否存在本地 iconv 来设置备用值或执行操作。必须在测试 ICONV_LIB 的值之前包含 bsd.port.pre.mk:

    37. 检查本地 iconv 可用性

    6.25. 使用 Xfce

    需要 Xfce 库或应用程序的 Port 应设置 USES=xfce。

    特定的 Xfce 库和应用程序依赖项通过赋值给 USE_XFCE 来设置。它们定义在 /usr/ports/Mk/Uses/xfce.mk 文件中。可用的值如下:

    USE_XFCE 的值

    38. USES=xfce 示例

    示例 39. 使用 Xfce 的 GTK2 小部件

    在此示例中,Port 化的应用程序使用 GTK2 特定的小部件 和 。

    Xfce 组件通过这种方式包含时,会自动包括它们所需的任何依赖项。现在不再需要列出整个依赖列表。如果 Port 仅需要 ,只需使用以下配置:

    不需要像这样列出 所需的组件:

    但是,Xfce 组件和 Port 的非 Xfce 依赖项必须显式包含。不要指望某个 Xfce 组件会为主 Port 提供除了它本身之外的子依赖项。

    6.26. 使用 Budgie

    依赖于 Budgie 桌面的应用程序或库应设置 USES=budgie 并将 USE_BUDGIE 设置为所需组件的列表。

    名称
    说明

    所有应用程序小部件通过 org.budgie_desktop.Raven 服务进行通信。默认的依赖项是 lib 和运行时,可以通过 :build 或 :run 来更改。例如:

    示例 40. USE_BUDGIE 示例

    6.27. 使用数据库

    使用以下 USES 宏之一来添加数据库依赖项,具体参考 。

    数据库 USES 宏

    表 42 数据库宏

    示例 41. 使用 Berkeley DB 6

    详见 。

    示例 42. 使用 MySQL

    当 Port 需要 MySQL 客户端库时,添加:

    详见 。

    示例 43. 使用 PostgreSQL

    当 Port 需要 PostgreSQL 9.6 或更高版本的服务器时,添加:

    详见 。

    示例 44. 使用 SQLite 3

    详见 。

    6.28. 启动和停止服务(rc 脚本)

    rc.d 脚本用于在系统启动时启动服务,并为管理员提供一种标准的方式来停止、启动和重新启动服务。Port 集成到系统 rc.d 框架中。有关其用法的详细信息,可以参见 。有关可用命令的详细解释,请参见 和 。此外,还有一篇关于 rc.d 脚本实践方面的 。

    假设有一个名为 doorman 的虚拟 Port,需要启动 doormand 守护进程。在 Makefile 中添加以下内容:

    可以列出多个脚本,它们将被安装。脚本必须放在 files 子目录中,并且文件名必须添加 .in 后缀。标准的 SUB_LIST 展开将会应用到这个文件上。强烈建议使用 %%PREFIX%% 和 %%LOCALBASE%% 展开。有关 SUB_LIST 的更多信息,请参见 。

    自 FreeBSD 6.1-RELEASE 以来,本地的 rc.d 脚本(包括 Port 安装的)已包含在基本系统的 中。

    这是一个简单的 rc.d 脚本示例,用于启动 doormand 守护进程:

    除非有非常充分的理由需要更早启动服务,或者服务以特定用户(非 root)身份运行,所有 Port 脚本必须使用:

    如果启动脚本启动了必须在系统关闭时停止的守护进程,以下设置将触发服务在系统关闭时停止:

    如果脚本启动的不是持久化服务,则不需要此设置。

    对于可选的配置元素,最好使用 = 风格的默认变量赋值,而不是 := 风格,因为前者仅在变量未设置时设置默认值,而后者则会在变量未设置 或 为空时设置默认值。例如,用户可能在 rc.conf.local 中包含如下内容:

    使用 := 的变量替换会不适当地覆盖用户的意图。_enable 变量是不可选的,必须使用 : 来设置默认值。

    警告

    Port 不能 在安装和卸载时启动和停止其服务。不要滥用 中说明的 plist 关键字,通过运行修改当前运行系统的命令,包括启动或停止服务。

    6.28.1. 提交前检查清单

    在提交一个包含 rc.d 脚本的 Port 之前,尤其是提交之前,请查阅以下检查清单,以确保它已经准备好。

    Port 可以检查其中的大部分内容,但它不能替代适当的代码审查。

    1. 如果这是一个新文件,它是否具有 .sh 扩展名?如果是的话,必须将其更改为 file.in,因为 rc.d 文件不能以该扩展名结尾。

    2. 文件名(去掉 .in 后),PROVIDE 行和 $ name 是否匹配?文件名与 PROVIDE 匹配可以使调试变得更容易,特别是对于 问题。匹配文件名和 $ name 可以更容易地弄清楚哪些变量在 rc.conf[.local] 中是相关的。这也是所有新脚本的政策,包括基本系统中的脚本。

    6.29. 添加用户和组

    一些 Ports 需要特定的用户帐户,通常是运行该用户的守护进程。对于这些 Ports,请从 50 到 999 中选择一个 唯一 的 UID,并在 ports/UIDs(用于用户)和 ports/GIDs(用于组)中注册它。用户和组的唯一标识符应当相同。

    当需要为 Port 创建新用户或组时,请包括这两个文件的补丁。

    然后在 Makefile 中使用 USERS 和 GROUPS,用户将在安装该 Port 时自动创建。

    当前保留的 UID 和 GID 列表可以在 ports/UIDs 和 ports/GIDs 中找到。

    6.30. 依赖内核源代码的 Ports

    一些 Ports(例如内核加载模块)需要内核源代码文件,以便能够编译。正确的判断用户是否已安装这些文件的方法如下:

    除了这个检查,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 完成文件名

    不要注册对 shell 本身的任何依赖。

    ,并且如果 Port 安装
    *.cmake
    依赖于构建类型(参见
    示例),必须使用该值。请注意,一些项目可能会定义自己的构建配置和/或通过在 CMakeLists.txt 中设置 CMAKE_BUILD_TYPE 强制特定的构建类型。为了让这样的项目的 Port 尊重 CFLAGS 和 WITH_DEBUG,必须删除这些文件中的 CMAKE_BUILD_TYPE 定义。

    CARGO_ENV

    要传递给 Cargo 的环境变量列表,类似于 MAKE_ENV。

    RUSTFLAGS

    传递给 Rust 编译器的标志。

    CARGO_CONFIGURE

    yes

    使用默认的 do-configure。

    CARGO_UPDATE_ARGS

    在配置阶段传递给 Cargo 的额外参数。有效的参数可以通过 cargo update --help 查找。

    CARGO_BUILDDEP

    yes

    添加对 的构建依赖。

    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。

    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

    带有改进的可访问性和国际化支持的终端组件

    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

    带有改进的可访问性和国际化支持的终端组件

    Qt 的库路径。

    QT_PLUGINDIR

    Qt 的插件路径。

    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 的支持

    实现 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 服务的交互

    设置后,将选定的 JDK Port 添加到提取依赖项中。

    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。

    Apache 配置文件的目录。此变量会在 pkg-plist 中自动展开。

    站点包树的位置,包含 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 解释器命令行,包括版本号。

    根据 Python 版本,条件依赖于 。

    Tk 解释器的完整路径

    TK_LIBDIR

    Tk 库文件的路径

    TK_INCLUDEDIR

    Tk C 头文件的路径

    mixer: audio/sdl_mixer

  • mm: devel/sdlmm

  • net: net/sdl_net

  • pango: x11-toolkits/sdl_pango

  • sound: audio/sdl_sound

  • ttf: graphics/sdl_ttf

  • net: net/sdl2_net

  • ttf: graphics/sdl2_ttf

  • ;
  • 修补软件的配置或构建文件,以选择正确的版本。

  • 安装 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)

    选项,则所需 Guile 版本的二进制文件是别名文件;
  • 如果没有使用 alias 选项,则所需 Guile 版本的工具路径(如 guild、guile-config 等)将作为变量 GUILD、GUILE_CONFIG 等被添加到 CONFIGURE_ENV 和 MAKE_ENV 中。

  • 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 工具的完整路径。

    GUILE_*_CMD GUILE_*_CMDPATH

    类似于 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 的合适值。

    GUILE_EXAMPLES

    share/examples/guile30

    版本特定的父目录。

    ICONV_CONFIGURE_ARG

    为配置脚本预构建的配置参数

    --with-libiconv-prefix=${LOCALBASE}

    (空)

    ICONV_CONFIGURE_BASE

    为配置脚本预构建的配置参数

    --with-libiconv=${LOCALBASE}

    (空)

    REQUIRE 行是否设置为 LOGIN?这是运行为非 root 用户的脚本的强制要求。如果它以 root 身份运行,是否有充分的理由让它在 LOGIN 之前运行?如果没有,它必须在后面运行,以便本地脚本可以大致分组到 rcorder(8) 中大多数基础服务已启动后的位置。

  • 脚本是否启动了一个持久性服务?如果是的话,必须添加 KEYWORD: shutdown。

  • 确保没有 KEYWORD: FreeBSD。多年来这已经不必要也不可取了。这也是新脚本可能是从旧脚本复制/粘贴的一个迹象,因此审查时必须格外小心。

  • 如果脚本使用像 perl、python 或 ruby 这样的解释性语言,请确保 command_interpreter 设置得当,例如,对于 Perl,添加 PERL=${PERL} 到 SUB_LIST 并使用 %%PERL%%。否则,

    可能无法正确工作。请参阅 service(8) 获取更多信息。

  • 所有 /usr/local 的出现是否都已被替换为 %%PREFIX%%?

  • 默认变量赋值是否出现在 load_rc_config 之后?

  • 是否有默认的空字符串赋值?它们应该被删除,但请再次确认该选项是否在文件顶部的注释中有所记录。

  • 脚本中设置的变量是否被实际使用?

  • 默认的 name_flags 中列出的选项是否确实是必须的?如果是,它们必须在 command_args 中。-d 是这里的一个警告标志(请原谅这个双关语),因为它通常是“守护进程化”过程的选项,因此实际上是必须的。

  • _name__flags 绝不能出现在 command_args 中(反之亦然,尽管这种错误较少见)。

  • 脚本是否无条件执行任何代码?这是不被推荐的。通常这些事情必须通过 start_precmd 进行处理。

  • 所有布尔测试必须使用 checkyesno 函数。不要手动编写 [Yy][Ee][Ss] 等测试。

  • 如果有一个循环(例如,等待某些东西启动),是否有一个计数器来终止该循环?如果出现错误,我们不希望引导过程永远卡住。

  • 脚本是否创建了需要特定权限的文件或目录,例如需要由运行该进程的用户拥有的 pid?与传统的 touch(1)/chown(8)/chmod(1) 例程不同,考虑使用 install(1) 并提供适当的命令行参数,一步完成整个过程。

  • GNU_CONFIGURE

    Port 使用 configure 脚本进行构建准备。

    HAS_CONFIGURE

    与 GNU_CONFIGURE 相同,只是默认的配置目标没有添加到 CONFIGURE_ARGS 中。

    CONFIGURE_ARGS

    传递给 configure 脚本的额外参数。

    CONFIGURE_ENV

    为 configure 脚本运行设置的额外环境变量。

    CONFIGURE_TARGET

    重写默认的配置目标。默认值为 ${MACHINE_ARCH}-portbld-freebsd${OSREL}。

    CMAKE_ARGS

    传递给 cmake 二进制文件的 Port 特定 CMake 标志。

    CMAKE_ON

    对于 CMAKE_ON 中的每个条目,都会将启用的布尔值添加到 CMAKE_ARGS 中。请参见 CMAKE_ON 和 CMAKE_OFF。

    CMAKE_OFF

    对于 CMAKE_OFF 中的每个条目,都会将禁用的布尔值添加到 CMAKE_ARGS 中。请参见 CMAKE_ON 和 CMAKE_OFF。

    CMAKE_BUILD_TYPE

    构建类型(CMake 预定义的构建配置)。默认值为 Release,如果设置了 WITH_DEBUG,则为 Debug。

    CMAKE_SOURCE_PATH

    源目录的路径。默认值为 ${WRKSRC}。

    CONFIGURE_ENV

    为 cmake 二进制文件设置的额外环境变量。

    CMAKE_NOCOLOR

    禁用彩色构建输出。默认未设置,除非设置了 BATCH 或 PACKAGE_BUILDING。

    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 的路径。必要时,可以指定多个锁定文件。

    MESON_ARGS

    要传递给 meson 二进制文件的 Port 特定 Meson 标志。

    MESON_BUILD_DIR

    相对于 WRKSRC 的构建目录路径。默认是 _build。

    PERL

    Perl 5 解释器的完整路径,无论是系统自带的还是从 Port 安装的,但不带版本号。当软件需要 Perl 解释器的路径时使用此变量。要替换脚本中的 "#!" 行,请使用 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 中。

    USES= imake

    该 Port 使用 imake。

    XMKMF

    如果 xmkmf 不在 PATH 中,设置为其路径。默认为 xmkmf -a。

    atk

    accessibility/atk

    辅助工具包 (ATK)

    atkmm

    accessibility/atkmm

    atk 的 C++ 绑定

    cairo

    graphics/cairo

    支持跨设备输出的矢量图形库

    cairomm

    graphics/cairomm

    cairo 的 C++ 绑定

    gnomeprefix

    为 configure 提供一些默认的路径。

    intlhack

    与 intltool 相同,但进行了修补,以确保使用 share/locale/。仅在 intltool 不足时使用。

    referencehack

    该宏用于帮助将 API 或参考文档拆分为自己的 Port。

    atspi

    accessibility/at-spi

    辅助技术服务提供者接口

    esound

    audio/esound

    Enlightenment 声音包

    gal2

    x11-toolkits/gal2

    来自 GNOME 2 gnumeric 的组件

    gconf2

    devel/gconf2

    GNOME 2 的配置数据库系统

    pangox-compat

    pangox-compat 已被废弃,并从 pango 包中分离出来。

    QMAKE

    qmake 可执行文件的完整路径。

    LRELEASE

    lrelease 工具的完整路径。

    MOC

    moc 的完整路径。

    RCC

    rcc 的完整路径。

    UIC

    uic 的完整路径。

    QT_INCDIR

    Qt 的包含目录。

    3d

    Qt3D 模块

    5compat

    Qt 5 兼容模块,用于 Qt 6

    assistant

    Qt 5 文档浏览器

    base

    Qt 6 基础模块

    canvas3d

    Qt canvas3d 模块

    charts

    Qt 5 图表模块

    buildtools

    构建工具(moc,rcc),几乎每个 Qt 应用都需要

    linguisttools

    本地化工具:lrelease,lupdate

    qmake

    Makefile 生成工具/构建工具

    imageformats

    支持 TGA、TIFF 和 MNG 图像格式的插件

    no_configure

    不添加配置目标。这由 HAS_CONFIGURE=yes 和 GNU_CONFIGURE=yes 隐含。当构建仅需要通过 USES= qmake 设置环境,但其他时候自行运行 qmake 时需要此参数。

    no_env

    禁止修改配置和构建环境。仅当 qmake 用于配置软件且构建无法理解 USES= qmake 设置的环境时才需要。

    norecursive

    不向 qmake 传递 -recursive 参数。

    outsource

    执行源代码外构建。

    QMAKE_ARGS

    传递给 qmake 二进制文件的 Port 特定 qmake 标志。

    QMAKE_ENV

    设置给 qmake 二进制文件的环境变量。默认值为 ${CONFIGURE_ENV}。

    QMAKE_SOURCE_PATH

    qmake 项目文件(.pro)的路径。如果请求源代码外构建,默认值为 ${WRKSRC},否则为空。

    activities

    KF5 运行时和库,用于在不同活动中组织工作

    activities-stats

    KF5 活动统计

    activitymanagerd

    管理用户活动、跟踪使用模式的系统服务

    akonadi

    KDE-Pim 的存储服务器

    akonadicalendar

    Akonadi 日历集成

    akonadiconsole

    Akonadi 管理和调试控制台

    buildtools

    用于额外 CMake 模块的辅助工具

    libfmqt

    Libfm Qt 绑定

    lxqt

    LXQt 核心库

    qtxdg

    freedesktop.org XDG 规范的 Qt 实现

    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_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')。

    JAVASHAREDIR

    与 Java 相关的所有内容的基本目录。默认值:${PREFIX}/share/java。

    JAVAJARDIR

    安装 JAR 文件的目录。默认值:${JAVASHAREDIR}/classes。

    JAVALIBDIR

    其他 Port 安装的 JAR 文件所在目录。默认值:${LOCALBASE}/share/java/classes。

    USE_APACHE

    Port 需要 Apache。可能的值:yes(获取任意版本),22,24,22-24,22+ 等。默认的 Apache 版本是 22。更多细节请参见 ports/Mk/bsd.apache.mk 以及 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 中自动展开。

    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。

    USE_PYTHON=optsuffix

    如果当前 Python 版本不是默认版本,则该 Port 将获得 PKGNAMESUFFIX=${PYTHON_PKGNAMESUFFIX}。仅在使用 flavors 时有用。

    PYTHON_PKGNAMEPREFIX

    用作 PKGNAMEPREFIX 来区分不同 Python 版本的包。例如:py27-。

    PYNUMERIC

    数值扩展的依赖项

    PYNUMPY

    新的数值扩展 numpy 的依赖项。(PYNUMERIC 已被上游供应商废弃)。

    PYXML

    XML 扩展的依赖项(对于 Python 2.0 及更高版本,因其也在基础发行版中,故不需要)。

    PY_ENUM34

    根据 Python 版本,条件依赖于 devel/py-enum34。

    PY_ENUM_COMPAT

    根据 Python 版本,条件依赖于 devel/py-enum-compat。

    PY_PATHLIB

    根据 Python 版本,条件依赖于 devel/py-pathlib。

    PY_IPADDRESS

    根据 Python 版本,条件依赖于 net/py-ipaddress。

    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 版本号(主版本。次版本)

    USE_WX

    Port 可以使用的版本列表

    所有可用版本

    USE_WX_NOT

    Port 不能使用的版本列表

    无

    2.8

    x11-toolkits/wxgtk28

    3.0

    x11-toolkits/wxgtk30

    单一版本

    2.8

    升序范围

    2.8+

    降序范围

    3.0-

    完整范围(必须是升序)

    2.8-3.0

    WANT_WX_VER

    port

    WITH_WX_VER

    用户

    wx

    主库

    无

    contrib

    贡献的库

    无

    python

    wxPython(Python 绑定)

    2.8-3.0

    build

    组件用于构建,相当于 BUILD_DEPENDS

    run

    组件用于运行,相当于 RUN_DEPENDS

    lib

    组件用于构建和运行,相当于 LIB_DEPENDS

    wx

    lib

    contrib

    lib

    python

    run

    mozilla

    lib

    svg

    lib

    WX_CONFIG

    wxWidgets 的 wx-config 脚本的路径(具有不同的名称)

    WXRC_CMD

    wxWidgets 的 wxrc 程序的路径(具有不同的名称)

    WX_VERSION

    将使用的 wxWidgets 版本(例如,2.6)

    absolute

    --with-wx-config=${WX_CONFIG}

    relative

    --with-wx=${LOCALBASE} --with-wx-config=${WX_CONFIG:T}

    LUA_VER

    将使用的 Lua 版本(例如,5.4)

    LUA_VER_STR

    不带点的 Lua 版本(例如,54)

    LUA_FLAVOR

    对应所选 Lua 版本的 flavors 名称,用于指定依赖

    LUA_BASE

    用于定位已安装的 Lua(和组件)的前缀

    LUA_PREFIX

    该 Port 将安装 Lua(和组件)的位置前缀

    LUA_INCDIR

    安装 Lua 头文件的目录

    LUA_DOCSDIR

    模块文档应安装到的目录。

    LUA_EXAMPLESDIR

    模块示例文件应安装到的目录。

    X.Y

    声明与 Guile 版本 X.Y 的兼容性。目前可用的版本为 1.8(已废弃)、2.2 和 3.0。可以指定多个版本。

    flavors

    为每个指定的 Guile 版本创建一个 flavors。由 DEFAULT_VERSIONS 指定的版本将成为默认 flavors。flavors 名称的格式为 guileXY。

    build

    仅将 Guile 解释器添加为构建依赖项,而不是库依赖项。可以同时指定 build 和 run。

    run

    仅将 Guile 解释器添加为运行时依赖项,而不是库依赖项。可以同时指定 build 和 run。

    alias

    为解释器和工具添加 BINARY_ALIAS 值。

    conflicts

    为比选定版本更新的 Guile 版本声明 CONFLICTS_BUILD。当 Port 无法配置为使用特定版本的 Guile 时,使用此选项。

    GUILE_VER

    3.0

    正在使用的 Guile 版本。

    GUILE_SFX

    3

    用于某些名称的短后缀。仅在小心使用时使用;可能不是唯一的,或将来可能会改变。

    GUILE_FLAVOR

    guile30

    与所选版本对应的 flavors 名称。

    GUILE_PORT

    lang/guile3

    指定的 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

    版本特定文档的父目录。

    变量名

    目的

    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

    garcon

    sysutils/garcon

    libexo

    x11/libexo

    libgui

    x11-toolkits/libxfce4gui

    libmenu

    x11/libxfce4menu

    libutil

    x11/libxfce4util

    panel

    x11-wm/xfce4-panel

    thunar

    x11-fm/thunar

    libbudgie

    桌面核心(库)

    libmagpie

    Budgie 的 X11 窗口管理器和合成器库

    raven

    用于访问不同应用程序小部件的面板一体化中心

    screensaver

    桌面特定的屏幕保护程序

    数据库

    USES 宏

    Berkeley DB

    bdb

    MariaDB, MySQL, Percona

    mysql

    PostgreSQL

    pgsql

    SQLite

    sqlite

    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}

    audio/ebur128
    net/ntp
    net/cvsup-static
    audio/logitechmediaserver
    deskutils/libportal
    PREFIX 和 DESTDIR
    USES=uidfix
    chown(8)
    chgrp(1)
    install(1)
    USES=fakeroot
    mtree(8)
    mtree(8)
    USES=metaport
    install(1)
    install(1)
    Fedora
    Gentoo
    CC-BY-SA 3.0
    pkg(8)
    [email protected]
    lang/mosml
    www/seamonkey
    autotools
    USES=libtool
    FreeBSD ports 邮件列表
    make(1)
    使用 USES 宏
    OPT_CMAKE_BOOL 和 OPT_CMAKE_BOOL_OFF
    许可证
    预定义许可证列表
    go
    ports-mgmt/modules2tuple
    cabal
    devel/hs-cabal-install
    ports-mgmt/hs-cabal2tuple
    autoreconf
    devel/gettext
    USES=gettext
    高级 pkg-plist 实践
    动态打包列表生成
    devel/gettext
    cpan.org
    perl5 USES 说明
    sed(1)
    perl(1)
    xorg
    gl
    x11-toolkits/open-motif
    x11-toolkits/lesstif
    x11-toolkits/open-motif-devel
    USES=display
    Freedesktop 标准
    INSTALL_DATA 宏
    Freedesktop 网站
    GNOME 组件
    GNOME Components
    现有的 Port
    FreeBSD GNOME 页面
    qt-dist
    CMake
    USES= qmake 示例
    USES qmake 的可能参数
    editors/texmaker
    使用 cmake
    java/openjdk18
    java/openjdk17
    java/openjdk16
    java/openjdk15
    java/openjdk14
    java/openjdk13
    java/openjdk12
    java/openjdk11
    java/openjdk8
    java/openjdk7
    基于 Make 变量修改 pkg-plist
    构建机制
    www/tomcat7
    基于 Make 变量修改 pkg-plist
    FreeBSD Java 项目
    bsd.java.mk Git 日志
    分类
    php
    PHP flavors
    PHP flavors
    Python flavors
    简单的 Python 模块 Makefile
    USES=tcl
    USES=tk
    Using USES Macros
    devel/sdl12
    graphics/sdl_image
    devel/sdl12
    devel/sdl_console
    graphics/sdl_gfx
    graphics/sdl_image
    devel/sdl20
    graphics/sdl2_gfx
    graphics/sdl2_image
    audio/sdl2_mixer
    net/sdl_net
    audio/sdl_mixer
    devel/sdl12
    net/sdl_net
    audio/sdl_mixer
    选择 wxWidgets 版本的变量
    默认 wxWidgets 依赖类型
    选择 wxWidgets 版本的变量
    uniquefiles
    converters/libiconv
    x11/libxfce4menu
    x11/xfce4-conf
    x11-wm/xfce4-panel
    x11-wm/xfce4-panel
    Database USES Macros
    bdb
    mysql
    pgsql
    sqlite
    rc.d Handbook 章节
    rc(8)
    rc.subr(8)
    文章
    相关章节
    rcorder(8)
    @preexec 命令、@postexec 命令、@preunexec 命令、@postunexec 命令
    devel/rclint
    rcorder(8)

    QT_LIBDIR

    concurrent

    akonadicontacts

    JAVA_EXTRACT

    JAVA_HOME

    APACHEETCDIR

    PYTHON_SITELIBDIR

    PY_FUTURES

    WISH

    LUA_LIBDIR

    xfconf

    devel/kf5-kcrash
    # service name stop
    NO_MTREE=	yes
    ${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
    % 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
    USE_LDCONFIG=	yes
    USE_LDCONFIG=	${PREFIX}/lib/foo ${PREFIX}/lib/bar
    .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
    USES=			cmake
    CMAKE_SOURCE_PATH=	${WRKSRC}/subproject
    CMAKE_ON=	VAR1 VAR2
    CMAKE_OFF=	VAR3
    CMAKE_ARGS=	-DVAR1:BOOL=TRUE -DVAR2:BOOL=TRUE -DVAR3:BOOL=FALSE
    env = Environment(**ARGUMENTS)
    PORTNAME=	tokei
    DISTVERSIONPREFIX=	v
    DISTVERSION=	7.0.2
    CATEGORIES=	devel
    
    MAINTAINER=	[email protected]
    COMMENT=	Display statistics about your code
    WWW=		https://github.com/XAMPPRocky/tokei/
    
    USES=		cargo
    USE_GITHUB=	yes
    GH_ACCOUNT=	Aaronepower
    
    .include <bsd.port.mk>
    % 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
    % 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 \
                    [...]
    PORTNAME=	tokei
    DISTVERSIONPREFIX=	v
    DISTVERSION=	7.0.2
    CATEGORIES=	devel
    
    MAINTAINER=	[email protected]
    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>
    % 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/.
    [...]
    CARGO_FEATURES=	json yaml
    [features]
    pulseaudio_backend = ["librespot-playback/pulseaudio-backend"]
    portaudio_backend = ["librespot-playback/portaudio-backend"]
    default = ["pulseaudio_backend"]
    CARGO_FEATURES=	--no-default-features
    
    OPTIONS_DEFINE=	PORTAUDIO PULSEAUDIO
    
    PORTAUDIO_VARS=		CARGO_FEATURES+=portaudio_backend
    PULSEAUDIO_VARS=	CARGO_FEATURES+=pulseaudio_backend
    % 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
    [...]
    USES=		meson
    MESON_ARGS=	-Dfoo=enabled
    PORTNAME=       hey
    DISTVERSIONPREFIX=	v
    DISTVERSION=    0.1.4
    CATEGORIES=     benchmarks
    
    MAINTAINER=     [email protected]
    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>
    PORTNAME=	ghq
    DISTVERSIONPREFIX=	v
    DISTVERSION=	0.12.5
    CATEGORIES=	devel
    
    MAINTAINER=	[email protected]
    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>
    % 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
    % 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
    PORTNAME=	ghq
    DISTVERSIONPREFIX=	v
    DISTVERSION=	0.12.5
    CATEGORIES=	devel
    
    MAINTAINER=	[email protected]
    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>
    % 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
    [...]
    GO_TARGET=  ./cmd/ipfs:ipfs-go
    GO_TARGET=  ./dnscrypt-proxy:${PREFIX}/sbin/dnscrypt-proxy
    PORTNAME=	ShellCheck
    DISTVERSION=	0.6.0
    CATEGORIES=	devel
    
    MAINTAINER=	[email protected]
    COMMENT=	Shell script analysis tool
    WWW=		https://www.shellcheck.net/
    
    USES=		cabal
    
    .include <bsd.port.mk>
    % 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/
    % 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)
    [...]
    % make make-use-cabal
    USE_CABAL=	QuickCheck-2.12.6.1 \
    		hashable-1.3.0.0 \
    		integer-logarithms-1.0.3 \
    [...]
    % 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
    [...]
    PORTNAME=	profiteur
    
    [...]
    
    USES=		cabal
    
    USE_CABAL=	OneTuple-0.3.1_2 \
    		QuickCheck-2.14.2 \
    		[...]
    
    .include <bsd.port.mk>
    [...]
    
    USE_CABAL=	OneTuple-0.3.1_2 \
    		QuickCheck-2.14.2 \
    		[...]
    
    
    CABAL_WRAPPER_SCRIPTS=		${CABAL_EXECUTABLES}
    
    .include <bsd.port.mk>
    [...]
    
    CABAL_WRAPPER_SCRIPTS=		${CABAL_EXECUTABLES}
    profiteur_DATADIR_VARS=		js-jquery
    
    .include <bsd.port.mk>
    [...]
    source-repository-package
      type: git
      location: https://github.com/input-output-hk/cardano-crypto
      tag: f73079303f663e028288f9f4a9e08bcca39a923e
    [...]
    % 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 \
    		[...]
    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
    BINARY_ALIAS=	git=true
    USES=	gettext
    GNU_CONFIGURE=	yes
    USES=	gettext localbase:ldflags
    GNU_CONFIGURE=	yes
    GNU_CONFIGURE=		yes
    
    OPTIONS_DEFINE=		NLS
    OPTIONS_SUB=		yes
    
    NLS_USES=		gettext
    NLS_CONFIGURE_ENABLE=	nls
    
    .include <bsd.port.mk>
    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>
    %%NLS%%share/locale/fr/LC_MESSAGES/foobar.mo
    %%NLS%%share/locale/no/LC_MESSAGES/foobar.mo
    p5-IO-Tee>=0.64:devel/p5-IO-Tee
    lib/perl5/5.14/man/man1/event.1.gz
    lib/perl5/5.14/man/man3/AnyEvent::I3.3.gz
    %%PERL5_MAN1%%/event.1.gz
    %%PERL5_MAN3%%/AnyEvent::I3.3.gz
    USES=		perl5
    USE_PERL5=	build
    USES=		perl5
    USE_PERL5=	patch build run
    USES=		perl5
    USE_PERL5=	configure
    USES=		perl5
    USE_PERL5=	modbuild
    USES=		perl5
    USE_PERL5=	modbuildtiny
    USES=		gl xorg
    USE_GL=		glu
    USE_XORG=	xrender xft xkbfile xt xaw
    # 使用一些 X11 库
    USES=		xorg
    USE_XORG=	x11 xpm
    USES=	display
    DESKTOP_ENTRIES=	"NAME" "COMMENT" "ICON" "COMMAND" "CATEGORY" StartupNotify
    DESKTOP_ENTRIES=	"ToME" "基于 JRR Tolkien 作品的 Roguelike 游戏" \
    			"${DATADIR}/xtra/graf/tome-128.png" \
    			"tome -v -g" "Application;Game;RolePlaying;" \
    			false
    USE_GNOME=	gtk30
    PORTNAME=	regexxer
    DISTVERSION=	0.10
    CATEGORIES=	devel textproc gnome
    MASTER_SITES=	GNOME
    
    MAINTAINER=	[email protected]
    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>
    GLIB_SCHEMAS=foo.gschema.xml
    GCONF_SCHEMAS=my_app.schemas my_app2.schemas my_app3.schemas
    INSTALLS_OMF=yes
    USES=	qt:5
    USE_QT=	gui buildtools_build qmake_build
    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}
    USES=	qmake:outsource qt:5
    USE_QT=	buildtools_build
    QMAKE_ARGS+=	INCLUDEPATH+=${LOCALBASE}/include \
    		LIBS+=-L${LOCALBASE}/lib
    USES=		cmake kde:5 qt:5
    USE_KDE=	ecm
    USE_QT=		core buildtools_build qmake_build
    USES=	cmake lxqt qt:5 tar:xz
    USE_QT=		core dbus widgets buildtools_build qmake_build
    USE_LXQT=	buildtools libfmqt
    PLIST_FILES+=	${JAVAJARDIR}/myport.jar
    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}
    PORTNAME=       Date
    DISTVERSION=	1.4.3
    CATEGORIES=	devel www pear
    
    MAINTAINER=	[email protected]
    COMMENT=	PEAR Date and Time Zone Classes
    WWW=		https://pear.php.net/package/Date/
    
    USES=	pear
    
    .include <bsd.port.mk>
    PORTNAME=	Horde_Core
    DISTVERSION=	2.14.0
    CATEGORIES=	devel www pear
    
    MAINTAINER=	[email protected]
    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>
    PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}
    PORTNAME=	sample
    DISTVERSION=	1.2.3
    CATEGORIES=	devel
    
    MAINTAINER=	[email protected]
    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>
    (cd ${STAGEDIR}${PREFIX} \
      && ${PYTHON_CMD} ${PYTHON_LIBDIR}/compileall.py \
       -d ${PREFIX} -f ${PYTHONPREFIX_SITELIBDIR:S;${PREFIX}/;;})
    USE_SDL=	net mixer
    USE_WX=		2.8
    WX_COMPS=	wx contrib
    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
    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
    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
    USES=	lua
    USES=	lua:52-53
    USES=	lua:module
    PKGNAMEPREFIX=	${LUA_PKGNAMEPREFIX}
    USES=	lua:flavors
    PORTNAME=	sample
    DISTVERSION=	1.2.3
    CATEGORIES=	whatever
    
    MAINTAINER=	[email protected]
    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>
    PORTNAME=	sample
    DISTVERSION=	1.2.3
    CATEGORIES=	whatever
    PKGNAMEPREFIX=	${LUA_PKGNAMEPREFIX}
    
    MAINTAINER=	[email protected]
    COMMENT=	Sample
    WWW=		https://example.com/lua_sample/sample/
    
    USES=		lua:module
    
    DOCSDIR=	${LUA_DOCSDIR}
    
    .include <bsd.port.mk>
    PKGNAMESUFFIX=	-${FLAVOR}
    USES=		iconv
    LDFLAGS+=	-L${LOCALBASE}/lib ${ICONV_LIB}
    USES=		iconv
    CONFIGURE_ARGS+=${ICONV_CONFIGURE_ARG}
    USES=		iconv
    
    post-patch:
    	@${REINPLACE_CMD} -e 's/-liconv/${ICONV_LIB}/' ${WRKSRC}/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>
    USES=		xfce
    USE_XFCE=	libmenu
    USES=		xfce:gtk2
    USE_XFCE=	libmenu xfconf
    USES=		xfce
    USE_XFCE=	panel
    USES=		xfce
    USE_XFCE=	libexo libmenu libutil panel
    USES=		budgie
    USE_BUDGIE=	screensaver:build
    USES=		budgie gettext gnome meson pkgconfig
    USE_BUDGIE=	libbudgie
    USES=	bdb:6
    USES=	mysql
    USES=		pgsql:9.6+
    WANT_PGSQL=	server
    USES=	sqlite:3
    USE_RC_SUBR=	doormand
    #!/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"
    REQUIRE: LOGIN
    KEYWORD: shutdown
    doormand_flags=""
    USERS=	pulse
    GROUPS=	pulse pulse-access pulse-rt
    USES=	kmod
    lang/rust
    devel/py-futures
    x11/xfce4-conf

    第 18 章 __FreeBSD_version 的值

    这里是 sys/param.h 中定义的 __FreeBSD_version 值的方便列表:

    18.1. FreeBSD 15 版本

    表 1. FreeBSD 15 __FreeBSD_version 值

    值
    修订版本
    日期
    发布

    18.2. FreeBSD 14 版本

    表格 2. FreeBSD 14 __FreeBSD_version 值

    值
    修订版本
    日期
    发布

    18.3. FreeBSD 13 版本

    表 3. FreeBSD 13 __FreeBSD_version 值

    值
    修订版本
    日期
    发布

    18.4. FreeBSD 12 版本

    表 4.FreeBSD 12 __FreeBSD_version 值

    值
    修订版本
    日期
    发布

    18.5. FreeBSD 11 版本

    第 5 表 FreeBSD 11 __FreeBSD_version 值

    值
    修订
    日期
    发布

    18.6. FreeBSD 10 版本

    表 6. FreeBSD 10 __FreeBSD_version 值

    值
    修订
    日期
    发布

    18.7. FreeBSD 9 版本

    表 7. FreeBSD 9 __FreeBSD_version 值

    值
    修订
    日期
    发布

    18.8. FreeBSD 8 版本

    表 8. FreeBSD 8 __FreeBSD_version 值

    值
    修订
    日期
    发布

    18.9. FreeBSD 7 版本

    表 9. FreeBSD 7 __FreeBSD_version 值

    值
    修订
    日期
    发布

    18.10. FreeBSD 6 版本

    表 10. FreeBSD 6 __FreeBSD_version 值

    值
    修订
    日期
    发布

    18.11. FreeBSD 5 版本

    表 11. FreeBSD 5 __FreeBSD_version 值

    值
    修订
    日期
    发布

    18.12. FreeBSD 4 版本

    表 12. FreeBSD 4 __FreeBSD_version 值

    值
    修订
    日期
    发布

    18.13. FreeBSD 3 版本

    表 13. FreeBSD 3 __FreeBSD_version 值

    值
    修订
    日期
    发布

    18.14. FreeBSD 2.2 版本

    表 14. FreeBSD 2.2 __FreeBSD_version 值

    值
    修订
    日期
    发布

    注意

    注意,2.2-STABLE 有时在 2.2.5-RELEASE 发布后以"2.2.5-STABLE"的形式标识自身。之前的模式是年份后跟月份,但社区决定改为从 2.2 开始采用更直接的主/次系统。这是因为在几个分支上的并行开发使得仅凭实际发布日期来分类发布变得不可行。不要担心旧的-CURRENT 版本;它们仅列在此供参考。

    18.15. FreeBSD 2 在 2.2-RELEASE 版本之前

    表 15. FreeBSD 2 在 2.2-RELEASE 之前的 __FreeBSD_version 值

    值
    修订
    日期
    发布

    1400003

    2021 年 1 月 28 日

    添加各种与 drm-kmod 冲突的 LinuxKPI 位后的 14.0-CURRENT。

    1400004

    2021 年 2 月 8 日

    内核接口更改后的 14.0-CURRENT 用于派发加密操作。

    1400005

    2021 年 2 月 17 日

    在更改 arm64 上的 ptrace(2)的 API PT_GETDBREGS / PT_SETDBREGS 后,14.0-CURRENT。

    1400006

    2021 年 3 月 17 日

    添加 sndstat(4)枚举 ioctls 后的 14.0-CURRENT。

    1400007

    2021 年 4 月 6 日

    修复错误后的 14.0-CURRENT dlpi_tls_data

    1400008

    2021 年 4 月 11 日

    在 krpc 和 NFS 模块之间更改内部 KAPI 后的 14.0-CURRENT。

    1400009

    2021 年 4 月 20 日

    在为 VLAN 和 VxLAN 添加 TCP LRO 支持之后的 14.0-CURRENT。

    1400010

    2021 年 4 月 21 日

    在更改 sndstat(4) ioctls nvlist 模式和定义后的 14.0-CURRENT。

    1400015

    2021 年 5 月 25 日

    增加更多 LinuxKPI 更改后需要调整 drm-kmod 的 14.0-CURRENT。

    1400016

    2021 年 5 月 25 日

    删除了对 KTLS 软件后端的支持后的 14.0-CURRENT。

    1400017

    2021 年 5 月 25 日

    添加 crypto_cursor_segment() 后的 14.0-CURRENT。

    1400018

    2021 年 5 月 30 日

    允许 VFS_QUOTACTL(9)实现指示繁忙状态更改后的 14.0-CURRENT

    1400019

    2021 年 6 月 7 日

    包括 pr_err_once() 在 LinuxKPI printk.h 中后的 14.0-CURRENT。

    1400020

    2021 年 6 月 9 日

    在 LinuxKPI 中添加宏 might_lock_nested() 和 lockdep_(re/un/)pin_lock() 后的 14.0-CURRENT。

    1400021

    2021 年 6 月 10 日

    在向 LinuxKPI 添加 list_for_each_entry_lockless() 宏后的 14.0-CURRENT。

    1400022

    2021 年 6 月 11 日

    14.0-CURRENT 在提交 e1a907a25cfa 后更改了 krpc 和 nfsserver 模块之间的内部 KAPI。

    1400023

    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

    2021 年 6 月 18 日

    在对 LinuxKPI 进行各种添加之后的 14.0-CURRENT。

    1400025

    2021 年 7 月 5 日

    在对 LinuxKPI 进行各种添加后的 14.0-CURRENT。

    1400026

    2021 年 7 月 16 日

    在将 nfscommon 和 nfsd 模块之间的内部 KAPI 更改后的 14.0-CURRENT。

    1400027

    2021 年 7 月 28 日

    在 aarch64 上向 libcompiler_rt.a 添加离线 LSE 原子帮助程序后的 14.0-CURRENT。

    1400028

    2021 年 7 月 31 日

    在 LinuxKPI 中使 FPU 部分线程安全后的 14.0-CURRENT。

    1400029

    2021 年 8 月 5 日

    添加 fspacectl(2), vn_deallocate(9)和 VOP_DEALLOCATE(9)后的 14.0-CURRENT。

    1400030

    2021 年 8 月 12 日

    在 VOP_DEALLOCATE(9)参数更改后的 14.0-CURRENT,并添加了对 POSIX 共享内存的 fspacectl(2)支持。

    1400031

    2021 年 8 月 24 日

    在将 fspacectl(2),vn_deallocate(9)和 VOP_DEALLOCATE(9)更改为更新 rmsr.r_offset 为有意义的值后的 14.0-CURRENT。

    1400032

    2021 年 8 月 25 日

    在更改 fspacectl(2)、vn_deallocate(9)和 VOP_DEALLOCATE(9)之后的 14.0-CURRENT,使得计算清零字节数更容易。

    1400033

    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

    2021 年 9 月 29 日

    LinuxKPI 更改后的 14.0-CURRENT。

    1400035

    2021 年 10 月 4 日

    将 libtinfow 从 libncurses 中拆分后的 14.0-CURRENT。

    1400036

    2021 年 10 月 6 日

    在 OCF 中扩展 AES-CCM 和 Chacha20-Poly1305 密码,以支持多个随机数长度后的 14.0-CURRENT。

    1400037

    2021 年 10 月 11 日

    从 VOP_STAT(9)中删除线程参数后的 14.0-CURRENT 和 fo_stat

    1400038

    2021 年 10 月 17 日

    LinuxKPI 获得懒惰的 BAR 分配支持后的 14.0-CURRENT

    1400039

    2021 年 10 月 19 日

    在页面分配器更改后的 14.0-CURRENT。

    1400040

    十月 30 日,2021 年

    在 libdialog 共享库版本号提升之后的 14.0-CURRENT。

    1400041

    2021 年 11 月 6 日

    更改 VOP_ALLOCATE(9)的参数后的 14.0-CURRENT。

    1400042

    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

    2021 年 11 月 25 日

    从 NDINIT(9)中删除未使用的线程参数后的 14.0-CURRENT。

    1400044

    2021 年 12 月 9 日

    在支持 AEAD 密码并将 Blake-2S/B auth 转换更改为像其他 auth 转换一样在 Setkey 之前进行 Init 之后,将 14.0-CURRENT 中的内核软件加密密码转换更改。

    1400045

    2021 年 12 月 15 日

    在将 VOP_READDIR(9)的 cookies 参数更改为 **uint64_t 后的 14.0-CURRENT。

    1400046

    2021 年 12 月 30 日

    在使 CPU_SET 宏与 glibc 兼容之后的 14.0-CURRENT。

    1400047

    2022 年 1 月 17 日

    在多个因 drm-kmod 而需要的 LinuxKPI 更改后,14.0-CURRENT。

    1400048

    2022 年 1 月 18 日

    在添加<crypto/chacha20_poly1305.h>之后的 14.0-CURRENT。

    1400049

    2022 年 1 月 24 日

    添加<crypto/curve25519.h>后的 14.0-CURRENT。

    1400050

    2022 年 1 月 25 日

    iflib 添加了新功能后,14.0-CURRENT 允许驱动程序将自己的 TX 队列选择功能设置为 ift_txq_select 在结构 if_txrx 中。

    1400051

    2022 年 1 月 25 日

    在为 LinuxKPI 添加 i2c 支持之后的 14.0-CURRENT。

    1400052

    2022 年 2 月 14 日

    添加 GUID_INIT 和 pm_qos.h 支持 LinuxKPI 后的 14.0-CURRENT。

    1400053

    2022 年 2 月 17 日

    在将 mmap_lock.h 添加到 LinuxKPI 后的 14.0-CURRENT。

    1400054

    2022 年 3 月 28 日

    将 irq_work_queue 更改为在 LinuxKPI 中返回布尔值以匹配 5.10 API 后的 14.0-CURRENT。

    1400055

    2022 年 3 月 29 日

    在将 for_each_sgtable_dma_sg 和 for_each_sgtable_dma_page 添加到 LinuxKPI 之后的 14.0-CURRENT

    1400056

    2022 年 3 月 31 日

    在升级 zlib 到 1.2.12 之后的 14.0-CURRENT

    1400057

    2022 年 4 月 22 日

    更改 udp_tun_func_t()原型后的 14.0-CURRENT

    1400058

    2022 年 5 月 7 日

    在删除 devclass 参数后的 14.0-CURRENT 新总线更改后。

    1400059

    2022 年 5 月 14 日

    在升级 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 到 llvmorg-14.0.3-0-g1f9140064dfb 之后的 14.0-CURRENT,也称为 14.0.3 版本。

    1400060

    2022 年 6 月 6 日

    14.0-CURRENT 在 LinuxKPI dmi_matches()修复后。

    1400061

    2022 年 6 月 8 日

    在 mbuf(9)结构更改之后的 14.0-CURRENT。

    1400062

    2022 年 6 月 18 日

    结构 kinfo_file 更改后的 14.0-CURRENT 版本。

    1400063

    2022 年 6 月 29 日

    在多次由 drm-kmod 需要的 LinuxKPI 更改后的 14.0-CURRENT。

    1400064

    2022 年 7 月 18 日

    在删除 OBJT_DEFAULT 后的 14.0-CURRENT。

    1400065

    2022 年 8 月 8 日

    在多次由 drm-kmod 需要的 LinuxKPI 更改后的 14.0-CURRENT。

    1400066

    2022 年 8 月 18 日

    在多次由 drm-kmod 需要的 LinuxKPI 更改后的 14.0-CURRENT。

    1400069

    2022 年 9 月 22 日

    在多次 LinuxKPI 更改后的 14.0-CURRENT。

    1400070

    2022 年 9 月 22 日

    在 KPI 更改后的 14.0-CURRENT 到 pmap_unmapdev()和 kmem_*()。

    1400071

    2022 年 9 月 26 日

    KPI 变更后的 14.0-CURRENT,使 sysctl OIDs 列表转换为 RB 树。

    1400072

    2022 年 9 月 22 日

    14.0-CURRENT 之后 qsort_r 原型被修改以匹配 POSIX。

    1400073

    2022 年 10 月 17 日

    引入 TX 队列选择功能 v2 后的 14.0-CURRENT。

    1400074

    2022 年 12 月 9 日

    在文件操作中添加备用 fops 插槽后的 14.0-CURRENT。

    1400078

    2023 年 1 月 13 日

    在更改 LinuxKPI pci.h 后的 14.0-CURRENT

    1400079

    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

    2023 年 3 月 23 日

    在更改 arm64 结构 reg、结构 gpreg、结构 trapframe 和结构 pcb 后的 14.0-CURRENT。

    1400085

    2023 年 3 月 28 日

    多个 LinuxKPI 更改后的 14.0-CURRENT

    1400086

    2023 年 4 月 8 日

    vn_lock_pair()参数更改后的 14.0-CURRENT。

    1400087

    2023 年 4 月 22 日

    LinuxKPI 更新后的 14.0-CURRENT。

    1400088

    2023 年 4 月 24 日

    将 LinuxKPI 迁移到 IfAPI 后的 14.0-CURRENT。

    1400089

    2023 年 4 月 25 日

    通过在 smp 中动态分配 stoppcbs 数组后的 14.0-CURRENT。

    1400090

    2023 年 6 月 7 日

    14.0-CURRENT 在 ptrace 开始在 PT_DETACH 期间清除 TDB_BORN 之后。

    1400091

    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

    2023 年 6 月 24 日

    导入 OpenSSL 3.0.9 后的 14.0-CURRENT 基本操作。

    1400093

    2023 年 7 月 5 日

    在 VFS 中使用__enum_uint8 进行 vtype 和 vstate 后的 14.0-CURRENT

    1400097

    2023 年 8 月 24 日

    在分支 stable/14 之后的 14.0-STABLE

    1400500

    2023 年 9 月 8 日

    在 releng/14.0 分支后的 14.0-STABLE

    1400501

    2023 年 11 月 19 日

    在 powerpc 上实现 fpu_kern_enter 和 fpu_kern_leave 后的 14.0-STABLE。

    1400502

    2023 年 12 月 24 日

    在修改 kgssapi 和 krpc 模块之间的内部 API 后,14.0-STABLE

    1400503

    2023 年 12 月 29 日

    在将 nfscommon 和 nfscl 模块之间的内部 KAPI 更改后的 14.0-STABLE。

    1400504

    2024 年 1 月 7 日

    在升级 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 到 llvmorg-17.0.6-0-g6009708b4367 之后的 14.0-STABLE,也称为 17.0.6 版本。

    1400505

    2024 年 1 月 7 日

    在添加 vnode_pager_clean_async(9)和 vnode_pager_clean_sync(9)之后的 14.0-STABLE。

    1400506

    2024 年 1 月 19 日

    在将 nfscommon 和 nfscl 模块之间的内部 KAPI 更改为 14.0-STABLE。

    1400507

    2024 年 1 月 31 日

    添加 kern_openatfp(9)和 kcmp(2)后的 14.0-STABLE。

    1400508

    2024 年 2 月 18 日

    LinuxKPI 更新后的 14.0-STABLE。

    1400509

    2024 年 2 月 18 日

    在更改 net80211 struct ieee80211vap 内部后的 14.0-STABLE。

    1400510

    2024 年 3 月 23 日

    修复在构建最近的 boost 库时出现的 clang 断言或崩溃后的 14.0-STABLE 版本。

    1400511

    2024 年 4 月 20 日

    升级 llvm,clang,compiler-rt,libc++,libunwind,lld,lldb 和 openmp 到 llvmorg-18.1.3-0-gc13b7485b879 后,14.0-STABLE,即 18.1.3 版本。

    1401500

    2024 年 5 月 2 日

    从 14.1-PRERELEASE 重命名为 14.1-STABLE。

    1401501

    2024 年 6 月 6 日

    在添加 linuxkpi_video 模块后,更新为 14.1-STABLE。

    1401502

    2024 年 8 月 2 日

    在 LinuxKPI 更改后,更新为 14.1-STABLE。

    1401503

    2024 年 10 月 15 日

    在扩展 vm_object 中的 flags 字段后,更新为 14.1-STABLE。

    1402500

    2024 年 10 月 31 日

    从 14.2-PRERELEASE 重命名为 14.2-STABLE。

    1402501

    2024 年 12 月 1 日

    通过将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-19.1.4-0-gaadaa00de76e,更新为 14.2-STABLE,亦即 19.1.4 发布版本。

    1402502

    2025 年 2 月 27 日

    在删除新总线资源 API 中多个函数的冗余 type 和 rid 参数后,更新为 14.2-STABLE。

    1402503

    2025 年 2 月 27 日

    在添加 bus_attach_children、bus_detach_children 和 bus_identify_children 后,更新为 14.2-STABLE。

    1402505

    2025 年 4 月 18 日

    在对 LinuxKPI 进行分配更改并删除 iwlwifi 固件后,更新为 14.2-STABLE。

    1300003

    2018 年 11 月 2 日

    vop_symlink API 更改后的 13.0-CURRENT( a_target 现在是 const 。)

    1300004

    2018 年 11 月 23 日

    启用 crtbegin 和 crtend 代码后的 13.0-CURRENT。

    1300005

    2018 年 12 月 11 日

    在启用 UFS inode 校验和之后的 13.0-CURRENT。

    1300006

    2018 年 12 月 24 日

    在修复 sys/random.h 包含以便从 C++可用后的 13.0-CURRENT。

    1300007

    2018 年 12 月 30 日

    在 32 位平台上更改 struct linux_cdev 大小后的 13.0-CURRENT。

    1300008

    2019 年 1 月 4 日

    在添加 kern.smp.threads_per_core 和 kern.smp.cores sysctl 后的 13.0-CURRENT。

    1300009

    2019 年 1 月 20 日

    通过对 ieee80211com 结构进行 struct ieee80211vap 结构更改以解决 ioctl/detach 竞争。

    1300010

    2019 年 1 月 27 日

    在将 SPECNAMELEN 从 63 增加到 MAXNAMELEN (255)后的 13.0-CURRENT。

    1300011

    2019 年 2 月 12 日

    在使用 CAPABILITIES 选项构建的内核中,13.0-CURRENT 在 renameat(2)之后已经修正,可以正常工作。

    1300012

    2019 年 2 月 12 日

    在 taskqgroup_attach() 和 taskqgroup_attach_cpu() 之后,13.0-CURRENT 接受一个 device_t 和一个结构资源指针作为参数,用于表示设备中断。

    1300013

    2019 年 2 月 19 日

    在去除 drm 和 drm2 后的 13.0-CURRENT。

    1300014

    2019 年 3 月 4 日

    在升级 clang、llvm、lld、lldb、compiler-rt 和 libc++ 到 8.0.0 rc3 之后的 13.0-CURRENT。

    1300015

    2019 年 3 月 15 日

    在去匿名化线程和 proc 状态枚举后的 13.0-CURRENT,因此用户空间应用程序可以在不重新定义值名称的情况下使用它们。

    1300016

    2019 年 3 月 16 日

    在 amd64 上默认启用 LLVM OpenMP 8.0.0 rc5 后的 13.0-CURRENT。

    1300017

    2019 年 3 月 19 日

    在 iflib 中向驱动程序公开 Rx mbuf 缓冲区大小后的 13.0-CURRENT。

    1300018

    2019 年 3 月 16 日

    在 345982 中引入 funlinkat 系统调用后的 13.0-CURRENT。

    1300019

    2019 年 4 月 16 日

    添加 is_random_seeded(9)到 random(4)后的 13.0-CURRENT。

    1300020

    2019 年 4 月 18 日

    在恢复 random(4) 可用性折衷之前的 346250 和添加新的可调整项和诊断 sysctl,以便在引导后以编程方式发现早期种子问题后的 13.0-CURRENT。

    1300021

    2019 年 4 月 24 日

    在 LinuxKPI 使用 bus_dma(9) 以与 IOMMU 兼容之后的 13.0-CURRENT。

    1300022

    2019 年 5 月 4 日

    在修复 LinuxKPI 中 346645 的回归问题后的 13.0-CURRENT。

    1300023

    2019 年 5 月 6 日

    13.0-CURRENT 在列出内核转储设备配置后。

    1300024

    2019 年 5 月 8 日

    13.0-CURRENT 在提升 Mellanox 驱动程序版本号(mlx4en(4); mlx5en(4))后。

    1300025

    2019 年 5 月 13 日

    重命名 vm.max_wired 为 vm.max_user_wired 并更改其类型后的 13.0-CURRENT

    1300026

    2019 年 5 月 14 日

    在 LinuxKPI 中添加上下文成员到 ww_mutex 后的 13.0-CURRENT。

    1300027

    2019 年 5 月 14 日

    在 LinuxKPI 中添加准备到 pm_ops 后的 13.0-CURRENT。

    1300028

    2019 年 5 月 17 日

    在 bm , cs ,删除后的 13.0-CURRENT,de,ed, ep ,ex, fe , pcn ,sf, sn , tl , tx , txp , vx , wb 和 xe 驱动程序。

    1300029

    2019 年 5 月 20 日

    13.0-CURRENT 在移除由于 sys/eventhandler.h 导致的一些头部污染后。受影响的文件现在可能需要显式包含 sys/eventhandler.h、sys/ktr.h、sys/lock.h 或 sys/mutex.h 中的一个或多个,当缺少的头部在 1300029 之前可能是隐式包含的。

    1300030

    2019 年 5 月 29 日

    13.0-CURRENT 在 powerpc64 上为 libdwarf 添加重定位支持后,修复了对未链接对象上 DWARF 信息的处理。原始提交在 348347 中。

    1300031

    2019 年 6 月 8 日

    在为 i386 内核模块添加 dpcpu 和 vnet 部分修复后,13.0-CURRENT 可以避免在某些情况下发生崩溃。需要使用链接器脚本魔法重新编译 i386 内核模块,否则它们将拒绝加载。

    1300032

    2019 年 6 月 17 日

    将内核 crc32() 实现分离到自己的头文件(gsb_crc32.h)并将源代码重命名为 gsb_crc32.c 后的 13.0-CURRENT。

    1300033

    2019 年 6 月 21 日

    在 LinuxKPI 的 rcu 列表中添加后的 13.0-CURRENT。

    1300034

    2019 年 6 月 24 日

    删除 NAND 和 NANDFS 后的 13.0-CURRENT。

    1300035

    2019 年 7 月 8 日

    13.0-CURRENT 合并 vm_page 保持和导线机制 后。

    1300036

    2019 年 7 月 13 日

    13.0-CURRENT 添加 arm_drain_writebuf() 和 arm_sync_icache() 以与 NetBSD 和 OpenBSD 兼容 后。

    1300037

    2019 年 7 月 24 日

    在移除 libcap_random(3)后的 13.0-CURRENT。

    1300038

    2019 年 7 月 30 日

    删除了 gzip 压缩的 a.out 支持后的 13.0-CURRENT。

    1300039

    2019 年 8 月 7 日

    从 projects/fuse2 合并 fusefs 后的 13.0-CURRENT。

    1300040

    2019 年 8 月 16 日

    删除了自 1997 年以来已被弃用的 sys/dir.h 后的 13.0-CURRENT。

    (未更改)

    2019 年 8 月 23 日

    在将大多数参数更改为 ping6(8)后的 13.0-CURRENT。

    1300041

    2019 年 8 月 25 日

    13.0-CURRENT 在内核 zlib 统一完成后移除 zlib 1.0.4 之后。

    1300042

    2019 年 8 月 27 日

    13.0-CURRENT 在内核端添加了对内核 TLS 的支持。

    1300043

    2019 年 9 月 2 日

    删除 gets(3)后的 13.0-CURRENT。

    1300044

    2019 年 9 月 2 日

    加入处理在一个调用中处理多个文件的 sysfs 创建/删除函数后的 13.0-CURRENT LinuxKPI。

    1300045

    2019 年 9 月 3 日

    加入 sysctlbyname(3)系统调用后的 13.0-CURRENT。

    1300046

    2019 年 9 月 6 日

    LinuxKPI sysfs 改进后的 13.0-CURRENT。

    1300047

    2019 年 9 月 9 日

    在更改 vm_page 引用计数同步规则后的 13.0-CURRENT。

    1300048

    2019 年 9 月 25 日

    在 13.0-CURRENT 中添加了 shm_open2 系统调用,以支持即将推出的 memfd_create(2)系统调用。

    1300049

    2019 年 10 月 7 日

    在将 VNET 关闭检查提取到自己的 VNET 结构字段之后的 13.0-CURRENT

    1300050

    2019 年 10 月 9 日

    在更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 至 9.0.0 final release r372316 后的 13.0-CURRENT。

    1300051

    2019 年 10 月 17 日

    从 netdump(4)拆分出更通用的 debugnet(4)后的 13.0-CURRENT。

    1300052

    2019 年 10 月 17 日

    在将页面繁忙字段提升为一流锁之后,13.0-CURRENT 不再需要对象锁来保持一致性。

    1300053

    2019 年 10 月 17 日

    在实现 NetGDB 之后的 13.0-CURRENT。

    1300054

    2019 年 10 月 21 日

    在移除用于访问接口地址列表的已过时 KPI 之后的 13.0-CURRENT。

    1300055

    2019 年 11 月 4 日

    在 LinuxKPI 中启用设备类组属性后的 13.0-CURRENT

    1300056

    2019 年 11 月 7 日

    13.0-CURRENT 在修复了 libc++中潜在的 OOB 读安全问题之后。

    1300057

    2019 年 11 月 13 日

    13.0-CURRENT 在 elf_aux_info(3)中添加了对 AT_EXECPATH 的支持。

    1300058

    2019 年 11 月 18 日

    在将 vm_page aflags 字段扩展到 16 位后的 13.0-CURRENT。

    1300059

    2019 年 11 月 18 日

    13.0-CURRENT 将内部 sysent 目标转换为使用新 makesyscalls.lua。

    1300060

    2019 年 11 月 20 日

    13.0-CURRENT 添加 /etc/os-release 作为 /var/run/os-release 的符号链接。

    1300061

    2019 年 11 月 21 日

    添加了 bitstring(3)功能,用于查找连续的设置或未设置位。

    1300062

    2019 年 12 月 2 日

    在添加 TCP_STATS 支持后的 13.0-CURRENT。

    1300063

    2019 年 12 月 8 日

    在去除 VI_DOOMED 后的 13.0-CURRENT(请改用 VN_IS_DOOMED)。

    1300064

    2019 年 12 月 9 日

    在修正 C++版本检查以声明 timespec_get(3)之后的 13.0-CURRENT。

    1300065

    2019 年 12 月 12 日

    在添加 musl libc 和 glibc 中常见的 sigsetop 扩展后的 13.0-CURRENT。

    1300066

    2019 年 12 月 12 日

    作为引入 NFS 4.2 的一部分,更改 NFS 模块之间的内部接口后的 13.0-CURRENT。

    1300067

    2019 年 12 月 13 日

    删除了已弃用的 callout_handle_init , timeout 和 untimeout 函数后的 13.0-CURRENT。

    1300068

    2019 年 12 月 16 日

    在 64 位平台上将 ARG_MAX 的值加倍后的 13.0-CURRENT。

    1300069

    2019 年 12 月 24 日

    添加 busdma 模板后的 13.0-CURRENT。

    1300070

    2019 年 12 月 27 日

    消除 AT_*定义中最后一个 MI 差异后的 13.0-CURRENT(用于 powerpc)。

    1300071

    2019 年 12 月 27 日

    在将 USB 统计更改为每个设备而不是每个总线后的 13.0-CURRENT。

    1300072

    2019 年 12 月 29 日

    在移除 GEOM_SCHED 类和 gsched 工具后的 13.0-CURRENT。

    1300073

    2020 年 1 月 2 日

    删除 arm/arm 作为有效目标后的 13.0-CURRENT。

    1300074

    2020 年 1 月 3 日

    从 VOP_UNLOCK 中删除标志参数后的 13.0-CURRENT。

    1300075

    2020 年 1 月 6 日

    在取消的 USB 传输中添加自己的计数器后的 13.0-CURRENT。

    1300076

    2020 年 1 月 8 日

    在将 vnop 实现推入 posix_fallocate(2)层之后的 13.0-CURRENT。

    (未更改)

    2020 年 2 月 2 日

    从 src 树中删除 armv5 架构代码后的 13.0-CURRENT。

    1300077

    2020 年 2 月 3 日

    从 src 树中移除 sparc64 架构代码后的 13.0-CURRENT。

    1300078

    2020 年 2 月 17 日

    在更改 struct vnet 和 VNET 魔术 Cookie 后的 13.0-CURRENT。

    1300079

    2020 年 2 月 20 日

    升级 ncurses 到 6.2.x 后的 13.0-CURRENT

    1300080

    2020 年 2 月 20 日

    13.0-CURRENT 添加 realpathat 系统调用到 VFS 之后。

    1300081

    2020 年 2 月 21 日

    13.0-CURRENT 在最近的 linuxkpi 更改之后。

    1300082

    2020 年 3 月 1 日

    删除 bktr(4)后的 13.0-CURRENT。

    1300083

    2020 年 3 月 10 日

    移除 amd(8)后的 13.0-CURRENT,r358821。

    1300084

    2020 年 3 月 10 日

    更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 至 10.0.0-rc3 c290cb61fdc 后的 13.0-CURRENT。

    1300085

    2020 年 3 月 23 日

    在导入 kyua 测试框架后的 13.0-CURRENT。

    1300086

    2020 年 3 月 26 日

    在将 powerpc 和 powerpcspe 切换到 lld 链接器后的 13.0-CURRENT。

    1300087

    2020 年 3 月 27 日

    在内核加密的驱动程序和消费者接口重构后的 13.0-CURRENT。

    1300088

    2020 年 4 月 1 日

    删除 procfs 进程调试支持后的 13.0-CURRENT。

    1300089

    2020 年 4 月 8 日

    将 RCU 接口克隆到 LinuxKPI 中的可睡眠部分和不可睡眠部分后的 13.0-CURRENT。

    1300090

    2020 年 4 月 9 日

    在移除使用 Giant 的旧 NFS 锁设备驱动程序后的 13.0-CURRENT。

    1300091

    2020 年 4 月 12 日

    实现 close_range(2)系统调用后的 13.0-CURRENT。

    1300092

    2020 年 4 月 14 日

    在 KTLS 重新设计未映射的 mbuf 后,13.0-CURRENT 可以在 mbuf 本身携带 ext_pgs 。

    1300093

    2020 年 4 月 27 日

    在 13.0-CURRENT 中添加了对内核 TLS 接收卸载的支持。

    1300094

    2020 年 5 月 7 日

    linuxkpi 更改后的 13.0-CURRENT。

    1300095

    2020 年 5 月 20 日

    在为 FreeBSD 客户端添加 HyperV 套接字支持后的 13.0-CURRENT。

    1300096

    2020 年 5 月 23 日

    在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 更新至 10.0.1 rc1 f79cd71e145 后的 13.0-CURRENT。

    1300097

    2020 年 6 月 2 日

    在 LinuxKPI 中实现 __is_constexpr() 函数宏后的 13.0-CURRENT。

    1300098

    2020 年 6 月 14 日

    在将 export_args ex_flags 字段更改为 64 位后的 13.0-CURRENT。

    1300099

    2020 年 6 月 20 日

    在 13.0-CURRENT 中,使用 libmd 实现 SHA256 来替代 liblzma。

    1300100

    2020 年 6 月 26 日

    在更改 NFS 内核模块之间的内部 API 后的 13.0-CURRENT。

    1300101

    2020 年 7 月 10 日

    在 LinuxKPI 中实现 array_size() 功能后的 13.0-CURRENT。

    1300102

    2020 年 7 月 26 日

    在 VFS 层实现无锁查找后的 13.0-CURRENT。

    1300103

    2020 年 8 月 1 日

    在为 NDINIT_ALL 强制权利后,13.0-CURRENT

    1300104

    2020 年 8 月 2 日

    13.0-CURRENT 在 vnode 布局更改之后。

    1300105

    2020 年 8 月 5 日

    13.0-CURRENT 在 vaccess() 更改之后。

    1300106

    2020 年 8 月 11 日

    在添加一个参数到 newnfs_connect() ,指示连接使用 TLS 后的 13.0-CURRENT 。

    1300107

    2020 年 8 月 11 日

    在更改克隆与 RCU 相关的任务结构字段后的 13.0-CURRENT。

    1300108

    2020 年 8 月 14 日

    在 linuxkpi 中添加了一些 wait_bit 函数,这些函数是从 Linux v5.4 中的 DRM 所需的,13.0-CURRENT。

    1300109

    2020 年 8 月 16 日

    在 vget() 参数移除和 namei 标志重新编号之后的 13.0-CURRENT。

    (未更改)

    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

    2020 年 8 月 18 日

    删除未使用的 use_ext 参数后的 13.0-CURRENT 到 nfscl_reqstart() 。

    1300111

    2020 年 8 月 22 日

    在内核 RPC 中添加 TLS 支持后的 13.0-CURRENT。

    1300112

    2020 年 8 月 25 日

    在合并 OpenZFS 支持后的 13.0-CURRENT。

    1300113

    2020 年 8 月 25 日

    在向 libcompiler_rt 添加原子和 bswap 函数后的 13.0-CURRENT。

    1300114

    2020 年 9 月 8 日

    在更改 arm64 AT_HWCAP 定义以供 elf_aux_info(3) 后的 13.0-CURRENT。

    1300115

    2020 年 9 月 14 日

    通过修复与 crunchgen(1) 应用程序构建相关的 WARNS=6 后的 13.0-CURRENT。

    1300116

    2020 年 9 月 22 日

    引入 powerpc64le ARCH 后的 13.0-CURRENT。

    1300117

    2020 年 9 月 23 日

    在重新实现 purgevfs 以迭代 vnodes 而不是整个哈希之后的 13.0-CURRENT。

    1300118

    2020 年 10 月 2 日

    在向 linuxkpi 添加背光支持和 dmi_* 功能后的 13.0-CURRENT。

    1300119

    2020 年 10 月 6 日

    在 LinuxKPI 中填充 ww_mutex 的获取上下文字段后的 13.0-CURRENT。

    1300120

    2020 年 10 月 13 日

    13.0-CURRENT 在修复 arm64 写入只读映射之后。

    1300121

    2020 年 10 月 15 日

    13.0-CURRENT 在添加 VOP_EAGAIN 后。

    1300122

    2020 年 10 月 17 日

    添加 ptsname_r 后的 13.0-CURRENT。

    1300123

    2020 年 10 月 20 日

    在 VOP 、 VPTOCNP 和 INACTIVE 更改后的 13.0-CURRENT。

    1300124

    2020 年 10 月 30 日

    在添加 cache_vop_mkdir 并将 cache_rename 重命名为 cache_vop_rename 后的 13.0-CURRENT。

    1300125

    2020 年 11 月 4 日

    在拆卸处理中使用 rms 锁后的 13.0-CURRENT。

    1300126

    2020 年 11 月 5 日

    经理每周都要审查项目计划。

    1300127

    2020 年 11 月 6 日

    将 malloc_type_internal 移入 malloc_type 后的 13.0-CURRENT。

    1300128

    2020 年 11 月 9 日

    在 LinuxKPI 添加后的 13.0-CURRENT 中,实现了基本系统中 drm-kmod 所需的 ACPI 位。

    1300129

    2020 年 11 月 12 日

    13.0-CURRENT 退役後 malloc_last_fail 。

    1300130

    2020 年 11 月 17 日

    13.0-CURRENT 在 p_pd / pwddesc 從 p_fd / filedesc 分家後。

    1300131

    2020 年 12 月 7 日

    删除加密文件描述符后的 13.0-CURRENT。

    1300132

    2020 年 12 月 15 日

    当改善 USB 栈中的备用设置处理后,13.0-CURRENT

    1300133

    2020 年 12 月 23 日

    在修改 NFS 和内核 RPC 模块之间的内部 API 后的 13.0-CURRENT。

    1300134

    2021 年 1 月 7 日

    13.0-CURRENT 分离 USB HID 支持的硬件独立部分到一个新的模块。

    1300135

    2021 年 1 月 12 日

    添加 kernel_fpu_begin / kernel_fpu_end 到 LinuxKPI 后的 13.0-CURRENT。

    1300136

    2021 年 1 月 17 日

    13.0-CURRENT 在重新在快速 taskqueue 上实现 LinuxKPI 的 irq_work 队列后。

    1300137

    2021 年 1 月 30 日

    修复构建 devel/onetbb 时修复 clang 断言的 13.0-CURRENT port。

    1300138

    2021 年 2 月 1 日

    将无锁符号链接查找添加到 vfs 缓存后的 13.0-ALPHA3。

    1300139

    2021 年 2 月 2 日

    添加各种 LinuxKPI 位后与 drm-kmod 冲突的 13.0-ALPHA3。

    1300500

    2021 年 2 月 5 日

    13.0-STABLE 在 releng/13.0 分支后。

    1300501

    2021 年 4 月 23 日

    在修复 rtld 的 dl_iterate_phdr() 后的 13.0-STABLE。

    1300501

    2021 年 4 月 23 日

    在修复 rtld 的 dl_iterate_phdr() 后的 13.0-STABLE 。

    1300502

    2021 年 4 月 23 日

    在 LinuxKPI 中实现 atomic_dec_and_lock_irqsave() 后的 13.0-STABLE。

    1300503

    2021 年 4 月 23 日

    13.0-STABLE 更改 krpc 和 NFS 之间的内部 KAPI 后。

    1300504

    2021 年 4 月 30 日

    在更新 LinuxKPI 以适应 drm-kmod 5.5 更新后的 13.0-STABLE。

    1300505

    2021 年 5 月 10 日

    在 nscl.ko 和 nfscommon.ko 模块之间更改内部 KAPI 后的 13.0-STABLE。

    1300506

    2021 年 6 月 2 日

    在为 VLAN 和 VxLAN 添加 TCP LRO 支持后的 13.0-STABLE。

    1300507

    2021 年 6 月 2 日

    在向 EPOCH(9) 跟踪器结构添加新成员后的 13.0-STABLE。

    1300508

    2021 年 6 月 11 日

    添加 LinuxKPI 中的 might_lock_nested() 和 lockdep_(re/un/)pin_lock() 宏之后的 13.0-STABLE。

    1300509

    2021 年 6 月 14 日

    在为 LinuxKPI 添加一个 list_for_each_entry_lockless() 宏之后的 13.0-STABLE。

    1300510

    2021 年 6 月 26 日

    经过在 krpc 和 nfsd 模块之间更改内部 KAPI 后的 13.0-STABLE。

    1300511

    2021 年 7 月 7 日

    改变 softdep_prelink() 为仅在另一个线程自先前 prelink 更改了 vnode 元数据后执行同步的 13.0-STABLE。

    1300512

    2021 年 7 月 18 日

    在各种合并到 LinuxKPI、OFED、net80211 和驱动程序之后的 13.0-STABLE。

    1300513

    2021 年 7 月 31 日

    在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-12.0.1-0-gfed41342a82f 之后的 13.0-STABLE,也就是 12.0.1 版本发布后。

    1300514

    2021 年 8 月 3 日

    内部接口之间的 KBI 的不兼容更改需要重新构建模块。

    1300515

    2021 年 9 月 22 日

    13.0-STABLE 返回到 13.0 KBI 为 linuxkpi。

    1300518

    2021 年 10 月 21 日

    加入 crypto_cursor_segment() 后的 13.0-STABLE 。

    1300519

    2021 年 10 月 21 日

    在 OCF 中扩展 AES-CCM 和 Chacha20-Poly1305 密码,以支持多个随机数长度后的 13.0-STABLE。

    1300521

    2021 年 11 月 19 日

    在各种合并到 LinuxKPI 和 net80211 之后的 13.0-STABLE。

    1300522

    2021 年 11 月 24 日

    在更改 NFS 模块之间的内部 KAPI 后,13.0-STABLE

    (未更改)

    2021 年 12 月 6 日

    在更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 到 llvmorg-13.0.0-0-gd7b669b3a303 之后的 13.0-STABLE,也称为 13.0.0 版本。

    1300523

    2021 年 12 月 18 日

    在向 VOP_ALLOCATE(9)添加两个参数后的 13.0-STABLE。

    1300524

    2022 年 1 月 14 日

    在使 CPU_SET 宏与 glibc 兼容后的 13.0-STABLE。

    1300525

    2022 年 1 月 22 日

    在 drm-kmod 需要的多个 LinuxKPI 更改之后的 13.0-STABLE。

    1300526

    2022 年 2 月 20 日

    多次 LinuxKPI 更改后的 13.0-STABLE 重叠但与 drm-kmod 不冲突。

    1301000

    2022 年 3 月 10 日

    releng/13.1 分支。

    1301500

    2022 年 3 月 10 日

    releng/13.1 分支后的 13.1-STABLE。

    1301501

    2022 年 3 月 27 日

    在对 LinuxKPI 和 net80211 进行各种合并后的 13.1-STABLE。

    1301502

    2022 年 4 月 27 日

    在各种合并到 LinuxKPI 后的 13.1-STABLE。

    1301503

    2022 年 5 月 19 日

    添加替代 DRIVER_MODULE 宏而没有 devclass 参数后的 13.1-STABLE。

    1301504

    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

    2022 年 6 月 21 日

    在进行各种合并到 LinuxKPI 后的 13.1-STABLE。

    1301506

    2022 年 7 月 13 日

    添加<crypto/chacha20_poly1305.h>和<crypto/curve25519.h>后,13.1-STABLE。

    1301507

    2022 年 6 月 21 日

    13.1-STABLE 经过对 LinuxKPI 的各种合并后。

    1301508

    2022 年 10 月 17 日

    在各种合并到 LinuxKPI 后的 13.1-STABLE 版本,并用于去除宏定义的 pause()。

    1301509

    2022 年 10 月 19 日

    引入 TX 队列选择功能 v2 后的 13.1-STABLE。

    1301510

    2022 年 12 月 8 日

    LinuxKPI dmi_matches() 修复后的 13.1-STABLE。

    1301511

    2022 年 12 月 17 日

    添加新的 rc 后的 13.1-STABLE: machine_id 生成 /etc/machine-id 。

    1302500

    2023 年 2 月 9 日

    在 releng/13.2 分支后的 13.2-STABLE。

    1302501

    2023 年 2 月 16 日

    在将 totalram_pages() 添加到 LinuxKPI 后的 13.2-STABLE。

    1302502

    2023 年 2 月 17 日

    LinuxKPI 合并后的 13.2-STABLE 版本。

    1302503

    2023 年 2 月 21 日

    在各种合并到 LinuxKPI 后的 13.2-STABLE。

    1302504

    2023 年 3 月 12 日

    在将机器 ID 合并到 13.2-STABLE 后 hostid_save 。

    1302505

    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

    2023 年 6 月 26 日

    在各种合并到 LinuxKPI 之后的 13.2-STABLE。

    1302507

    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

    2023 年 9 月 6 日

    ptrace 开始在 PT_DETACH 期间清除 TDB_BORN 后的 13.2-STABLE。

    1302509

    2023 年 12 月 2 日

    在添加一个名为 vfs_exjail_clone() 的新 VFS 函数后,13.2-STABLE 将被 ZFS 模块使用。

    1302510

    2024 年 1 月 7 日

    升级 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 至 llvmorg-17.0.6-0-g6009708b4367 后的 13.2-STABLE,也称为 17.0.6 发布。

    1303001

    2024 年 2 月 19 日

    更改 net80211 struct ieee80211vap 内部后的 13.3-BETA3。

    1303501

    2024 年 2 月 19 日

    更改 net80211 struct ieee80211vap 内部后的 13.3-STABLE。

    1303502

    2024 年 3 月 23 日

    在修复构建最新的 boost 库时发生 clang 断言或崩溃后,13.3-STABLE。

    1303503

    2024 年 4 月 20 日

    在升级 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 到 llvmorg-18.1.3-0-gc13b7485b879 之后的 13.3-STABLE,也称为 18.1.3 版本。

    1304500

    2024 年 8 月 1 日

    从 13.4-PRERELEASE 重命名为 13.4-STABLE。

    1304501

    2024 年 12 月 1 日

    通过将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-19.1.4-0-gaadaa00de76e,更新为 13.4-STABLE,亦即 19.1.4 发布版本。

    1200003

    2016 年 8 月 22 日

    在 rev 303795 中添加了 C++11 thread_local 支持后的 12.0-CURRENT。

    1200004

    2016 年 8 月 24 日

    修复 LC*MASK 后的 12.0-CURRENT,用于 newlocale(3)和 querylocale(3) (修订版 304703)。

    1200005

    2016 年 8 月 25 日

    在 rev 304787 中更改了一些 ioctl 接口后的 12.0-CURRENT 在 iSCSI 用户空间程序和内核之间。

    1200006

    2016 年 9 月 1 日

    在 305254 中修复了 crunchgen(1) META_MODE 的 12.0-CURRENT。

    1200007

    2016 年 9 月 5 日

    解决 device_detach() 和 usbd_do_request_flags(9)之间的死锁后,12.0-CURRENT

    1200008

    2016 年 9 月 15 日

    在移除 305824 中的 4.3BSD 兼容宏 m_copy() 后的 12.0-CURRENT。

    1200009

    2016 年 9 月 21 日

    在 305988 中移除 bio_taskqueue() 后的 12.0-CURRENT。

    1200010

    2016 年 9 月 23 日

    在默认情况下使用 longnames 支持挂载 msdosfs(5)后的 12.0-CURRENT。

    1200011

    2016 年 10 月 1 日

    在 306555 中添加 fb_memattr 字段到 fb_info 后的 12.0-CURRENT。

    1200012

    2016 年 10 月 2 日

    在 net80211(4) 更改后的 12.0-CURRENT (修订 306590, 306591)。

    1200013

    2016 年 10 月 12 日

    安装头文件后的 12.0-CURRENT 需要与 libzfs_core 一起进行开发。

    1200014

    2016 年 10 月 17 日

    在合并 rtwn(4)和 urtwn(4)中的公共代码,并添加对 802.11ac 设备的支持后的 12.0-CURRENT。

    1200015

    2016 年 11 月 20 日

    在一些 ABI 更改后,用于修复 powerpc 的 12.0-CURRENT。

    1200016

    2016 年 11 月 22 日

    从 vmmeter 中删除 PG_CACHED 相关字段后的 12.0-CURRENT。

    1200017

    2016 年 11 月 25 日

    在升级 clang、llvm、lldb、compiler-rt 和 libc++到 3.9.0 版本,并添加 lld 3.9.0 后的 12.0-CURRENT。

    1200018

    2016 年 12 月 7 日

    在 12.0-CURRENT 中,添加 ki_moretdname 成员到 struct kinfo_proc 和 struct kinfo_proc32 ,将整个线程名称导出到用户空间实用程序。

    1200019

    2016 年 12 月 16 日

    在开始为 11ac 支持打下基础后的 12.0-CURRENT。

    1200020

    2017 年 1 月 13 日

    删除 fgetsock 和 fputsock 后的 12.0-CURRENT 。

    1200021

    2017 年 2 月 16 日

    删除 MCA 和 EISA 支持后的 12.0-CURRENT 。

    1200022

    2017 年 2 月 21 日

    在使 LinuxKPI 任务结构在系统调用之间持久化后的 12.0-CURRENT。

    (未更改)

    2017 年 3 月 2 日

    删除 System V Release 4 二进制兼容性支持后的 12.0-CURRENT。

    1200023

    2017 年 3 月 2 日

    升级后的 12.0-CURRENT 复制了 clang、llvm、lld、lldb、compiler-rt 和 libc++到 4.0.0。

    1200024

    2017 年 3 月 7 日

    删除 pcap-int.h 后的 12.0-CURRENT

    1200025

    2017 年 3 月 16 日

    添加<dev/mmc/mmc_ioctl.h>头文件后的 12.0-CURRENT。

    1200026

    2017 年 3 月 16 日

    从用户空间隐藏 struct inpcb 和 struct tcpcb 后的 12.0-CURRENT。

    1200027

    2017 年 3 月 21 日

    使 CAM SIM 锁变为可选后的 12.0-CURRENT。

    1200028

    2017 年 4 月 10 日

    在 316648 中将 smp_no_rendevous_barrier() 重命名为 smp_no_rendezvous_barrier() 后的 12.0-CURRENT。

    1200029

    2017 年 4 月 19 日

    12.0-CURRENT 在从 317061 中移除 struct vmmeter 和 struct pcpu 后。

    1200030

    2017 年 4 月 24 日

    12.0-CURRENT 在移除 NATM 支持后,包括 en(4), fatm(4), hatm(4) 和 patm(4)。

    1200031

    2017 年 5 月 23 日

    在 ino_t , dev_t 和 nlink_t 扩展到 64 位并 struct dirent 更改布局后的 12.0-CURRENT(也称为 ino64)。

    1200032

    2017 年 6 月 8 日

    移除 groff 后的 12.0-CURRENT 。

    1200033

    2017 年 6 月 17 日

    将 struct event 成员的类型增加到 64 位后,以及添加 ext 结构成员后的 12.0-CURRENT。

    1200034

    2017 年 6 月 19 日

    在 NFS 客户端和服务器实际使用 64 位 ino_t 后的 12.0-CURRENT。

    1200035

    2017 年 6 月 24 日

    添加 MAP_GUARD mmap(2) 标志后的 12.0-CURRENT。

    1200036

    2017 年 6 月 26 日

    在 powerpc 上将 time_t 更改为 64 位后的 12.0-CURRENT(32 位版本)。

    1200037

    2017 年 7 月 1 日

    在清理和内联 bus_dmamap* 函数后的 12.0-CURRENT(320528)。

    1200038

    2017 年 7 月 10 日

    MMC CAM 提交后 12.0-CURRENT。(320844)。

    1200039

    2017 年 7 月 22 日

    clang、llvm、lld、lldb、compiler-rt 和 libc++ 升级到 5.0.0 (trunk r308421) 后的 12.0-CURRENT。

    1200040

    2017 年 7 月 29 日

    添加 NFS 客户端强制卸载支持后的 12.0-CURRENT umount -N

    1200041

    2017 年 8 月 21 日

    在 amd64 上,12.0-CURRENT 在 WRFSBASE 指令之后开始运行。

    1200042

    2017 年 8 月 25 日

    在使用 counter(9) 更改 PLPMTUD 计数器后,12.0-CURRENT 开始运行。

    1200043

    2017 年 8 月 28 日

    在将 x86 CACHE_LINE_SIZE 降至 64 字节后,12.0-CURRENT。

    1200044

    2017 年 9 月 8 日

    在 LinuxKPI 中实现 poll_wait() 后的 12.0-CURRENT。

    1200045

    2017 年 9 月 18 日

    在 LinuxKPI 中添加了对共享内存的支持后的 12.0-CURRENT。(323703)。

    1200046

    2017 年 9 月 22 日

    在为 LinuxKPI 添加对 32 位兼容性 IOCTL 的支持之后,12.0-CURRENT。

    1200047

    2017 年 9 月 26 日

    删除 M_HASHTYPE_RSS_UDP_IPV4_EX 后的 12.0-CURRENT。 (324052)。

    1200048

    2017 年 10 月 2 日

    从用户空间隐藏 struct socket 和 struct unpcb 后的 12.0-CURRENT。

    1200049

    2017 年 10 月 4 日

    在 struct diocgattr_arg 添加 value.u16 字段后的 12.0-CURRENT。

    1200050

    2017 年 10 月 5 日

    添加 armv7 MACHINE_ARCH 后的 12.0-CURRENT。 (324340).

    1200051

    2017 年 10 月 9 日

    删除 libstand.a 作为公共接口后的 12.0-CURRENT。 (324454).

    1200052

    2017 年 10 月 26 日

    修复 ptrace() 后,12.0-CURRENT 总是清除正确的线程事件才能恢复。

    1200053

    2017 年 11 月 7 日

    12.0-CURRENT 在更改 struct mbuf 布局后,为接收数据包添加可选硬件时间戳。

    1200054

    2017 年 11 月 15 日

    12.0-CURRENT 在更改 struct vmtotal 布局以允许报告大内存计数器之后。

    1200055

    2018 年 1 月 9 日

    添加 cpucontrol -e 支持后的 12.0-CURRENT。

    1200056

    2018 年 1 月 14 日

    在升级 clang、llvm、lld、lldb、compiler-rt 和 libc++到 6.0.0 之后的 12.0-CURRENT(分支/release_60 r321788)。

    1200057

    2018 年 2 月 8 日

    在应用 clang 6.0.0 修复后,使 wine ports能够正确构建的 12.0-CURRENT。

    1200058

    2018 年 2 月 12 日

    在提交 Lua 加载程序后的 12.0-CURRENT。

    1200059

    2018 年 3 月 2 日

    12.0-CURRENT 删除了 union semun 的声明,除非 _WANT_SEMUN 被定义。还删除了 struct mymsg ,并重命名了 struct semid_ds 和 struct msgid_ds 的仅内核成员。

    1200060

    2018 年 3 月 4 日

    12.0-CURRENT 在升级 clang、llvm、lld、lldb、compiler-rt 和 libc++到 6.0.0 版本后。

    1200061

    2018 年 4 月 6 日

    更改 syslog(3)以发出符合 RFC 5424 格式的消息后的 12.0-CURRENT

    1200062

    2018 年 4 月 12 日

    在更改 Netmap API 后的 12.0-CURRENT。

    1200063

    2018 年 5 月 10 日

    在重新设计 CTL 前端和后端选项以使用 nv(3)后,允许创建多个 ioctl 前端ports的 12.0-CURRENT。

    1200064

    2018 年 5 月 22 日

    在更改 ifnet 地址和多播地址 TAILQ 为 CK_STAILQ 后的 12.0-CURRENT。

    1200065

    2018 年 5 月 28 日

    在更改 dwatch(1)以允许'-E code'覆盖配置文件 EVENT_DETAILS 后的 12.0-CURRENT。

    1200066

    2018 年 6 月 1 日

    在删除英特尔内核中的 PMC 表后的 12.0-CURRENT。

    1200067

    2018 年 6 月 9 日

    在将 DW_LANG 常量添加到 libdwarf 后的 12.0-CURRENT。

    1200068

    2018 年 6 月 12 日

    在 NFS 模块之间更改接口后的 12.0-CURRENT。

    1200069

    2018 年 6 月 15 日

    在将 struct kerneldumpheader 更改为版本 4 后的 12.0-CURRENT(类似于 11-STABLE 和之前的版本 2)。

    1200070

    2018 年 7 月 2 日

    在 amd64 和 i386 上将 atomic(9)内联到模块后,需要对这些架构的所有消费者模块进行重建,版本为 12.0-CURRENT。

    1200071

    2018 年 7 月 4 日

    12.0-CURRENT 更改 epoch(9)的 ABI 和 API 后(335924),需要重新构建消费者模块。

    1200072

    2018 年 7 月 5 日

    12.0-CURRENT 更改 ABI 和 API 后, struct xinpcb 等组件。

    1200073

    2018 年 7 月 15 日

    在更改 ABI 和 API 后,12.0-CURRENT 要求 iflib(9)消费者模块重新构建 struct if_shared_ctx 和 struct if_softc_ctx 。

    1200074

    2018 年 7 月 16 日

    在更新 libstdc++ 配置以使用 C99 函数后的 12.0-CURRENT。

    1200075

    2018 年 7 月 19 日

    在将 zfsloader 合并到加载程序中,并将 ntpd:ntpd 添加为 uid:gid 123:123 之后的 12.0-CURRENT,以及在移除 arm 大端支持(MACHINE_ARCH=armeb)之后。

    1200076

    2018 年 7 月 30 日

    在 KPI 更改后的 12.0-CURRENT timespecadd 。

    1200077

    2018 年 8 月 10 日

    在 timespec_get(3) 被添加到系统之后的 12.0-CURRENT。

    1200078

    2018 年 8 月 15 日

    在 exec.created 钩子之后的 12.0-CURRENT jails。

    1200079

    2018 年 8 月 19 日

    在将 arc4random 转换为使用 Chacha20 算法并弃用 arc4random_stir 和 arc4random_addrandom 后的 12.0-CURRENT。

    1200080

    2018 年 8 月 22 日

    删除 drm 驱动后的 12.0-CURRENT。

    1200081

    2018 年 8 月 21 日

    NVMe 关键性能指标(KPI)更改后的 12.0-CURRENT。

    1200082

    2018 年 8 月 24 日

    在撤销 drm 驱动程序的移除后的 12.0-CURRENT。

    1200083

    2018 年 8 月 26 日

    删除 arc4random_stir 和 arc4random_addrandom 后的 12.0-CURRENT 。

    1200084

    2018 年 9 月 5 日

    更新 objcopy(1) 以正确处理小端 MIPS64 目标文件后的 12.0-CURRENT。

    1200085

    2018 年 10 月 19 日

    在将 OpenSSL 更新到版本 1.1.1 之后的 12.0-STABLE。

    1200086

    2018 年 10 月 25 日

    更新 OpenSSL 共享库版本号后的 12.0-STABLE。

    1200500

    2018 年 11 月 16 日

    releng/12.0 分支后的 12-STABLE。

    1200501

    2019 年 1 月 6 日

    在合并修复 linux_destroy_dev() 行为后的 12-STABLE,当仍有文件从销毁的 cdev 打开时。

    1200502

    2019 年 1 月 17 日

    在启用 C++ 中的 sys/random.h #include 之后的 12-STABLE。

    1200503

    2019 年 2 月 15 日

    修复 CAPABILITIES 内核下的 renameat(2) 合并后的 12-STABLE。

    1200504

    2019 年 3 月 15 日

    合并 CCM 以使 ZoFport受益后的 12-STABLE。

    1200505

    2019 年 3 月 20 日

    合并支持有选择地禁用 ZFS 而不禁用加载程序后的 12-STABLE。

    1200506

    2019 年 4 月 12 日

    在合并 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 8.0.0 最终发布 r356365 后的 12-STABLE。

    1200507

    2019 年 4 月 17 日

    在 345303、345658 和部分 345305 的 iflib 更改 MFC 后的 12-STABLE。

    1200508

    2019 年 4 月 27 日

    ether_gen_addr 可用后的 12-STABLE。

    1200509

    2019 年 5 月 16 日

    在提升 Mellanox 驱动程序版本号(mlx4en(4); mlx5en(4))后的 12-STABLE。

    1200510

    2019 年 5 月 21 日

    从 348035 更改到 linuxkpi 中的 12-STABLE 结构后。

    1200511

    2019 年 5 月 24 日

    在将 347843 的 MFC 应用于 12-STABLE 后,向 LinuxKPI 的结构 task_struct 添加 group_leader 成员。

    1200512

    2019 年 5 月 24 日

    在 LinuxKPI 的 ww_mutex 中添加上下文成员后的 12-STABLE。

    1200513

    2019 年 7 月 5 日

    在 MFC epoch(9)更改之后的 12-STABLE:349763, 340404, 340415, 340417, 340419, 340420。

    1200514

    2019 年 7 月 17 日

    在将 LinuxKPI 的 rcu 列表添加后的 12-STABLE。

    1200515

    2019 年 8 月 11 日

    在 MFC 349891(将 SRCS 列表重新组织为每行一个文件,然后按字母顺序排列)和 349972(添加 arm_sync_icache() 和 arm_drain_writebuf() sysarch 系统调用包装器)之后的 12-STABLE。

    1200516

    2019 年 8 月 20 日

    在对 iflib 351276 进行各种更改后的 12-STABLE。

    1200517

    2019 年 9 月 9 日

    在向 LinuxKPI 添加处理一次调用中处理多个文件的 sysfs 创建/删除函数后的 12-STABLE。

    1200518

    2019 年 9 月 10 日

    在 LinuxKPI 的 sysfs 进行额外更新后的 12-STABLE。

    1200519

    2019 年 9 月 15 日

    在新的 fusefs 驱动程序合并后的 12-STABLE。

    1201000

    2019 年 9 月 20 日

    从 stable/12@r352480 分支出 releng/12.1 分支。

    1201500

    2019 年 9 月 20 日

    releng/12.1 分支后的 12-STABLE。

    1201501

    2019 年 11 月 10 日

    修复了 libc ++中潜在的 OOB 读取安全问题后的 12-STABLE。

    1201502

    2019 年 11 月 11 日

    在 LinuxKPI 中启用设备类组属性后的 12-STABLE。

    1201503

    2019 年 11 月 21 日

    在为 elf_aux_info(3) 添加对 AT_EXECPATH 的支持后的 12-STABLE。

    1201504

    2019 年 11 月 10 日

    在更正 C++ 版本检查以声明 timespec_get(3) 之后的 12-STABLE。

    1201505

    2019 年 12 月 19 日

    在添加 musl libc 和 glibc 中常见的 sigsetop 扩展后的 12-STABLE。

    1201506

    2019 年 12 月 21 日

    在 64 位平台上将 ARG_MAX 的值加倍后的 12-STABLE。

    1201507

    2020 年 1 月 2 日

    在 bitstring(3)中添加功能,以查找连续的设置或未设置的位序列后的 12-STABLE。

    1201508

    2020 年 1 月 6 日

    在将 USB 统计数据从每个总线更改为每个设备之后的 12-STABLE。

    1201509

    2020 年 1 月 7 日

    更新 llvm,clang,compiler-rt,libc ++,libunwind,lld,lldb 和 openmp 至 9.0.0 最终版 r372316 之后的 12-STABLE。

    1201510

    2020 年 1 月 13 日

    添加自己的计数器后,12-STABLE 可取消的 USB 传输。

    1201511

    2020 年 1 月 31 日

    添加/etc/os-release 作为到/var/run/os-release 的符号链接后的 12-STABLE。

    1201512

    2020 年 2 月 6 日

    最近 LinuxKPI 更改后的 12-STABLE。

    1201513

    2020 年 4 月 15 日

    在将 RCU 接口克隆到 LinuxKPI 中的可睡眠部分和不可睡眠部分之后的 12-STABLE。

    1201514

    2020 年 5 月 1 日

    在实现完整的 bus_dma(9)支持并引入所有依赖项后,12-STABLE 在 LinuxKPI 中。

    1201515

    2020 年 5 月 1 日

    在更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 到 10.0.0 版本后的 12-STABLE。

    1201516

    2020 年 5 月 4 日

    在将 id_mapped 移动到 bus_dma_impl 结构末尾以保留 KPI 之后的 12-STABLE。

    1201517

    2020 年 5 月 21 日

    在重命名 vm.max_wired 为 vm.max_user_wired 并更改其类型后,12-STABLE

    1201518

    2020 年 6 月 18 日

    在 LinuxKPI 中实现 __is_constexpr() 函数宏后,12-STABLE

    1201519

    2020 年 7 月 4 日

    在使用 libmd 实现 SHA256 后,12-STABLE

    1201520

    2020 年 7 月 24 日

    在更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 到 10.0.1 版本后的 12-STABLE。

    1201521

    2020 年 8 月 3 日

    在 LinuxKPI 中实现 array_size() 函数后的 12-STABLE。

    1201522

    2020 年 8 月 4 日

    添加 sysctlbyname 系统调用后的 12-STABLE。

    1201523

    2020 年 8 月 19 日

    在更改为克隆与 RCU 有关的任务结构字段后的 12-STABLE。

    1201524

    2020 年 9 月 5 日

    在将 XDR 拆分为单独的内核模块后的 12-STABLE,以最小化 ZFS 依赖性。

    1201525

    2020 年 9 月 8 日

    在将原子和 bswap 函数添加到 libcompiler_rt 后的 12-STABLE。

    1201526

    2020 年 9 月 10 日

    在更新 net80211 和核心特权检查 API 更改后的 12-STABLE。

    1202000

    2020 年 9 月 11 日

    从 stable/12@r365618 分支的 releng/12.2。

    1202500

    2020 年 9 月 11 日

    在 releng/12.2 分支后的 12-STABLE。

    1202501

    2020 年 9 月 12 日

    在跟进提交到 libcompiler_rt 后的 12-STABLE。

    1202502

    2020 年 9 月 16 日

    在修复 crunchgen(1)应用程序构建时的 12-STABLE。

    1202503

    2020 年 10 月 20 日

    在 LinuxKPI 中填充 ww_mutex 的获取上下文字段后的 12-STABLE。

    1202504

    2020 年 11 月 9 日

    12-STABLE 在添加了 ptsname_r(3)之后。

    1202505

    2020 年 12 月 28 日

    在 USB 堆栈中改进处理备用设置后的 12-STABLE。

    1202506

    2021 年 4 月 30 日

    更改 krpc 和 NFS 之间的内部 KAPI 后的 12-STABLE

    1202507

    2021 年 5 月 10 日

    在将 nscl.ko 和 nfscommon.ko 模块之间的内部 KAPI 更改后的 12-STABLE。

    1202508

    2021 年 6 月 26 日

    在将 krpc 和 nfsd 模块之间的内部 KAPI 更改后,在 12-STABLE 版本中。

    1203500

    2021 年 10 月 20 日

    在 releng/12.3 分支后的 12-STABLE。

    1203501

    2021 年 12 月 22 日

    将原子和 bswap 函数添加到 libcompiler_rt 后的 12-STABLE。

    1203502

    2021 年 12 月 22 日

    更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 至 11.0.1 后的 12-STABLE。

    1203503

    2021 年 12 月 25 日

    更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 到 12.0.0 后的 12-STABLE。

    1203504

    2021 年 12 月 25 日

    在 aarch64 上将脱机 LSE 原子帮助器添加到 libcompiler_rt.a 后的 12-STABLE。

    1203505

    2021 年 12 月 25 日

    在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 更新到 13.0.0 之后的 12-STABLE。

    1203506

    2022 年 2 月 12 日

    恢复可用性折衷之后的 12-STABLE random(4)。

    1203507

    2022 年 4 月 9 日

    zlib 统一后的 12-STABLE。

    1203508

    2022 年 10 月 19 日

    在 iflib 之后的 12-STABLE:允许驱动程序确定在哪个队列上进行 TX。

    1204000

    2022 年 10 月 20 日

    releng/12.4 从 stable/12 分支出来。

    1204500

    2022 年 10 月 20 日

    在 releng/12.4 分支后的 12-STABLE。

    1100003

    2013 年 11 月 17 日

    在 iconv 更改后的 11.0-CURRENT。

    1100004

    2013 年 12 月 15 日

    2013 年 12 月 28 日(UTC)

    1100005

    2013 年 12 月 28 日

    在 259951 之后的 11.0-CURRENT - 不要合并 vm_map_stack(9)中的条目。

    1100006

    2014 年 1 月 28 日

    升级 libelf 和 libdwarf 后的 11.0-CURRENT。

    1100007

    2014 年 1 月 30 日

    升级 libc++至 3.4 版本后的 11.0-CURRENT。

    1100008

    2014 年 2 月 14 日

    11.0-CURRENT 在 libc++ 3.4 ABI 兼容性修复后。

    1100009

    2014 年 2 月 16 日

    11.0-CURRENT 升级至 llvm/clang 3.4 版本后。

    1100010

    2014 年 2 月 28 日

    升级 ncurses 至 5.9 版本(修订版 262629)后的 11.0-CURRENT。

    1100011

    2014 年 3 月 13 日

    在 ABI 更改后的 11.0-CURRENT 中的结构 if_data 。

    1100012

    2014 年 3 月 14 日

    在删除 Novell IPX 协议支持后的 11.0-CURRENT。

    1100013

    2014 年 3 月 14 日

    删除 AppleTalk 协议支持后的 11.0-CURRENT。

    1100014

    2014 年 3 月 16 日

    11.0-CURRENT 重命名<sys/capability.h>为<sys/capsicum.h>,以避免与其他操作系统中同名头文件发生冲突。兼容性头文件仍然保留以减少构建中断,但会在适当时机被弃用。

    1100015

    2014 年 3 月 22 日

    11.0-CURRENT 之后 cnt 重命名为 vm_cnt 。

    1100016

    2014 年 3 月 23 日

    在添加 armv6hf TARGET_ARCH 后的 11.0-CURRENT。

    1100017

    2014 年 4 月 4 日

    在 GCC 支持下的 11.0-CURRENT __block 定义之后。

    1100018

    2014 年 4 月 6 日

    在支持 UDP-Lite 协议 (RFC 3828) 的 11.0-CURRENT 之后。

    1100019

    2014 年 4 月 8 日

    FreeBSD-SA-14:06.openssl 后的 11.0-CURRENT(修订版 264265)。

    1100020

    2014 年 5 月 1 日

    删除 lindev ,默认使用/dev/full 后的 11.0-CURRENT(修订版 265212)。

    1100021

    2014 年 5 月 6 日

    src.opts.mk 更改后的 11.0-CURRENT,将 make.conf(5)与 buildworld 分离(修订版 265419)。

    1100022

    2014 年 5 月 30 日

    在对 strcasecmp(3)进行更改后,将 strcasecmp_l(3)和 strncasecmp_l(3)从<string.h>移到<strings.h>以符合 POSIX 2008 规范(修订版 266865)。

    1100023

    2014 年 6 月 13 日

    默认情况下,CUSE 库和内核模块已附加到构建的 11.0-CURRENT 之后。

    1100024

    2014 年 6 月 27 日

    在 sysctl(3) API 更改后的 11.0-CURRENT。

    1100025

    2014 年 6 月 30 日

    在 regex(3) 库更新后,11.0-CURRENT 添加了">"和"<"分隔符。

    1100026

    2014 年 7 月 1 日

    11.0-CURRENT 在 NFS 模块之间的内部接口之后,在 (rev 268115) 处被更改。

    1100027

    2014 年 7 月 8 日

    11.0-CURRENT 在 FreeBSD-SA-14:17.kmem 之后 (rev 268431)。

    1100028

    2014 年 7 月 21 日

    在 hdestroy(3)合规修复之后的 11.0-CURRENT 变更 ABI。

    1100029

    2014 年 8 月 3 日

    11.0-CURRENT 在 SOCK_DGRAM 修复错误后 (修订版 269489)。

    1100030

    2014 年 9 月 1 日

    11.0-CURRENT 在 SOCK_RAW 后,套接字被更改为不修改数据包。

    1100031

    2014 年 9 月 9 日

    FreeBSD-SA-14:18.openssl 后的 11.0-CURRENT(修订版 269686)。

    1100032

    2014 年 9 月 11 日

    在 API 更改后的 11.0-CURRENT 之后 ifa_ifwithbroadaddr , ifa_ifwithdstaddr , ifa_ifwithnet , 和 ifa_ifwithroute 。

    1100033

    2014 年 9 月 9 日

    在更改 access , eaccess , 和 faccessat 以验证模式参数后的 11.0-CURRENT。

    1100034

    2014 年 9 月 16 日

    FreeBSD-SA-14:19.tcp 后的 11.0-CURRENT(修订版 271666)。

    1100035

    2014 年 9 月 17 日

    11.0-CURRENT 在 i915 硬件上下文支持之后。

    1100036

    2014 年 9 月 17 日

    版本升级,使 ABI 注释能够区分为适用于严格的 mmap(2)标志检查的二进制文件(修订版 271724)。

    1100037

    2014 年 10 月 6 日

    添加 explicit_bzero(3)后的 11.0-CURRENT (修订版 272673)。

    1100038

    2014 年 10 月 11 日

    11.0-CURRENT 清理了 TCP 包装头之后。

    1100039

    2014 年 10 月 18 日

    移除 MAP_RENAME 和 MAP_NORESERVE 后的 11.0-CURRENT。

    1100040

    2014 年 10 月 21 日

    FreeBSD-SA-14:23(修订版 273146)后的 11.0-CURRENT

    1100041

    2014 年 10 月 30 日

    在 API 更改后的 11.0-CURRENT 到 syscall_register , syscall32_register , syscall_register_helper 和 syscall32_register_helper (rev 273707)。

    1100042

    2014 年 11 月 3 日

    在 struct tcpcb 更改后的 11.0-CURRENT。

    1100043

    2014 年 11 月 4 日

    启用 vt(4)后的 11.0-CURRENT。

    1100044

    2014 年 11 月 4 日

    在添加新的库/实用程序 ( dpv 和 figpar ) 用于数据吞吐量可视化后的 11.0-CURRENT。

    1100045

    2014 年 11 月 4 日

    FreeBSD-SA-14:23、FreeBSD-SA-14:24 和 FreeBSD-SA-14:25 后的 11.0-CURRENT。

    1100046

    2014 年 11 月 13 日

    11.0-CURRENT 在 kern_poll 签名更改后 (修订版 274462)。

    1100047

    2014 年 11 月 13 日

    在移除 VFS 系统调用助手的 no-at 版本后的 11.0-CURRENT,例如 kern_open 。

    1100048

    2014 年 12 月 1 日

    在网络代码中开始移除弃用的"M_FLOWID"标志后的 11.0-CURRENT。

    1100049

    2014 年 12 月 9 日

    在将一个重要修复程序导入 LLVM 向量化器后,11.0-CURRENT 可能会在某些情况下导致缓冲区溢出。

    1100050

    2014 年 12 月 12 日

    在 OpenCrypto 中添加 AES-ICM 和 AES-GCM 后的 11.0-CURRENT。

    1100051

    2014 年 12 月 23 日

    从内核中删除旧的 NFS 客户端和服务器代码后的 11.0-CURRENT。

    1100052

    2014 年 12 月 31 日

    在升级 clang、llvm 和 lldb 到 3.5.0 版本后的 11.0-CURRENT。

    1100053

    2015 年 1 月 7 日

    11.0-CURRENT 在 MCLGET(9)获得返回值之后获得了一个返回值 (rev 276750)。

    1100054

    2015 年 1 月 15 日

    11.0-CURRENT 在重写调度子系统之后。

    1100055

    2015 年 1 月 22 日

    在 277213 中恢复调用更改后的 11.0-CURRENT。

    1100056

    2015 年 1 月 23 日

    添加 futimens 和 utimensat 系统调用后的 11.0-CURRENT。

    1100057

    2015 年 1 月 29 日

    移除 d_thread_t 后的 11.0-CURRENT。

    1100058

    2015 年 2 月 5 日

    在添加对探测 SCSI VPD 扩展查询页面(0x86)支持后的 11.0-CURRENT。

    1100059

    2015 年 2 月 9 日

    导入 xz 5.2.0 后的 11.0-CURRENT,增加了多线程压缩,lzma 增加了 libthr 依赖(修订版 278433)。

    1100060

    2015 年 2 月 16 日

    将 FBIO_BLANK 转发到帧缓冲客户端后的 11.0-CURRENT。

    1100061

    2015 年 2 月 18 日

    CDAI_FLAG_NONE 添加后的 11.0-CURRENT。

    1100062

    2015 年 2 月 23 日

    在添加 mtio(4)和 sa(4) API 和 ioctl(2)后的 11.0-CURRENT。

    1100063

    2015 年 3 月 7 日

    在内核中为 pps_ioctl() API 添加互斥支持后的 11.0-CURRENT。

    1100064

    2015 年 3 月 7 日

    在向 USB 串行驱动程序添加 PPS 支持后的 11.0-CURRENT。

    1100065

    2015 年 3 月 15 日

    升级 clang、llvm 和 lldb 到 3.6.0 后的 11.0-CURRENT。

    1100066

    2015 年 3 月 20 日

    从 OpenSSL 中移除 SSLv2 支持后的 11.0-CURRENT。

    1100067

    2015 年 3 月 25 日

    从 fetch(1)和 fetch(3)中删除 SSLv2 支持后的 11.0-CURRENT。

    1100068

    2015 年 4 月 6 日

    在更改 net.inet6.ip6.mif6table sysctl 后的 11.0-CURRENT。

    1100069

    2015 年 4 月 15 日

    从 iconv(3) 中移除 const 修饰符后的 11.0-CURRENT。

    1100070

    2015 年 4 月 16 日

    在将 ALTQ 从 contrib 移动到 net/altq 后,11.0-CURRENT

    1100071

    2015 年 4 月 29 日

    11.0-CURRENT 在 API/ABI 更改为 smb(4) 后 (修订版 281985)。

    1100072

    2015 年 5 月 1 日

    11.0-CURRENT 在 libc 中添加 reallocarray(3) 后 (修订版 282314)。

    1100073

    2015 年 5 月 8 日

    在将 PCM 流中允许的最大 PCM 通道数量扩展到 127 并将最大子通道数量减少到 1 之后的 11.0-CURRENT

    1100074

    2015 年 5 月 25 日

    添加对 x86-64 Linux 二进制文件的初步支持(版本 283424 后),并将 clang 和 llvm 升级到 3.6.1 后的 11.0-CURRENT。

    1100075

    2015 年 5 月 27 日

    在 dounmount() 上需要对传递的结构挂载进行引用后的 11.0-CURRENT(版本 283602)。

    1100076

    2015 年 6 月 4 日

    禁用默认生成传统格式密码数据库条目后的 11.0-CURRENT。

    1100077

    2015 年 6 月 10 日

    在 API 更改后的 11.0-CURRENT 到 lim_cur , lim_max 和 lim_rlimit (修订 284215)。

    1100078

    2015 年 8 月 12 日

    在 crunchgen(1) 从 284356 更改到 285986 后的 11.0-CURRENT。

    1100079

    2015 年 8 月 18 日

    导入 jemalloc 4.0.0 后的 11.0-CURRENT(修订版 286866)。

    1100080

    2015 年 10 月 5 日

    升级 clang、llvm、lldb、compiler-rt 和 libc++ 到 3.7.0 后的 11.0-CURRENT。

    1100081

    2015 年 10 月 16 日

    11.0-CURRENT 在升级 undating ZFS 以支持可恢复的发送/接收 (rev 289362) 之后。

    1100082

    2015 年 10 月 19 日

    Linux KPI 更新后的 11.0-CURRENT。

    1100083

    2015 年 10 月 22 日

    11.0-CURRENT 改名为 linuxapi.ko 到 linuxkpi.ko 后。

    1100084

    2015 年 10 月 29 日

    将 LinuxKPI 模块移至默认内核构建后的 11.0-CURRENT。

    1100085

    2015 年 10 月 30 日

    导入 OpenSSL 1.0.2d 后的 11.0-CURRENT。

    1100086

    2015 年 11 月 2 日

    在使 figpar(3)宏更加独特后的 11.0-CURRENT。

    1100087

    2015 年 11 月 7 日

    在更改 sysctl_add_oid(9)的 ABI 后的 11.0-CURRENT。

    1100088

    2015 年 11 月 7 日

    在字符串排序和区域设置重做后的 11.0-CURRENT。

    1100089

    2015 年 11 月 7 日

    在 API 更改为 sysctl_add_oid(9) 后的 11.0-CURRENT(修订版 290475)。

    1100090

    2015 年 11 月 10 日

    在调用 callout_stop 宏后的 11.0-CURRENT(修订版 290664)。

    1100091

    2015 年 11 月 30 日

    2015 年 12 月 19 日,将 nfsd.ko 和 nfscommon.ko 模块之间的接口更改为 11.0-CURRENT 中的 291527。

    1100092

    2015 年 12 月 19 日

    11.0-CURRENT 在移除 vm_pageout_grow_cache (修订版 292469)后。

    1100093

    2015 年 12 月 30 日

    11.0-CURRENT 在移除 sys/crypto/sha2.h(修订版 292782)后。

    1100094

    2016 年 1 月 15 日

    LinuxKPI PCI 变更后的 11.0-CURRENT(修订版 294086)。

    1100095

    2016 年 1 月 19 日

    11.0-CURRENT 经过 LRO 优化后。

    1100096

    2016 年 1 月 21 日

    11.0-CURRENT 经过 LinuxKPI idr_* 添加后。

    1100097

    2016 年 1 月 26 日

    在 API 更改为 dpv(3)后的 11.0-CURRENT。

    1100098

    2016 年 2 月 16 日

    在 API 更改后的 11.0-CURRENT rman (修订版 294883)。

    1100099

    2016 年 2 月 18 日

    允许驱动程序设置 TCP ACK/data 段聚合限制后的 11.0-CURRENT。

    1100100

    2016 年 2 月 26 日

    在添加 bus_alloc_resource_any(9) API 后的 11.0-CURRENT。

    1100101

    2016 年 3 月 5 日

    在升级 clang、llvm、lldb 和 compiler-rt 到 3.8.0 版本后的 11.0-CURRENT。

    1100102

    2016 年 3 月 12 日

    在修复 libelf 跨端问题后的 11.0-CURRENT,修订版为 296685。

    1100103

    2016 年 3 月 18 日

    在 uintmax_t 用过后的 11.0-CURRENT 中 rman 范围。

    1100104

    2016 年 3 月 21 日

    '11.0-CURRENT 跟踪 filemon 使用通过一个 proc.p_filemon 指针,而不是它自己的列表。'

    1100105

    '2016 年 4 月 6 日'

    '11.0-CURRENT 修复 sed 函数 i 和 a ,不丢弃前导空格。'

    1100106

    2016 年 4 月 22 日

    修复了在 RDMA 中使用 IPv6 地址的问题后的 11.0-CURRENT。

    1100107

    2016 年 5 月 4 日

    在改进 bitstring(3) API 的性能和功能后,11.0-CURRENT。

    1100108

    2016 年 5 月 12 日

    在修复 LinuxKPI 中 IOCTLs 的处理后,11.0-CURRENT。

    1100109

    2016 年 5 月 16 日

    在 LinuxKPI 中实现更多 Linux 设备相关功能后的 11.0-CURRENT。

    1100110

    2016 年 5 月 19 日

    在添加对管理槽磁记录(SMR)驱动器的支持后的 11.0-CURRENT。

    1100111

    2016 年 5 月 20 日

    在 arm64 中从 brk 和 sbrk 删除后的 11.0-CURRENT。

    1100112

    2016 年 5 月 23 日

    在向 bitstring(3) API 添加 bit_count 后的 11.0-CURRENT。

    1100113

    2016 年 5 月 26 日

    在 armv6 上禁用对齐故障后的 11.0-CURRENT。

    1100114

    2016 年 5 月 26 日

    修复了与 crunchgen(1) 使用相关的 11.0-CURRENT MAKEOBJDIRPREFIX 。

    1100115

    2016 年 5 月 30 日

    在添加 M_HASHTYPE_ 后的 11.0-CURRENT 中增加了一个 mbuf 标志。

    1100116

    2016 年 5 月 31 日

    在 libmd、libcrypt、内核和 ZFS(版本 301010)中添加了 SHA-512t256(版本 300903)和 Skein(版本 300966)后的 11.0-CURRENT。

    1100117

    2016 年 6 月 6 日

    在库存 301602 同步 libpam 后,11.0-CURRENT 提升了库版本。

    1100118

    2016 年 6 月 21 日

    在破坏结构磁盘 302069 的二进制兼容性后的 11.0-CURRENT。

    1100119

    2016 年 6 月 23 日

    在将 geom_disk 切换到使用池互斥量后的 11.0-CURRENT。

    1100120

    2016 年 6 月 23 日

    在向结构 ifnet 添加备用设备后的 11.0-CURRENT。

    1100121

    2015 年 8 月 12 日

    releng/11.0 从 11-STABLE(修订版 303975)分支后的 11-STABLE。

    1100500

    2016 年 8 月 12 日

    11.0-STABLE 添加了分支 303976。

    1100501

    2016 年 8 月 22 日

    11.0-STABLE 在添加了 C++11 thread_local 支持之后。

    1100502

    2016 年 8 月 26 日

    LC_*_MASK 修复后的 11.0-STABLE。

    1100503

    2016 年 9 月 12 日

    在解决 device_detach() 和 usbd_do_request_flags(9)之间的死锁后,11.0-STABLE。

    1100504

    2016 年 10 月 14 日

    ZFS 合并后的 11.0-STABLE。

    1100505

    2016 年 10 月 19 日

    struct fb_info 更改后的 11.0-STABLE。

    1100506

    2016 年 10 月 28 日

    在安装开发所需的头文件后 11.0-STABLE 使用 libzfs_core 。

    1100507

    2016 年 12 月 15 日

    在将 ki_moretdname 成员添加到 struct kinfo_proc 和 struct kinfo_proc32 以导出整个线程名称到用户空间实用程序后 11.0-STABLE

    1100508

    2016 年 12 月 26 日

    在升级了 clang、llvm、lldb、compiler-rt 和 libc++到 3.9.1 版本,以及添加了 lld 3.9.1 后的 11.0-STABLE。

    1100509

    2017 年 1 月 3 日

    在 crunchgen(1) META_MODE 修复后的 11.0-STABLE(修订版 311185)。

    1100510

    2017 年 3 月 15 日

    在 MFC fget_cap , getsock_cap 和相关更改后的 11.0-STABLE。

    1100511

    2017 年 4 月 2 日

    在多次 MFC 更新 clang、llvm、lld、lldb、compiler-rt 和 libc++到 4.0.0 版本后的 11.0-STABLE。

    1100512

    2017 年 4 月 4 日

    11.0-STABLE 在将 CAM SIM 锁定设置为可选后(修订版本 315673, 315674)。

    1100513

    2017 年 5 月 11 日

    在合并添加 <dev/mmc/mmc_ioctl.h> 标头之后的 11.0-STABLE。

    1100514

    2017 年 5 月 31 日

    经过 libpcap , WITHOUT_INET6 和其他一些较小的更改后的 11.0-STABLE

    1101000

    2017 年 6 月 30 日

    releng/11.1 从 stable/11 分支出来。

    1101001

    2017 年 6 月 30 日

    11.1-RC1 合并 MAP_GUARD mmap(2) 标志添加后。

    1101500

    2017 年 6 月 30 日

    11-STABLE 在 releng/11.1 分支后。

    1101501

    2017 年 7 月 5 日

    在合并 MAP_GUARD mmap(2)标志添加后的 11-STABLE。

    1101502

    2017 年 7 月 29 日

    在合并 NFS 客户端强制卸载支持 umount -N 添加后的 11-STABLE。

    1101503

    2017 年 9 月 11 日

    在合并使 WRFSBASE 指令在 amd64 上可操作的更改后,11-STABLE。

    1101504

    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

    2017 年 9 月 26 日

    合并 clang,llvm,lld,lldb,compiler-rt 和 libc++ 5.0.0 版本后的 11-STABLE。

    1101506

    2017 年 10 月 25 日

    在将 324281 合并后,向 11-STABLE 中添加 value.u16 字段到 struct diocgattr_arg 。

    1101507

    2018 年 1 月 24 日

    合并 325028 后的 11-STABLE,修复了 ptrace() 以在恢复时始终清除正确的线程事件。

    1101508

    2018 年 1 月 24 日

    合并 316648 后的 11-STABLE,将 smp_no_rendevous_barrier() 重命名为 smp_no_rendezvous_barrier() 。

    1101509

    2018 年 2 月 1 日

    从 FreeBSD-head 进行 LinuxKPI 的覆盖合并后的 11-STABLE。

    1101510

    2018 年 2 月 17 日

    在 LinuxKPI 中的 cmpxchg() 宏现在完全可用于 11-STABLE。

    1101511

    2018 年 2 月 25 日

    在最近的 LinuxKPI 相关更新结束后,11-STABLE 现在可用。

    1101512

    2018 年 3 月 19 日

    从上游 llvm、clang 和 lld 5.0 分支合并 retpoline 支持之后的 11-STABLE。

    1101513

    2018 年 3 月 31 日

    在合并 clang、llvm、lld、lldb、compiler-rt 和 libc++ 6.0.0 版本以及几次后续修复后的 11-STABLE。

    1101514

    2018 年 4 月 5 日

    在合并 328331 后,在 rc 脚本中添加了一个新的不兼容的 ${name}_limits 解释的 11-STABLE。

    1101515

    2018 年 4 月 10 日

    331880 撤销后的 11-STABLE,删除 rc 脚本中 ${name}_limits 的新且不兼容的解释。

    1101516

    2018 年 5 月 30 日

    经过 dwatch(1) 触摸后的 11-STABLE。

    1102000

    2018 年 6 月 1 日

    releng/11.2 从 stable/11 分支出来。

    1102500

    2018 年 6 月 1 日

    11.2 分支后的 11-STABLE。

    1102501

    2018 年 6 月 20 日

    11-STABLE 在 LinuxKPI 更新后需要重新编译外部内核模块。

    1102502

    2018 年 9 月 12 日

    在添加套接字选项 SO_TS_CLOCK 和修复 recvmsg32() 系统调用以正确将 64 位结构的布局降级到与 32 位应用程序期望的匹配的情况下,11-STABLE。

    1102503

    2018 年 9 月 25 日

    将 TCP 校验和修复合并到 iflib(9)并向 if_media.h 添加新的媒体类型后的 11-STABLE

    1102504

    2018 年 11 月 9 日

    经过几次 MFC 对 11-STABLE 的更新:将 objcopy(1)更新为正确处理小端 MIPS64 目标;更正 mips64el 测试以使用 ELF 头;为_libelf_is_mips64el 中的 64 位 ELF 添加测试。

    1102505

    2019 年 1 月 6 日

    在修复 linux_destroy_dev() 行为合并后的 11-STABLE 中,当仍有文件从销毁 cdev 中打开时。

    1102506

    2019 年 2 月 17 日

    将多个提交合并到 lualoader 后的 11-STABLE 版本。

    1102507

    2019 年 4 月 16 日

    合并 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 8.0.0 最终版本 r356365 后的 11-STABLE。

    1102508

    2019 年 4 月 27 日

    ether_gen_addr 可用后的 11-STABLE。

    1102509

    2019 年 5 月 6 日

    345303、345658 合并后的 11-STABLE 版本,以及部分 345305 的合并。

    1102510

    2019 年 5 月 16 日

    在提升 Mellanox 驱动程序版本号(mlx4en(4); mlx5en(4))后的 11-STABLE。

    1103000

    2019 年 6 月 14 日

    releng/11.3 从 stable/11 分支出。

    1103500

    2019 年 6 月 14 日

    在 releng/11.3 分支后的 11-STABLE。

    1103501

    2019 年 11 月 10 日

    在修复了 libc++中潜在的 OOB 读取安全问题后的 11-STABLE。

    1103502

    2019 年 11 月 11 日

    在 LinuxKPI 中添加了处理一次调用中处理多个文件的 sysfs 创建/删除函数后的 11-STABLE。

    1103503

    2019 年 11 月 11 日

    LinuxKPI sysfs 改进后的 11-STABLE。

    1103504

    2019 年 11 月 11 日

    在启用 LinuxKPI 中的设备类组属性后,11-STABLE。

    1103505

    2019 年 12 月 19 日

    在 11-STABLE 中添加在 musl libc 和 glibc 中常见的 sigsetop 扩展。

    1103506

    2020 年 1 月 6 日

    在将 USB 统计更改为每设备而不是每个总线之后的 11-STABLE。

    1103507

    2020 年 1 月 13 日

    添加自己的计数器以用于取消的 USB 传输后的 11-STABLE。

    1103508

    2020 年 2 月 6 日

    最近的 LinuxKPI 更改后的 11-STABLE。

    1103509

    2020 年 4 月 15 日

    将 id_mapped 移动到 bus_dma_impl 结构末尾以保留 KPI 后的 11-STABLE。

    1103510

    2020 年 5 月 5 日

    更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 到 9.0.0 最终版本 r372316 后的 11-STABLE

    1103511

    2020 年 5 月 7 日

    将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 更新到 10.0.0 版本后的 11-STABLE

    1104000

    2020 年 5 月 8 日

    releng/11.4 分支自 stable/11 。

    1104001

    2020 年 5 月 8 日

    在更新 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 到 10.0.0 版本之后的 11.4-BETA1。

    1104500

    2020 年 5 月 8 日

    在 releng/11.4 分支后的 11-STABLE。

    1104501

    2020 年 6 月 18 日

    在 LinuxKPI 中实现 __is_constexpr() 功能宏后的 11-STABLE。

    1104502

    2020 年 7 月 4 日

    在使 liblzma 使用 SHA256 的 libmd 实现后的 11-STABLE。

    1104503

    2020 年 7 月 24 日

    11-STABLE 更新 llvm,clang,compiler-rt,libc ++,libunwind,lld,lldb 和 openmp 至 10.0.1 版本后。

    1104504

    2020 年 8 月 3 日

    在 LinuxKPI 中实现 array_size() 功能后的 11-STABLE。

    1104505

    2020 年 8 月 19 日

    在更改为克隆与 RCU 相关的任务结构字段后的 11-STABLE。

    1104506

    2020 年 9 月 8 日

    在向 libcompiler_rt 添加原子和 bswap 函数后的 11-STABLE。

    1104507

    2020 年 9 月 12 日

    在对 libcompiler_rt 进行后续提交后的 11-STABLE。

    1104508

    2020 年 10 月 20 日

    在填充 LinuxKPI 中的 ww_mutex 的获取上下文字段后的 11-STABLE。

    1104509

    2020 年 10 月 20 日

    在 LinuxKPI 的 RCU 列表中添加后的 11-STABLE。

    1104510

    2020 年 11 月 9 日

    添加 ptsname_r 后的 11-STABLE。

    1000003

    2011 年 12 月 16 日

    在对 carp(4) 进行重大更改之后的 10-CURRENT,改变了结构体 in_aliasreq 的大小,结构体 in6_aliasreq(版本 228571)以及 SIOCAIFADDR 的参数检查(版本 228574)的参数检查。

    1000004

    2012 年 1 月 1 日

    移除 skpc() 并添加 memcchr(9)(修订版 229200)后的 10-CURRENT。

    1000005

    2012 年 1 月 16 日

    10-CURRENT 在删除对 SIOCSIFADDR、SIOCSIFNETMASK、SIOCSIFBRDADDR、SIOCSIFDSTADDR ioctls 的支持后。

    1000006

    2012 年 1 月 26 日

    在 cam(4)层引入读取容量数据异步通知之后,10-CURRENT。

    1000007

    2012 年 2 月 5 日

    引入新的 tcp(4)套接字选项后的 10-CURRENT 版本:TCP_KEEPINIT、TCP_KEEPIDLE、TCP_KEEPINTVL 和 TCP_KEEPCNT。

    1000008

    2012 年 2 月 11 日

    10-CURRENT 在引入新的可扩展 sysctl(3)接口 NET_RT_IFLISTL 用于查询地址列表后。

    1000009

    2012 年 2 月 25 日

    10-CURRENT 在导入 libarchive 3.0.3(修订版本 232153)后。

    1000010

    2012 年 3 月 31 日

    清理后的 10-CURRENT。

    1000011

    2012 年 4 月 16 日

    10-CURRENT 导入 LLVM/Clang 3.1 主干 154661(修订版 234353)。

    1000012

    2012 年 5 月 2 日

    10-CURRENT jemalloc 导入。

    1000013

    2012 年 5 月 22 日

    byacc 导入后的 10-CURRENT。

    1000014

    2012 年 6 月 27 日

    BSD 排序后的 10-CURRENT 成为默认排序(修订版 237629)。

    1000015

    2012 年 7 月 12 日

    导入 OpenSSL 1.0.1c 后的 10-CURRENT。

    (not changed)

    2012 年 7 月 13 日

    修复 LLVM/Clang 3.1 回归后的 10-CURRENT。

    1000016

    2012 年 8 月 8 日

    在 ucom(4)中的 KBI 更改后的 10-CURRENT。

    1000017

    2012 年 8 月 8 日

    将流特性添加到 USB 堆栈后的 10-CURRENT。

    1000018

    2012 年 9 月 8 日

    在 pf(4)的重大重写后的 10-CURRENT。

    1000019

    2012 年 10 月 6 日

    在 pfil(9) KBI/KPI 更改后的 10-CURRENT 中,以网络字节顺序提供数据包给 AF_INET 过滤器钩子。

    1000020

    2012 年 10 月 16 日

    在网络接口克隆 KPI 更改后的 10-CURRENT 中,结构 if_clone 变得不透明。

    1000021

    2012 年 10 月 22 日

    支持非 MPSAFE 文件系统的移除和支持 FUSEFS(修订版 241519)之后的 10-CURRENT。

    1000022

    2012 年 10 月 22 日

    10-CURRENT 在整个 IPv4 堆栈切换到网络字节顺序以用于 IP 数据包头存储后。

    1000023

    2012 年 11 月 5 日

    在常见 USB 串行驱动程序代码中的抖动缓冲区中,当 TTY 缓冲区已满时,临时存储字符。在发生这种情况时添加流停止和启动信号。

    1000024

    2012 年 11 月 5 日

    在 i386 和 amd64 上将 clang 设置为默认编译器后的 10-CURRENT。

    1000025

    2012 年 11 月 17 日

    在 sin6_scope_id 成员变量在 struct sockaddr_in6 中被更改为在将结构传递给用户空间之前由内核填充后的 10-CURRENT 通过 sysctl 或路由套接字。这意味着 sin6_addr.s6_addr[2] 中的 KAME 特定嵌入式范围 id 在用户空间应用程序中始终被清除。

    1000026

    2013 年 1 月 11 日

    安装后的 10-CURRENT 获得了 -N 标志。也可用于指示 nmtree 的存在。

    1000027

    2013 年 1 月 29 日

    在猫获得-l 标志之后的 10-CURRENT(修订版 246083)。

    1000028

    2013 年 2 月 13 日

    移动到驱动程序结构后的 10-CURRENT,需要重建所有 USB 模块。

    1000029

    2013 年 3 月 4 日

    引入无滴答调度设施后的 10-CURRENT,也改变了 struct callout 的布局(修订版 247777)。

    1000030

    2013 年 3 月 12 日

    在支持读/写锁定(修订版 248084)后,10-CURRENT 中出现了 VM 子系统中的 KPI 破坏。

    1000031

    2013 年 4 月 26 日

    在 ifnet if_output 方法的 dst 参数更改为带有 const 修饰符后的 10-CURRENT(修订版 249925)。

    1000032

    2013 年 5 月 1 日

    在引入 accept4(2)(修订版 250154)和 pipe2(2)(修订版 250159)系统调用后的 10-CURRENT。

    1000033

    2013 年 5 月 21 日

    在导入 flex 2.5.37 后的 10-CURRENT。

    1000034

    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

    2013 年 6 月 8 日

    在引入 aio_mlock(2)系统调用之后的 10-CURRENT(修订版 251526)。

    1000036

    2013 年 7 月 9 日

    在对内核 GSSAPI 模块的函数调用接口添加新功能后的 10-CURRENT。

    1000037

    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

    2013 年 7 月 16 日

    在 arm、armeb、armv6 和 armv6eb 体系结构上将 ARM EABI 设置为默认 ABI 后的 10-CURRENT。

    1000039

    2013 年 7 月 22 日

    CAM 后的 10-CURRENT 和 mps(4)驱动程序扫描更改。

    1000040

    2013 年 7 月 24 日

    在添加 libusb pkgconf 文件后的 10-CURRENT。

    1000041

    2013 年 8 月 5 日

    在 PF_INET6 中从 time_second 更改为 time_uptime 后的 10-CURRENT。

    1000042

    2013 年 8 月 9 日

    VM 子系统更改后的 10-CURRENT,统一软硬忙机制。

    1000043

    2013 年 8 月 13 日

    WITH_ICONV 后,10-CURRENT 默认启用。 新增 src.conf(5) 选项, WITH_LIBICONV_COMPAT (默认禁用)添加 libiconv_open 以与 converters/libiconv port 兼容。

    1000044

    2013 年 8 月 15 日

    10-CURRENT 在 libc.so 转换为 ld(1) 脚本后(修订版 251668)。

    1000045

    2013 年 8 月 15 日

    在将 cdevsw 标志 D_UNMAPPED_IO 替换为 struct cdev 标志 SI_UNMAPPED 后,10-CURRENT 进行了 devfs 编程接口更改。

    1000046

    2013 年 8 月 19 日

    10-CURRENT 添加 M_PROTO[9-12] 和删除 M_FRAG|M_FIRSTFRAG|M_LASTFRAG mbuf 标志后(修订版本 254524、254526)。

    1000047

    2013 年 8 月 21 日

    stat(2) 更新后的 10-CURRENT,允许将一些 Windows/DOS 和 CIFS 文件属性存储为 stat(2)标志。

    1000048

    2013 年 8 月 22 日

    10-CURRENT 结构修改后 xsctp_inpcb 。

    1000049

    2013 年 8 月 24 日

    10-CURRENT 在为不适用于分割 I/O(如 sa(4))的设备提供 physio(9)支持后。

    1000050

    2013 年 8 月 24 日

    mbuf 结构修改后的 10-CURRENT(修订版本 254780、254799、254804、254807 254842)

    1000051

    2013 年 8 月 25 日

    Radeon KMS 驱动程序导入后的"10-CURRENT"(修订版 254885)。

    1000052

    2013 年 9 月 3 日

    在导入 NetBSD libexecinfo 之后,10-CURRENT 连接到构建。

    1000053

    2013 年 9 月 6 日

    在 Capsicum 框架的 API 和 ABI 更改后的 10-CURRENT。

    1000054

    2013 年 9 月 6 日

    10-CURRENT 在 gcc 和 libstdc++ 不再默认构建。

    1000055

    2013 年 9 月 6 日

    10-CURRENT 在添加 MMAP_32BIT mmap(2) 标志后 (修订版 255426)。

    1000100

    2013 年 12 月 7 日

    releng/10.0 从 stable/10 分支出来。

    1000500

    2013 年 10 月 10 日

    分支后的 10-STABLE head/ 。

    1000501

    2013 年 10 月 22 日

    添加第一次引导 rc(8)支持后的 10-STABLE。

    1000502

    2013 年 11 月 20 日

    从 libc.so.7 中删除 iconv 符号后的 10-STABLE。

    1000510

    2013 年 12 月 7 日

    releng/10.0 FreeBSD_version 更新以防止值向后变化。

    1000700

    2013 年 12 月 7 日

    releng/10.0 分支之后的 10-STABLE。

    1000701

    2013 年 12 月 15 日

    修复 Heimdal 编码后的 10.0-STABLE 版本。

    1000702

    2013 年 12 月 31 日

    MAP_STACK 修复后的 10-STABLE。

    1000703

    2014 年 3 月 5 日

    将 libc++升级至 3.4 版本后的 10-STABLE。

    1000704

    2014 年 3 月 7 日

    在 vt(4)驱动程序(MFC 262861 修订版)之后的 10-STABLE。

    1000705

    2014 年 3 月 21 日

    升级 llvm/clang 到 3.4 版本后的 10-STABLE。

    1000706

    2014 年 4 月 6 日

    在 GCC 支持 __block 定义后的 10-STABLE。

    1000707

    2014 年 4 月 8 日

    FreeBSD-SA-14:06.openssl 后的 10-STABLE。

    1000708

    2014 年 4 月 30 日

    FreeBSD-SA-14:07.devfs、FreeBSD-SA-14:08.tcp 和 FreeBSD-SA-14:09.openssl 之后的 10-STABLE。

    1000709

    2014 年 5 月 13 日

    支持 UDP-Lite 协议(RFC 3828)后的 10-STABLE。

    1000710

    2014 年 6 月 13 日

    在对 strcasecmp(3)进行更改后,将 strcasecmp_l(3)和 strncasecmp_l(3)从<string.h>移动到<strings.h>,以符合 POSIX 2008 标准。

    1000711

    2014 年 7 月 8 日

    10-STABLE 在 FreeBSD-SA-14:17.kmem 之后(修订版 268432)。

    1000712

    2014 年 8 月 1 日

    10-STABLE 在 nfsd(8) 4.1 合并之后(修订版 269398)。

    1000713

    2014 年 8 月 3 日

    在更新正则表达式(3)库后,10-STABLE 添加了">"和"<"定界符。

    1000714

    2014 年 8 月 3 日

    经过 SOCK_DGRAM bug 修复后的 10-STABLE (rev 269490)。

    1000715

    2014 年 9 月 9 日

    FreeBSD-SA-14:18 修复后的 10-STABLE (rev 269686)。

    1000716

    2014 年 9 月 16 日

    FreeBSD-SA-14:19(修订版 271667)之后的 10-STABLE。

    1000717

    2014 年 9 月 18 日

    在 i915 硬件上下文支援后的 10-STABLE。

    1001000

    2014 年 10 月 2 日

    在 releng/10.1 分支后的 10.1-RC1。

    1001500

    2014 年 10 月 2 日

    releng/10.1 分支后的 10-STABLE。

    1001501

    2014 年 10 月 21 日

    在 FreeBSD-SA-14:20、FreeBSD-SA-14:22 和 FreeBSD-SA-14:23(修订版 273411)之后的 10-STABLE。

    1001502

    2014 年 11 月 4 日

    在 FreeBSD-SA-14:23、FreeBSD-SA-14:24 和 FreeBSD-SA-14:25 之后的 10-STABLE。

    1001503

    2014 年 11 月 25 日

    在合并新的库/实用程序(dpv(1) dpv(3)和 figpar(3))以进行数据吞吐量可视化后的 10-STABLE。

    1001504

    2014 年 12 月 13 日

    合并重要修复到 LLVM 向量化器后的 10-STABLE,这可能在某些情况下导致缓冲区溢出。

    1001505

    2015 年 1 月 3 日

    合并一些 arm 常量到 276312 后的 10-STABLE。

    1001506

    2015 年 1 月 12 日

    合并了 yacc 的最大表大小更新后的 10-STABLE。

    1001507

    2015 年 1 月 27 日

    在对 UDP 隧道回调进行更改以提供上下文指针和源 sockaddr 后的 10-STABLE。

    1001508

    2015 年 2 月 18 日

    在添加 CDAI_TYPE_EXT_INQ 请求类型后的 10-STABLE。

    1001509

    2015 年 2 月 25 日

    FreeBSD-EN-15:01.vt 之后的 10-STABLE,FreeBSD-EN-15:02.openssl,FreeBSD-EN-15:03.freebsd-update,FreeBSD-SA-15:04.igmp 和 FreeBSD-SA-15:05.bind。

    1001510

    2015 年 2 月 26 日

    10-STABLE 在修订版本 278964 之后。

    1001511

    2015 年 3 月 19 日

    10-STABLE 在 sys/capability.h 被重命名为 sys/capsicum.h 后(修订版本 280224/)。

    1001512

    2015 年 3 月 24 日

    添加新的 mtio(4)、sa(4) ioctls 後的 10-STABLE。

    1001513

    2015 年 4 月 24 日

    从网络代码中移除弃用的"M_FLOWID"标志的过程开始后的 10-STABLE。

    1001514

    2015 年 4 月 30 日

    在 MFC iconv(3)修复后的 10-STABLE。

    1001515

    2015 年 5 月 11 日

    添加 M_FLOWID 后的 10-STABLE。

    1001516

    2015 年 5 月 24 日

    在许多 USB 事务的 MFC 之后的 10-STABLE。

    1001517

    2015 年 6 月 3 日

    在声音相关事务的 MFC 之后的 10-STABLE。

    1001518

    2015 年 6 月 10 日

    在修复 zfs vfs 问题后的 10-STABLE(修订版 284203)。

    1001519

    2015 年 6 月 23 日

    10-STABLE 在 amd64 上恢复 bumping MAXCPU 之后。

    1002000

    2015 年 7 月 24 日

    releng/10.2 从 10-STABLE 分支出来。

    1002500

    2015 年 7 月 24 日

    releng/10.2 从 10-STABLE 分支后的 10-STABLE。

    1002501

    2015 年 10 月 8 日

    在合并影响 zfeature_info 结构内部接口的 ZFS 更改后的 10-STABLE(修订版本 288572)。

    1002502

    2015 年 11 月 24 日

    在合并影响 g_dev_setdumpdev() 参数的转储设备更改后的 10-STABLE(修订版本 291215)。

    1002503

    2015 年 12 月 14 日

    10-STABLE 合并对 nfsd.ko 和 nfscommon.ko 模块内部接口的更改后,要求它们一起升级(修订版 292223)。

    1002504

    2015 年 12 月 22 日

    10-STABLE 合并了 xz 5.2.2 合并(多线程支持)(修订版 292588)。

    1002505

    2015 年 12 月 30 日

    在合并对 pci(4)的更改后的 10-STABLE (修订版 292907)。

    1002506

    2016 年 1 月 9 日

    在合并 utimensat(2)后的 10-STABLE(修订版 293473)。

    1002507

    2016 年 1 月 9 日

    在合并对 linux(4)更改后的 10-STABLE(修订版 293477 至 293609)。

    1002508

    2016 年 1 月 9 日

    在合并对 figpar(3)类型/宏的更改后的 10-STABLE (修订版 290275)。

    1002509

    2016 年 2 月 1 日

    在将 API 更改合并到 dpv(3)之后的 10-STABLE。

    1003000

    2016 年 3 月 4 日

    从 10-STABLE 中分支出 releng/10.3 。

    1003500

    2016 年 3 月 4 日

    releng/10.3 从 10-STABLE 分支后的 10-STABLE。

    1003501

    2016 年 6 月 19 日

    在添加-P 选项之后的 10-STABLE kdbcontrol (修订版 298297)。

    1003502

    2016 年 6 月 19 日

    在将 libcrypto.so 设置为位置无关后的 10-STABLE。

    1003503

    2016 年 6 月 19 日

    允许 MK_ 覆盖后的 10-STABLE(修订版 300233)。

    1003504

    2016 年 6 月 21 日

    从 11-CURRENT MFC filemon 更改后的 10-STABLE。

    1003505

    2016 年 6 月 27 日

    将 sed 转换为使用 REG_STARTEND 后修复 Mesa 问题的 10-STABLE。

    1003506

    2016 年 8 月 22 日

    添加 C++11 thread_local 支持后的 10-STABLE。

    1003507

    2016 年 8 月 26 日

    在 LC_*_MASK 修复后的 10-STABLE。

    1003508

    2016 年 9 月 12 日

    在 device_detach() 和 usbd_do_request_flags(9)之间解决死锁后的 10-STABLE。

    1003509

    2016 年 10 月 14 日

    ZFS 合并后的 10-STABLE。

    1003510

    2016 年 10 月 28 日

    安装头文件后,10-STABLE 需要与 libzfs_core 进行开发。

    1003511

    2016 年 12 月 15 日

    在导出整个线程名称后的 10-STABLE(修订版 309676)。

    1003512

    2017 年 3 月 22 日

    经过 libmd 更改后的 10-STABLE(修订版本 314143)。

    1003513

    2017 年 4 月 4 日

    在使 CAM SIM 锁定可选后的 10-STABLE(修订版本 315673、315674)。

    1003514

    2017 年 5 月 11 日

    在合并<dev/mmc/mmc_ioctl.h>头文件添加后的 10-STABLE。

    1003515

    2017 年 7 月 19 日

    在向 libc 添加 C14 大小的释放函数后的 10-STABLE。

    1003516

    2017 年 7 月 30 日

    合并 MAP_GUARD mmap(2)标志增加后的 10-STABLE。

    1004000

    2017 年 9 月 15 日

    releng/10.4 从 10-STABLE 分支出来。

    1004500

    2017 年 9 月 15 日

    10-STABLE 在 releng/10.4 从 10-STABLE 分支之后。

    1004501

    2018 年 1 月 24 日

    在合并 325028 后的 10-STABLE,修复 ptrace() 以始终清除正确的线程事件。

    1004502

    2020 年 1 月 6 日

    在将 USB 统计数据改为每设备而不是每总线后再换到 10-STABLE。

    1004503

    2020 年 1 月 13 日

    在添加了自己的取消 USB 传输计数器之后的 10-STABLE。

    900003

    2009 年 12 月 2 日

    添加 sigpause(2)和 PIE 支持后的 9.0-CURRENT。

    900004

    2009 年 12 月 6 日

    9.0-CURRENT 添加 libulog 及其 libutempter 兼容接口之后。

    900005

    2009 年 12 月 12 日

    9.0-CURRENT 添加了 sleepq_sleepcnt(9),可用于查询特定等待队列上等待者的数量。

    900006

    2010 年 1 月 4 日

    在将 scandir(3)和 alphasort(3)原型更改为符合 SUSv4 之后,9.0-CURRENT。

    900007

    2010 年 1 月 13 日

    9.0-CURRENT 在删除了 utmp(5)并添加了 utmpx (参见 getutxent(3))以改善用户登录和系统事件的记录之后。

    900008

    2010 年 1 月 20 日

    9.0-CURRENT 在导入 BSDL bc/dc 并废弃 GNU bc/dc 后。

    900009

    2010 年 1 月 26 日

    在网络接口添加 SIOCGIFDESCR 和 SIOCSIFDESCR ioctl 后的 9.0-CURRENT。这些 ioctl 可用于操纵接口描述,灵感来自 OpenBSD。

    900010

    2010 年 3 月 22 日

    导入 zlib 1.2.4 后的 9.0-CURRENT。

    900011

    2010 年 4 月 24 日

    添加 soft-updates 日志记录后的 9.0-CURRENT。

    900012

    2010 年 5 月 10 日

    添加 liblzma、xz、xzdec 和 lzmainfo 后的 9.0-CURRENT。

    900013

    2010 年 5 月 24 日

    在为 linux(4)引入 USB 修复程序之后的 9.0-CURRENT。

    900014

    2010 年 6 月 10 日

    在添加 Clang 后的 9.0-CURRENT。

    900015

    2010 年 7 月 22 日

    导入 BSD grep 后的 9.0-CURRENT。

    900016

    2010 年 7 月 28 日

    在向结构体 malloc_type_internal 添加 mti_zone 后的 9.0-CURRENT。

    900017

    2010 年 8 月 23 日

    在将默认的 grep 更改回 GNU grep 并添加 WITH_BSD_GREP 开关后的 9.0-CURRENT。

    900018

    2010 年 8 月 24 日

    在 pthread_kill(3)生成的信号被识别为 SI_LWP 之后的 9.0-CURRENT 中, si_code 。之前, si_code 是 SI_USER。

    900019

    2010 年 8 月 28 日

    在向 mmap(2) 添加 MAP_PREFAULT_READ 标志后的 9.0-CURRENT。

    900020

    2010 年 9 月 9 日

    在向 sbufs 添加 drain 功能后的 9.0-CURRENT,这也改变了 struct sbuf 的布局。

    900021

    2010 年 9 月 13 日

    在 DTrace 增加对用户空间跟踪的支持后,9.0-CURRENT 已经发展壮大。

    900022

    2010 年 10 月 2 日

    在添加了 BSDL man 实用程序并淘汰 GNU/GPL man 实用程序后的 9.0-CURRENT。

    900023

    2010 年 10 月 11 日

    在将 xz 更新为 git 20101010 快照后的 9.0-CURRENT。

    900024

    2010 年 11 月 11 日

    libgcc.a 被 libcompiler_rt.a 替换后的 9.0-CURRENT。

    900025

    2010 年 11 月 12 日

    引入模块化拥塞控制后的 9.0-CURRENT。

    900026

    2010 年 11 月 30 日

    引入串行管理协议(SMP)透传以及 XPT_SMP_IO 和 XPT_GDEV_ADVINFO CAM 后的 9.0-CURRENT。

    900027

    2010 年 12 月 5 日

    在将 log2 添加到 libm 后的 9.0-CURRENT。

    900028

    2010 年 12 月 21 日

    9.0-CURRENT 在添加 Hhook(Helper Hook)、Khelp(Kernel Helpers)和 Object Specific Data(OSD)KPIs 之后。

    900029

    2010 年 12 月 28 日

    在修改 TCP 堆栈以允许 Khelp 模块通过助手挂钩点与其交互,并在 TCP 控制块中存储每个连接数据后的 9.0-CURRENT。

    900030

    2011 年 1 月 12 日

    在将 libdialog 更新到 20100428 版本后的 9.0-CURRENT。

    900031

    2011 年 2 月 7 日

    在 pthread_getthreadid_np(3)添加之后的 9.0-CURRENT。

    900032

    2011 年 2 月 8 日

    在删除 uio_yield 原型和符号后的 9.0-CURRENT。

    900033

    2011 年 2 月 18 日

    将 binutils 更新到 2.17.50 版本后的 9.0-CURRENT。

    900034

    2011 年 3 月 8 日

    在结构 sysvec ( sv_schedtail )更改后的 9.0-CURRENT。

    900035

    2011 年 3 月 29 日

    在更新基本 gcc 和 libstdc++到最新的 GPLv2 许可的修订版后的 9.0-CURRENT。

    900036

    2011 年 4 月 18 日

    从基本系统中删除 libobjc 和 Objective-C 支持后的 9.0-CURRENT。

    900037

    2011 年 5 月 13 日

    导入 libprocstat(3)库和 fuser(1)实用程序后的 9.0-CURRENT 到基本系统。

    900038

    2011 年 5 月 22 日

    在添加锁标志参数到 VFS_FHTOVP(9) 之后的 9.0-CURRENT。

    900039

    2011 年 6 月 28 日

    在从 OpenBSD 4.5 导入 pf 之后的 9.0-CURRENT。

    900040

    2011 年 7 月 19 日

    将 FreeBSD 的默认 MAXCPU 增加到 64,适用于 amd64 和 ia64,对于 XLP(mips)增加到 128。

    900041

    2011 年 8 月 13 日

    在实现 Capsicum 功能后的 9.0-CURRENT;fget(9)获得了一个权限参数。

    900042

    2011 年 8 月 28 日

    为了准备 9.0,增加了已更改 ABI 的共享库版本号。

    900043

    2011 年 9 月 2 日

    添加不支持同步缓存 SCSI 命令的 USB 大容量存储设备的自动检测。

    900044

    2011 年 9 月 10 日

    重构自动特性。9.0-RELEASE。

    900045

    2012 年 1 月 2 日

    从 1000002 后的 true/false 合并到 9-STABLE。

    900500

    2012 年 1 月 2 日

    9.0-STABLE.

    900501

    2012 年 1 月 6 日

    在添加 posix_fadvise(2)系统调用后的 9.0-STABLE 合并后。

    900502

    2012 年 1 月 16 日

    合并 gperf 3.0.3 之后的 9.0-STABLE

    900503

    2012 年 2 月 15 日

    引入新的可扩展 sysctl(3)接口 NET_RT_IFLISTL 用于查询地址列表后的 9.0-STABLE。

    900504

    2012 年 3 月 3 日

    在jail内挂载文件系统相关更改后的 9.0-STABLE。

    900505

    2012 年 3 月 13 日

    引入新的 tcp(4)套接字选项后的 9.0-STABLE:TCP_KEEPINIT,TCP_KEEPIDLE,TCP_KEEPINTVL 和 TCP_KEEPCNT。

    900506

    2012 年 5 月 22 日

    9.0-STABLE 在引入 quick_exit 函数以及 C++11 所需的相关更改后。

    901000

    2012 年 8 月 5 日

    9.1-RELEASE.

    901500

    2012 年 8 月 6 日

    分支 releng/9.1 之后的 9.1-STABLE(RELENG_9_1)。

    901501

    2012 年 11 月 11 日

    在 queue.h 中添加 LIST_PREV(3)(修订 242893)和 USB 串行设备的 KBI 更改后的 9.1-STABLE。

    901502

    2012 年 11 月 28 日

    U 盘中的 9.1-STABLE 在 USB 串行抖动缓冲区之后需要重建 USB 串行设备模块。

    901503

    2013 年 2 月 21 日

    将 USB 移至驱动程序结构后的 9.1-STABLE 需要重新构建所有 USB 模块。还指示存在 nmtree。

    901504

    2013 年 3 月 15 日

    安装后的 9.1-STABLE 获得了-l、-M、-N 和相关标志,cat 获得了-l 选项。

    901505

    2013 年 6 月 13 日

    经过修复的 9.1-STABLE 在 ctfmerge 自举 (rev 249243).

    902001

    2013 年 8 月 3 日

    releng/9.2 从 stable/9 分支出来。

    902501

    2013 年 8 月 2 日

    创建 releng/9.2 分支后的 9.2-STABLE。

    902502

    2013 年 8 月 26 日

    包含 PIM_RESCAN CAM 路径查询标志后的 9.2-STABLE。

    902503

    2013 年 8 月 27 日

    包含 SI_UNMAPPED cdev 标志后的 9.2-STABLE。

    902504

    2013 年 10 月 22 日

    在包含对"首次启动"rc(8)脚本的支持后,9.2-STABLE。

    902505

    2013 年 12 月 12 日

    在 Heimdal 编码修复之后的 9.2-STABLE。

    902506

    2013 年 12 月 31 日

    在 MAP_STACK 修复(版本 260082)之后的 9-STABLE。

    902507

    2014 年 3 月 5 日

    升级 libc++至 3.4 版本后的 9-STABLE。

    902508

    2014 年 3 月 14 日

    9-STABLE 合并了 Radeon KMS 驱动程序(rev 263170)。

    902509

    2014 年 3 月 21 日

    升级到 LLVM/Clang 3.4 版本之后的 9-STABLE。

    902510

    2014 年 3 月 27 日

    合并了 vt(4) 驱动程序后的 9-STABLE。

    902511

    2014 年 3 月 27 日

    FreeBSD-SA-14:06.openssl 之后的 9-STABLE。

    902512

    2014 年 4 月 30 日

    在 FreeBSD-SA-14:08.tcp 之后的 9-STABLE。

    903000

    2014 年 6 月 20 日

    9-RC1 releng/9.3 分支。

    903500

    2014 年 6 月 20 日

    9.3-STABLE releng/9.3 分支。

    903501

    2014 年 7 月 8 日

    在 FreeBSD-SA-14:17.kmem (rev 268433)之后的 9-STABLE。

    903502

    2014 年 8 月 19 日

    在 SOCK_DGRAM bug 修复之后的 9-STABLE (rev 269789)。

    903503

    2014 年 9 月 9 日

    自 FreeBSD-SA-14:18 之后的 9-STABLE(修订版 269687)。

    903504

    2014 年 9 月 16 日

    在 FreeBSD-SA-14:19 之后的 9-STABLE(修订版 271668)。

    903505

    2014 年 10 月 21 日

    在 FreeBSD-SA-14:20,FreeBSD-SA-14:21 和 FreeBSD-SA-14:22 之后的 9-STABLE(修订版 273412)。

    903506

    2014 年 11 月 4 日

    FreeBSD-SA-14:23、FreeBSD-SA-14:24 和 FreeBSD-SA-14:25 之后的 9-STABLE。

    903507

    2014 年 12 月 13 日

    在合并重要修复到 LLVM 向量化器后的 9-STABLE,某些情况下可能导致缓冲区溢出。

    903508

    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

    2016 年 2 月 29 日

    在将默认值从 compat.linux.osrelease 调整为 2.6.18 以支持开箱即用的 linux-c6-* ports之后的 9-STABLE。

    903510

    2016 年 5 月 19 日

    最新版本的伯克利引导加载程序(BBL)在系统二进制接口(SBI)页面移动后,9-STABLE 由于代码尺寸增加了 300234。

    903511

    2016 年 9 月 12 日

    通过解决 device_detach() 和 usbd_do_request_flags(9)之间的死锁问题后的 9-STABLE。

    800003

    2007 年 10 月 24 日

    在将 ABI 向后兼容性添加到 FreeBSD 4/5/6 版本的 PCIOCGETCONF、PCIOCREAD 和 PCIOCWRITE IOCTL 之后,需要再次破坏 PCIOCGETCONF IOCTL 的 ABI

    800004

    2007 年 11 月 12 日

    8.0-CURRENT 在将 agp(4)驱动程序从 src/sys/pci 移动到 src/sys/dev/agp 之后

    800005

    2007 年 12 月 4 日

    8.0-CURRENT 在 jumbo 帧分配器发生更改之后(修订版本 174247)。

    800006

    2007 年 12 月 7 日

    在 hwpmc(4)添加 callgraph 捕获功能后的 8.0-CURRENT。

    800007

    2007 年 12 月 25 日

    8.0-CURRENT 后 kdb_enter() 增加了一个"why"参数。

    800008

    2007 年 12 月 28 日

    8.0-CURRENT 在移除 LK_EXCLUPGRADE 选项后。

    800009

    2008 年 1 月 9 日

    引入 lockmgr_disown(9)后的 8.0-CURRENT

    800010

    2008 年 1 月 10 日

    vn_lock(9)原型更改后的 8.0-CURRENT

    800011

    2008 年 1 月 13 日

    VOP_LOCK(9)和 VOP_UNLOCK(9)原型更改后的 8.0-CURRENT。

    800012

    2008 年 1 月 19 日

    在引入 lockmgr_recursed(9)、BUF_RECURSED(9) 和 BUF_ISLOCKED(9) 以及删除 BUF_REFCNT() 后的 8.0-CURRENT。

    800013

    2008 年 1 月 23 日

    在引入“ASCII”编码后的 8.0-CURRENT。

    800014

    2008 年 1 月 24 日

    更改 lockmgr(9)原型和删除 lockcount() 和 LOCKMGR_ASSERT() 后的 8.0-CURRENT。

    800015

    2008 年 1 月 26 日

    8.0-CURRENT 在扩展 fts(3) 结构的类型之后。

    800016

    2008 年 2 月 1 日

    在向 MEXTADD(9) 添加参数后的 8.0-CURRENT

    800017

    2008 年 2 月 6 日

    在 lockmgr(9)空间中引入 LK_NODUP 和 LK_NOWITNESS 选项后的 8.0-CURRENT。

    800018

    2008 年 2 月 8 日

    8.0-CURRENT 添加 m_collapse 后。

    800019

    2008 年 2 月 9 日

    8.0-CURRENT 将当前工作目录、根目录和jail目录支持添加到 kern.proc.filedesc sysctl 后。

    800020

    2008 年 2 月 13 日

    引入 lockmgr_assert(9)和 BUF_ASSERT 函数后的 8.0-CURRENT。

    800021

    2008 年 2 月 15 日

    8.0-CURRENT 在引入 lockmgr_args(9)和移除 LK_INTERNAL 标志之后。

    800022

    (已撤销)

    8.0-CURRENT 在将默认系统 ar 更改为 BSD ar(1)之后。

    800023

    2008 年 2 月 25 日

    更改 lockstatus(9)和 VOP_ISLOCKED(9)的原型后的 8.0-CURRENT;更具体地说是淘汰 struct thread 参数。

    800024

    2008 年 3 月 1 日

    砍掉 lockwaiters 和 BUF_LOCKWAITERS 函数后,8.0-CURRENT 将 brelvp 的返回值从 void 改为 int,并为 lockinit(9)引入了新标志。

    800025

    2008 年 3 月 8 日

    8.0-CURRENT 在 fcntl(2)中添加 F_DUP2FD 命令后。

    800026

    2008 年 3 月 12 日

    在将优先级参数更改为 cv_broadcastpri 后的 8.0-CURRENT,其中 0 表示无优先级。

    800027

    2008 年 3 月 24 日

    在将 bpf 监控 ABI 更改为 zerocopy bpf 缓冲区添加后的 8.0-CURRENT。

    800028

    2008 年 3 月 26 日

    在将 l_sysid 添加到 struct flock 后的 8.0-CURRENT。

    800029

    2008 年 3 月 28 日

    继重新集成 BUF_LOCKWAITERS 函数和添加 lockmgr_waiters(9)之后的 8.0-CURRENT。

    800030

    2008 年 4 月 1 日

    引入 rw_try_rlock(9) 和 rw_try_wlock(9) 函数后的 8.0-CURRENT。

    800031

    2008 年 4 月 6 日

    引入 lockmgr_rw 和 lockmgr_args_rw 函数后的 8.0-CURRENT。

    800032

    2008 年 4 月 8 日

    在实现 openat 和相关系统调用后的 8.0-CURRENT 版本,引入了 open(2)的 O_EXEC 标志,并提供了相应的 Linux 兼容系统调用。

    800033

    2008 年 4 月 8 日

    在本机操作级别为 psm(4) 添加了 write(2) 支持后的 8.0-CURRENT。现在可以向 /dev/psm%d 写入任意命令,并从中读取状态。

    800034

    2008 年 4 月 10 日

    引入 memrchr 函数后的 8.0-CURRENT。

    800035

    2008 年 4 月 16 日

    在引入 fdopendir 函数后的 8.0-CURRENT。

    800036

    2008 年 4 月 20 日

    在 8.0-CURRENT 切换到 802.11 无线到多 BSS 支持后 (又称 vaps )。

    800037

    2008 年 5 月 9 日

    在 8.0-CURRENT 添加多路由表支持后 (又称 setfib(1), setfib(2))。

    800038

    2008 年 5 月 26 日

    删除 netatm 和 ISDN4BSD 后的 8.0-CURRENT 版本。此外,还添加了紧凑型 C 类型(CTF)工具。

    800039

    2008 年 6 月 14 日

    8.0-CURRENT 删除 sgtty 后。

    800040

    2008 年 6 月 26 日

    8.0-CURRENT 使用内核 NFS lockd 客户端。

    800041

    2008 年 7 月 22 日

    在添加 arc4random_buf(3)和 arc4random_uniform(3)之后的 8.0-CURRENT。

    800042

    2008 年 8 月 8 日

    8.0-CURRENT 加入 cpuctl(4)后。

    800043

    2008 年 8 月 13 日

    将 bpf(4)更改为使用单个设备节点的 8.0-CURRENT。

    800044

    2008 年 8 月 17 日

    在 VIMAGE 项目中第一步提交后,將全局變量重命名為具有 V_ 前綴的 virtualized 宏,然后再將它們映射回其全局名稱。

    800045

    2008 年 8 月 20 日

    8.0-CURRENT 在集成 MPSAFE TTY 层后,包括与其交互的各种驱动程序和实用程序的更改。

    800046

    2008 年 9 月 8 日

    8.0-CURRENT 在 amd64 架构上每 CPU 的 GDT 分离后。

    800047

    2008 年 9 月 10 日

    删除 VSVTX、VSGID 和 VSUID 后的 8.0-CURRENT。

    800048

    2008 年 9 月 16 日

    将内核 NFS 挂载代码转换为在 nmount(2)中接受单独的挂载选项后的 8.0-CURRENT iovec ,而不仅仅是一个大的 struct nfs_args。

    800049

    2008 年 9 月 17 日

    在删除 suser(9)和 suser_cred(9)之后的 8.0-CURRENT。

    800050

    2008 年 10 月 20 日

    缓存 API 更改后的 8.0-CURRENT。

    800051

    2008 年 10 月 23 日

    在移除 MALLOC(9) 和 FREE(9) 宏之后的 8.0-CURRENT。

    800052

    2008 年 10 月 28 日

    8.0-CURRENT 在 accmode_t 的引入和将 VOP_ACCESS a_mode 参数重命名为 a_accmode 之后。

    800053

    2008 年 11 月 2 日

    8.0-CURRENT 修改了 vfs_busy(9) 的原型并引入了它的 MBF_NOWAIT 和 MBF_MNTLSTLOCK 标志。

    800054

    2008 年 11 月 22 日

    在添加 buf_ring 后的 8.0-CURRENT,添加了内存屏障和 ifnet 功能,以促进支持这些功能的卡的多个硬件传输队列,并添加了无锁环形缓冲区实现,以使驱动程序能够更有效地管理数据包的排队。

    800055

    2008 年 11 月 27 日

    8.0-CURRENT 在添加 Intel™ Core, Core2 和 Atom 支持到 hwpmc(4) 后。

    800056

    2008 年 11 月 29 日

    8.0-CURRENT 在引入多/无 IPv4/v6 jails 后。

    800057

    2008 年 12 月 1 日

    在切换到 ath hal 源代码后,8.0-CURRENT

    800058

    2008 年 12 月 12 日

    8.0-CURRENT 在 VOP_VPTOCNP 操作引入后。

    800059

    2008 年 12 月 15 日

    8.0-CURRENT 包括新的 arp-v2 重写。

    800060

    2008 年 12 月 19 日

    添加 makefs 后的 8.0-CURRENT。

    800061

    2009 年 1 月 15 日

    在 TCP 适当字节计数后的 8.0-CURRENT。

    800062

    2009 年 1 月 28 日

    在删除 minor() , minor2unit() , unit2minor() 等之后的 8.0-CURRENT

    800063

    2009 年 2 月 18 日

    在 GENERIC 配置更改为使用 USB2 堆栈后的 8.0-CURRENT,同时还添加了 fdevname(3)。

    800064

    2009 年 2 月 23 日

    在 USB2 堆栈移至并替换 dev/usb 后的 8.0-CURRENT。

    800065

    2009 年 2 月 26 日

    在重命名 libmp(3)中的所有函数后,8.0-CURRENT。

    800066

    2009 年 2 月 27 日

    更改 USB devfs 处理和布局后的 8.0-CURRENT。

    800067

    2009 年 2 月 28 日

    在添加 getdelim() , getline() , stpncpy() , strnlen() , wcsnlen() , wcscasecmp() 和 wcsncasecmp() 后的 8.0-CURRENT。

    800068

    2009 年 3 月 2 日

    重命名 ushub devclass 为 uhub 后的 8.0-CURRENT。

    800069

    2009 年 3 月 9 日

    将 libusb20.so.1 重命名为 libusb.so.1 后的 8.0-CURRENT。

    800070

    2009 年 3 月 9 日

    将 IGMPv3 和源特定多播(SSM)合并到 IPv4 堆栈后的 8.0-CURRENT。

    800071

    2009 年 3 月 14 日

    在 gcc 被修补以在 c99 和 gnu99 模式下使用 C99 内联语义后的 8.0-CURRENT。

    800072

    2009 年 3 月 15 日

    在移除 IFF_NEEDSGIANT 标志后的 8.0-CURRENT;不再支持非 MPSAFE 网络设备驱动程序。

    800073

    2009 年 3 月 18 日

    在为 rpath 和所需路径实现动态字符串令牌替换后的 8.0-CURRENT。

    800074

    2009 年 3 月 24 日

    8.0-CURRENT 在 tcpdump 4.0.0 和 libpcap 1.0.0 导入后。

    800075

    2009 年 4 月 6 日

    8.0-CURRENT 在更改 vnet_net、vnet_inet 和 vnet_ipfw 结构布局后。

    800076

    2009 年 4 月 9 日

    在 dummynet 中添加延迟配置后的 8.0-当前版本。

    800077

    2009 年 4 月 14 日

    移除 VOP_LEASE() 和 vop_vector.vop_lease 后的 8.0-CURRENT。

    800078

    2009 年 4 月 15 日

    在添加结构 rt_weight 字段到结构 rt_metrics 和结构 rt_metrics_lite 后的 8.0-CURRENT,改变了结构 rt_metrics_lite 的布局。进行了版本号 RTM_VERSION 的提升,但后来被撤销。

    800079

    2009 年 4 月 15 日

    在将 llentry 指针添加到 struct route 和 struct route_in6 之后的 8.0-CURRENT。

    800080

    2009 年 4 月 15 日

    8.0-CURRENT 在 struct inpcb 布局更改后。

    800081

    2009 年 4 月 19 日

    8.0-CURRENT 在更改了结构 malloc_type 的布局之后。

    800082

    2009 年 4 月 21 日

    8.0-CURRENT 在更改了结构 ifnet 后,以及具有 if_ref() 和 if_rele() ifnet refcounting 。

    800083

    2009 年 4 月 22 日

    在实现低级别蓝牙 HCI API 后的 8.0-CURRENT。

    800084

    2009 年 4 月 29 日

    在 IPv6 SSM 和 MLDv2 更改后的 8.0-CURRENT。

    800085

    2009 年 4 月 30 日

    在启用支持具有一个活动镜像的 VIMAGE 内核构建后的 8.0-CURRENT。

    800086

    2009 年 5 月 8 日

    在 patch(1)中添加对任意长度输入行的支持后的 8.0-CURRENT。

    800087

    2009 年 5 月 11 日

    在一些 VFS KPI 更改后的 8.0-CURRENT。线程参数已从 VFS 的 FSD 部分中移除。 VFS_* 函数不再需要上下文,因为它总是指向 curthread 。在一些特殊情况下,保留了旧的行为。

    800088

    2009 年 5 月 20 日

    在 net80211 监控模式更改后的 8.0-CURRENT。

    800089

    2009 年 5 月 23 日

    添加 UDP 控制块支持后的 8.0-CURRENT。

    800090

    2009 年 5 月 23 日

    在虚拟化接口克隆后的 8.0-CURRENT。

    800091

    2009 年 5 月 27 日

    在添加分层jails和移除全局安全级别后的 8.0-CURRENT。

    800092

    2009 年 5 月 29 日

    在更改 sx_init_flags() KPI 后的 8.0-CURRENT。 SX_ADAPTIVESPIN 已退役,并引入了一个新的 SX_NOADAPTIVE 标志来处理反向逻辑。

    800093

    2009 年 5 月 29 日

    在向结构挂载添加 mnt_xflag 后的 8.0-CURRENT。

    800094

    2009 年 5 月 30 日

    在添加 VOP_ACCESSX(9)后的 8.0-CURRENT。

    800095

    2009 年 5 月 30 日

    在更改轮询 KPI 后的 8.0-CURRENT。现在轮询处理程序返回处理的数据包数量。还引入了一个新的 IFCAP_POLLING_NOCOUNT ,用于指定返回值不重要且应跳过计数。

    800096

    2009 年 6 月 1 日

    8.0-CURRENT 在更新到新的 netisr 实现后,并在更改存储和访问 FIB 的方式后。

    800097

    2009 年 6 月 8 日

    8.0-CURRENT 在引入 vnet 析构钩子和基础设施后。

    (未更改)

    2009 年 6 月 11 日

    在引入 netgraph 出站到入站路径调用检测和排队后的 8.0-CURRENT,也改变了 struct thread 的布局。

    800098

    2009 年 6 月 14 日

    输入 OpenSSL 0.9.8k 后的 8.0-CURRENT。

    800099

    2009 年 6 月 22 日

    8.0-CURRENT 在 NGROUPS 更新后,并将路由虚拟化移入其自己的 VImage 模块中。

    800100

    2009 年 6 月 24 日

    8.0-CURRENT 在 SYSVIPC ABI 更改之后。

    800101

    2009 年 6 月 29 日

    在删除/dev/net/*每个接口字符设备后的 8.0-CURRENT

    800102

    2009 年 7 月 12 日

    添加填充到结构 sackhint 、结构 tcpcb 和结构 tcpstat 后的 8.0-CURRENT 。

    800103

    2009 年 7 月 13 日

    在 TOE 驱动程序接口中用结构 toeopt 替换结构 tcpopt 后的 8.0-CURRENT 到 TCP syncache 。

    800104

    2009 年 7 月 14 日

    在添加基于链接器集的每个虚拟网络分配器后的 8.0-CURRENT。

    800105

    2009 年 7 月 19 日

    8.0-CURRENT 在为未打开符号版本的所有共享库版本增加后。

    800106

    2009 年 7 月 24 日

    8.0-CURRENT 在引入 OBJT_SG VM 对象类型后。

    800107

    2009 年 8 月 2 日

    在添加新总线 sxlock 和 8.0-RELEASE 后,使新总线子系统 Giant 免费的 8.0-CURRENT。

    800108

    2009 年 11 月 21 日

    在实现 EVFILT_USER kevent 过滤器后的 8.0-STABLE。

    800500

    2010 年 1 月 7 日

    在 __FreeBSD_version 提升后,使 pkg_add -r 使用 packages-8-stable 的 8.0-STABLE。

    800501

    2010 年 1 月 24 日

    更改 scandir(3)和 alphasort(3)原型以符合 SUSv4 后的 8.0-STABLE。

    800502

    2010 年 1 月 31 日

    添加 sigpause(2)后的 8.0-STABLE。

    800503

    2010 年 2 月 25 日

    在网络接口中添加 SIOCGIFDESCR 和 SIOCSIFDESCR ioctl 后的 8.0-STABLE。这些 ioctl 可用于操纵接口描述,受 OpenBSD 启发。

    800504

    2010 年 3 月 1 日

    在将 x86emu 引入 MFC 后的 8.0-STABLE,从 OpenBSD 导入实模式 x86 CPU 的软件仿真器。

    800505

    2010 年 5 月 18 日

    添加 liblzma、xz、xzdec 和 lzmainfo 后的 8.0-STABLE MFC。

    801000

    2010 年 6 月 14 日

    8.1-RELEASE

    801500

    2010 年 6 月 14 日

    8.1-STABLE 在 8.1-RELEASE 之后。

    801501

    2010 年 11 月 3 日

    在结构 sysentvec 的 KBI 更改后,以及对 ptrace(PT_LWPINFO)实现 PL_FLAG_SCE/SCX/EXEC/SI 和 pl_siginfo 之后的 8.1-STABLE。

    802000

    2010 年 12 月 22 日

    8.2-RELEASE

    802500

    2010 年 12 月 22 日

    8.2-RELEASE 后的 8.2-STABLE。

    802501

    2011 年 2 月 28 日

    自合并 DTrace 更改后的 8.2-STABLE 版本,包括对用户空间跟踪的支持。

    802502

    2011 年 3 月 6 日

    合并 log2 和 log2f 到 libm 后的 8.2-STABLE。

    802503

    2011 年 5 月 1 日

    将 gcc 升级到 FSF gcc-4_2-branch 的最新 GPLv2 版本后的 8.2-STABLE。

    802504

    2011 年 5 月 28 日

    在引入 KPI 和支持模块化拥塞控制基础设施后的 8.2-STABLE。

    802505

    2011 年 5 月 28 日

    引入 Hhook 和 Khelp KPIs 后的 8.2-STABLE。

    802506

    2011 年 5 月 28 日

    在 struct tcpcb 中添加 OSD 后的 8.2-STABLE。

    802507

    2011 年 6 月 6 日

    在 ZFS v28 导入后的 8.2-STABLE。

    802508

    2011 年 6 月 8 日

    在从 schedtail 事件处理程序中移除并向结构 sysvec 添加 sv_schedtail 方法后的 8.2-STABLE。

    802509

    2011 年 7 月 14 日

    在将 SSSE3 支持合并到 binutils 后的 8.2-STABLE。

    802510

    2011 年 7 月 19 日

    在添加 RFTSIGZMB 标志给 rfork(2)后的 8.2-STABLE。

    802511

    2011 年 9 月 9 日

    添加自动检测不支持禁止同步高速缓存 SCSI 命令的 USB 大容量存储设备后的 8.2-STABLE。

    802512

    2011 年 9 月 10 日

    合并重新调整自动特性的 8.2-STABLE。

    802513

    2011 年 10 月 25 日

    在将 MAP_PREFAULT_READ 标志合并到 mmap(2)后的 8.2-STABLE 版本。

    802514

    2011 年 11 月 16 日

    合并了 posix_fallocate(2)系统调用的 8.2-STABLE。

    802515

    2012 年 1 月 6 日

    合并了 posix_fadvise(2)系统调用的 8.2-STABLE。

    802516

    2012 年 1 月 16 日

    合并 gperf 3.0.3 后的 8.2-STABLE 版本

    802517

    2012 年 2 月 15 日

    引入新的可扩展 sysctl(3)接口 NET_RT_IFLISTL 后的 8.2-STABLE 用于查询地址列表。

    803000

    2012 年 3 月 3 日

    8.3-RELEASE.

    803500

    2012 年 3 月 3 日

    分支 releng/8.3 后的 8.3-STABLE(RELENG_8_3)。

    803501

    2013 年 2 月 21 日

    在两个 USB 修复(修订版 246616 和 246759)MFC 后的 8.3-STABLE。

    804000

    2013 年 3 月 28 日

    8.4-RELEASE.

    804500

    2013 年 3 月 28 日

    8.4-发布后的 STABLE。

    804501

    2013 年 12 月 16 日

    在上游 Heimdal 编码修复合并后的 8.4-STABLE 版本。

    804502

    2014 年 4 月 30 日

    FreeBSD-SA-14:08.tcp 后的 8.4-STABLE 版本。

    804503

    2014 年 7 月 9 日

    FreeBSD-SA-14:17.kmem 之后的 8.4-STABLE。

    804504

    2014 年 9 月 9 日

    FreeBSD-SA-14:18(修订版 271305)后的 8.4-STABLE。

    804505

    2014 年 9 月 16 日

    FreeBSD-SA-14:19(修订版 271668)后的 8.4-STABLE。

    804506

    2014 年 10 月 21 日

    FreeBSD-SA-14:21(修订版 273413)后的 8.4-STABLE。

    804507

    2014 年 11 月 4 日

    在 FreeBSD-SA-14:23、FreeBSD-SA-14:24 和 FreeBSD-SA-14:25 之后的 8.4-STABLE。

    804508

    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

    2016 年 9 月 12 日

    在解决 device_detach() 和 usbd_do_request_flags(9)之间的死锁后,8-STABLE。

    700003

    2005 年 8 月 25 日

    测试了 memmem(3)添加到 libc 之后的 7.0-CURRENT。

    700004

    2005 年 10 月 30 日

    7.0-CURRENT 在修改 solisten(9)内核参数以接受 backlog 参数之后。

    700005

    2005 年 11 月 11 日

    在 IFP2ENADDR() 更改为返回 IF_LLADDR() 后的 7.0-CURRENT。

    700006

    2005 年 11 月 11 日

    在添加 if_addr 成员到 struct ifnet 并移除 IFP2ENADDR() 之后的 7.0-CURRENT 版本。

    700007

    2005 年 12 月 2 日

    在将来自 local_startup 目录中的脚本纳入基本 rcorder(8)之后的 7.0-CURRENT 版本。

    700008

    2005 年 12 月 5 日

    删除 MNT_NODEV 挂载选项后的 7.0-CURRENT。

    700009

    2005 年 12 月 19 日

    ELF-64 类型更改和符号版本化后的 7.0-CURRENT。

    700010

    2005 年 12 月 20 日

    添加 hostb 和 vgapci 驱动程序后,添加 pci_find_extcap() ,并将 AGP 驱动程序更改为不再映射孔。

    700011

    2005 年 12 月 31 日

    在所有平台上, tv_sec 后的 7.0-CURRENT 在 Alpha 上制作 time_t

    700012

    2006 年 1 月 8 日

    7.0-CURRENT 在 ldconfig_local_dirs 更改后。

    700013

    2006 年 1 月 12 日

    "/etc/rc.d/abi" 在支持 /compat/linux/etc/ld.so.cache 作为只读文件系统中符号链接后的 7.0-CURRENT 变更。

    700014

    2006 年 1 月 26 日

    pts 导入后的 7.0-CURRENT。

    700015

    2006 年 3 月 26 日

    引入 hwpmc(4)版本 2 ABI 后的 7.0-CURRENT。

    700016

    2006 年 4 月 22 日

    7.0-CURRENT 在将 fcloseall(3) 添加到 libc 后。

    700017

    2006 年 5 月 13 日

    7.0-CURRENT 删除 ip6fw 后。

    700018

    2006 年 7 月 15 日

    导入 snd_emu10kx 后的 7.0-CURRENT。

    700019

    2006 年 7 月 29 日

    导入 OpenSSL 0.9.8b 后的 7.0-CURRENT。

    700020

    2006 年 9 月 3 日

    添加 bus_dma_get_tag 功能后的 7.0-CURRENT

    700021

    2006 年 9 月 4 日

    导入 libpcap 0.9.4 和 tcpdump 3.9.4 后的 7.0-CURRENT

    700022

    2006 年 9 月 9 日

    在 dlsym 更改后的 7.0-CURRENT 中,查找请求的符号时会同时在指定的 DSO 和其隐式依赖项中查找。

    700023

    2006 年 9 月 23 日

    7.0-CURRENT 在为 OSSv4 混音器 API 添加新的声音 IOCTL 后。

    700024

    2006 年 9 月 28 日

    7.0-CURRENT 在导入 OpenSSL 0.9.8d 后。

    700025

    2006 年 11 月 11 日

    在添加 libelf 之后的 7.0-CURRENT。

    700026

    2006 年 11 月 26 日

    最近在声音 sysctl 上的重大更改后的 7.0-CURRENT。

    700027

    2006 年 11 月 30 日

    在添加 Wi-Spy 特性后的 7.0-CURRENT。

    700028

    2006 年 12 月 15 日

    在向 libc 添加 sctp 调用之后的 7.0-CURRENT

    700029

    2007 年 1 月 26 日

    7.0-CURRENT 在用来自 NetBSD 移植的 BSD 许可版本替换 GNU gzip(1)实现之后。

    700030

    2007 年 2 月 7 日

    从 IPv4 多播转发代码中移除 IPIP 隧道封装(VIFF_TUNNEL)后的 7.0-CURRENT。

    700031

    2007 年 2 月 23 日

    在 bus_setup_intr() (newbus)修改后的 7.0-CURRENT。

    700032

    2007 年 3 月 2 日

    7.0-CURRENT 包含 ipw(4) 和 iwi(4) 固件后。

    700033

    2007 年 3 月 9 日

    7.0-CURRENT 包含 ncurses 宽字符支持后。

    700034

    2007 年 3 月 19 日

    在对 insmntque() , getnewvnode() 和 vfs_hash_insert() 的工作方式进行更改后,7.0-CURRENT。

    700035

    2007 年 3 月 26 日

    添加了用于 CPU 频率变化通知机制的 7.0-CURRENT。

    700036

    2007 年 4 月 6 日

    导入 ZFS 文件系统后的 7.0-CURRENT。

    700037

    2007 年 4 月 8 日

    在添加 CAM 'SG'外围设备后的 7.0-CURRENT,该设备实现了 Linux SCSI SG 透传设备 API 的子集。

    700038

    2007 年 4 月 30 日

    在将 getenv(3)、putenv(3)、setenv(3) 和 unsetenv(3) 更改为符合 POSIX 标准后的 7.0-CURRENT。

    700039

    2007 年 5 月 1 日

    在撤销了 700038 中的更改后的 7.0-CURRENT。

    700040

    2007 年 5 月 10 日

    在将 flopen(3)添加到 libutil 之后的 7.0-CURRENT。

    700041

    2007 年 5 月 13 日

    7.0-CURRENT 启用符号版本控制,并将默认线程库更改为 libthr。

    700042

    2007 年 5 月 19 日

    7.0-CURRENT 在导入 gcc 4.2.0 后。

    700043

    2007 年 5 月 21 日

    在升级所有自 RELENG_6 以来未更改的共享库版本后的 7.0-CURRENT。

    700044

    2007 年 6 月 7 日

    在从文件描述符索引更改为结构文件*后的 7.0-CURRENT 中 vn_open() / VOP_OPEN() 参数。

    700045

    2007 年 6 月 10 日

    在将 pam_nologin(8)更改为向 PAM 框架提供帐户管理功能而不是认证功能后的 7.0-CURRENT。

    700046

    2007 年 6 月 11 日

    更新后的 802.11 无线支持 7.0-CURRENT。

    700047

    2007 年 6 月 11 日

    添加 TCP LRO 接口功能后的 7.0-CURRENT。

    700048

    2007 年 6 月 12 日

    在 IPv4 栈中添加了 RFC 3678 API 支持后的 7.0-CURRENT。现已移除 IP_MULTICAST_IF ioctl 的传统 RFC 1724 行为;不再可以使用 0.0.0.0/8 来指定接口索引。请改用结构 ipmreqn 。

    700049

    2007 年 7 月 3 日

    从 OpenBSD 4.1 导入 pf 后的 7.0-CURRENT

    (未更改)

    7.0-CURRENT 在为 FAST_IPSEC 添加 IPv6 支持之后,删除 KAME IPSEC 并将 FAST_IPSEC 更名为 IPSEC。

    700050

    2007 年 7 月 4 日

    7.0-CURRENT 在将 setenv/putenv 等函数调用从传统 BSD 转换为 POSIX 之后。

    700051

    2007 年 7 月 4 日

    添加新的 mmap/lseek 等系统调用后的 7.0-CURRENT。

    700052

    2007 年 7 月 6 日

    7.0-CURRENT 将 I4B 标头移至 include/i4b 后。

    700053

    2007 年 9 月 30 日

    7.0-CURRENT 在添加对 PCI 域支持之后。

    700054

    2007 年 10 月 25 日

    在宽字符和单字节字符类型分离合并后的 7.0-STABLE。

    700055

    2007 年 10 月 28 日

    7.0-RELEASE,并在 ABI 向后兼容性到 FreeBSD 4/5/6 版本的 PCIOCGETCONF、PCIOCREAD 和 PCIOCWRITE IOCTLs 之后,需要再次破坏 PCIOCGETCONF IOCTL 的 ABI,这是在 7.0-CURRENT 之后 MFCed 的

    700100

    2007 年 12 月 22 日

    7.0-RELEASE 之后的 7.0-STABLE

    700101

    2008 年 2 月 8 日

    m_collapse() 合并后的 7.0-STABLE 。

    700102

    2008 年 3 月 30 日

    kdb_enter_why() 后的 7.0-STABLE 。

    700103

    2008 年 4 月 10 日

    将 l_sysid 添加到 struct flock 后的 7.0-STABLE 。

    700104

    2008 年 4 月 11 日

    在 procstat(1) 的 MFC 之后的 7.0-STABLE。

    700105

    2008 年 4 月 11 日

    在 umtx 功能的 MFC 之后的 7.0-STABLE。

    700106

    2008 年 4 月 15 日

    在将 write(2)支持 MFC 到 psm(4)之后的 7.0-STABLE 版本。

    700107

    2008 年 4 月 20 日

    7.0-STABLE 在将 F_DUP2FD 命令 MFC 到 fcntl(2) 之后。

    700108

    2008 年 5 月 5 日

    7.0-STABLE 在一些 lockmgr(9) 更改之后,使用 lockmgr(9) 必须包括 sys/lock.h。

    700109

    2008 年 5 月 27 日

    memrchr(3)函数的 MFC 后,7.0-STABLE。

    700110

    2008 年 8 月 5 日

    在内核 NFS lockd 客户端 MFC 后的 7.0-STABLE。

    700111

    2008 年 8 月 20 日

    在添加物理连续巨帧支持后的 7.0-STABLE。

    700112

    2008 年 8 月 27 日

    内核 DTrace 支持 MFC 后的 7.0-STABLE。

    701000

    2008 年 11 月 25 日

    7.1-RELEASE

    701100

    2008 年 11 月 25 日

    7.1-RELEASE 后的 7.1-STABLE。

    701101

    2009 年 1 月 10 日

    7.1-STABLE 合并 strndup(3)后。

    701102

    2009 年 1 月 17 日

    添加 cpuctl(4)支持后的 7.1-STABLE。

    701103

    2009 年 2 月 7 日

    多/无-IPv4/v6jails合并后的 7.1-STABLE。

    701104

    2009 年 2 月 14 日

    在挂载结构所有者的存储之后,将 7.1-STABLE 引入 struct mount,并将 vfs_susp_clean 方法引入 struct vfsops 中。

    701105

    2009 年 3 月 12 日

    在 64 位体系结构上,通过对 kern.ipc.shmsegs sysctl 的不兼容更改允许分配更大的 SysV 共享内存段后,将 7.1-STABLE 引入。

    701106

    2009 年 3 月 14 日

    在合并了对 POSIX 信号量等待操作修复后的 7.1-STABLE 版本。

    702000

    2009 年 4 月 15 日

    7.2-RELEASE

    702100

    2009 年 4 月 15 日

    7.2-RELEASE 后的 7.2-STABLE。

    702101

    2009 年 5 月 15 日

    在 ichsmb(4)被更改为使用左调整的次级寻址以匹配其他 SMBus 控制器驱动程序之后的 7.2-STABLE。

    702102

    2009 年 5 月 28 日

    在 fdopendir(3)函数合并后的 7.2-STABLE。

    702103

    2009 年 6 月 6 日

    在 PmcTools 合并后的 7.2-STABLE 版本。

    702104

    2009 年 7 月 14 日

    在 closefrom(2) 系统调用的 MFC 后 7.2-STABLE。

    702105

    2009 年 7 月 31 日

    在 SYSVIPC ABI 更改的 MFC 后 7.2-STABLE。

    702106

    2009 年 9 月 14 日

    在添加了 x86 PAT 增强和 d_mmap_single() 以及分散/聚集列表 VM 对象类型后,7.2-STABLE

    703000

    2010 年 2 月 9 日

    7.3-RELEASE

    703100

    2010 年 2 月 9 日

    7.3-RELEASE 后的 7.3-STABLE。

    704000

    2010 年 12 月 22 日

    7.4-RELEASE

    704100

    2010 年 12 月 22 日

    7.4-RELEASE 后的 7.4-STABLE。

    704101

    2011 年 5 月 2 日

    在 rev 221317 之后的 gcc MFC 之后的 7.4-STABLE。

    600003

    2004 年 9 月 8 日

    在重新添加结构 if_data 的 ifi_epoch 成员后的 6.0-CURRENT。

    600004

    2004 年 9 月 29 日

    在向 pfil API 添加 struct inpcb 参数后的 6.0-CURRENT。

    600005

    2004 年 10 月 5 日

    在向 newsyslog 添加“-d DESTDIR”参数后的 6.0-CURRENT。

    600006

    2004 年 11 月 4 日

    添加 glibc 风格的 strftime(3) 填充选项后的 6.0-CURRENT。

    600007

    2004 年 12 月 12 日

    添加 802.11 框架更新后的 6.0-CURRENT。

    600008

    2005 年 1 月 25 日

    在 VOP_*VOBJECT() 函数更改和为无 Giant 文件系统引入 MNTK_MPSAFE 标志后的 6.0-CURRENT。

    600009

    2005 年 2 月 4 日

    添加 cpufreq 框架和驱动程序后的 6.0-CURRENT。

    600010

    2005 年 2 月 6 日

    在导入 OpenBSD 的 nc(1)后的 6.0-CURRENT。

    600011

    2005 年 2 月 12 日

    在删除了 SVID2 matherr() 支持的 6.0-CURRENT。

    600012

    2005 年 2 月 15 日

    默认线程栈大小增加后的 6.0-CURRENT。

    600013

    2005 年 2 月 19 日

    6.0-CURRENT 在<src/include/stdbool.h>和<src/sys/i386/include/_types.h>修复后,可以使用 Intel C/C++编译器的 GCC 兼容性。

    600014

    2005 年 2 月 21 日

    在 vswprintf(3)中修复 EOVERFLOW 检查后的 6.0-CURRENT。

    600015

    2005 年 2 月 25 日

    在将结构 if_data 成员 ifi_epoch 从挂钟时间更改为正常运行时间后的 6.0-CURRENT。

    600016

    2005 年 2 月 26 日

    LC_CTYPE 磁盘格式更改后的 6.0-CURRENT。

    600017

    2005 年 2 月 27 日

    NLS 目录磁盘格式更改后的 6.0-CURRENT。

    600018

    2005 年 2 月 27 日

    LC_COLLATE 磁盘格式更改后的 6.0-CURRENT。

    600019

    2005 年 2 月 28 日

    将 acpica 包含安装到/usr/include 中。

    600020

    2005 年 3 月 9 日

    向 send(2) API 添加 MSG_NOSIGNAL 标志。

    600021

    2005 年 3 月 17 日

    添加字段到 cdevsw

    600022

    2005 年 3 月 21 日

    从基本系统中删除了 gtar。

    600023

    2005 年 4 月 13 日

    将 LOCAL_CREDS、LOCAL_CONNWAIT 套接字选项添加到 unix(4)。

    600024

    2005 年 4 月 19 日

    将 hwpmc(4)和相关工具添加到 6.0-CURRENT 中。

    600025

    2005 年 4 月 26 日

    结构 icmphdr 添加到 6.0-CURRENT。

    600026

    2005 年 5 月 3 日

    pf 更新到 3.7。

    600027

    2005 年 5 月 6 日

    内核 libalias 和 ng_nat 被引入。

    600028

    2005 年 5 月 13 日

    POSIX ttyname_r(3) 通过 unistd.h 和 libc 可用。

    600029

    2005 年 5 月 29 日

    更新到 v0.9.1 alpha 096 后的 6.0-CURRENT。

    600030

    2005 年 6 月 5 日

    导入 NetBSD 的 if_bridge(4)后的 6.0-CURRENT。

    600031

    2005 年 6 月 10 日

    在驱动程序 softcs 中将 struct ifnet 拆分出来后的 6.0-CURRENT 。

    600032

    2005 年 7 月 11 日

    导入 libpcap v0.9.1 后的 6.0-CURRENT。

    600033

    2005 年 7 月 25 日

    在未自 RELENG_5 以来未更改的所有共享库版本升级后的 6.0-STABLE。

    600034

    2005 年 8 月 13 日

    在 dev_clone 事件处理程序中添加凭证参数后的 6.0-STABLE。6.0-RELEASE。

    600100

    2005 年 11 月 1 日

    6.0-RELEASE 后的 6.0-STABLE

    600101

    2005 年 12 月 21 日

    从 local_startup 目录中的脚本合并到基本 rcorder(8) 后的 6.0-STABLE。

    600102

    2005 年 12 月 30 日

    更新 ELF 类型和常量后的 6.0-STABLE。

    600103

    2006 年 1 月 15 日

    在 pidfile(3) API 合并后的 6.0-STABLE 版本。

    600104

    2006 年 1 月 17 日

    在 ldconfig_local_dirs 更改合并后的 6.0-STABLE 版本。

    600105

    2006 年 2 月 26 日

    NLS 目录支持 csh(1)后的 6.0-STABLE。

    601000

    2006 年 5 月 6 日

    6.1-RELEASE

    601100

    2006 年 5 月 6 日

    6.1-RELEASE 后的 6.1-STABLE。

    601101

    2006 年 6 月 22 日

    导入 csup 后的 6.1-STABLE 。

    601102

    2006 年 7 月 11 日

    iwi(4) 更新后的 6.1-STABLE。

    601103

    2006 年 7 月 17 日

    在 BIND9 更新解析器后的 6.1-STABLE,并暴露 netdb 函数的可重入版本。

    601104

    2006 年 8 月 8 日

    启用了 OpenSSL 中的 DSO(动态共享对象)支持后的 6.1-STABLE。

    601105

    2006 年 9 月 2 日

    802.11 修复更改 IEEE80211_IOC_STA_INFO ioctl 的 API 后的 6.1-STABLE。

    602000

    2006 年 11 月 15 日

    6.2-RELEASE

    602100

    2006 年 9 月 15 日

    发布 6.2 版本后为 6.2-STABLE。

    602101

    2006 年 12 月 12 日

    添加 Wi-Spy 特性后的 6.2-STABLE 版本。

    602102

    2006 年 12 月 28 日

    添加 pci_find_extcap() 后的 6.2-STABLE。

    602103

    2007 年 1 月 16 日

    在 MFC 之后的 6.2-STABLE 将查找请求的符号的更改,以在指定的 DSO 及其隐式依赖项中查找。

    602104

    2007 年 1 月 28 日

    在 MFC ng_deflate(4)和 ng_pred1(4) netgraph 节点以及 ng_ppp(4)节点的新压缩和加密模式之后的 6.2-STABLE。

    602105

    2007 年 2 月 20 日

    从 NetBSD 移植的 BSD 许可版本的 gzip(1) Port MFC 后的 6.2-STABLE。

    602106

    2007 年 3 月 31 日

    在 MFC PCI MSI 和 MSI-X 支持后的 6.2-STABLE。

    602107

    2007 年 4 月 6 日

    在 MFC ncurses 5.6 和宽字符支持后,6.2-STABLE。

    602108

    2007 年 4 月 11 日

    经过 CAM 'SG'外围设备的 MFC 后,6.2-STABLE 实现了 Linux SCSI SG 直通设备 API 的子集。

    602109

    2007 年 4 月 17 日

    6.2-STABLE 在应用 readline 5.2 补丁集 002 后。

    602110

    2007 年 5 月 2 日

    6.2-STABLE 在应用 pmap_invalidate_cache() , pmap_change_attr() , pmap_mapbios() , pmap_mapdev_attr() 和 pmap_unmapbios() 于 amd64 和 i386 后。

    602111

    2007 年 6 月 11 日

    BOP_BDFLUSH 和引起文件系统模块 KBI 故障后的 6.2-STABLE。

    602112

    2007 年 9 月 21 日

    libutil(3) MFC 之后的 6.2-STABLE。

    602113

    2007 年 10 月 25 日

    MFC 宽字节和单字节 ctype 分离之后的 6.2-STABLE。引用 ctype.h 的新编译二进制文件可能需要一个新符号, __mb_sb_limit ,这在旧系统上不可用。

    602114

    2007 年 10 月 30 日

    在恢复 ctype ABI 向前兼容性后的 6.2-STABLE。

    602115

    2007 年 11 月 21 日

    回退宽字符和单字节字符类型分离后的 6.2-STABLE 版本。

    603000

    2007 年 11 月 25 日

    6.3-RELEASE

    603100

    2007 年 11 月 25 日

    6.3-STABLE 在 6.3-RELEASE 之后。

    (未更改)

    2007 年 12 月 7 日

    在修复位宏中的多字节类型支持后为 6.3-STABLE。

    603102

    2008 年 4 月 24 日

    在将 l_sysid 添加到 struct flock 后为 6.3-STABLE。

    603103

    2008 年 5 月 27 日

    在 memrchr(3)函数的 MFC 之后的 6.3-STABLE。

    603104

    2008 年 6 月 15 日

    在 MFC 支持 make(1)中的 :u 变量修改器后的 6.3-STABLE。

    604000

    2008 年 10 月 4 日

    6.4-RELEASE

    604100

    2008 年 10 月 4 日

    6.4-STABLE 之后 6.4-RELEASE。

    500003

    2000 年 5 月 18 日

    buf/bio 更改后的 5.0-CURRENT。

    500004

    2000 年 5 月 26 日

    binutils 升级后的 5.0-CURRENT。

    500005

    2000 年 6 月 3 日

    将 libxpg4 代码合并到 libc 后,以及 TASKQ 接口引入后的 5.0-CURRENT。

    500006

    2000 年 6 月 10 日

    在添加 AGP 接口后的 5.0-CURRENT 版本。

    500007

    2000 年 6 月 29 日

    在将 Perl 升级到 5.6.0 后的 5.0-CURRENT

    500008

    2000 年 7 月 7 日

    在将 KAME 代码更新到 2000/07 源码后的 5.0-CURRENT

    500009

    2000 年 7 月 14 日

    在 ether_ifattach() 和 ether_ifdetach() 更改后的 5.0-CURRENT。

    500010

    2000 年 7 月 16 日

    5.0-CURRENT 更改 mtree 默认值回到原始变体后,添加-L 以跟随符号链接。

    500011

    2000 年 7 月 18 日

    5.0-CURRENT 在更改 kqueue API 后。

    500012

    2000 年 9 月 2 日

    在 setproctitle(3)从 libutil 移动到 libc 之后的 5.0-CURRENT。

    500013

    2000 年 9 月 10 日

    5.0-CURRENT 在第一次 SMPng 提交之后。

    500014

    2001 年 1 月 4 日

    <sys/select.h> 移至 <sys/selinfo.h> 之后的 5.0-CURRENT。

    500015

    2001 年 1 月 10 日

    在合并 libgcc.a 和 libgcc_r.a 以及相关的 GCC 链接更改之后的 5.0-CURRENT。

    500016

    2001 年 1 月 24 日

    5.0-CURRENT 在允许 libc 和 libc_r 进行链接在一起的更改后,已废弃 -pthread 选项。

    500017

    2001 年 2 月 18 日

    5.0-CURRENT 在从结构 ucred 切换到结构 xucred 以稳定 kernel 导出 API 以供 mountd 等使用后。

    500018

    2001 年 2 月 24 日

    在添加了用于控制特定于 CPU 的优化的 CPUTYPE make 变量后的 5.0-CURRENT。

    500019

    2001 年 6 月 9 日

    在将 machine/ioctl_fd.h 移至 sys/fdcio.h 后的 5.0-CURRENT

    500020

    2001 年 6 月 15 日

    在区域名称重命名后的 5.0-CURRENT

    500021

    2001 年 6 月 22 日

    Bzip2 导入后的 5.0-CURRENT。还表示 S/Key 的移除。

    500022

    2001 年 7 月 12 日

    SSE 支持后的 5.0-CURRENT。

    500023

    2001 年 9 月 14 日

    在 KSE 里程碑 2 之后的 5.0-CURRENT。

    500024

    2001 年 10 月 1 日

    在 d_thread_t 之后的 5.0-CURRENT,并将 UUCP 移动到 ports。

    500025

    2001 年 10 月 4 日

    在 64 位平台上,ABI 更改后的 5.0-CURRENT 支持描述符和 creds 传递。

    500026

    2001 年 10 月 9 日

    5.0-CURRENT 移至 XFree86 4 默认用于软件包构建后,并在添加新的 libc strnstr() 函数后。

    500027

    2001 年 10 月 10 日

    添加新的 libc strcasestr() 函数后的 5.0-CURRENT。

    500028

    2001 年 12 月 14 日

    在用户空间组件的 smbfs 被导入后的 5.0-CURRENT。

    (未更改)

    在新增 C99 特定宽度整数类型之后的 5.0-CURRENT。

    500029

    2002 年 1 月 29 日

    在 sendfile(2)的返回值发生变化之后的 5.0-CURRENT。

    500030

    2002 年 2 月 15 日

    在引入了类型 fflags_t 之后的 5.0-CURRENT 版本中,这是文件标志的适当大小。

    500031

    2002 年 2 月 24 日

    5.0-CURRENT 在 usb 结构元素重命名之后。

    500032

    2002 年 3 月 16 日

    5.0-CURRENT 在引入 Perl 5.6.1 后。

    500033

    2002 年 4 月 3 日

    在 sendmail_enable rc.conf(5)变量被设置为 NONE 之后的 5.0-CURRENT。

    500034

    2002 年 4 月 30 日

    5.0-CURRENT 在 mtx_init() 之后增加了第三个参数。

    500035

    2002 年 5 月 13 日

    5.0-CURRENT 使用 Gcc 3.1。

    500036

    2002 年 5 月 17 日

    /usr/src 中的 5.0-CURRENT 没有 Perl

    500037

    2002 年 5 月 29 日

    5.0-CURRENT 在添加了 dlfunc(3)之后

    500038

    2002 年 7 月 24 日

    5.0-CURRENT 在修改了部分结构 sockbuf 成员的类型并重新排序结构之后

    500039

    2002 年 9 月 1 日

    在导入 GCC 3.2.1 之后的 5.0-CURRENT。还在头文件中停止使用 BSD_FOO_T,并开始使用_FOO_T_DECLARED。这个值也可以作为支持 bzip2(1)软件包开始的保守估计。

    500040

    2002 年 9 月 20 日

    通过对磁盘功能进行各种更改之后的 5.0-CURRENT,旨在消除对磁盘标签结构内部的依赖。

    500041

    2002 年 10 月 1 日

    通过将 getopt_long(3)添加到 libc 后的 5.0-CURRENT。

    500042

    2002 年 10 月 15 日

    在升级 Binutils 2.13 后的 5.0-CURRENT 版本中,包括了新的 FreeBSD 模拟、 vec ,和输出格式。

    500043

    2002 年 11 月 1 日

    在向 libc 添加弱 pthread_XXX 存根后的 5.0-CURRENT,废弃了 libXThrStub.so。5.0-RELEASE。

    500100

    2003 年 1 月 17 日

    在为 RELENG_5_0 分支后的 5.0-CURRENT

    500101

    2003 年 2 月 19 日

    <sys/dkstat.h>是空的。不要包含它。

    500102

    2003 年 2 月 25 日

    d_mmap_t 接口更改后的 5.0-CURRENT。

    500103

    2003 年 2 月 26 日

    taskqueue_swi 更改为在没有 Giant 的情况下运行后, taskqueue_swi_giant 添加为在 Giant 的情况下运行的 5.0-CURRENT。

    500104

    2003 年 2 月 27 日

    cdevsw_add() 和 cdevsw_remove() 不再存在。出现了 MAJOR_AUTO 分配设施。

    500105

    2003 年 3 月 4 日

    在新的 cdevsw 初始化方法之后的 5.0-CURRENT。

    500106

    2003 年 3 月 8 日

    devstat_add_entry() 已被 devstat_new_entry() 替换。

    500107

    2003 年 3 月 15 日

    devstat 接口更改;请参阅 sys/sys/param.h 1.149

    500108

    2003 年 3 月 15 日

    令牌环接口更改。

    500109

    2003 年 3 月 25 日

    vm_paddr_t 的添加。

    500110

    2003 年 3 月 28 日

    在 realpath(3) 变得线程安全之后的 5.0-CURRENT

    500111

    2003 年 4 月 9 日

    5.0-CURRENT 在 usbhid(3)与 NetBSD 同步后

    500112

    2003 年 4 月 17 日

    5.0-CURRENT 在新的 NSS 实现和添加 POSIX.1 getpw _r、getgr_r 函数之后

    500113

    2003 年 5 月 2 日

    在删除旧的 rc 系统后的 5.0-CURRENT。

    501000

    2003 年 6 月 4 日

    5.1-RELEASE.

    501100

    2003 年 6 月 2 日

    RELENG_5_1 分支后的 5.1-CURRENT。

    501101

    2003 年 6 月 29 日

    在纠正 sigtimedwait(2) 和 sigwaitinfo(2) 语义后的 5.1-CURRENT。

    501102

    2003 年 7 月 3 日

    在向 bus_dma_tag_create(9) 添加 lockfunc 和 lockfuncarg 字段后的 5.1-CURRENT。

    501103

    2003 年 7 月 31 日

    在 GCC 3.3.1-pre 20030711 快照集成后的 5.1-CURRENT。

    501104

    2003 年 8 月 5 日

    5.1-CURRENT 3ware API changes to twe.

    501105

    2003 年 8 月 17 日

    5.1-CURRENT 动态链接/bin 和/sbin 支持以及库移动到/lib。

    501106

    2003 年 9 月 8 日

    在为 Coda 6.x 添加内核支持后的 5.1-CURRENT。

    501107

    2003 年 9 月 17 日

    5.1-CURRENT 升级后,16550 UART 常量从<dev/sio/sioreg.h>移动到<dev/ic/ns16550.h>。当 libmap 功能被 rtld 无条件支持时也是如此。

    501108

    2003 年 9 月 23 日

    5.1-CURRENT 升级后,PFIL_HOOKS API 更新。

    501109

    2003 年 9 月 27 日

    在添加 kiconv(3)之后的 5.1-CURRENT

    501110

    2003 年 9 月 28 日

    更改 cdevsw 中打开和关闭的默认操作后的 5.1-CURRENT

    501111

    2003 年 10 月 16 日

    更改 cdevsw 布局后的 5.1-CURRENT

    501112

    2003 年 10 月 16 日

    添加 kobj 多重继承后的 5.1-CURRENT

    501113

    2003 年 10 月 31 日

    5.1-CURRENT 在 struct ifnet 更改后

    501114

    2003 年 11 月 16 日

    5.1-CURRENT 在更改 /bin 和 /sbin 为动态链接后

    502000

    2003 年 12 月 7 日

    5.2-RELEASE

    502010

    2004 年 2 月 23 日

    5.2.1-RELEASE

    502100

    2003 年 12 月 7 日

    在为 RELENG_5_2 进行分支之后,5.2-CURRENT

    502101

    2003 年 12 月 19 日

    在向 libc 添加 cxa_atexit / cxa_finalize 函数后,5.2-CURRENT

    502102

    2004 年 1 月 30 日

    从 libc_r 更改为 libpthread 后的 5.2-CURRENT。

    502103

    2004 年 2 月 21 日

    5.2-CURRENT 在设备驱动程序 API 大补丁之后。

    502104

    2004 年 2 月 25 日

    5.2-CURRENT 在 getopt_long_only() 添加之后。

    502105

    2004 年 3 月 5 日

    在 C 中将 NULL 转换为((void *)0)后,5.2-CURRENT 会产生更多警告。

    502106

    2004 年 3 月 8 日

    5.2-CURRENT 在 pf 被链接到构建并安装后。

    502107

    2004 年 3 月 10 日

    5.2-CURRENT 在 time_t 被更改为 sparc64 上的 64 位值之后。

    502108

    2004 年 3 月 12 日

    在某些头文件中添加了对 Intel C/C++编译器的支持,并对 execve(2)进行了更严格地符合 POSIX 标准的更改。

    502109

    2004 年 3 月 22 日

    引入 bus_alloc_resource_any API 后的 5.2-CURRENT

    502110

    2004 年 3 月 27 日

    添加了 UTF-8 本地化之后的 5.2-CURRENT

    502111

    2004 年 4 月 11 日

    删除 getvfsent(3) API 后的 5.2-CURRENT

    502112

    2004 年 4 月 13 日

    5.2-CURRENT 添加.warning 指令后。

    502113

    2004 年 6 月 4 日

    5.2-CURRENT 在强制 ttyioctl() 成为串行驱动程序的必需项后。

    502114

    2004 年 6 月 13 日

    在导入 ALTQ 框架之后的 5.2-CURRENT。

    502115

    2004 年 6 月 14 日

    5.2-CURRENT 在将 sema_timedwait(9) 更改为在成功时返回 0 并在失败时返回非零错误代码后。

    502116

    2004 年 6 月 16 日

    5.2-CURRENT 在将内核 dev_t 更改为指向 struct cdev * 的指针后。

    502117

    2004 年 6 月 17 日

    更改内核 udev_t 为 dev_t 后的 5.2-CURRENT。

    502118

    2004 年 6 月 17 日

    5.2-CURRENT 在将 CLOCK_VIRTUAL 和 CLOCK_PROF 支持添加到 clock_gettime(2) 和 clock_getres(2) 后。

    502119

    2004 年 6 月 22 日

    5.2-CURRENT 在更改网络接口克隆大修后。

    502120

    2004 年 7 月 2 日

    在将软件包工具更新到 20040629 修订版后的 5.2-CURRENT。

    502121

    2004 年 7 月 9 日

    将蓝牙代码标记为非 i386 特定后的 5.2-CURRENT。

    502122

    2004 年 7 月 11 日

    在引入 KDB 调试器框架、将 DDB 转换为后端以及引入 GDB 后端后的 5.2-CURRENT。

    502123

    2004 年 7 月 12 日

    改变为使 VFS_ROOT 接受一个 struct 线程参数,就像 vflush 一样。现在结构 kinfo_proc 有一个用户数据指针。同时还进行了默认 X 实现切换到 xorg 。

    502124

    2004 年 7 月 24 日

    5.2-CURRENT 在改变 ports rc.d 和传统脚本启动方式后。

    502125

    2004 年 7 月 28 日

    5.2-CURRENT 在撤销先前更改后。

    502126

    2004 年 7 月 31 日

    在移除 kmem_alloc_pageable() 和导入 gcc 3.4.2 后的 5.2-CURRENT。

    502127

    2004 年 8 月 2 日

    在将 UMA 内核 API 更改为允许构造函数/初始化失败后的 5.2-CURRENT。

    502128

    2004 年 8 月 8 日

    在更改 vfs_mount 签名以及全局替换 PRISON_ROOT 为 SUSER_ALLOWJAIL 以用于 suser(9) API 后的 5.2-CURRENT。

    503000

    2004 年 8 月 23 日

    在 pfil API 更改之前的 5.3-BETA/RC

    503001

    2004 年 9 月 22 日

    5.3-RELEASE

    503100

    2004 年 10 月 16 日

    5.3-STABLE 在为 RELENG_5_3 分支之后

    503101

    2004 年 12 月 3 日

    在添加 glibc 风格的 strftime(3) 填充选项后的 5.3-STABLE。

    503102

    2005 年 2 月 13 日

    在 OpenBSD 的 nc(1) 导入 MFC 后的 5.3-STABLE。

    503103

    2005 年 2 月 27 日

    在将修复程序合并到<src/include/stdbool.h>和<src/sys/i386/include/_types.h>后,5.4-PRERELEASE 可以使用英特尔 C/C++编译器的 GCC 兼容性。

    503104

    2005 年 2 月 28 日

    在 ifi_epoch 从挂钟时间到正常运行时间的更改 MFC 后的 5.4-PRERELEASE。

    503105

    2005 年 3 月 2 日

    在 vswprintf(3)中的 EOVERFLOW 检查修复的 MFC 后的 5.4-PRERELEASE。

    504000

    2005 年 4 月 3 日

    5.4-RELEASE.

    504100

    2005 年 4 月 3 日

    5.4-STABLE 分支后的 RELENG_5_4

    504101

    2005 年 5 月 11 日

    增大默认线程栈大小后的 5.4-STABLE

    504102

    2005 年 6 月 24 日

    在添加 sha256 后的 5.4-STABLE

    504103

    2005 年 10 月 3 日

    在 if_bridge 的 MFC 之后的 5.4-STABLE

    504104

    2005 年 11 月 13 日

    在 bsdiff 和 portsnap 的 MFC 之后的 5.4-STABLE

    504105

    2006 年 1 月 17 日

    ldconfig_local_dirs 更改后的 5.4-STABLE 版本。

    505000

    2006 年 5 月 12 日

    5.5-RELEASE.

    505100

    2006 年 5 月 12 日

    在为 RELENG_5_5 分支后的 5.5-STABLE

    400003

    1999 年 3 月 27 日

    在完成 dladdr(3) 功能之后的 4.0-CURRENT

    400004

    1999 年 4 月 5 日

    在动态链接器错误修复(也是 EGCS 1.1.2 集成之后)之后的 4.0-CURRENT

    400005

    1999 年 4 月 27 日

    suser(9) API 更改后的 4.0-CURRENT(还有 newbus 后的 4.0-CURRENT)

    400006

    1999 年 5 月 31 日

    在 cdevsw 注册更改后的 4.0-CURRENT

    400007

    1999 年 6 月 17 日

    添加 so_cred 以用于套接字级凭据的 4.0-CURRENT

    400008

    1999 年 6 月 20 日

    在向 libc_r 添加一个轮询 syscall 包装器后的 4.0-CURRENT

    400009

    1999 年 7 月 20 日

    内核 dev_t 类型更改为 struct specinfo 指针后的 4.0-CURRENT

    400010

    1999 年 9 月 25 日

    修复jail(2)后的 4.0-CURRENT

    400011

    1999 年 9 月 29 日

    4.0-CURRENT 在 sigset_t 数据类型更改后

    400012

    1999 年 11 月 15 日

    4.0-CURRENT 切换到 GCC 2.95.2 编译器后

    400013

    1999 年 12 月 4 日

    添加可插拔的 Linux 模式 ioctl 处理程序后的 4.0-CURRENT

    400014

    2000 年 1 月 18 日

    在导入 OpenSSL 后的 4.0-CURRENT

    400015

    2000 年 1 月 27 日

    在 GCC 2.95.2 中从-fvtable-thunks 改为默认的-fno-vtable-thunks 后的 4.0-CURRENT

    400016

    2000 年 2 月 27 日

    导入 OpenSSH 后的 4.0-CURRENT

    400017

    2000 年 3 月 13 日

    4.0-RELEASE

    400018

    2000 年 3 月 17 日

    4.0-STABLE 在 4.0-RELEASE 之后

    400019

    2000 年 5 月 5 日

    引入延迟校验和后的 4.0-STABLE 版本。

    400020

    2000 年 6 月 4 日

    将 libxpg4 代码合并到 libc 后的 4.0-STABLE。

    400021

    2000 年 7 月 8 日

    将 Binutils 升级到 2.10.0,ELF 品牌更改以及基本系统中的 tcsh 后的 4.0-STABLE。

    410000

    2000 年 7 月 14 日

    4.1-RELEASE

    410001

    2000 年 7 月 29 日

    4.1-RELEASE 后的 4.1-STABLE

    410002

    2000 年 9 月 16 日

    4.1-STABLE 在 setproctitle(3)从 libutil 移动到 libc 之后。

    411000

    2000 年 9 月 25 日

    4.1.1-RELEASE

    411001

    4.1.1-STABLE 之后的 4.1.1-RELEASE

    420000

    2000 年 10 月 31 日

    4.2-RELEASE

    420001

    2001 年 1 月 10 日

    合并 libgcc.a 和 libgcc_r.a 后的 4.2-STABLE,以及相关的 GCC 链接更改。

    430000

    2001 年 3 月 6 日

    4.3-RELEASE

    430001

    2001 年 5 月 18 日

    wint_t 介绍后的 4.3-STABLE。

    430002

    2001 年 7 月 22 日

    PCI 电源状态 API 合并后的 4.3-STABLE。

    440000

    2001 年 8 月 1 日

    4.4-RELEASE

    440001

    2001 年 10 月 23 日

    d_thread_t 引入后的 4.4-STABLE。

    440002

    2001 年 11 月 4 日

    4.4-STABLE 在挂载结构更改后 (影响文件系统 klds)。

    440003

    2001 年 12 月 18 日

    4.4-STABLE 在导入 smbfs 用户空间组件后。

    450000

    2001 年 12 月 20 日

    4.5-RELEASE

    450001

    2002 年 2 月 24 日

    在 usb 结构元素重命名后的 4.5-STABLE。

    450002

    2002 年 3 月 12 日

    在区域设置更改后的 4.5-STABLE。

    450003

    (从未创建)

    450004

    2020 年 4 月 16 日

    在 sendmail_enable rc.conf(5) 变量被设置为 NONE 后的 4.5-STABLE 。

    450005

    2002 年 4 月 27 日

    4.5-STABLE 在默认情况下转移到 XFree86 4 用于软件包构建。

    450006

    2002 年 5 月 1 日

    在接受过滤修复后的 4.5-STABLE 不再容易受到简单 DoS 攻击的影响。

    460000

    2002 年 6 月 21 日

    4.6-RELEASE

    460001

    2002 年 6 月 21 日

    4.6-STABLE 的 sendfile(2)已修复,以符合文档,不计算发送的任何标头与要从文件发送的数据量。

    460002

    2002 年 7 月 19 日

    4.6.2-RELEASE

    460100

    2002 年 6 月 26 日

    4.6-STABLE

    460101

    2002 年 6 月 26 日

    在 sed -i 合并后的 4.6-STABLE 。

    460102

    2002 年 9 月 1 日

    经过从 HEAD 中许多新 pkg_install 功能的 MFC 后的 4.6-STABLE。

    470000

    2002 年 10 月 8 日

    4.7-RELEASE

    470100

    2002 年 10 月 9 日

    4.7-STABLE

    470101

    2002 年 11 月 10 日

    开始生成 std{in,out,err}p 参考,而不是 sF。这将 std{in,out,err}从编译时表达式更改为运行时表达式。

    470102

    2003 年 1 月 23 日

    在 MFC mbuf 更改后的 4.7-STABLE 中,将 m_aux 个 mbuf 替换为 `m_tag'

    470103

    2003 年 2 月 14 日

    4.7-STABLE 获得 OpenSSL 0.9.7

    480000

    2003 年 3 月 30 日

    4.8-RELEASE

    480100

    2003 年 4 月 5 日

    4.8-STABLE

    480101

    2003 年 5 月 22 日

    在 realpath(3)被线程安全化之后的 4.8-STABLE

    480102

    2003 年 8 月 10 日

    4.8-STABLE 3ware API 更改为 twe.

    490000

    2003 年 10 月 27 日

    4.9-RELEASE

    490100

    2003 年 10 月 27 日

    4.9-STABLE

    490101

    2004 年 1 月 8 日

    e_sid 添加到 kinfo_eproc 结构后的 4.9-STABLE。

    490102

    2004 年 2 月 4 日

    在 MFC libmap 功能后的 4.9-STABLE 版本。

    491000

    2004 年 5 月 25 日

    4.10-RELEASE

    491100

    2004 年 6 月 1 日

    4.10-STABLE

    491101

    2004 年 8 月 11 日

    包工具 20040629 修订后的 4.10-STABLE

    491102

    2004 年 11 月 16 日

    在处理虚构页面解除连接的 VM 修复后的 4.10-STABLE

    492000

    2004 年 12 月 17 日

    4.11-RELEASE

    492100

    2004 年 12 月 17 日

    4.11-STABLE

    492101

    2006 年 4 月 18 日

    在将 libdata/ldconfig 目录添加到 mtree 文件后的 4.11-STABLE。

    300003

    1998 年 6 月 7 日

    ioctl 参数更改后的 3.0-CURRENT

    300004

    1998 年 9 月 3 日

    3.0-CURRENT 转换为 ELF 后

    300005

    1998 年 10 月 16 日

    3.0-RELEASE

    300006

    1998 年 10 月 16 日

    3.0-CURRENT 在 3.0-RELEASE 之后

    300007

    1999 年 1 月 22 日

    3.0-STABLE 在 3/4 分支之后

    310000

    1999 年 2 月 9 日

    3.1-RELEASE

    310001

    1999 年 3 月 27 日

    3.1-RELEASE 后的 3.1-STABLE

    310002

    1999 年 4 月 14 日

    C++构造函数/析构函数顺序更改后的 3.1-STABLE

    320000

    3.2-RELEASE

    320001

    1999 年 5 月 8 日

    3.2-STABLE

    320002

    1999 年 8 月 29 日

    在二进制不兼容的 IPFW 和套接字更改后的 3.2-STABLE

    330000

    1999 年 9 月 2 日

    3.3-RELEASE

    330001

    1999 年 9 月 16 日

    3.3-STABLE

    330002

    1999 年 11 月 24 日

    在向 libc 添加 mkstemp(3)后的 3.3-STABLE

    340000

    1999 年 12 月 5 日

    3.4-RELEASE

    340001

    1999 年 12 月 17 日

    3.4-STABLE

    350000

    2000 年 6 月 20 日

    3.5-RELEASE

    350001

    2000 年 7 月 12 日

    3.5-STABLE

    221001

    1997 年 4 月 15 日

    在 texinfo-3.9 之后的 2.2-STABLE

    221002

    1997 年 4 月 30 日

    2.2-STABLE 之后的顶部

    222000

    1997 年 5 月 16 日

    2.2.2-RELEASE

    222001

    1997 年 5 月 19 日

    2.2-STABLE 在 2.2.2-RELEASE 之后

    225000

    1997 年 10 月 2 日

    2.2.5-RELEASE

    225001

    1997 年 11 月 20 日

    2.2-STABLE 之后的 2.2.5-RELEASE

    225002

    1997 年 12 月 27 日

    2.2-STABLE 之后的 ldconfig -R merge

    226000

    1998 年 3 月 24 日

    2.2.6-RELEASE

    227000

    1998 年 7 月 21 日

    2.2.7-RELEASE

    227001

    1998 年 7 月 21 日

    2.2-STABLE 在 2.2.7-RELEASE 之后

    227002

    1998 年 9 月 19 日

    semctl(2) 更改后的 2.2-STABLE

    228000

    1998 年 11 月 29 日

    2.2.8-RELEASE

    228001

    1998 年 11 月 29 日

    2.2-STABLE 在 2.2.8-RELEASE 之后

    199504

    1995 年 4 月 9 日

    2.0.5-RELEASE

    199508

    1995 年 8 月 26 日

    2.2-CURRENT 之前的 2.1

    199511

    1995 年 11 月 10 日

    2.1.0-RELEASE

    199512

    1995 年 11 月 10 日

    2.2-CURRENT 之前的 2.1.5

    199607

    1996 年 7 月 10 日

    2.1.5-RELEASE

    199608

    1996 年 7 月 12 日

    2.2-CURRENT before 2.1.6

    199612

    1996 年 11 月 15 日

    2.1.6-RELEASE

    199612

    2.1.7-RELEASE

    1500000

    29a16ce065db

    2023 年 8 月 24 日

    15.0-CURRENT.

    1500001

    a6662c37b6ff

    2023 年 9 月 17 日

    在为 powerpc 实现 fpu_kern_enter 和 fpu_kern_leave 之后的 15.0-CURRENT。

    1500002

    17f5e2b904af

    2023 年 10 月 18 日

    在更改 nfscommon 和 nfscl 模块之间的内部 KAPI 后的 15.0-CURRENT。

    1500003

    ef85fd507e6e

    2023 年 11 月 1 日

    在去除 inode64 转换的向前兼容代码后的 15.0-CURRENT。

    1500004

    7fabea328fed

    2023 年 11 月 23 日

    添加一个名为 vfs_exjail_clone() 的新 VFS 函数后,15.0-CURRENT 将会被 ZFS 模块使用。

    1500005

    21fce617d1de

    2023 年 11 月 27 日

    15.0-CURRENT 经历了一系列树上的机械更改:删除了 SCCS 标识,删除了#if 0 的版权字符串,在此大变革之后进行了机械样式修复并从 sys/cdefs.h 中删除了一些宏。

    1500006

    c711af772782

    2023 年 12 月 8 日

    在升级 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 到 llvmorg-17.0.6-0-g6009708b4367 后,15.0-CURRENT,即 17.0.6 版本发布。

    1500007

    8ccd0b876e67

    2023 年 12 月 11 日

    在 libc 中为 Linux 兼容性暴露 execvpe 后的 15.0-CURRENT。

    1500008

    9bf957fc9b37

    2023 年 12 月 24 日

    LinuxKPI 更改后的 15.0-CURRENT。

    1500009

    b068bb09a1a8

    2024 年 1 月 11 日

    添加 vnode_pager_clean_async(9)和 vnode_pager_clean_sync(9)后的 15.0-CURRENT。

    1500010

    a2da1bdb61bc 者

    2024 年 1 月 12 日

    在 nfscommon 和 nfscl 模块之间更改内部 KAPI 后的 15.0-CURRENT。

    1500011

    a2da1bdb61bc

    2024 年 1 月 17 日

    添加 zfs.dataset 支持后,15.0-CURRENTjail(8)。

    1500012

    120ceebab5d4

    2024 年 1 月 24 日

    在添加 kern_openatfp(9)和 kcmp(2)之后的 15.0-CURRENT。

    1500013

    d04abb05375d

    2024 年 2 月 7 日

    添加 libsys 后的 15.0-CURRENT。

    1500014

    ed27ae8df4b1

    2024 年 2 月 11 日

    将 clang 和其他 LLVM 可执行文件切换为构建为 PIE 后的 15.0-CURRENT。

    1500015

    a7b9f4d96e8b

    2024 年 3 月 13 日

    从新总线资源 API 中的多个函数中删除冗余 type 和 rid 参数后的 15.0-CURRENT。

    1500016

    60bc9617e79e

    2024 年 3 月 18 日

    引入 livedump_start_vnode(9) 后的 15.0-CURRENT。

    1500017

    萝卜

    2024 年 3 月 20 日

    在修复构建最近的 boost 库时的 clang 断言或崩溃后的 15.0-当前

    1500018

    0192eda105b3

    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

    2024 年 5 月 31 日

    通过将 CLOCK_BOOTTIME 重新定义为 CLOCK_MONOTONIC 而不是 CLOCK_UPTIME,更新为 15.0-CURRENT。

    1500020

    7818c2d37c2c

    2024 年 7 月 12 日

    移除对构建 armv6 的支持后,更新为 15.0-CURRENT。

    1500021

    24388fccd551

    2024 年 7 月 21 日

    在 LinuxKPI 更改后,更新为 15.0-CURRENT。

    1500022

    a1740cb93639

    2024 年 7 月 29 日

    移除内核堆栈交换支持后,更新为 15.0-CURRENT。

    1500023

    1206cf04a717

    2024 年 7 月 30 日

    向 malloc(9) 添加新标志后,更新为 15.0-CURRENT。

    1500024

    e3953c036f9d

    2024 年 10 月 2 日

    将 libmd.so.6 升级为 libmd.so.7 后,更新为 15.0-CURRENT。

    1500025

    9d52823bf1df

    2024 年 10 月 6 日

    在扩展 vm_object 中的 flags 字段后,更新为 15.0-CURRENT。

    1500026

    f3dbef108212

    2024 年 10 月 23 日

    在将 llvm、clang、compiler-rt、libc++、libunwind、lld、lldb 和 openmp 升级到 llvmorg-19.1.2-0-g7ba7d8e2f7b6 后,更新为 15.0-CURRENT,亦即 19.1.2 发布版本。

    1500027

    893d044346d5

    2024 年 11 月 14 日

    在隐藏 struct ifnet 并更改 sound(4) 的设备注册 KPI 后,更新为 15.0-CURRENT。

    1500028

    cab31f5633c1

    2024 年 11 月 25 日

    添加 TDA_PSELECT 标志以实现信号掩码的提前恢复后,更新为 15.0-CURRENT。

    1500029

    46297859a745

    2024 年 12 月 6 日

    在添加 bus_attach_children、bus_detach_children 和 bus_identify_children 后,更新为 15.0-CURRENT。

    1500030

    b196276c20b5

    2025 年 1 月 2 日

    更改 bus_generic_detach 以在分离子设备后删除它们,更新为 15.0-CURRENT。

    1500037

    7acd5af48cf1

    2025 年 4 月 12 日

    对 LinuxKPI 进行分配更改后,更新为 15.0-CURRENT。

    1500038

    gitref:[repository="src",length=12]

    2025 年 4 月 19 日

    移除 vm_page_next() 和 _prev 后,更新为 15.0-CURRENT。

    1500039

    gitref:[repository="src",length=12]

    2025 年 5 月 4 日

    引入正确类型的 jiffies 后,更新为 15.0-CURRENT。

    1500040

    gitref:[repository="src",length=12]

    2025 年 5 月 4 日

    在 nfscommon 和 nfscl 模块之间的内部 API 更改后,更新为 15.0-CURRENT。

    1400000

    a53ce3fc4938

    2021 年 1 月 22 日

    14.0-CURRENT.

    1400001

    739ecbcf1c4f

    2021 年 1 月 23 日

    在添加符号链接支持后的 14.0-CURRENT 进行无锁查找。

    1400002

    2cf84258922f

    2021 年 1 月 26 日

    1300000

    339436

    2018 年 10 月 19 日

    13.0-CURRENT.

    1300001

    339730

    2018 年 10 月 25 日

    在提升 OpenSSL 共享库版本号后的 13.0-CURRENT

    1300002

    339765

    2018 年 10 月 25 日

    1200000

    302409

    2016 年 7 月 7 日

    12.0-CURRENT.

    1200001

    302628

    2016 年 7 月 12 日

    从 [a-z] -type 范围中删除协同比较后的 12.0-CURRENT。

    1200002

    304395

    2016 年 8 月 18 日

    1100000

    256284

    2013 年 10 月 10 日

    11.0-CURRENT.

    1100001

    256776

    2013 年 10 月 19 日

    添加对"首次启动"rc.d 脚本支持后的 11.0-CURRENT,因此ports可以利用此功能。

    1100002

    257696

    2013 年 11 月 5 日

    1000000

    225757

    2011 年 9 月 26 日

    10.0-CURRENT.

    1000001

    227070

    2011 年 11 月 4 日

    添加 posix_fadvise(2)系统调用后的 10-CURRENT。

    1000002

    228444

    2011 年 12 月 12 日

    900000

    196432

    2009 年 8 月 22 日

    9.0-CURRENT.

    900001

    197019

    2009 年 9 月 8 日

    导入 x86emu 后的 9.0-CURRENT,这是一个用于模拟实模式 x86 CPU 的软件仿真器,来自 OpenBSD。

    900002

    197430

    2009 年 9 月 23 日

    800000

    172531

    2007 年 10 月 11 日

    8.0-CURRENT。将宽字节和单字节 ctype 分开。

    800001

    172688

    2007 年 10 月 16 日

    8.0-CURRENT 在 libpcap 0.9.8 和 tcpdump 3.9.8 导入后。

    800002

    172841

    2007 年 10 月 21 日

    700000

    147925

    2005 年 7 月 11 日

    7.0-CURRENT.

    700001

    148341

    2005 年 7 月 23 日

    在所有自 RELENG_5 以来未更改的共享库版本提升后的 7.0-CURRENT。

    700002

    149039

    2005 年 8 月 13 日

    600000

    133921

    2004 年 8 月 18 日

    6.0-CURRENT

    600001

    134396

    2004 年 8 月 27 日

    在内核中永久启用 PFIL_HOOKS 后的 6.0-CURRENT 。

    600002

    134514

    2004 年 8 月 30 日

    500000

    58009

    2000 年 3 月 13 日

    5.0-CURRENT

    500001

    59348

    2000 年 4 月 18 日

    添加额外的 ELF 头字段,并更改 ELF 二进制品牌方法后的 5.0-CURRENT。

    500002

    59906

    2000 年 5 月 2 日

    400000

    43041

    1999 年 1 月 22 日

    4.0-CURRENT 在 3.4 分支之后

    400001

    44177

    1999 年 2 月 20 日

    在动态链接处理更改后的 4.0-CURRENT

    400002

    44699

    1999 年 3 月 13 日

    300000

    22917

    1996 年 2 月 19 日

    3.0-CURRENT 在 mount(2)更改之前

    300001

    36283

    1997 年 9 月 24 日

    挂载(2)更改后的 3.0-CURRENT

    300002

    36592

    1998 年 6 月 2 日

    220000

    22918

    1997 年 2 月 19 日

    2.2-RELEASE

    (not changed)

    2.2.1-RELEASE

    (not changed)

    119411

    2.0-RELEASE

    199501

    7153

    1995 年 3 月 19 日

    2.1-CURRENT

    199503

    7310

    1995 年 3 月 24 日

    在修复构建 devel/onetbb 时修复了一个 clang 断言的 14.0-CURRENT port。

    恢复 sys/joystick.h 后的 13.0-CURRENT。

    删除未使用和过时的 openbsd_poll 系统调用后的 12.0-CURRENT。

    在放弃对历史 ioctl 的支持后的 11.0-CURRENT。

    在定义布尔值 true/false 在 sys/types.h 之后,sizeof(bool) 的大小可能已经更改(版本 228444)。在引入 xlocale.h 之后的 10-CURRENT(版本 227753)。

    在实现 EVFILT_USER kevent 过滤功能后的 9.0-CURRENT。

    8.0-CURRENT 在将 kthread_create(9) 等重命名为 kproc_create(9) 之后。

    在添加凭据参数到 dev_clone 事件处理程序后的 7.0-CURRENT。

    在 struct if_data 中初次添加 ifi_epoch 后的 6.0-CURRENT。 几天后撤回。 请勿使用此值。

    kld 元数据更改后的 5.0-CURRENT。

    C++构造函数/析构函数顺序更改后的 4.0-CURRENT

    semctl(2)更改后的 3.0-CURRENT

    2.2-STABLE 在 2.2.1-RELEASE 之后

    2.1-CURRENT

    d386f3a3c32f
    68f6800ce05c
    45eabf5754ac
    c96151d33509
    d36d68161517
    e152bbecb221
    9ca874cf740e
    a3a02acde100
    d72cd275187c
    21e3c1fbe246
    beb817edfe22
    a4b07a2701f5
    37d64dcdfa51
    8a1a42b2a7a4
    b47f461c8e67
    40cc9a3a6b81
    d409305fa383
    41dfd8bd6466
    5fa1eb1cd927
    fad3f322efb5
    cc55ee8009a5
    792b602a337d
    245ec7651e42
    95941b963606
    1a4c5061fc5b
    76321d2d432e
    c751d067c166
    c751d067c166
    16f1ee11e657
    ac847dbf7368
    2b68eb8e1dbb
    0d6516b45346
    bd49c454ca62
    f38bef2ce417
    0c276dee030b
    20aa359773be
    7e1d3eefd410
    ec434c85b46d
    b214fcceacad
    e2650af157bc
    ed6417cd8d0b
    dd2f7a4b45eb
    2c4b65cc3d22
    213e91399b79
    59d465e200bb
    05f0b24bfb34
    ba87e9bf7420
    50bb3a33d879
    d69af4758be9
    ab8ac4c28574
    e68b35e40881
    2e32d4e41d20
    3a9a9c0ca44e
    85d7875d4291
    c4c5981c14d5
    8c309d48aabf
    8cff8e6e13a6
    ddd9004e7a5d
    b273f93657cf
    ff7812ee7d44
    f95c0bc89ea4
    6bddde307e21
    d3f96f661050
    8a96874eeeee
    9c9501390512
    e28932c643e8
    4b56afaf7bf4
    3264f6b88fce
    ea3061526e9c
    1cebc9298cf2
    c17eb99a66e7
    af22da75a035
    97583aa25675
    9fb6718d1b18
    653738e895ba
    a681cba16d89
    9ead001d5b42
    ba8cc6d7271a
    29a16ce065db
    29a16ce065db
    91e53779b4fc
    092abb839d1d
    ba99d960884d
    68584c97ecfb
    64e869e9b93c
    d90417109582
    b566e44b2b88
    2d120981e26d
    b392b36d3776
    69da6e087983
    7c41358a2b0a
    7b082bdf72e6
    f285eabc89ce
    b37a6d41a046
    8a5a9dbf389e
    4e8444d5750a
    35d2f335e855
    d172f42e4ba7
    4aed8b3b613c
    a3b2d8e360c3
    340055
    340841
    341836
    342398
    342629
    342772
    343213
    343485
    344041
    344062
    344300
    344779
    345196
    345236
    345305
    346012
    346282
    346358
    346645
    347089
    347192
    347325
    347532
    347596
    347601
    347925
    347984
    348350
    348808
    349151
    349277
    349352
    349846
    349972
    350307
    350437
    350665
    351140
    351423
    351480
    351522
    351698
    351701
    351729
    351937
    352110
    352700
    353274
    353358
    353685
    353698
    353700
    353868
    354335
    354460
    354694
    354820
    354835
    354922
    354977
    355309
    355537
    355658
    355643
    355679
    355732
    355828
    356051
    356113
    356135
    356185
    356263
    356337
    356409
    356511
    357396
    357455
    358020
    358164
    358172
    358218
    358497
    358834
    358851
    359261
    359347
    359374
    359530
    359727
    359747
    359839
    359920
    360418
    360796
    361275
    361410
    361724
    362159
    362453
    362640
    363077
    363562
    363757
    363783
    363894
    364092
    364109
    364233
    364274
    364284
    364331
    364476
    364747
    364753
    365459
    365705
    366062
    366070
    366374
    366432
    366666
    366719
    366782
    366871
    367162
    367347
    367384
    367432
    367522
    367627
    367777
    368417
    368659
    2ed0c8d801f5
    a84b0e94cdbf
    35a39dc5b349
    72c551930be1
    010196adcfaf
    dcee9964238b
    91a07ed50ffc
    3c6a89748a01
    c3f97dd75a1c
    c3f97dd75a1c
    da6a8ccfa293
    d60c6dc8f69b
    fb34817c686c
    8f81f190a640
    e31579b8558d
    c64d1bd7145b
    658f5eed38c3
    210349325af9
    eb3397588e1b
    2622570aeb3d
    f72db34d2295
    af732203b8f7
    53d162819c20
    0437d10e359e
    a017868e2818
    fe2827f1678b
    29745cf91cfc
    0c8684ae2001
    7224d4125ab5
    690bcf605d84
    dc4114875ef1
    dee0854a009c
    c39ff2415cb9
    ad329796bdb2
    08523c8c63bb
    6663718bb496
    2278cf4e48e7
    b2aa64d05bd8
    a13b6fc61908
    6f93a76ffeab
    8e6cfc632cf6
    9cbba5950123
    83ac15a799e3
    baa97013121a
    6820a0512fa6
    17333d92643d
    c243de11cf7c
    e3068d2655e2
    5ca371f4f536
    aaca677fee21
    d6852eed98ed
    85e32e957fcc
    e982b1cf1fe1
    b2acc21dfbd6
    21ccba43f511
    faedeaf7377b
    45758665781d
    a75a3d7afcc8
    a7e1fc7f620d
    07839ae99c06
    055e875e6077
    77064cddb948
    b802ab153dd2
    304608
    304752
    304789
    305256
    305421
    305833
    306077
    306276
    306556
    306592
    307140
    307529
    308874
    309017
    309124
    309676
    310149
    312087
    313858
    314040
    314373
    314564
    314865
    315430
    315662
    315673
    316683
    317176
    317383
    318736
    319664
    320043
    320085
    320317
    320347
    320545
    320879
    321369
    321688
    322762
    322900
    322989
    323349
    323706
    323910
    324053
    324227
    324281
    324342
    324455
    325028
    325506
    325852
    327740
    327952
    329033
    329166
    330299
    330384
    332100
    332423
    333446
    334074
    334290
    334466
    334892
    334930
    335237
    335873
    335930
    335979
    336313
    336360
    336538
    336914
    337576
    337863
    338061
    338172
    338182
    338285
    338331
    338478
    339270
    339732
    340471
    342801
    343126
    344152
    345169
    345327
    346168
    346337
    346784
    347790
    348036
    348243
    348245
    349763
    350083
    350877
    351276
    352076
    352114
    352351
    352546
    352547
    354598
    354613
    354928
    355658
    355899
    355968
    356306
    356394
    356460
    356679
    357333
    357612
    359957
    360525
    360545
    360620
    361350
    362319
    362916
    363494
    363790
    363832
    364390
    365356
    365471
    365608
    365618
    365619
    365661
    365816
    366878
    367511
    f3d75bed5475
    d36cc12ddfe3
    1e279fe9deae
    489236b04748
    f2900e784cb0
    b148c7b87148
    4772e4135cb3
    e405b2dc913c
    1a398266112e
    0b7be89b329e
    f591279d9c93
    180d95e04e93
    6c717a28505d
    fce871fe3520
    6a9031c5e2ba
    258284
    259424
    260010
    261246
    261283
    261881
    261991
    262630
    263102
    263140
    263152
    263235
    263620
    263660
    264121
    264212
    264289
    265215
    266151
    266904
    267440
    267992
    268066
    268118
    268441
    268945
    270173
    270929
    271341
    271438
    271657
    271686
    271705
    271724
    272674
    272951
    273250
    273432
    273875
    274046
    274085
    274116
    274162
    274470
    274476
    275358
    275633
    275732
    276096
    276479
    276781
    277213
    277528
    277610
    277897
    278228
    278442
    278846
    278964
    279221
    279728
    279729
    280031
    280306
    280630
    281172
    281550
    281613
    282256
    282319
    282650
    283526
    283623
    283983
    284233
    286672
    286874
    288943
    289415
    289594
    289749
    290135
    290207
    290275
    290479
    290495
    290505
    290715
    291537
    292499
    292966
    294086
    294327
    294505
    294860
    295682
    295739
    296136
    296417
    296749
    297000
    297156
    297602
    298486
    299090
    299530
    299933
    300207
    300303
    300539
    300701
    300806
    300982
    301011
    301892
    302071
    302150
    302153
    303979
    303979
    304609
    304865
    305733
    307330
    307590
    308048
    310120
    310618
    311186
    315312
    316423
    316498
    318197
    319279
    320486
    320763
    320487
    320666
    321688
    323431
    324006
    324023
    325003
    328379
    328386
    328653
    329450
    329981
    331219
    331838
    332089
    332363
    334392
    334459
    334461
    335436
    338617
    338931
    340309
    342804
    344220
    346296
    346784
    347212
    347883
    349026
    349027
    354598
    354614
    354615
    354616
    355899
    356395
    356680
    357613
    359958
    360658
    360784
    360804
    360822
    360805
    362320
    362919
    363496
    363792
    364391
    365471
    365661
    366879
    366889
    367513
    228571
    229204
    230207
    230590
    231025
    231505
    232154
    233757
    234355
    234924
    235788
    237631
    238405
    238429
    239179
    239214
    240233
    241245
    241610
    241897
    241913
    242619
    242624
    243443
    245313
    246084
    246759
    247821
    248210
    249943
    250163
    250881
    251294
    251527
    253049
    253089
    253396
    253549
    253638
    253970
    254138
    254273
    254358
    254389
    254537
    254627
    254672
    254760
    254844
    254887
    255180
    255305
    255321
    255449
    259065
    256283
    256916
    258398
    259067
    259069
    259447
    260135
    262801
    262889
    263508
    264214
    264289
    265122
    265946
    267465
    268442
    269400
    269484
    270174
    271341
    271686
    271816
    272463
    272464
    273432
    274162
    275040
    275742
    276633
    277087
    277790
    278974
    279287
    279329
    280246
    280438
    281955
    282275
    282781
    283341
    283950
    284204
    284720
    285830
    285831
    289005
    291243
    292224
    292589
    292908
    293476
    293610
    293619
    295107
    296373
    296374
    298299
    299966
    300235
    302066
    302228
    304611
    304864
    305734
    307331
    308047
    310121
    315730
    316499
    318198
    321222
    321717
    323604
    323605
    328379
    356396
    356681
    200039
    200185
    200447
    201513
    202219
    202722
    203052
    205471
    207410
    207842
    208486
    208973
    210390
    210565
    211701
    211735
    211937
    212381
    212568
    213395
    213700
    215127
    215166
    216088
    216212
    216615
    216758
    217309
    218414
    218425
    218822
    219406
    220150
    220770
    221862
    222167
    223637
    224217
    224834
    225350
    225350
    225469
    229285
    229318
    229723
    230237
    231768
    232728
    232945
    235786
    239082
    239081
    240659
    243656
    247090
    248338
    251687
    253912
    253913
    254938
    254979
    256917
    259448
    260136
    262801
    263171
    263509
    263818
    264289
    265123
    267656
    267657
    268443
    270175
    271341
    271686
    273432
    274162
    275742
    279287
    296219
    300236
    305735
    172932
    173573
    174261
    174399
    174901
    174951
    175168
    175204
    175295
    175487
    175581
    175636
    175688
    175872
    176015
    176112
    176124
    176251
    176321
    176556
    176560
    176709
    176958
    177086
    177551
    177637
    177688
    177844
    177958
    178006
    178017
    178051
    178256
    178362
    178892
    179316
    179784
    180025
    180691
    181439
    181694
    181803
    181905
    182869
    182905
    183091
    183114
    184099
    184205
    184419
    184555
    185162
    185363
    185435
    185522
    185968
    186119
    186344
    187289
    187830
    188745
    188946
    189092
    189110
    189136
    189276
    189585
    189592
    189825
    189853
    190265
    190373
    190787
    190866
    190914
    191080
    191117
    191126
    191267
    191368
    191389
    191672
    191688
    191910
    191990
    192470
    192649
    192669
    192895
    193011
    193047
    193093
    193096
    193219
    193731
    194012
    194210
    194675
    194920
    195175
    195634
    195654
    195699
    195767
    195852
    196037
    199627
    201749
    202922
    203299
    204344
    204546
    208259
    209150
    209146
    214762
    216639
    216654
    219107
    219324
    221275
    222401
    222406
    222408
    222741
    222846
    224017
    224214
    225458
    225470
    226763
    227573
    229725
    230239
    231769
    232446
    232439
    247091
    248850
    248819
    259449
    265123
    268444
    271341
    271686
    273432
    274162
    279287
    305736
    149470
    151888
    152296
    152315
    153027
    153107
    153519
    153579
    153936
    154114
    154269
    154863
    157144
    157962
    158513
    160386
    160821
    161931
    162023
    162170
    162588
    162919
    164190
    164614
    164770
    165242
    166259
    166549
    166907
    167165
    167360
    167684
    167906
    168413
    168504
    169151
    169190
    169453
    169526
    169758
    169830
    170395
    170510
    170530
    170579
    170613
    171175
    171167
    171195
    171211
    171275
    172394
    172988
    173104
    174864
    176111
    177735
    178061
    178108
    178120
    178225
    178353
    178783
    179367
    181328
    181940
    182294
    185315
    185302
    187023
    187370
    188281
    188625
    189740
    189786
    191099
    191091
    192149
    193020
    193638
    195694
    196006
    197198
    203740
    203742
    216647
    216658
    221318
    134933
    135920
    136172
    137192
    138760
    140809
    141250
    141394
    141727
    141940
    142089
    142184
    142501
    142582
    142683
    142686
    142752
    143308
    143746
    143901
    144980
    145565
    145565
    145843
    145966
    146191
    146780
    146988
    147256
    147898
    148388
    149040
    151958
    153601
    153912
    154396
    154453
    156019
    158330
    158331
    159861
    160253
    160429
    161098
    161900
    164312
    162329
    165122
    165596
    166039
    166314
    166840
    168133
    168438
    168611
    168805
    169222
    170556
    172284
    172986
    173170
    173794
    173897
    173891
    174434
    178459
    179367
    179810
    183583
    183584
    60688
    60936
    61221
    61500
    62235
    62764
    63154
    63265
    63459
    65353
    65671
    70650
    70894
    71583
    72650
    72975
    77937
    78304
    78632
    83435
    83435
    84324
    84481
    84710
    84743
    87879
    89938
    90711
    91203
    92453
    93722
    95831
    96498
    96781
    97516
    100591
    102757
    103675
    104250
    105178
    106289
    109405
    111120
    111482
    111540
    111600
    111864
    112007
    112288
    112300
    112571
    112741
    113273
    113597
    114492
    115816
    115710
    117025
    117191
    118241
    118511
    119021
    119881
    120180
    120386
    120503
    120556
    121125
    121129
    121816
    122779
    123198
    126150
    123196
    123677
    125236
    126083
    126208
    126644
    126757
    126819
    126891
    127312
    127475
    128144
    128182
    130057
    130418
    130481
    130585
    130640
    130656
    130934
    131429
    131883
    131971
    132025
    132597
    132726
    132914
    132991
    133306
    134189
    135580
    136595
    138459
    141788
    142639
    142835
    143029
    144575
    144581
    146105
    504101
    150892
    152370
    154464
    158481
    158482
    45059
    45321
    46113
    47640
    47992
    48048
    48936
    51649
    51791
    53164
    54123
    56216
    56700
    57529
    58005
    58170
    60047
    61262
    62820
    63095
    64012
    65962
    66336
    68066
    70895
    73800
    76779
    80157
    80923
    85341
    86038
    88130
    88271
    91203
    92151
    94840
    95555
    95846
    97923
    98730
    100366
    98857
    98880
    102759
    104655
    104717
    106732
    109753
    110887
    112852
    113107
    115232
    118737
    121592
    121593
    124264
    125417
    129700
    129918
    133506
    137786
    138960
    138959
    157843
    36735
    38768
    40438
    40445
    43042
    43807
    45060
    45689
    46742
    50563
    50813
    51328
    53671
    54166
    54730
    61876
    63043
    24941
    25325
    25851
    25921
    30053
    31300
    32019
    34445
    37803
    37809
    39489
    41403
    41418
    7704
    10297
    12189
    12196
    17067
    17127
    19358