Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
警告
除已校对部分外,本项目目前翻译错漏百出,不适合用于生产。
本项目目前处于低维护状态,主要维护者因精力所限仅处理 PR。欢迎社区通过 PR 贡献力量。
在一个私有目录中解压 tarball 的副本,并进行必要的修改,以确保该 Port 可以在当前版本的 FreeBSD 下正确编译。要仔细记录每个步骤,因为稍后将需要将这些步骤自动化。当 Port 完成时,所有操作,包括文件的删除、添加或修改,都必须可以通过自动化脚本或补丁文件来完成。
如果 Port 需要大量的用户交互或定制来编译或安装,可以参考 Larry Wall 的经典 Configure 脚本,可能需要做一些类似的工作。新的 Ports 的目标是使每个 Port 尽可能“即插即用”,同时占用最小的磁盘空间。
注意
除非明确说明,所有为 FreeBSD Ports 创建和第三方软件的补丁文件、脚本及其他文件,都假设遵守标准的 BSD 版权条件。
本节说明了如何快速创建一个新的 Port。对于那些快速方法不够充分的应用程序,完整的“慢速移植”过程在 慢速移植 中有详细说明。
首先,获取原始的 tarball 文件并将其放入 DISTDIR,默认路径为 /usr/ports/distfiles。
注意
这些步骤假设软件可以开箱即用编译运行。换句话说,应用程序在 FreeBSD 系统上工作时完全不需要修改。如果需要修改,请参考 慢速移植。
注意
建议在进行移植之前,在
/etc/make.conf中设置 make(1) 变量DEVELOPER。# echo DEVELOPER=yes >> /etc/make.conf此设置启用“开发者模式”,该模式会显示弃用警告,并在调用 make 时激活一些额外的质量检查。
Makefile 的最简版本看起来如下所示:
尝试理解它。更详细的示例请参见 部分。
如果 Port 在构建、配置或安装时需要用户输入,请在 Makefile 中设置 IS_INTERACTIVE。这将允许“过夜构建”跳过这些步骤。如果用户在环境中设置了变量 BATCH(并且用户设置了变量 INTERACTIVE,那么只有那些需要交互的 Ports 会被构建)。这将节省那些持续构建 Ports 的机器上的大量时间(见下文)。
如果有合理的默认答案,建议使用 PACKAGE_BUILDING 来关闭交互式脚本。当设置了 PACKAGE_BUILDING 时,这将允许我们为 CDROM 和 FTP 构建软件包。
请使用 portlint 检查 Port 是否符合我们的规范。ports-mgmt/portlint 程序是 Ports 的一部分。特别是,检查 Makefile 是否符合规范,以及 package 是否命名得当。
警告
不要盲目跟随
portlint输出的结果。它是一个静态 lint 工具,有时会出错。
只需键入 make makesum。Ports 框架将自动生成 distinfo。不要尝试手动生成该文件。
版权所有 © 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>Ports 中有 ports-mgmt/porttools。
port 是前端脚本,能帮助简化测试工作。每当需要测试新的 Port 或更新现有 Port 时,可以使用 port test 来进行测试,包括 portlint 检查。此命令还会检测并列出任何未在 pkg-plist 中列出的文件。例如:
# port test /usr/ports/net/csup在提交新的 Port 之前,请阅读 部分。
如果你对 Port 满意,剩下的就是将它放入 FreeBSD 的主 Ports 树,并让其他人也为它高兴。
重要
我们不需要 work 目录或 pkgname.txz 包,所以现在就删除它们。
接下来,创建一个 文件。假设该 Port 名为 oneko,并位于 games 分类下。
示例 1. 为新 Port 创建 .diff 文件
使用 git add . 添加所有文件,然后用 git diff
好的,看来这并不像想象中那样简单,Port 需要一些修改才能正常工作。在本节中,我们将逐步解释如何修改它,以使其适应 Ports 的使用模式。
首先,当用户在 Port 目录下输入 make 时,会发生以下事件。阅读 bsd.port.mk 的相关内容能帮助更好地理解这一过程,建议在另一个窗口打开 bsd.port.mk 进行参考。
但别担心,并没有多少人完全理解 bsd.port.mk 的工作原理… :-)
fetch 目标运行。fetch 目标负责确保 tarball 文件存在于本地的 DISTDIR 中。如果 fetch
配置 Makefile 非常简单,再次建议在开始之前查看现有的示例。此外,本手册中有个 ,请查看并遵循该模板中的变量和部分的顺序,以便其他人更容易阅读 Port。
在设计新的 Makefile 时,请按顺序考虑以下问题:
它是否以类似 foozolix-1.2.tar.gz 的标准 gzip 压缩 tarball 存储在 DISTDIR 中?如果是,继续下一步。如果不是,分发文件格式可能需要覆盖 DISTVERSION、DISTNAME、EXTRACT_CMD、EXTRACT_BEFORE_ARGS、EXTRACT_AFTER_ARGS、EXTRACT_SUFX
所有的 pkg-* 文件名都使用变量定义,如果需要,可以在 Makefile 中更改这些变量。这对于在多个 Port 之间共享相同的 pkg-* 文件或当需要写入其中一个文件时特别有用。请参见 ,了解为什么直接写入包含 pkg-* 文件的目录是一个坏主意。
以下是变量名及其默认值的列表。(PKGDIR 默认为 ${MASTERDIR}。)
当使用 并设置了 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、
确保 Port 规则完全符合预期,包括打包 Port。需要验证以下几个重要点:
pkg-plist 中不应包含任何未由 Port 安装的文件。
pkg-plist 中应包含 Port 安装的所有文件。
可以使用 install 目标安装 Port。这验证了安装脚本是否正确工作。
当使用 并带有以下参数之一:phpize、ext、zend 或 pecl,该 Port 会自动填充 FLAVORS,其中包含它支持的 PHP 版本。
示例 5:简单的 USES=php 扩展
以下写法将为所有支持的版本生成包:
以下写法将为所有支持的版本生成包,但排除 7.2:
DISTDIRMASTER_SITESFETCHDISTDIRextract 目标运行。该目标会在 DISTDIR 中查找 Port 的分发文件(通常是压缩的 tarball 文件),并将其解压到指定的临时子目录 WRKDIR 中(默认是 work)。
patch 目标运行。首先,应用在 PATCHFILES 中定义的补丁。其次,如果在 PATCHDIR 中找到任何名为 patch-* 的补丁文件(默认位于 files 子目录中),则按字母顺序在此时应用它们。
configure 目标运行。这个目标可以执行许多不同的操作。
如果存在,则运行 scripts/configure。
如果设置了 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 stage
make stage-qa
make package
make install
make deinstall
make package(作为用户)
确保所有阶段没有警告。
可以通过 ports-mgmt/poudriere 进行彻底的自动化测试,详细信息请参见 poudriere。它维护了 jails,可以在不影响主机系统状态的情况下测试上述所有步骤。
DISTFILES在最坏的情况下,可以创建自定义的 do-extract 目标来覆盖默认设置。但这种情况很少发生,几乎不需要。
想要创建一个新的 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 列表,看看你是否能着手做其中一个(或多个)。
软件中偶尔会引入漏洞。可以说,其中最危险的是那些会导致安全漏洞的漏洞。从技术角度来看,这类漏洞需要通过消除导致它们的漏洞来关闭。然而,处理普通漏洞和安全漏洞的政策是非常不同的。
一个典型的小漏洞只影响那些启用了某些选项组合的用户,这些选项触发了该漏洞。开发者最终会发布一个修复补丁,然后发布一个新的软件版本,修复了该漏洞,但大多数用户不会立即升级,因为该漏洞从未困扰过他们。一个可能导致数据丢失的严重漏洞代表了一个更严重的问题。然而,谨慎的用户知道,除了软件漏洞,很多可能的事故也有可能导致数据丢失,因此他们会备份重要数据;此外,严重漏洞很快就会被发现。
安全漏洞则完全不同。首先,它可能会保持不被注意多年,因为它通常不会导致软件故障。其次,恶意方可以利用它获得对易受攻击系统的未经授权的访问,销毁或更改敏感数据;在最坏的情况下,用户甚至不会注意到造成的损害。第三,暴露一个易受攻击的系统通常会帮助攻击者入侵其他本来无法突破的系统。因此,修复一个漏洞本身是不够的:需要以最清晰、最全面的方式通知受众,让他们评估风险并采取适当的行动。
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
${PKGDIR}/pkg-plist
将任何额外的自定义命令包含到 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 中添加相关条目。
py35py36示例 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= distutilsPHP 应用也可以支持 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:extPORTNAME= some-ext
PORTVERSION= 0.0.1
PKGNAMEPREFIX= ${PHP_PKGNAMEPREFIX}
USES= php:ext
IGNORE_WITH_PHP= 72% git add .
% git diff --staged% git commit
% git format-patch origin/mainUSES= python
USE_PYTHON= distutils allflavorsUSES= python:-3.5
USE_PYTHON= distutilsUSES= python:-3.5
USE_PYTHON= distutils allflavorsUSES= python:3.4+
USE_PYTHON= distutilsUSES= python:3.4+
USE_PYTHON= distutils allflavorsRUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}mutagen>0:audio/py-mutagen@${PY_FLAVOR}
USES= python:3.5+PKGNAMESUFFIX= ${PHP_PKGNAMESUFFIX}
USES= php:flavorsBINARY_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安装的程序不能用于创建二进制别名,因为此方式指定的测试依赖关系是在创建二进制别名之后处理的。
某些 Port,尤其是以 p5- 开头的 Port,需要根据配置的选项(或 p5- Port 中 perl 的版本)更改其 pkg-plist。为简化此操作,pkg-plist 中出现的 %%OSREL%%、%%PERL_VER%% 和 %%PERL_VERSION%% 会被自动替换为适当的值。%%OSREL%% 的值是操作系统的数字版本(例如 4.9);%%PERL_VERSION%% 和 %%PERL_VER%% 是 perl
如果 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 脚本。通过
有时,程序在运行时会出现问题,导致 Port 失败。为了帮助调试 Ports,FreeBSD 提供了一些工具。这些工具的功能是有限的,因为调试 Port 的方式很大程度上取决于使用的技术。以下变量有助于调试 Ports:
WITH_DEBUG:如果设置此变量,Ports 将会在构建时包含调试符号。
WITH_DEBUG_PORTS:指定要使用 WITH_DEBUG 选项构建的 Ports 列表。
哪怕 Port 构建正常,确保软件正确执行其预期功能也是一个好主意。如果原始上游项目随软件一起提供了测试,最好运行这些测试并检查一切是否按预期工作。
Port 可以通过使用 TEST_TARGET 变量自动启用测试。设置该变量时,它包含 Port 的测试目标名称。通常为 test,但也可以是其他名称,例如 tests、check,或者在特定情况下类似 run_tests.py 之类的名称。
除了 TEST_TARGET 变量,框架还提供了以下变量来控制测试的执行:
TEST_WRKSRC
每个 Port 应指向一个提供更多软件信息的网站。
如果可能的话,这应该是由软件开发者维护的官方项目网站。
但它也可以是源代码仓库中的目录或资源:
WWW 变量紧跟在 Makefile 中的 COMMENT 变量后面。
如果相同的内容可以通过 HTTP 和 HTTPS 访问,应使用以 https:// 开头的 URL。如果 URI 是网站或目录的根目录,则必须以斜杠结尾。
这些信息以前放在 pkg-descr 文件的最后一行。现在已将其移至 Makefile 以便于维护和处理。pkg-descr 文件末尾的 WWW: 行已被弃用。
获取原始源代码(通常是压缩的 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
Portscout 是 FreeBSD Ports 的自动化 distfile 检查工具,详细描述见 。
PORTSCOUT 定义了 Portscout distfile 扫描器受限的特殊条件。
设置 PORTSCOUT 时的情况包括:
当需要忽略特定版本的 distfile 时。例如,排除版本 8.2 和版本 8.3 的 distfile 版本检查,因为已知它们存在问题,可以添加:
当需要完全禁用 distfile 版本检查时。例如,如果一个 Port 永远不会再更新,可以添加:
当使用 或 时,Port 会自动填充 FLAVORS,其中包含它所支持的 Lua 版本。不过,普通的应用程序(而不是 Lua 模块)通常不应使用这个功能;大多数嵌入或使用 Lua 的应用程序只需简单地使用 USES=lua。
LUA_FLAVOR 是可用的(并且必须使用)变量,用于依赖正确版本的依赖项,无论该 Port 是否使用了 flavors 或 module 参数。
有关更多信息,请参见 。
TEST_ENV 包含在测试阶段传递的附加变量。
TEST_ARGS 包含传递给测试阶段的任何额外参数。
这些变量的使用示例可以在 cad/xyce、www/libjwt 等 Port 中找到。
注意
请确保在更新 Port 时测试不会出现故障。
username如果 Port 的 distfile 经常变化,而作者没有进行版本更新,请考虑将 distfile 放在个人主页上,并将其列为第一个 MASTER_SITES。尝试说服作者停止这样做;这确实有助于建立某种源代码管理。托管特定版本将防止用户遇到 checksum mismatch 错误,并减少我们 FTP 站点维护者的工作量。此外,如果一个 Port 只有一个主站点,建议将备份放在个人主页上,并将其列为第二个 MASTER_SITES。
如果 Port 需要额外的补丁,并且这些补丁可以从互联网下载,请同样将它们下载并放入 DISTDIR。即使这些补丁来自与主要源代码 tarball 不同的网站,也不需要担心,我们有办法处理这种情况(请参见下文对 PATCHFILES 的描述)。
无实际意义
单个软件包组为 port,不加 s
Ports
Ports
pkg注意
推荐使用 pkg-pre-install(或 pkg-pre-install.lua)和 pkg-post-install(或 pkg-post-install.lua),而不是使用 pkg-install。
这些脚本会自动添加到打包列表中。
重要
这些脚本用于简化包安装后的配置。不能 滥用它们来启动服务、停止服务或运行任何其他会修改当前运行系统的命令。
WWW= https://ffmpeg.org/WWW= https://sourceforge.net/projects/mpd/另一方面,pkg-descr 的内容必须比 Makefile 中的 COMMENT 行 更长。它必须更深入地解释该 Port 的功能。
编写得好的 pkg-descr 完全描述了 Port,使用户不必查阅文档或访问网站,就能理解该软件的功能、用途或特别的优点。提及一些要求,如图形工具包、较重的依赖关系、运行时环境或实现语言,有助于用户决定这个 Port 是否适合他们。
注意
以前在 pkg-descr 文件的最后一行包含的 URL 已经移到 Makefile 中。
该文件列出了 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%%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.3BUILD_DEPENDS= gsed:textproc/gsed
...
BINARY_ALIAS= sed=gsedUSES= 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.xpmPLIST_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.xpmOCTAVE_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 "
.endifPORTSCOUT= ignore:1SUB_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 示例:
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。
此文件用于列出被移动或删除的 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为了在安装包时显示一条消息,可以将消息放在 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 的条目。
该格式如下。它应为对象的数组。每个对象可以包含以下关键字:
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 来限制消息的使用,以确保它仅在从某个特定版本之前的版本进行升级时显示。
这里是一个可以用来创建新 Port 的 Makefile 示例。确保删除所有多余的注释(即括号中的注释)。
所示的格式是推荐的变量排序方式,部分之间的空行等。这种格式设计的目的是使最重要的信息容易找到。我们推荐使用 来检查 Makefile。
FreeBSD Ports 是几乎所有人安装应用程序(“Ports”)的方式。和 FreeBSD 的其他一切一样,它主要由志愿者推动。在阅读本文档时,记住这一点是很重要的。
在 FreeBSD 中,任何人都可以提交一个新的 Port,或者自愿维护一个现有的无人维护的 Port。不需要特别的提交权限。
minimum_version
仅在 type 为 upgrade 时使用。仅在升级自严格高于指定版本的情况下显示。
[描述 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>[
{ 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."
}
]当某 Port 不是作者发布的最新版本时,请更新本地工作副本 /usr/ports。该 Port 可能已经被更新到新版本。
如果要处理多个 Port,使用 Git 来保持整个 Ports 最新可能会更加方便,正如在 中所描述的。这还可以跟踪所有 Port 的依赖项。
接下来的步骤是检查是否已经有一个更新待处理。为此,有两种方法。可以通过可搜索的界面访问 ,在 Product 的多选菜单中选择 Ports & Packages,然后在 Summary 字段中输入 Port 的名称。
如果没有待处理的 PR,接下来的步骤是向 Port 的维护者发送电子邮件,如通过 make maintainer 显示的那样。维护者可能已经在进行升级,或者有不升级该 Port 的理由(例如新版本可能存在稳定性问题),这时就没有必要重复他们的工作。注意,未维护的 Ports 会列出 [email protected] 作为维护者,这是一个通用的 Ports 邮件列表,因此在这种情况下发送邮件可能没有帮助。
如果维护者要求你进行升级,或者该 Port 没有维护者,那么可以帮助 FreeBSD 准备更新!可以使用基本系统中的 命令来完成。
静态包列表是指在 Ports 中可用的包列表,可以是 pkg-plist(无论是否使用变量替换)或通过 PLIST_FILES 和 PLIST_DIRS 嵌入在 Makefile 中。即使内容是通过工具或 Makefile 中的目标在加入 Ports 集合之前自动生成的(例如,使用 make makeplist),它仍然被视为静态列表,因为在不下载或编译源文件的情况下,可以检查其内容。
动态包列表是指在编译 Port 时根据安装的文件和目录生成的包列表。在下载和编译源代码或运行 make clean 后,它将无法被检查。
尽管使用动态包列表并不被禁止,但维护者应尽可能使用静态包列表,因为这样可以使用户通过 查询现有 Port,从而发现例如哪些 Port 安装了某个特定的文件。动态包列表主要应当用于复杂的 Port,在这些 Port 中,包列表会根据 Port 的可选特性(因此维护静态包列表不可行)或使用的依赖软件版本发生重大变化。例如,生成 Javadoc 文档的 Port。
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。
按照 问题报告提交指南 提交补丁。
% 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_branchPREFIX 决定了 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
如果包需要安装 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 ...LINUXBASE避免在源代码中硬编码 /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。
% make clean; make package PREFIX=/var/tmp/`make -V PORTNAME`% make stage && make check-plist && make stage-qa && make package-DPAGER=\"${LOCALBASE}/bin/less\"FreeBSD Ports 不断变化。以下是一些保持更新的方式。
通过订阅 是了解已提交更新的最简单方式之一。可以监控多个 Port。强烈建议维护者订阅,因为他们不仅会收到自己更改的通知,还会收到其他 FreeBSD 提交者的更改通知。(这些通常是保持更新 Ports 框架所必需的——尽管提前通知这些更改的提交者是很礼貌的做法,但有时会被忽视或不切实际。此外,在某些情况下,所做的更改是非常小的。我们期望大家在这些情况下使用最佳判断。)
要使用 FreshPorts,需要一个账户。使用 @FreeBSD.org 注册邮箱的人会在网页的右侧看到选择加入的链接。如果已有 FreshPorts 账户但没有使用 @FreeBSD.org 邮箱地址,可以将邮箱改为 @FreeBSD.org,然后订阅,再改回去。
这些脚本在包被移除时执行。
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 脚本提供了一些扩展功能和一些限制,这些都在
在提交之前,请使用 检查该 Port。portlint 会告警许多常见的错误,包括功能性和风格上的问题。对于新 Port,portlint -A 是最全面的;对于现有 Port,portlint -C 足矣。
由于 portlint 使用启发式方法来检测错误,它可能会产生误报。此外,有时标记为问题的内容由于 Port 框架的限制,无法以其他方式解决。如果有疑问,最好的做法是向 提问。
可以通过 Web 界面浏览源代码库中的文件。影响整个 Port 系统的更改现在已记录在 CHANGES 文件中。影响单个 Port 的更改记录在 UPDATING 文件中。然而,解决任何问题的权威答案无疑是阅读 bsd.port.mk 和相关文件的源代码。
作为 Port 维护者,考虑订阅 FreeBSD ports 邮件列表。有关 Ports 工作方式的重要更改将在那里发布,并随后提交到 CHANGES。
如果邮件列表的消息量太大,可以考虑关注 FreeBSD ports announce 邮件列表,该列表只包含公告。
FreeBSD 的一项不太为人所知的强大功能是,有一个集群的机器专门用于持续构建 Ports,涵盖每个主要的操作系统版本以及每个 Tier-1 架构。
除非特别标记为 IGNORE,否则会构建每个独立的 Port。标记为 BROKEN 的 Port 仍然会尝试构建,以查看底层问题是否已经解决。(这是通过将 TRYBROKEN 传递给 Port 的 Makefile 来完成的。)
构建集群专门用于构建每个 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 仓库 中找到。
注意
推荐使用 pkg-pre-deinstall(或 pkg-pre-deinstall.lua)和 pkg-post-deinstall(或 pkg-post-deinstall.lua),而不是使用 pkg-deinstall。
这些脚本会自动添加到打包列表中。
重要
这些脚本用于简化包卸载后的清理工作。不能 滥用它们来启动服务、停止服务或运行任何其他会修改当前运行系统的命令。
在发现安全漏洞后,尽早通知 Port 用户社区是非常重要且紧急的步骤。这样的通知有两个目的。首先,如果风险真的很严重,最好立即采取临时解决方案。例如,停止受影响的网络服务,或者在漏洞修复前完全卸载该 Port。其次,很多用户通常只偶尔升级已安装的包。他们会从通知中得知,一旦有修复版本发布,就必须立即更新包。
鉴于 Ports 树中 Port 数量庞大,不能在每个事件发生时都发布安全公告,这样会造成信息泛滥,导致观众对真正严重的事件失去关注。因此,发现的 Ports 中的安全漏洞会被记录在 FreeBSD VuXML 数据库 中。安全官员团队成员也会监视它,处理需要他们干预的问题。
提交者可以自己更新 VuXML 数据库,协助安全官员团队,并更快速地向社区提供关键信息。对于那些不是提交者,或者发现了特别严重的漏洞的人,应当毫不犹豫地直接联系安全官员团队,联系方式可以在 FreeBSD 安全信息 页面上找到。
VuXML 数据库是一个 XML 文档。其源文件 vuln.xml 保存在 Port security/vuxml 中。因此,该文件的完整路径将是 PORTSDIR/security/vuxml/vuln.xml。每当发现一个新的 Port 安全漏洞时,请将该条目添加到该文件中。在熟悉 VuXML 之前,最好先找到一个现有条目作为模板,复制并使用它。
完整的 XML 格式非常复杂,超出了本书的范围。然而,要基本了解 VuXML 条目的结构,只需要了解标签的概念。XML 标签名称用尖括号括起来。每个打开的 <tag> 必须有一个匹配的关闭标签 </tag>。标签可以嵌套。如果是嵌套的,必须先关闭内部标签,再关闭外部标签。标签有层次结构,即更复杂的嵌套规则。这与 HTML 类似。主要的区别在于,XML 是 eXtensible(可扩展的),即基于定义自定义标签。由于 XML 的固有结构,它将原本无序的数据整理成形。VuXML 特别为标记安全漏洞描述而设计。
现在考量一个实际的 VuXML 条目:
标签名称应该是不言自明的,因此我们只详细说明需要填写的字段:
① 这是 VuXML 条目的顶层标签。它有一个必需的属性 vid,指定该条目的通用唯一标识符(UUID,用引号括起来)。每个新的 VuXML 条目都应生成一个 UUID(并且不要忘记用其替换模板 UUID,除非是从头编写条目)。使用 来生成 VuXML UUID。
② 这是所发现问题的一行描述。
③ 这里列出受影响的包名称。可以列出多个名称,因为多个包可能基于同一个主 Port 或软件产品。这可能包括稳定版和开发版、本地化版本,以及具有不同重要构建配置选项的从属 Port。
④ 这里以一个或多个范围形式指定受影响包的版本,使用 <lt>
本例描述了一个关于 dropbear 包的新漏洞条目,该漏洞在版本 dropbear-2013.59 中已修复。
前提是安装最新版的 Port。
首先检查是否已有该漏洞的条目。如果已有,该条目应能匹配该包的前一个版本 2013.58:
如果未找到匹配条目,则为此漏洞添加一个新条目:
如果该漏洞具有 标识符,可以使用以下命令代替:
其中 CVE-YYYYY-XXXX 是有效的 CVE 标识符。
如果该漏洞是 FreeBSD 安全公告,可使用以下命令代替:
其中 FreeBSD-SA-YY-XXXXXX.asc 是已发布的 。
验证语法和格式是否正确:
上述命令会生成 vuln-flat.xml 文件,也可以使用以下命令生成:
注意
至少需要安装以下其中一个包:、。
验证条目中的 <affected> 区块是否能匹配正确的包版本:
确保该条目不会错误地匹配不受影响的版本。
现在检查是否匹配正确的版本范围:
能匹配旧版本,不会匹配新版本则。
如果上游项目存在已知漏洞,应检查 Ports 树中该项目的衍生版本或分支是否也受影响。例如,如果在 中发现漏洞,应评估类似的衍生项目,如 、 或其他类似项目是否也存在相同漏洞。请在 VuXML 条目中列出所有受影响的衍生项目,以确保这些 Ports 的用户也能获知相关信息。
首先,确保 Port 几近完工,仅缺失 pkg-plist。运行 make makeplist 会显示 pkg-plist 的示例。makeplist 的输出必须仔细检查其正确性,因为它会自动猜测一些内容,可能会出错。
用户配置文件应该安装为 filename.sample,如 Configuration Files 中所述。info/dir 不能列出,并且必须按照 info files 部分的说明添加适当的 install-info 行。Port 安装的任何库必须按 shared libraries 部分的说明列出。
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 正确生成:
评论是显示在 pkg info 中的 Port 的一行描述。在编写评论时,请遵循以下规则:
COMMENT 字符串不应超过 70 个字符。
不要包含软件的包名或版本号。
评论应以大写字母开头,且末尾不加句号。
不要以不定冠词(如 A 或 An)开头。
对于名称,如 Apache、JavaScript 或 Perl,要使用大写字母。
列表中的单词应使用串联逗号:例如 green, red, and blue。
检查拼写错误。
示例:
COMMENT 变量紧跟在 Makefile 中的 MAINTAINER 变量后面。
在卸载 Port 时,必须删除它所创建的空目录。大多数目录会被 pkg(8) 自动删除,但对于在 ${PREFIX} 之外创建的目录或本身为空的目录,则需要额外处理。通常通过为这些目录添加 @dir 行来实现。删除时必须先删除子目录,再删除父目录。
[...]
@dir /var/games/oneko/saved-games
@dir /var/games/onekoPort 安装过程中创建的空目录需要特别注意。在生成软件包时,这些目录必须存在。如果 Port 的代码没有自动创建这些目录,就需要在 Makefile 中显式创建:
像对待其他条目一样将该目录添加进 pkg-plist:
要声明一个具有多个 flavor 的 Port,需要在其 Makefile 中添加 FLAVORS。FLAVORS 中的第一个 flavor 是默认的 flavor。
技巧
同时定义
FLAVOR为FLAVOR?= ${FLAVORS:[1]}有助于简化 Makefile 的逻辑。
重要
为了将 flavor 与总是大写字母的选项区别开来,flavor 名称只能包含小写字母、数字和下划线
_
如果 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
这些工具来自 。
Portclippy 是一款代码检查工具,用于检查 Makefile 中的变量是否按照 正确排列。
Portfmt 是一款自动格式化 Makefile 的工具。
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.errorConstruct。)
如果 make describe 输出一个字符串而不是错误信息,通常意味着一切正常。具体字符串的含义可以参考 bsd.port.mk。
还要注意,运行较新的 portlint(如下一节所述)将自动触发 make describe 的执行。
如果 port 将其 man 树放置在 PREFIX 以外的地方,请使用 MANDIRS 来指定这些目录。请注意,手册页对应的文件必须与其他文件一起放置在 pkg-plist 中。MANDIRS 的目的是启用手册页的自动压缩,因此文件名会以 .gz 结尾。
<le><gt><ge><range>*2.*2.aalphabetaRC2.3.*2.x2.03.02.r33.b1.61.92.x2.4_13.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)。新条目不得包含该字段。仅在编辑现有条目时添加。
/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.soCOMMENT= Cat chasing a mouse all over the screenpost-install:
${MKDIR} ${STAGEDIR}${PREFIX}/some/directory@dir some/directorySCRIPTDIRRESOLUTION=360RESOLUTION=300PORTNAME= 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
.endifRESOLUTION= 360
MASTERDIR= ${.CURDIR}/../pkfonts300
.include "${MASTERDIR}/Makefile"示例 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。
为了简化 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 可以轻松实现:
或者可能是:
如果所需的源文件位于提取的分发文件的子目录中,请将 WRKSRC_SUBDIR 设置为该目录。
如果 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&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=machbin/%%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.soPLIST_SUB= PERL_ARCH=mach \
PERL_ARCH_regex=\bmach\bbin/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.soFLAVORS= default lite
lite_PKGNAMESUFFIX= -lite
[...]
.if ${FLAVOR:U} != lite
[启用非 lite 功能]
.endifFLAVORS= x11 nox11
FLAVOR?= ${FLAVORS:[1]}
nox11_PKGNAMESUFFIX= -nox11
[...]
.if ${FLAVOR} == x11
[启用 x11 功能]
.endifUSES= 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-py3FLAVORS= normal lite
lite_PKGNAMESUFFIX= -liteWRKSRC= ${WRKDIR}/fooWRKSRC= ${WRKDIR}/${PORTNAME}WRKSRC_SUBDIR= srcNO_WRKSUBDIR= yes如果 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。
有三个不同的变量用于注册包和 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.confCONFLICTS_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 中设置。
% 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
bind910CONFLICTS_INSTALL= bind910CONFLICTS_INSTALL= bind99CONFLICTS_INSTALL= gnotime-2.[0-3]* \
gnotime-2.4.0* gnotime-2.4.1 \
gnotime-2.4.1_[12]% make -DDISABLE_CONFLICTS patch请在这里设置你的邮件地址 :-)
只允许使用没有注释部分的单一地址作为 MAINTAINER 值。使用的格式为 用户名@主机名.域名。请不要在此条目中包含任何描述性文本(如真实姓名)。这会让 Ports 基础设施和大多数使用它的工具感到困惑。
维护者负责保持 Port 的更新,并确保其正常工作。如需详细了解 Port 维护者的责任,请参阅 。
注意
维护者自愿保持 Port 的正常运行。维护者对其 Port 负主要责任,但并不拥有独占权。Ports 是为了社区的利益而存在的,实际上属于社区。这意味着除了维护者之外,其他人也可以对 Port 进行修改。对于 Ports 中的重大更改,可能需要更改许多 Port。FreeBSD Ports 管理团队或其他团队的成员可能会修改 Port,以解决依赖问题或其他问题,例如更新共享库的版本。
如果某些类型的修复有“普遍批准”,例如从 Ports 管理团队 <> 获得批准,那么任何提交者都可以修复这些类别的问题,而无需维护者的批准。这些修复不需要维护者的批准。
大多数 Port 都会获得“普遍批准”,适用于基础设施更改或简单且 经过测试 的构建和运行时修复。当前列表可在 中查看。
我们保留在没有明确批准的情况下,修改维护者提交的内容,以更好地符合现有政策和 Ports 的风格。同时,大型基础设施更改可能导致在没有维护者同意的情况下修改 Port。这类更改永远不会影响 Port 的功能。
Ports 管理团队 [email protected] 保留因任何原因撤销或覆盖任何人维护权限的权利,安全官团队 [email protected] 保留因安全原因撤销或覆盖维护权限的权利。
对于 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。
可以在 Ports 树中的 中找到 poudriere。可以通过 或从 Ports 安装:
或者
还有一个开发中的版本,最终将成为下个发布版。可在 中找到它。这个开发版本用于官方的 FreeBSD 包构建,因此经过了充分的测试,并且通常包含更新的有趣功能。Ports 提交者会希望使用开发版本,因为它是用于生产环境的,并且拥有所有新的功能,能够确保一切完全正确。贡献者不一定需要这些功能,因为最重要的修复会回溯到发布版本。使用开发版本构建官方包的主要原因是它更快,在高端 32 CPU 服务器和 128GB 内存的情况下,完整构建时间将从 18 小时缩短到 17 小时。而这些优化在桌面机器上构建 Ports 时影响不大。
该程序安装了默认的配置文件 /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。当使用代理时不需要此项。请参考默认配置文件中的代理配置。
创建 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/13jail,则主机也必须运行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 列表:
管理更新非常简单。使用以下命令:
该命令会将指定的 jail 更新到最新版本。对于 FreeBSD 版本更新,可以使用 更新到最新的补丁级别。对于从源代码构建的 FreeBSD 版本,可以更新到分支中的最新 git 修订版。
注意
对于采用
git+*方法的 jail,添加-J NumberOfParallelBuildJobs有助于通过增加并行编译作业数来加速构建。例如,如果构建机器有 6 个 CPU,使用:
在 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。
根据工作流的不同,使用手动维护的 ports trees 可能非常有用。例如,如果有一个位于 /work/ports 的本地 ports tree,可以将 poudriere 指向该位置:
这将会在已知树的表格中列出:
注意
METHOD列中的破折号或null表示 poudriere 永远不会更新或更改该 ports tree。用户完全负责维护此树,包括所有用于测试新 Port 和提交补丁的本地修改。
更新 ports 与上述 jail 更新一样简单:
该命令会将指定的 PORTSTREE(由 poudriere -l 输出的树)更新到官方服务器上最新的修订版。
注意
没有指定更新方式的 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 时,建议分别进行一个测试运行,选中所有选项 和 不选任何选项。
对于所有涉及构建的操作,可以使用 -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 通过一个命令进行设置。有关详情,请参见 。
与使用 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 中已设置,其内容也不会被覆盖。
poudriere 提供了一种内建机制,用于删除不再被任何 Port 使用的过时 distfiles。使用以下命令:
该命令将扫描 poudriere.conf 中的 DISTFILES_CACHE 文件夹,并与通过 -p <portstree> 参数指定的 Ports 树进行对比,提示删除那些不再使用的 distfiles。如果希望跳过提示,直接无条件删除所有未使用的文件,可以添加 -y 参数:
重要
install阶段对最终用户非常重要,因为它将文件添加到他们的系统中。Port Makefile 中的*-install目标运行的所有附加命令应回显到屏幕上。不要 使用@或.SILENT来隐藏这些命令。
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。
已安装的二进制文件应该去除符号表。除非绝对必要,否则不要手动去除符号表。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
有时,需要安装大量文件,并保持其层次结构不变。例如,将整个目录树从 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%% 前缀。
如果软件有除标准 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 中。
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
INSTALL_KLD 是安装内核可加载模块的命令。有些架构不喜欢将模块去除符号表,因此请使用此命令,而不是 INSTALL_PROGRAM。INSTALL_DATA 是安装可共享数据(包括静态库)的命令。
INSTALL_MAN 是安装手册页和其他文档的命令(它不进行压缩)。
DOCSDIR_REL 展开为 share/doc/PORTNAME。
EXAMPLESDIR 展开为 PREFIX/share/examples/PORTNAME。
EXAMPLESDIR_REL 展开为 share/examples/PORTNAME。
# pkg install poudriere# make -C /usr/ports/ports-mgmt/poudriere install cleanZPOOL=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/firefoxDEFAULT_VERSIONS+= perl=5.20# poudriere distclean -p portstree# poudriere distclean -p portstree -ypost-install:
${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/xdlpost-install:
.for l in geometry media body track world
${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/lib${PORTNAME}-${l}.so.0
.endforpost-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%%/CONTACTPORTDOCS= README.* ChangeLog docs/*在准备 Port 时,可以使用 diff(1) 记录已添加或修改的文件,稍后将这些差异提供给 patch(1)。对典型文件进行此操作时,需要在进行任何更改之前保存原始文件的副本,并使用 .orig 后缀。
在所有更改完成后,cd 回到 Port 目录。使用 make makepatch 生成更新的补丁文件,并将其存储在 files 目录中。
技巧
使用
BINARY_ALIAS在构建过程中替代硬编码命令,避免修改构建文件。有关更多信息,请参阅 使用BINARY_ALIAS重命名命令,而不是修改构建。
补丁文件存储在 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 目标中进行,而不是作为补丁的一部分。
注意
通常不需要手动创建补丁。自动生成补丁,如本节前述,通常是首选方法。然而,有时可能需要手动补丁。
补丁保存为名为 patch-* 的文件,其中 * 表示被修补的文件路径名,例如 patch-Imakefile 或 patch-src-config.h。不以 patch- 开头的补丁文件名将不会被自动应用。
修改文件后,使用 记录原始文件和修改后文件之间的差异。-u 选项使 生成“统一”格式的差异,这是首选格式。
当为新添加的文件生成补丁时,使用 -N 告诉 将不存在的原始文件视为空文件:
使用 的递归选项 (-r) 生成补丁是可以的,但请检查生成的补丁,确保其中没有不必要的内容。特别是,当两个备份文件、使用 Imake 或 GNU configure 的 Makefile 之间的差异是没有必要的,并且应该删除。如果需要编辑 configure.in 并运行 autoconf 以重新生成 configure,不要对 configure 进行差异比较(它通常会变得很大,达到几千行!)。相反,定义 USES=autoreconf,并对 configure.in 进行差异比较。
可以通过 Port 的 Makefile 直接使用 的原地模式进行简单的替换。这对于需要使用变量值的更改非常有用:
重要
仅使用 来替换变量内容。必须使用补丁文件而不是 来替换静态内容。
在移植软件时,源文件中常常使用 CR/LF 换行符约定。这可能会导致进一步打补丁时出现问题、编译警告或脚本执行错误(例如 /bin/sh^M not found)。要快速将所有文件从 CR/LF 转换为仅 LF,可以在 Port 的 Makefile 中添加以下内容:
可以指定要转换的特定文件列表:
使用 DOS2UNIX_REGEX 可以跨子目录转换一组文件。其参数是一个与 兼容的正则表达式。有关格式的更多信息,请参阅 。此选项对于转换所有具有特定扩展名的文件非常有用。例如,转换所有源代码文件,而保持二进制文件不变:
类似的选项是 DOS2UNIX_GLOB,它会对其中列出的每个元素运行 find。
可以设置转换的基础目录。这在存在多个 distfile 且其中几个文件需要进行行结束符转换时非常有用。
有些 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 -u file.orig file > patch-pathname-file% diff -u -N newfile.orig newfile > patch-pathname-newfilepost-patch:
@${REINPLACE_CMD} -e 's|/usr/local|${PREFIX}|g' ${WRKSRC}/MakefileUSES= dos2unixUSES= dos2unix
DOS2UNIX_FILES= util.c util.hUSES= dos2unix
DOS2UNIX_REGEX= .*\.([ch]|cpp)USES= dos2unix
DOS2UNIX_GLOB= *.c *.cpp *.hUSES= 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.acOPTIONS_DEFINE= FOO
FOO_EXTRA_PATCHES= ${PATCHDIR}/foo-patchesMakefile 的开头各段必须始终按固定顺序排列。这个标准让任何人都能轻松阅读任意一个 Port,而无需在混乱顺序中查找变量。
注意
此处所述的各段和变量在一个普通 Port 中是强制性的。在一个从属 Port 中,许多段和变量可以省略。
重要
每个以下代码块之间必须以一个空行分隔。
在每个代码块中,仅设置该 Port 所必需的变量。请按照下列顺序定义这些变量。
PORTNAME 段这是最重要的一段。它定义了 Port 的名称、版本、源代码分发文件的位置和分类。变量必须按如下顺序排列:
* []
* []
重要
PORTVERSION和DISTVERSION只能择一而用。
PATCHFILES 段此段为可选项。变量如下:
MAINTAINER 段此段为强制项。变量如下:
LICENSE 段这一段是可选的,但强烈建议使用。变量包括:
或 LICENSE_GROUPS_NAME
或 LICENSE_NAME_NAME
如果存在多个许可证,需按许可证名称对各个 LICENSE_VAR_NAME 变量进行排序。
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 之后才能判断,那么应在 中设置这些变量。
这一段是可选的。变量包括:
这一段是可选的。
以定义 FLAVORS 开始此段,然后继续定义可用的 Flavors 助手。请参阅 了解更多信息。
对于不能通过助手设置的变量,应使用 .if ${FLAVOR:U} == foo 结构,并将其置于各自所属的段落中。
USES 和 USE_x以定义 USES 开始本段,然后继续定义可能的 USE_x。
请将相关变量紧密排列。例如使用 时,务必将所有 GH_* 变量紧跟其后。
这一段用于定义可以在 bsd.port.mk 中使用、但不属于前述各段的变量。
虽然变量的顺序并不重要,但请尽量将相似的变量归类在一起。例如,用户和用户组变量 USERS 和 GROUPS;配置变量 CONFIGURE_* 与 *_CONFIGURE;文件与目录列表变量如 PORTDOCS 与 PORTEXAMPLES。
如果该 Port 使用了 ,请先定义 OPTIONS_DEFINE 和 OPTIONS_DEFAULT,然后是其它 OPTIONS_* 变量,再之后是 *_DESC 描述,最后是选项 helpers。尽量将上述所有内容按字母顺序排列。
示例 1:Options 变量排序示例
FOO 和 BAR 选项没有标准描述,因此需要编写。其他选项已经在 Mk/bsd.options.desc.mk 中定义好了描述,无需重复编写。DOCS 和 EXAMPLES 使用目标 helpers 来安装它们的文件,在此处也给出以示完整,尽管它们应归属 ,因此其前可插入其他变量和目标。
然后定义所有未在上述各段中提及的其它变量。
在所有变量定义之后,可以定义可选的 目标。请确保 pre-<strong></strong>** 排在 post-** 之前,并按照不同阶段的执行顺序排列:
fetch
extract
patch
configure
技巧
使用选项 helpers 时,保持它们按字母顺序排序,但确保
-on排在-off之前。若同时使用主目标,则主目标应排在可选目标之前:
许多 Port 依赖于其他 Port。这是大多数类 Unix 操作系统(包括 FreeBSD)的一项非常方便的功能。多个 Port 可以共享一个共同的依赖,而不是将该依赖项与每个需要它的 Port 或包捆绑在一起。有七个变量可以用来确保所有必要的组件都在用户的机器上。此外,还有一些常见情况的预支持依赖变量,以及一些其他控制依赖行为的变量。
重要
当软件有额外的依赖项以提供额外的功能时,
*_DEPENDS中列出的基础依赖项应该包括那些对大多数用户有益的额外依赖项。基础依赖项不应是“最小”依赖集。目标不是包括所有可能的依赖项,只包括那些对大多数人有益的依赖项。
LIB_DEPENDS此变量指定该 Port 依赖的共享库。它是一个 <lib:dir> 元组的列表,其中 <lib> 是共享库的名称,<dir> 是查找该库的目录,以防库不可用。例如:
将检查是否存在共享的 jpeg 库,并且如果找不到,将深入 graphics/jpeg 子目录以构建和安装该库。
该依赖项会被检查两次,第一次在 build 目标中,第二次在 install 目标中。此外,依赖项的名称会被放入包中,以便如果用户系统中没有该库,pkg install(参见 )会自动安装它。
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或反之。所有变量都会立即展开,这是完全错误的做法,几乎总是会失败。
BUILD_DEPENDS此变量指定该 Port 构建时所需的可执行文件或文件。与 RUN_DEPENDS 类似,它是 <path:dir>[:<target>] 元组的列表。例如:
将检查是否存在名为 unzip 的可执行文件,如果找不到,它将深入 archivers/unzip 子目录以构建和安装该文件。
注意
这里的“build”指的是从提取到编译的整个过程。该依赖项会在
extract目标中进行检查。如果target部分与DEPENDS_TARGET相同,则可以省略该部分。
FETCH_DEPENDS此变量指定该 Port 在获取时所需的可执行文件或文件。与前两个类似,它是 <path:dir>[:<target>] 元组的列表。例如:
将检查是否存在名为 ncftp2 的可执行文件,如果找不到,它将深入 net/ncftp2 子目录以构建和安装该文件。
该依赖项会在 fetch 目标中进行检查。如果 target 部分与 DEPENDS_TARGET 相同,则可以省略该部分。
EXTRACT_DEPENDS此变量指定该 Port 在提取时所需的可执行文件或文件。与前面类似,它是 <path:dir>[:<target>] 元组的列表。例如:
将检查是否存在名为 unzip 的可执行文件,如果找不到,它将深入 archivers/unzip 子目录以构建和安装该文件。
该依赖项会在 extract 目标中进行检查。如果 target 部分与 DEPENDS_TARGET 相同,则可以省略该部分。
注意
仅在提取操作无法正常工作时使用此变量(默认假定使用
tar)。如果提取操作无法通过USES=tar、USES=lha或USES=zip(参见 )来解决,则使用此变量。
PATCH_DEPENDS此变量指定该 Port 在打补丁时所需的可执行文件或文件。与前面一样,它是 <path:dir>[:<target>] 元组的列表。例如:
将深入 java/jfc 子目录提取该文件。
该依赖项会在 patch 目标中进行检查。如果 target 部分与 DEPENDS_TARGET 相同,则可以省略该部分。
USES可以通过添加参数来定义 Port 使用的不同特性和依赖项。通过在 Makefile 中添加以下行来指定:
有关完整的值列表,请参见 。
重要
USES不能在包含 bsd.port.pre.mk 后进行赋值。
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 的信息。
可以使用以下语法在任何 *_DEPENDS 中指定依赖项的最小版本,LIB_DEPENDS 除外:
第一个字段包含一个依赖包名称,它必须与包数据库中的条目匹配,后跟一个比较符号和一个包版本。依赖项得到满足的条件是机器上安装了 p5-Spiffy-0.26 或更高版本。
如上所述,调用依赖项时的默认目标是 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 并提取它。
重要
不要在 Ports 树中引入任何循环依赖!
Ports 构建技术不容忍循环依赖。如果引入了循环依赖,某个地方的 FreeBSD 安装几乎会立即崩溃,接着许多人会受到影响。这些依赖很难发现。如果有疑虑,在做出更改之前,请确保运行:cd /usr/ports; make index。该过程在旧机器上可能会很慢,但它可能在过程中为很多人,包括你自己,节省不少麻烦。
依赖项必须显式声明或使用 声明。使用自动检测等其他方法会使索引变得复杂,从而导致 port 和包管理的问题。
示例 37. 错误的可选依赖声明
自动添加依赖的问题在于,单个 port 外的文件和设置随时可能发生变化。例如:索引已构建,然后安装了一批 ports。但其中一个 port 安装了被测试的文件。此时,索引变得不正确,因为一个已安装的 port 突然有了新的依赖项。如果其他 ports 也基于其他文件的存在来确定其依赖性,重建索引后它可能依然是错误的。
示例 38. 正确的可选依赖声明
测试选项变量是正确的方法。只要选项在构建索引之前已定义,就不会导致批量 ports 的索引不一致。然后可以使用简单的脚本来自动化这些 ports 及其包的构建、安装和更新。
MASTER_SITE_SUBDIR(已弃用)
LICENSE_TEXT 或 LICENSE_TEXT_NAME
LICENSE_FILE 或 LICENSE_FILE_NAME
LICENSE_PERMS 或 LICENSE_PERMS_NAME_
LICENSE_DISTFILES 或 LICENSE_DISTFILES_NAME
TEST_DEPENDS
build
install
test
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 中使用
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/jpegRUN_DEPENDS= ${LOCALBASE}/news/bin/innd:news/inn \
xmlcatmgr:textproc/xmlcatmgr/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/binRUN_DEPENDS= ${BUILD_DEPENDS}MY_DEPENDS= some:devel/some \
other:lang/other
BUILD_DEPENDS= ${MY_DEPENDS}
RUN_DEPENDS= ${MY_DEPENDS}BUILD_DEPENDS= unzip:archivers/unzipFETCH_DEPENDS= ncftp2:net/ncftp2EXTRACT_DEPENDS= unzip:archivers/unzipPATCH_DEPENDS= ${NONEXISTENT}:java/jfc:extractUSES= feature[:arguments]USE_GCC=X.YUSE_GCC=yes # Port 需要当前版本的 GCC USE_GCC=11:build # Port 仅在构建时需要 GCC 11p5-Spiffy>=0.26:devel/p5-SpiffyBUILD_DEPENDS= ${NONEXISTENT}:graphics/jpeg:extract.include <bsd.port.pre.mk>
.if exists(${LOCALBASE}/bin/foo)
LIB_DEPENDS= libbar.so:foo/bar
.endifOPTIONS_DEFINE= BAR
BAR_DESC= Calling cellphones via bar
BAR_LIB_DEPENDS= libbar.so:foo/barCATEGORIES当一个软件包被创建时,它被放置在 /usr/ports/packages/All 目录下,并且从 /usr/ports/packages 的一个或多个子目录创建链接。这些子目录的名称由变量 CATEGORIES 指定。这样做旨在使用户在浏览 FTP 站点或 CDROM 上的软件包堆时更加方便。请查看当前的分类列表,并选择适合 port 的分类。
该列表还确定了 ports 树中导入 port 的位置。如果这里有多于一个类别,则 port 文件必须放在以第一个类别名称命名的子目录中。有关如何选择正确类别的更多讨论,请参见下文。
这是当前 port 类别列表。用星号标记( * )的是虚拟类别 - 在 ports 树中没有相应子目录的类别。它们仅用作辅助类别,仅供搜索目的使用。
由于许多类别重叠,选择 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 被导入到错误的类别,然后立即移动。
随着 Ports 的增长,引入了各种新分类。新分类可以是虚拟分类 - 即不在 ports 树中具有相应子目录的分类 - 或物理分类 - 即在 ports 树中具有相应子目录的分类。本节讨论了创建新物理分类涉及的问题。在提出新分类之前,请仔细阅读。
我们现有的做法是避免创建新的物理分类,除非逻辑上大量的 ports 应属于该分类,或者应属于该分类的 ports 是一个逻辑上独特且受到有限普遍兴趣的群体(例如,与口头人类语言有关的分类),或者最好两者兼而有之。
这样做的理由是,这样的变化会给所有跟踪 Ports Collection 变化的提交者和用户带来相当多的工作量。此外,拟议的类别变动似乎自然而然地会引起争议。(也许这是因为对于何时一个类别“太大”没有明确的共识,或者类别是否应该适合浏览(以及理想的类别数量是多少),等等。)
这是程序:
在 FreeBSD ports 邮件列表上提出新类别。包括新类别的详细理由,包括为什么现有类别不够用,以及要移动的现有 ports 列表。(如果在 Bugzilla 中有适合该类别的新 ports,也将它们列出。)如果你是维护者和/或提交者,请提及,因为这可能有助于案例。
参与讨论
如果看起来支持这个想法,请提交包括理由和需要移动的现有 ports 列表的 PR。理想情况下,这个 PR 还会包括以下补丁:
一旦它们被复制,为新的 ports 创建 Makefiles
提议新建虚拟类别类似于上述过程,但涉及较少操作,因为不必移动任何 ports。在这种情况下,将包括在 PR 中的唯一补丁是那些将新类别添加到受影响 ports 的 CATEGORIES 中。
有时候有人提议用 2 级结构或其他一些关键字结构重新组织类别。到目前为止,这些提议都没有任何进展,因为虽然很容易提出,但要将现有的 ports 整体重新组织的工作量令人望而却步。在发布这个想法之前,请阅读邮件列表存档中关于这些提议的历史。此外,请准备好接受挑战,以提供一个工作原型。
在谈到 Ports 和包时,安全漏洞可能最初出现在原始发行版或 Port 文件中。在前一种情况下,原始软件开发者可能会立即发布补丁或新版本。根据作者的修复,及时更新 Port。如果由于某种原因修复被延迟,你可以 或向 Port 引入一个补丁文件。在易受攻击的 Port 的情况下,尽快修复该 Port。在这两种情况下,除非有权直接提交到 Ports 树,否则应遵循。
重要
成为 Ports 提交者并不足以随意提交 Port。切记,Port 通常有各自维护者,必须尊重他们。
请确保在漏洞修复后,尽快更新该 Port 的版本号。这样,定期升级已安装包的用户就能看到他们需要运行更新。此外,新的包将通过 FTP 和 WWW 镜像重新构建并分发,替换掉易受攻击的版本。如果修复漏洞过程中 DISTVERSION 没有变化,则增加 PORTREVISION。也就是说,如果向 Port 添加了补丁文件,则增加 PORTREVISION,但如果更新 Port 到最新软件版本并已修改 DISTVERSION,则不增加它。更多信息请参考。
安装和卸载后将运行 update-desktop-database -q。永远不要直接使用,应该在 Makefile 中添加 USES=desktop-file-utils。
为作为参数传递的目录添加一个 @dir 条目,并在安装和卸载后运行 fc-cache -fs 命令。
为作为参数传递的目录添加一个 @dir 条目,并在安装和卸载后运行 mkfontscale 和 mkfontdir 命令。此外,在卸载时,如果 fonts.scale 和 fonts.dir 缓存文件为空,还会将其删除。
将作为参数传递的文件添加到 plist,并在安装和卸载时更新信息文档索引。此外,在卸载时,如果索引为空,还会删除该索引。永远不要手动使用此项,而应该通过 INFO 使用。有关更多信息,请参见 Info Files。
在安装和卸载时对该目录运行 kldxref。此外,在卸载时,如果目录为空,还会删除该目录。
在卸载时删除该文件,如果文件不存在,则不报错。
用于通过软件包中捆绑的示例文件处理配置文件的安装。非示例文件(实际文件)是第二个文件名(如果存在),或者是第一个文件名去掉 .sample 后缀的版本。
这三件事会发生。首先,将作为参数传递的第一个文件(示例文件)添加到 plist。然后,在安装时,如果找不到实际文件,则将示例文件复制到实际文件。最后,在卸载时,如果实际文件没有被修改,则删除该文件。有关更多信息,请参见 Configuration Files。
在安装和卸载时对该目录运行 update-mime-database。
将作为参数传递的文件添加到 plist 中。
在安装时,将 file 的完整路径添加到 /etc/shells 中,同时确保不会重复添加。卸载时,将其从 /etc/shells 中移除。
不要单独使用。如果 Port 安装了 *.terminfo 文件,请在其 Makefile 中添加 USES=terminfo。
在安装和卸载时,如果 tic 存在,则从 ${PREFIX}/shared/misc 中的 *.terminfo 文件刷新 ${PREFIX}/shared/misc/terminfo.db。
有一些硬编码的关键字,并且在 pkg-create(8) 中有详细文档。为了完整性,本文也会记录这些关键字。
空关键字是一个占位符,用于在需要更改文件的所有者、组或模式时使用。例如,要将文件的组设置为 games 并添加 setgid 位,请添加:
在包安装或卸载过程中执行 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。
重要
这些关键字旨在帮助你设置包,以使其尽可能准备好使用。它们 不得 被滥用来启动服务、停止服务或运行任何其他修改当前系统的命令。
设置所有随后提取文件的默认权限为 mode。格式与 chmod(1) 使用的格式相同。使用时若不带参数,则设置为默认权限(打包时文件的权限模式)。
重要
这必须是数字模式,例如
644、4755或600。不能是相对模式,例如u+s。
为所有后续文件设置默认所有者为 user。若不带参数,则设置为默认所有者(root)。
为所有后续文件设置默认组所有权为 group。若不带参数,则设置为默认组所有权(wheel)。
此行在打包时会被忽略。
声明目录名称。默认情况下,通过包安装创建的目录会在卸载时自动删除。若需要在 PREFIX 下创建一个空目录,或该目录需要有非默认的所有者、组或权限,则使用此项。PREFIX 以外的目录需要注册。例如,/var/db/${PORTNAME} 需要有一个 @dir 条目,而 ${PREFIX}/shared/${PORTNAME} 如果包含文件或使用默认所有者、组和权限,则不需要。
在安装或卸载过程中执行 command。请改用 @preexec command。
声明要在卸载时删除的目录名称。默认情况下,通过包安装创建的目录会在包卸载时被删除。
声明要删除的目录名称,类似于 @dirrm,但如果无法删除目录,则不会发出警告。
通过在 ${PORTSDIR}/Keywords 目录中定义的关键字,可以扩展包列表文件。每个关键字的设置存储在一个名为 keyword.ucl 的 UCL 文件中。该文件必须至少包含以下一个部分:
attributes
action
pre-install
post-install
pre-deinstall
post-deinstall
pre-upgrade
post-upgrade
更改关键字使用的所有者、组或模式。包含一个关联数组,其中可能的键是 owner、group 和 mode。值分别为用户名、组名和文件模式。例如:
定义关键字的参数会发生什么。包含一个数组,其中可能的值有:
setprefix
设置下一个 plist 条目的前缀。
dir
注册一个在安装时创建并在卸载时删除的目录。
dirrm
注册一个在卸载时删除的目录。已弃用。
dirrmtry
注册一个在卸载时尝试删除的目录。已弃用。
file
注册一个文件。
setmode
设置下一个 plist 条目的模式。
setowner
设置下一个 plist 条目的所有者。
setgroup
设置下一个 plist 条目的组。
comment
不执行任何操作,相当于不输入 action 部分。
ignore_next
忽略 plist 中的下一个条目。
如果设置为 true,则添加参数处理,将整个行 %@ 拆分为编号的参数 %1、%2 等。例如,对于以下行:
%1 和 %2 将分别包含:
它还会影响 action 条目的工作方式。当有多个参数时,必须指定参数的编号。例如:
这些关键字包含一个 sh(1) 脚本,在安装、卸载或升级包之前或之后执行。除了通常的 @exec %foo 占位符(如 @preexec command 中描述的)外,还有一个新占位符 %@,它表示该关键字的参数。
示例 2. @dirrmtryecho 关键字示例
此关键字执行两项操作:它向打包列表添加一个 @dirrmtry<span> </span>directory 行,并在卸载包时回显删除该目录的消息。
示例 3. 真实示例,如何实现 @sample
此关键字执行三项操作:它将第一个作为参数传递给 @sample 的 filename 添加到打包列表中;它将指令添加到 post-install 脚本中,以便在目标配置文件不存在时,将示例文件复制到实际配置文件中;它将指令添加到 post-deinstall 脚本中,在配置文件未被修改的情况下删除该配置文件。
@sample(games,games,640) etc/config.sample@sample(,games,660) etc/config.sample@(,games,2755) sbin/daemonattributes: { owner: "games", group: "games", mode: 0555 }@foo some.content other.contentsome.content
other.contentactions: [file(1)]actions: [dirrmtry]
post-deinstall: <<EOD
echo "Directory %D/%@ removed."
EODactions: [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
EODastro
天文学相关的 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 语言相关的软件。
邮件软件。
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
葡萄牙语语言支持。
打印软件。
包括桌面出版工具(如预览器等)。
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
压缩与归档工具。
LICENSE_PERMSLICENSE_NAMELICENSE_FILELICENSE_TEXTLICENSE_DISTFILESLICENSE_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
权限。如果为空,使用 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。发行文件和软件包将不会出现在安装映像中。
许可证所属的组。
预定义的许可证组列表
FSF Free Software Foundation 批准,见 FSF Licensing & Compliance Team。
GPL 与 GPL 兼容
OSI OSI 批准,见 Open Source Initiative 的 Open Source Licenses 页面。
COPYFREE 符合 Copyfree 标准定义,见 Copyfree Licenses 页面。
FONTS 字体许可证
许可证的完整名称。
示例 31. LICENSE_NAME
包含许可证文本的文件的完整路径,通常是 ${WRKSRC}/some/file。如果文件不在分发包中,且其内容太长,无法放在 LICENSE_TEXT 中,请将其放入 ${FILESDIR} 中的新文件。
示例 32. LICENSE_FILE
作为许可证使用的文本。当许可证不在分发文件中且文本较短时很有用。
示例 33. LICENSE_TEXT
适用于的分发文件。默认为所有分发文件。
示例 34. LICENSE_DISTFILES
当分发文件并非全部适用同一许可证时使用。例如,一个文件有代码许可证,另一个文件包含不能重新分发的艺术作品:
如果所有许可证都适用,则设置为 multi。如果任意许可证适用,则设置为 dual。默认为 single。
示例 35. 双重许可证
当一个 Port 显示“此软件可以根据 GNU 通用公共许可证或艺术许可证进行分发”时,表示可以使用其中任何一个许可证。使用如下设置:
如果提供了许可证文件,请使用如下设置:
示例 36. 多个许可证
当一个 Port 的一部分使用一个许可证,而另一部分使用不同的许可证时,使用 multi:
LICENSE= LGPL21+LICENSE= LGPL21+
LICENSE_FILE= ${WRKSRC}/COPYINGLICENSE= 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-acceptLICENSE= 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-acceptLICENSE= UNRAR
LICENSE_NAME= UnRAR License
LICENSE_FILE= ${WRKSRC}/license.txt
LICENSE_PERMS= dist-mirror dist-sell pkg-mirror pkg-sell auto-acceptLICENSE= GPLv3+
LICENSE_FILE= ${WRKSRC}/COPYINGLICENSE= 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-acceptMASTER_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.zipLICENSE= ART10 GPLv1
LICENSE_COMB= dualLICENSE= ART10 GPLv1
LICENSE_COMB= dual
LICENSE_FILE_ART10= ${WRKSRC}/Artistic
LICENSE_FILE_GPLv1= ${WRKSRC}/CopyingLICENSE= 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
(默认)
以下是移植过程中常见的一些注意事项和禁忌。请对照本清单检查 Port,同时也请查看其他人提交到 PR 数据库 中的 Ports。根据 Bug Reports and General Commentary 中的说明提交对 Ports 的任何意见。检查 PR 数据库中的 Ports 不仅可以加快我们提交的速度,还可以证明你熟悉相关操作。
WRKDIR不要向 WRKDIR 之外的文件写入任何内容。WRKDIR 是构建 Port 过程中唯一保证可写的地方(参见 中只读树构建 Ports 的示例)。pkg-* 文件可以通过 的方式修改,而不是直接覆盖文件。
WRKDIRPREFIX确保 Port 支持 WRKDIRPREFIX。大多数 Ports 不需要关心这一点。尤其是在引用其他 Port 的 WRKDIR 时,应注意正确的位置是 ${WRKDIRPREFIX}${PORTSDIR}/subdir/name/work,而不是 ${PORTSDIR}/subdir/name/work 或 ${.CURDIR}/../../subdir/name/work 或类似路径。
某些代码需要根据所运行的 FreeBSD Unix 版本进行修改或条件编译。区分 FreeBSD 版本的推荐方式是使用定义在 中的 __FreeBSD_version 和 __FreeBSD__ 宏。如果未包含该文件,请在对应的 .c 文件中添加如下代码:
__FreeBSD__ 在所有版本的 FreeBSD 中都定义为其主版本号。例如,在 FreeBSD 9.x 中,__FreeBSD__ 被定义为 9。
__FreeBSD_version 的完整值列表可参考 。
不要在 .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 而不是空格。
exec 语句如果 Port 安装了一个 shell 脚本,而该脚本的目的是启动另一个程序,并且启动该程序是脚本执行的最后一步,那么请务必使用 exec 语句来启动该程序,例如:
exec 语句会将当前 shell 进程替换为指定程序。如果省略 exec,则 shell 进程在程序运行期间仍会驻留在内存中,造成系统资源的无谓浪费。
Makefile 应该以简单合理的方式完成任务。使其更简洁或更易读总是更好的做法。示例包括使用 make 的 .if 结构代替 shell 的 if 结构;如果只需重定义 EXTRACT* 就足够了,就不要重定义 do-extract;使用 GNU_CONFIGURE 而不是 CONFIGURE_ARGS += --prefix=${PREFIX}。
如果为了实现某个功能需要添加大量新代码,很可能在 bsd.port.mk 中已经有相关实现。虽然 bsd.port.mk 难以阅读,但它为许多看似复杂的问题提供了简洁的解决方案。
CC 和 CXXPort 必须遵守 CC 和 CXX。这意味着不能直接覆盖这两个变量的值,而应在已有值的基础上追加所需内容。这样做可以确保影响所有 Ports 的构建选项能被全局设置。
如果 Port 没有遵守这些变量,请在 Makefile 中添加 NO_PACKAGE=ignores either cc or cxx。
以下是一个遵守 CC 和 CXX 的 Makefile 示例。注意 ?= 的使用:
以下是不遵守的示例:
在 FreeBSD 系统中,CC 和 CXX 可以在 /etc/make.conf 中定义。第一个示例仅在变量未被预先定义时赋值,保留了系统范围的定义;而第二个示例则会覆盖已有定义。
CFLAGSPort 必须遵守 CFLAGS。这意味着不能直接覆盖该变量的值,而应在已有值的基础上追加所需内容。这样可以使影响所有 Ports 的构建选项可以全局设置。
如果未遵守,请在 Makefile 中添加 NO_PACKAGE=ignores cflags。
以下是一个遵守 CFLAGS 的 Makefile 示例。注意 += 的使用:
以下是不遵守的示例:
CFLAGS 在 FreeBSD 系统中定义于 /etc/make.conf。第一个示例将额外参数附加到已有的 CFLAGS 上,保留系统级定义;而第二个示例会覆盖原有定义。
请从第三方 Makefile 中移除优化标志。系统的 CFLAGS 已包含系统范围的优化选项。以下是未修改的 Makefile 中的示例:
使用系统优化标志后的 Makefile 应类似如下:
请确保 Port 的构建系统在构建阶段显示所有执行的命令。完整的构建日志对于调试 Port 问题至关重要。
不具可读性的构建日志示例(错误):
详细的构建日志示例(正确):
某些构建系统(如 CMake、ninja 和 GNU configure)在 Ports 框架中已经配置为显示详细日志。其他情况下,Port 可能需要单独调整。
请将相关的更改和补丁提交给上游维护者,以便在下一版本中包含这些更改。这样有助于简化后续版本的更新过程。
README.html 并不是 Port 的一部分,而是通过执行 make readme 生成的。请勿将此文件包含在补丁或提交中。
注意
如果
make readme失败,请确认 Port 未修改ECHO_MSG的默认值。
BROKEN、FORBIDDEN 或 IGNORE 标记不可安装的 Port在某些情况下,必须阻止用户安装某个 Port。可以在 Port 的 Makefile 中使用几个变量来告诉用户该 Port 无法安装。这些 make 变量的值将作为 Port 拒绝安装的原因显示给用户。请使用正确的 make 变量。每个变量在语义上有明显不同,不仅对用户如此,对依赖 Makefile 的自动化系统(如 和 )也是如此。
BROKEN:用于目前无法编译、安装、卸载或正常运行的 Port。适用于预计问题是暂时性的情形。
如果设置,构建集群在收到指示的情况下仍可能尝试构建以查看问题是否已经解决。(但通常构建集群不会这样做。)
例如,当一个 Port:
无法编译;
配置或安装过程失败;
不要给 BROKEN、IGNORE 及相关变量的值加引号。由于这些信息最终会显示给用户,每个变量所使用的消息措辞是不同的:
这样,make describe 的输出如下所示:
FreeBSD 支持的处理器架构远不止常见的 x86 架构。一些 Port 仅适用于某些特定架构,或者在某些架构下会有问题。
要查看支持的架构列表,请执行以下命令:
返回的值为 TARGET/TARGET_ARCH 形式。只读 make 变量 ARCH 的值基于 TARGET_ARCH 设置。Port 的 Makefile 应当测试该变量的值。
不包含任何依赖特定架构文件或要求的 Port 应设置 NO_ARCH=yes。
这类 Port 构建出的软件包,其架构字符串将以 :*(通配架构)结尾,例如不是 freebsd:13:x86:64(即 amd64 架构)。
注意
设置
NO_ARCH的目的在于表明无需为所有支持架构单独构建包。这样可以减少构建和分发软件包所消耗的资源,例如网络带宽、镜像服务器和分发介质的磁盘空间。但当前的软件包基础设施(例如软件包管理器、镜像、构建系统)尚未完全利用NO_ARCH带来的优势。
若希望仅在某些架构上将 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 设定说明。
某些 Port 会尝试通过向编译器传递 -march=native 参数来针对当前构建机器做出优化。这种做法应避免:要么作为默认关闭的选项列出,要么彻底删除该参数。
否则,由构建集群构建的默认软件包可能无法在该架构下的所有机器上运行。
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 可用,建议在提交说明中提及替代项。
并没有明确规定应提前多久通知用户。当前的惯例是:安全相关问题提前一个月通知,构建相关问题提前两个月通知。这也为感兴趣的提交者留出时间修复问题。
.error 结构Makefile 中如果需要因为某些外部因素(例如用户指定了不合法的构建选项组合)而阻止 Port 安装,正确的做法是给 IGNORE 赋一个非空的值。该值会在执行 make install 时被格式化并展示给用户。
一个常见的错误是为此目的使用 .error。这样做的问题在于,许多与 Ports 树交互的自动化工具在遇到这种情况时会失败。最常见的例子是在尝试构建 /usr/ports/INDEX 时失败(参见 )。但即使是非常简单的命令,例如 make maintainer,也会因此失败。这种行为是不可接受的。
示例 1:如何避免使用 .error
下面两个 Makefile 片段中,第一个会导致 make index 失败,而第二个不会:
除非用于目标(targets)中,通常不应在 Makefile 中使用 sysctl。这是因为在处理 makevar(例如运行 make index 时)时会执行该命令,从而进一步拖慢处理速度。
仅应通过 SYSCTL 使用 ,因为它包含完整路径,并且在必要时可以被覆盖。
有时软件作者会在不更改文件名的情况下,修改已发布的 distfile 内容。应验证这些更改是官方行为,且确实由作者执行。过去曾有 distfile 在下载服务器上被暗地里篡改,意图造成损害或危及终端用户的安全。
请将旧的 distfile 备份,下载新的文件,解压后使用 比较内容。如果确认没有可疑之处,再更新 distinfo。
重要
请务必在 PR 和提交日志中简要说明差异,这样其他人可以了解没有发生恶意行为。
联系软件作者并向他们确认这些更改。
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 上就不行。
请务必反复检查 pkg-descr 和 pkg-plist。如果在审查 Port 时发现可以改进其措辞,请进行修正。
请务必注意任何法律问题!不要让我们非法分发软件!
你是否在维护 Ports 时遇到过具体的非 POSIX 行为或仅 Linux 依赖?
卸载时未能清除所有文件(不过如果留下的是用户已修改的文件,可能是可以接受甚至是期望的);
在本应能正常运行的系统上运行失败;
应使用 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 的更多信息)
#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?= gccCXX?= g++CC= gccCXX= g++CFLAGS+= -Wall -WerrorCFLAGS= -Wall -WerrorCFLAGS= -O3 -funroll-loops -DHAVE_SOUNDCFLAGS+= -DHAVE_SOUNDCC source1.o
CC source2.o
CCLD someprogramcc -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 -lsomelibBROKEN= fails to link with base -lcryptoIGNORE= 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 targetsONLY_FOR_ARCHS= i386 amd64NOT_FOR_ARCHS= ia64 sparc64.error "option is not supported"IGNORE=option is not supported许多应用程序可以通过可选或不同的配置进行构建。示例包括选择自然(人类)语言、图形界面与命令行界面,或支持的数据库类型。用户可能需要不同于默认配置的版本,因此 Ports 系统提供了 hook,port 作者可以使用这些 hook 来控制将构建哪种变体。正确支持这些选项将使用户满意,并有效地提供多个 port,而收费仅为一个。
OPTIONSOPTIONS_* 向安装 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 可以移除保存的配置。
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 的实际使用
以下选项默认始终开启:
DOCS - 构建并安装文档。
NLS - 本地语言支持。
EXAMPLES - 构建并安装示例。
注意
不需要将这些选项添加到
OPTIONS_DEFAULT中。然而,为了使它们生效并在选项选择对话框中显示,它们必须添加到OPTIONS_DEFINE中。
在使用 GNU 配置脚本时,注意哪些可选功能是通过自动检测激活的。通过在 CONFIGURE_ARGS 中显式禁用不需要的可选功能,使用 --without-xxx 或 --disable-xxx。
示例 42. 错误的选项处理
在上面的示例中,假设系统上安装了 libfoo 库。用户不希望此应用程序使用 libfoo,因此在 make config 对话框中关闭了该选项。但应用程序的配置脚本检测到系统中存在该库,并将其支持包含到生成的可执行文件中。现在,当用户决定从系统中删除 libfoo 时,Ports 系统不会发出警告(因为没有记录对 libfoo 的依赖),但是应用程序会崩溃。
示例 43. 正确的选项处理
注意
在某些情况下,简写的条件语法可能会导致复杂构造的问题。通常会出现
Malformed conditional错误,可以使用替代语法作为
的替代。
有一些宏可以帮助简化基于选项设置的条件值。为了便于访问,提供了一个全面的列表:
PLIST_SUB, SUB_LIST
有关自动生成 %%OPT%% 和 %%NOOPT%%,请参见 。
对于更复杂的用法,请参见 。
CONFIGURE_ARGS
对于 --enable-x 和 --disable-x
OPTIONS_SUB如果将 OPTIONS_SUB 设置为 yes,则会将所有添加到 OPTIONS_DEFINE 中的选项添加到 PLIST_SUB 和 SUB_LIST 中,例如:
等同于:
注意
OPTIONS_SUB的值会被忽略。将其设置为任何值都会为 所有 选项添加PLIST_SUB和SUB_LIST条目。
OPT_USE 和 OPT_USE_OFF当选中选项 OPT 时,对于 OPT_USE 中的每个 key=value 配对,value 会被附加到相应的 USE_KEY 上。如果 value 包含空格,则用逗号替换空格,处理时这些逗号会变回空格。OPT_USE_OFF 的工作方式相同,但当 OPT 未被选中时。示例:
等同于:
CONFIGURE_ARGS 帮助工具OPT_CONFIGURE_ENABLE当选中选项 OPT 时,对于 OPT_CONFIGURE_ENABLE 中的每个 entry,--enable-entry 会被附加到 CONFIGURE_ARGS。当选项 OPT 未被选中时,--disable-entry 会被附加到 CONFIGURE_ARGS。可以用 = 符号指定可选参数,该参数仅会附加到 --enable-entry 配置选项。例如:
等同于:
OPT_CONFIGURE_WITH当选中选项 OPT 时,对于 OPT_CONFIGURE_WITH 中的每个 entry,--with-entry 会被附加到 CONFIGURE_ARGS。当选项 OPT 未被选中时,--without-entry 会被附加到 CONFIGURE_ARGS。可以用 = 符号指定可选参数,该参数仅会附加到 --with-entry 配置选项。例如:
等同于:
OPT_CONFIGURE_ON 和 OPT_CONFIGURE_OFF当选中选项 OPT 时,OPT_CONFIGURE_ON 的值(如果已定义)会附加到 CONFIGURE_ARGS。OPT_CONFIGURE_OFF 的工作方式相同,但当 OPT 未被选中时。示例:
等同于:
技巧
大多数情况下,
OPT_CONFIGURE_ENABLE和OPT_CONFIGURE_WITH中的帮助工具提供了更简洁和全面的功能。
CMAKE_ARGS HelpersOPT_CMAKE_ON 和 OPT_CMAKE_OFF当选中选项 OPT 时,如果定义了 OPT_CMAKE_ON,则该值会附加到 CMAKE_ARGS。OPT_CMAKE_OFF 的工作方式相同,但当 OPT 未被选中时。例如:
等同于:
技巧
当值为布尔型时,请参考 以获取更简洁的帮助工具。
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。例如:
等同于:
MESON_ARGS HelpersOPT_MESON_ON 和 OPT_MESON_OFF当选中选项 OPT 时,如果定义了 OPT_MESON_ON,则该值会附加到 MESON_ARGS。OPT_MESON_OFF 的工作方式相同,但当 OPT 未被选中时。例如:
等同于:
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。例如:
等同于:
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。例如:
等同于:
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。例如:
等同于:
OPT_QMAKE_ON 和 OPT_QMAKE_OFF当选中选项 OPT 时,如果定义了 OPT_QMAKE_ON,则该值会附加到 QMAKE_ARGS。OPT_QMAKE_OFF 的工作方式相同,但当 OPT 未被选中时。例如:
等同于:
OPT_IMPLIES提供了一种在选项之间添加依赖关系的方式。
当选中选项 OPT 时,此变量中列出的所有选项也将被选中。以下是使用之前描述的 来举例说明:
等同于:
示例 44. OPT_IMPLIES 的简单使用
这个 Port 有一个 X11 选项和一个需要选中 X11 选项才能构建的 GNOME 选项。
OPT_PREVENTS 和 OPT_PREVENTS_MSG提供了一种在选项之间添加冲突的方式。
当选中选项 OPT 时,OPT_PREVENTS 中列出的所有选项必须取消选择。如果设置了 OPT_PREVENTS_MSG 且触发了冲突,则其内容将显示,解释为什么它们会冲突。例如:
大致等同于:
唯一的区别是,第一个会在运行 make config 后输出错误,提示更改所选的选项。
示例 45. OPT_PREVENTS 的简单使用
这个 Port 有 X509 和 SCTP 选项。两个选项都添加补丁,但这些补丁彼此冲突,因此不能同时选择。
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=符号和值之间添加额外的空格,这样也会将其分割成两个字符串。这将不起作用:
OPT_DEPTYPE 和 OPT_DEPTYPE_OFF对于以下任何依赖类型:
PKG_DEPENDS
EXTRACT_DEPENDS
PATCH_DEPENDS
当选项 OPT 被选中时,如果定义了 OPT_DEPTYPE,则其值将被追加到 DEPTYPE。OPT_DEPTYPE_OFF 在选项 OPT 未被选中时以相同的方式工作。例如:
等同于:
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。
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_DEPENDSBUILD_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-extractdo-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
OPTIONS_DEFINE= OPT1 OPT2OPT1_DESC= 描述 OPT1
OPT2_DESC= 描述 OPT2
OPT3_DESC= 描述 OPT3
OPT4_DESC= 描述 OPT4
OPT5_DESC= 描述 OPT5
OPT6_DESC= 描述 OPT6OPTIONS_SINGLE= SG1
OPTIONS_SINGLE_SG1= OPT3 OPT4OPTIONS_RADIO= RG1
OPTIONS_RADIO_RG1= OPT7 OPT8OPTIONS_MULTI= MG1
OPTIONS_MULTI_MG1= OPT5 OPT6OPTIONS_GROUP= GG1
OPTIONS_GROUP_GG1= OPT9 OPT10OPTIONS_DEFAULT= OPT1 OPT3 OPT6OPTIONS_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= examplesOPTIONS_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
.endifFOO_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= yesOPTIONS_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=""
.endifOPTIONS_DEFINE= OPT1
OPT1_USES= xorg
OPT1_USE= mysql=yes xorg=x11,xextproto,xext,xrandr
OPT1_USE_OFF= openssl=yesOPTIONS_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
.endifOPTIONS_DEFINE= OPT1 OPT2
OPT1_CONFIGURE_ENABLE= test1 test2
OPT2_CONFIGURE_ENABLE= test2=exhaustiveOPTIONS_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
.endifOPTIONS_DEFINE= OPT1 OPT2
OPT1_CONFIGURE_WITH= test1
OPT2_CONFIGURE_WITH= test2=exhaustiveOPTIONS_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
.endifOPTIONS_DEFINE= OPT1
OPT1_CONFIGURE_ON= --add-test
OPT1_CONFIGURE_OFF= --no-testOPTIONS_DEFINE= OPT1
.include <bsd.port.options.mk>
.if ${PORT_OPTIONS:MOPT1}
CONFIGURE_ARGS+= --add-test
.else
CONFIGURE_ARGS+= --no-test
.endifOPTIONS_DEFINE= OPT1
OPT1_CMAKE_ON= -DTEST:BOOL=true -DDEBUG:BOOL=true
OPT1_CMAKE_OFF= -DOPTIMIZE:BOOL=trueOPTIONS_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
.endifOPTIONS_DEFINE= OPT1
OPT1_CMAKE_BOOL= TEST DEBUG
OPT1_CMAKE_BOOL_OFF= OPTIMIZEOPTIONS_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
.endifOPTIONS_DEFINE= OPT1
OPT1_MESON_ON= -Dopt=1
OPT1_MESON_OFF= -Dopt=2OPTIONS_DEFINE= OPT1
.include <bsd.port.options.mk>
.if ${PORT_OPTIONS:MOPT1}
MESON_ARGS+= -Dopt=1
.else
MESON_ARGS+= -Dopt=2
.endifOPTIONS_DEFINE= OPT1
OPT1_MESON_TRUE= test debug
OPT1_MESON_FALSE= optimizeOPTIONS_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
.endifOPTIONS_DEFINE= OPT1
OPT1_MESON_YES= test debug
OPT1_MESON_NO= optimizeOPTIONS_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
.endifOPTIONS_DEFINE= OPT1
OPT1_MESON_ENABLED= test
OPT1_MESON_DISABLED= debugOPTIONS_DEFINE= OPT1
.include <bsd.port.options.mk>
.if ${PORT_OPTIONS:MOPT1}
MESON_ARGS+= -Dtest=enabled -Ddebug=disabled
.else
MESON_ARGS+= -Dtest=disabled -Ddebug=enabled
.endifOPTIONS_DEFINE= OPT1
OPT1_QMAKE_ON= -DTEST:BOOL=true
OPT1_QMAKE_OFF= -DPRODUCTION:BOOL=trueOPTIONS_DEFINE= OPT1
.include <bsd.port.options.mk>
.if ${PORT_OPTIONS:MOPT1}
QMAKE_ARGS+= -DTEST:BOOL=true
.else
QMAKE_ARGS+= -DPRODUCTION:BOOL=true
.endifOPTIONS_DEFINE= OPT1 OPT2
OPT1_IMPLIES= OPT2
OPT1_CONFIGURE_ENABLE= opt1
OPT2_CONFIGURE_ENABLE= opt2OPTIONS_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
.endifOPTIONS_DEFINE= X11 GNOME
OPTIONS_DEFAULT= X11
X11_USES= xorg
X11_USE= xorg=xi,xextproto
GNOME_USE= gnome=gtk30
GNOME_IMPLIES= X11OPTIONS_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)
.endifOPTIONS_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
.endifOPT_VARS= foo="bar baz"OPT_VARS= foo= barOPTIONS_DEFINE= OPT1
OPT1_LIB_DEPENDS= liba.so:devel/a
OPT1_LIB_DEPENDS_OFF= libb.so:devel/bOPTIONS_DEFINE= OPT1
.include <bsd.port.options.mk>
.if ${PORT_OPTIONS:MOPT1}
LIB_DEPENDS+= liba.so:devel/a
.else
LIB_DEPENDS+= libb.so:devel/b
.endifOPTIONS_DEFINE= OPT1
OPT1_USES= gmake
OPT1_CFLAGS_OFF= -DTESTOPTIONS_DEFINE= OPT1
.include <bsd.port.options.mk>
.if ${PORT_OPTIONS:MOPT1}
USES+= gmake
.else
CFLAGS+= -DTEST
.endifALL_TARGET= all
DOCS_ALL_TARGET= docDOCS_ALL_TARGET= docOPTIONS_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}/MakefileOPTIONS_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
.endifDISTNAMEDISTNAME 是由软件的作者指定的名称。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)。
MASTER_SITES在 MASTER_SITES 中记录指向原始 tarball 的 FTP/HTTP URL 的目录部分。不要忘记尾部的斜杠(/**/)!
如果系统上找不到分发文件,make 宏将尝试使用此规范通过 FETCH 获取分发文件。
建议在此列表中包含多个站点,最好来自不同的大陆。这将有助于避免广域网问题。
重要
MASTER_SITES不能为空。它必须指向实际托管分发文件的站点。不能指向网页档案或 FreeBSD 分发文件缓存站点。唯一的例外是没有分发文件的 Ports。例如,meta-Ports 没有分发文件,因此不需要设置MASTER_SITES。
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_*宏的简写
一些流行站点有可预测的目录结构,存在一些“魔法”宏。对于这些站点,只需使用简写,系统会自动选择子目录。例如,对于名为 Stardict,版本为 1.2.3,并托管在 SourceForge 上的 Port,添加以下行:
这将推测出名为 /project/stardict/stardict/1.2.3 的子目录。如果推测的目录不正确,可以覆盖它:
也可以写成:
表 4. 魔法 MASTER_SITES 宏
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 版本不会冲突。(参见 比较版本):
如果请求的提交与某个标签相同,默认会显示一个更短的描述。更长的版本是等效的:
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 相关的行):
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。
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 和网页根目录可以在同一个变量中修改。
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 中出现了一些冗余信息。
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中使用,因此只需设置其中之一。
DISTFILES有时下载的文件名称与 Port 的名称没有任何关系。例如,它可能被称为 source.tar.gz 或类似名称。在其他情况下,应用程序的源代码可能分散在几个不同的归档文件中,所有这些文件都必须下载。
如果是这种情况,可以将 DISTFILES 设置为一个由空格分隔的文件列表,列出所有需要下载的文件。
如果未明确设置,DISTFILES 默认为 ${DISTNAME}${EXTRACT_SUFX}。
EXTRACT_ONLY如果只需要解压部分 DISTFILES,例如其中一个是源代码,另一个是未压缩的文档,可以在 EXTRACT_ONLY 中列出必须解压的文件名。
当没有 DISTFILES 需要解压时,可以将 EXTRACT_ONLY 设置为空字符串。
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目标中添加命令以删除已复制的补丁。
(可以将本节视为一个“高级话题”;对于初学者,建议初次阅读时跳过此部分)。
本节介绍了一种名为 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_]范围的字符。这是因为,虽然 可以接受包含连字符的变量名,但 不允许。
本节解释了如何快速准备从不同站点和子目录下载多个分发文件和补丁的精细化获取。我们在这里描述了简化版 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 使用(每个站点多个文件)
好的,那么之前的例子没有反映出新的 Port 的需求吗?在这一节中,我们将详细解释细粒度获取机制 MASTER_SITES:n 的工作原理以及如何使用它。
元素可以通过 :n 后缀,其中 n 是 <span class="^:">,也就是说,n 可以是任何字母数字字符串,但我们将其限制为 [a-zA-Z_][0-9a-zA-Z_]</span> 目前为止。
此外,字符串匹配是区分大小写的;也就是说,n 和 N 是不同的。
然而,这些单词不能用于后缀化,因为它们具有特殊含义:default、all 和 ALL(它们在 项中被内部使用)。此外,DEFAULT 是一个特殊用途的单词(请查看
所有当前的 Ports 保持不变。只有当存在按上述语法规则附加 :n 后缀的元素时,MASTER_SITES:n 特性才会被激活,特别是在 中显示的那样。
Port 目标保持不变:checksum、makesum、patch、configure、build 等。唯一的例外是 do-fetch、
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,并遵循此语法:
所有 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-listmaster-sitespatch-sitesdo-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 目标:
master-sites-n 和 patch-sites-n 目标将列出各自组 n 中的元素。例如,master-sites-DEFAULT 和 patch-sites-DEFAULT 将返回 DEFAULT 组的元素,master-sites-test 和 patch-sites-test 将返回 test 组的元素,依此类推。
新的目标 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 项目的站点名称
GL_ACCOUNT
托管项目的 GitLab 用户的账户名
${PORTNAME}
GL_PROJECT
GitLab 上的项目名称
${PORTNAME}
GL_COMMIT
要下载的提交哈希值,必须是完整的 160 位、40 字符的十六进制 sha1 哈希值。对于 GitLab,这是一个必需的变量。
(none)
SOURCEFORGE
MASTER_SITES= alphaMASTER_SITES= alpha:DEFAULTMASTER_SITES= alpha alpha:SOME_SITEMASTER_SITES= alpha:DEFAULT alpha:SOME_SITEMASTER_SITES= alpha:SOME_SITE,DEFAULTMASTER_SITES= alpha:DEFAULT,SOME_SITEMASTER_SITES= http://site1/ SF/something/1.0:sourceforge,TEST
DISTFILES= something.tar.gz:sourceforgePATCH_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-P6PORTNAME= kermit
PORTVERSION= 9.0.304
CATEGORIES= comms ftp net
MASTER_SITES= ftp://ftp.kermitproject.org/kermit/test/tar/
DISTNAME= cku${PORTVERSION:E}-dev20PORTNAME= libworkman
PORTVERSION= 1.4
CATEGORIES= audio
MASTER_SITES= LOCAL/jim
DISTNAME= ${PORTNAME}-1999-06-20PORTNAME= librs232
PORTVERSION= 20160710
CATEGORIES= comms
MASTER_SITES= http://www.teuniz.net/RS-232/
DISTNAME= RS-232
DIST_SUBDIR= ${PORTNAME}-${PORTVERSION}MASTER_SITES= GNU/makeMASTER_SITES= ${MASTER_SITE_GNU}
MASTER_SITE_SUBDIR= makeMASTER_SITES= FOOMASTER_SITES= FOO/barMASTER_SITES= SFMASTER_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= freebsdPORTNAME= pkg-devel
DISTVERSION= 1.3.0.a.20140411
USE_GITHUB= yes
GH_ACCOUNT= freebsd
GH_PROJECT= pkg
GH_TAGNAME= 6dbb17bPORTNAME= foo
DISTVERSIONPREFIX= v
DISTVERSION= 1.0.2
USE_GITHUB= yesPORTNAME= bar
DISTVERSION= g20140411
USE_GITHUB= yes
GH_TAGNAME= c472d66b% pkg version -t g20140411 0
<% git describe --tags f0038b1
v0.7.3-14-gf0038b1PORTNAME= 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-gc66c71dUSE_GITHUB= nodefaultDISTFILES= ${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/iconsPORTNAME= 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= e90302e342bfd27bc8c9132ab9d0ea3d8723fd03PORTNAME= foobar
DISTVERSION= g20170906
USE_GITLAB= yes
GL_SITE= https://gitlab.example.com
GL_ACCOUNT= foo
GL_PROJECT= bar
GL_COMMIT= 9c1669ce60c3f4f5eb43df874d7314483fb3f8a6PORTNAME= 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/iconsPORTNAME= 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.gzipDISTFILES= source1.tar.gz source2.tar.gzDISTFILES= source.tar.gz manual.html
EXTRACT_ONLY= source.tar.gzEXTRACT_ONLY=PATCHFILES= patch1 patch2:-p1PATCHFILES= patch2:-p1:source2DISTFILES= alpha:0 beta:1MASTER_SITES= ftp://ftp1.example.com/:source1 \
http://www.example.com/:source2
DISTFILES= source1.tar.gz:source1 \
source2.tar.gz:source2MASTER_SITES= ftp://ftp.example.com/:source1 \
http://www.example.com/:source2
DISTFILES= source1.tar.gz:source1 \
source2.tar.gz:source2 \
source3.tar.gz:source2MASTER_SITE_BACKUP
file2 将与 file1 完全相同地获取,因为它们属于相同的组
MASTER_SITE_OVERRIDE
MASTER_SITE_BACKUP
file3 将从以下站点获取:
MASTER_SITE_OVERRIDE
MASTER_SITE_BACKUP
file4 将从以下站点获取:
MASTER_SITE_OVERRIDE
MASTER_SITE_BACKUP
file5 将从以下站点获取:
MASTER_SITE_OVERRIDE
MASTER_SITE_BACKUP
file6 将从以下站点获取:
MASTER_SITE_OVERRIDE
MASTER_SITE_BACKUP
Port 的 Makefile 的第一部分命名 Port,描述其版本号,并将其列入正确的类别。
PORTNAME将 PORTNAME 设置为软件的基础名称。它作为 FreeBSD 包的基础名称,并用于 DISTNAME。
重要
包名称必须在整个 Ports 树中唯一。确保
PORTNAME不被现有的 Port 使用,并且没有其他 Port 使用相同的PKGBASE。如果该名称已被使用,可以添加 。
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 示例
示例 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 的版本方案不兼容,或者当分发文件本身不包含版本时,参见 。
PORTREVISION 和 PORTEPOCHPORTREVISIONPORTREVISION 是一个单调递增的值,每次 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,包构建器无法检测到更改,因此无法重建包。
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)仍然是数字上更大的版本。
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的作用所在。
PKGNAMEPREFIX 和 PKGNAMESUFFIX两个可选变量,PKGNAMEPREFIX 和 PKGNAMESUFFIX,与 PORTNAME 和 PORTVERSION 结合,形成 PKGNAME,其格式为 ${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}。确保它符合我们的。特别地,PORTVERSION 中不允许使用连字符(-)。此外,如果包名中有 language- 或 -compiled.specifics 部分(见下文),则分别使用 PKGNAMEPREFIX 和 PKGNAMESUFFIX,不要将它们作为 PORTNAME 的一部分。
这些是命名包时要遵循的规范。目的是使包目录便于扫描,因为目前已经有成千上万个包,如果名称不规范,用户会因此离开!
包名的格式为 语言_地区 - 名称 - 编译特性。版本号
包名定义为 ${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. 包命名示例
如果原始源代码中完全没有版本信息,并且原作者不太可能发布另一个版本,则将版本字符串设置为 1.0(如上面 piewm 示例)。否则,询问原作者或使用源文件发布的日期字符串(dyyyy.mm.dd,或 dyyyymmdd)作为版本。
技巧
可以使用任何字母。这里的
d代表日期,如果源是 Git 仓库,通常使用g后跟提交日期,使用s表示快照也是常见的。
CATEGORIES当创建一个包时,它会被放置在 /usr/ports/packages/All 目录下,并且会从 /usr/ports/packages 的一个或多个子目录中创建链接。这些子目录的名称由变量 CATEGORIES 指定。这样做是为了方便用户在 FTP 站点或 CDROM 上浏览成千上万的包时更轻松。请查看 ,选择适合该 Port 的分类。
该列表还决定了 Port 在 Ports 树中的导入位置。如果有多个分类,Port 文件必须放在第一个分类名称的子目录中。更多关于如何选择正确分类的讨论,请参见 。
以下是当前的 Port 分类列表。带有星号(*)标记的是 虚拟 分类——这些分类在 Ports 树中没有对应的子目录,仅作为次要分类使用,并且仅用于搜索目的。
注意
对于非虚拟分类,每个子目录的 Makefile 中会有一行描述,描述该分类的作用。
由于许多分类有重叠,选择哪一个分类作为 Port 的主要分类可能会很繁琐。对此有几个规则。以下是按优先顺序递减的规则:
第一个分类必须是物理分类(见)。这是为了使打包工作正常进行。虚拟分类和物理分类可以在之后混合使用。
语言特定的分类总是优先。例如,如果该 Port 安装的是日语 X11 字体,则 CATEGORIES 行应写为 japanese x11-fonts。
特定的分类应列在不太具体的分类之前。例如,一个 HTML 编辑器应该列为 www editors,而不是反过来。并且,如果 Port 属于 irc、mail、news、security 或 www 中的任何一个分类时,不要列出 net,因为 net 已经隐含包含在内。
如果分类不明确,请在在 bug 数据库中加入评论,供我们讨论在导入前进行讨论。作为提交者,请向 发送通知,以便我们先进行讨论。很多时候,新的 Ports 被导入到错误的分类中,之后又立即被移动。
随着 Ports 的不断发展,已经引入了多个新分类。新分类可以是 虚拟 分类——即在 Ports 树中没有对应的子目录的分类——或者是 物理 分类——即有对应子目录的分类。本节讨论了创建新物理分类时涉及的问题。在提议新分类之前,请仔细阅读以下内容。
我们现有的做法是,除非有大量的 Port 明显属于该分类,或者这些 Port 是逻辑上独立的且属于一般兴趣有限的群体(例如与口语人类语言相关的分类),否则避免创建新的物理分类,最好是两者都满足。
这样做的原因是,这样的变更会给 带来相当大的工作量,特别是那些追踪 Ports 变化的用户。此外,提议的分类更改往往会引发争议。(也许这是因为对于分类何时“过大”以及分类是否应便于浏览(因此理想的分类数量是多少)等问题,缺乏明确的共识,等等。)
以下是提出新物理分类的程序:
在 上提议新分类。提供详细的理由,说明现有分类不足之处,并列出拟迁移到该分类的现有 Ports。(如果有在 Bugzilla 中待处理的符合该分类的新 Ports,也请列出。)如果你是维护者和/或提交者,请提及这一点,因为这可能有助于你的提议。
参与讨论。
如果看起来有支持这一想法的声音,请提交一个 PR,包含新分类的理由和需要迁移的现有 Ports 列表。理想情况下,PR 还应包括以下补丁:
新 Ports 的 Makefile,在它们被复制到新位置后
提议新虚拟分类与上述类似,但要简单得多,因为实际上不需要迁移任何 Port。在这种情况下,PR 中仅需包含那些将新分类添加到受影响 Port 的 CATEGORIES 的补丁。
偶尔有人提议以 2 层结构或其他某种关键字结构重新组织分类。到目前为止,这些提议没有取得任何进展,因为虽然提出这些提议很容易,但将整个现有 Ports 进行任何形式的重组工作非常庞大,可以说是非常艰巨的任务。在发布此类想法之前,请阅读邮件列表档案中的这些提议的历史记录。此外,准备好接受挑战,提供一个有效的原型。
MASTER_SITE_SUBDIR= old:n new/:NEWMASTER_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④ 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。
PORTREVISIONmule
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 语言相关的软件。
邮件软件。
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
葡萄牙语语言支持。
打印软件。
包括桌面出版工具(如预览器等)。
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
压缩与归档工具。
(空)
% 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-4PORTNAME= nekoto
DISTVERSIONPREFIX= v
DISTVERSION= 1_2_4PORTNAME= nekoto
DISTVERSIONPREFIX= nekoto-
DISTVERSION= 1.2_4PORTNAME= nekoto
DISTVERSION= 1.2-4
DISTVERSIONSUFFIX= _RELEASEPORTNAME= nekoto
DISTVERSIONPREFIX= nekoto-
DISTVERSION= 1.2-4
DISTVERSIONSUFFIX= _RELEASEPORTNAME= nekoto
DISTVERSION= 1.2-pre4PORTNAME= 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.10PORTNAME= gtkmumble
DISTVERSION= 0.10
PORTREVISION= 1PORTNAME= gtkmumble
DISTVERSION= 0.2
PORTEPOCH= 1PORTNAME= gtkmumble
DISTVERSION= 0.3
PORTEPOCH= 1USES 的介绍USES 宏简化了声明 Ports 依赖和设置的过程。它们可以添加依赖关系、修改构建行为、向包添加元数据等,所有这些都通过选择简单的预设值来完成。
本章的每个部分都描述了 USES 的一个可能值及其可能的参数。参数在值后通过冒号(:)附加。多个参数之间用逗号(,)分隔。
示例 1. 使用多个值
示例 2. 添加一个参数
示例 3. 添加多个参数
示例 4. 综合使用
7z可能的参数:(无),p7zip,partial
使用 代替 提取文件,并将 EXTRACT_SUFX 设置为 .7z。如果基本系统中的 7z 无法提取文件,p7zip 选项会强制依赖于来自 的 7z。如果使用 partial 选项,则 EXTRACT_SUFX 不会改变,这对于主分发文件没有 .7z 扩展名时非常有用。
ada可能的参数:(无),6,12,(run)
依赖一个支持 Ada 的编译器,并相应地设置 CC。默认使用来自 Ports 的 gcc6-aux。
angr可能的参数:binaries,nose
为需要 的 Ports 提供支持。
如果存在 binaries 参数,则该 Port 需要特殊的 angr 二进制文件进行测试。
如果存在 nose 参数,则该 Port 使用 nosetests 作为测试目标。该参数隐式地意味着 USES=python:test。
该框架提供以下变量供 Port 设置:
ANGR_VERSION:angr 项目程序的版本。
ANGR_BINARIES_TAGNAME:angr 二进制文件的标签名。
ANGR_NOSETESTS:nosetests 程序的路径。
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”)。
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 版本。
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
azurepy可能的参数:(无)
为 py-azure* Ports 提供支持。移除 azure 命名空间并清理常见文件。
blaslapack可能的参数:(无),atlas,netlib(默认),gotoblas,openblas
添加对 Blas / Lapack 库的依赖。
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 都不得使用它
bison可能的参数:(无),build,run,both
使用 。默认情况下,未指定参数或指定 build 参数时,表示 bison 是构建时依赖;run 表示运行时依赖;both 表示同时是构建时和运行时依赖。
budgie可能的参数:(无)
为 Budgie 桌面环境提供支持。使用 USE_BUDGIE 选择 Port 所需的组件。有关更多信息,请参见 。
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 将:
在提取阶段将原始文件移动到 cabal.project.${PORTNAME}。
在补丁阶段将原始的 cabal.project.${PORTNAME} 和生成的 cabal.project 合并成一个文件。使用 append 可以在合并之前对原始文件进行补丁处理。
cargo可能的参数:(无)
使用 Cargo 进行配置、构建和测试。它可以用于 Port 化使用 Cargo 构建系统的 Rust 应用程序。更多信息请参见 。
charsetfix可能的参数:(无)
防止 Port 安装 charset.alias。该文件必须仅由 安装。如果 charset.alias 不是由 ${WRKSRC}/Makefile.in 安装的,可以通过设置 CHARSETFIX_MAKEFILEIN 来指定相对于 WRKSRC 的路径。
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 编译器的路径。
cmake可能的参数:(无),insource,noninja,run,testing
使用 CMake 配置 Port 并生成构建系统。
默认情况下,执行的是源代码外构建,将源代码中的构建产物与源代码分离。使用 insource 参数时,将执行源代码内构建。该参数应仅作为例外,在常规的源代码外构建无法工作时使用。
默认情况下,使用 Ninja()进行构建。在某些情况下,这可能无法正确工作。使用 noninja 参数时,构建将使用常规的 make。只有当基于 Ninja 的构建不工作时,才应使用此参数。
使用 run 参数时,除了构建依赖外,还会注册一个运行时依赖。
使用 testing 参数时,将添加一个测试目标,该目标使用 CTest。当运行测试时,Port 将为测试重新配置并重新构建。
有关更多信息,请参见 。
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:默认编译器版本的前两位数字。
cpe可能的参数:(无)
在包清单中包含 Common Platform Enumeration (CPE) 信息,以 CPE 2.3 格式的字符串表示。有关详细信息,请参见 。要将 CPE 信息添加到 Port,请按照以下步骤操作:
通过使用 NVD 的 或在 中搜索软件产品的官方 CPE 条目(警告,此文件为非常大的 XML 文件)。切勿自行编造 CPE 数据。
将 cpe 添加到 USES 中,并使用 make -V CPE_STR 检查结果,确保它与 CPE 字典条目一致。逐步调整直到 make -V CPE_STR 正确。
如果产品名称(第二个字段,默认为 PORTNAME
cran可能的参数:(无),auto-plist,compiles
使用综合 R 存档网络。指定 auto-plist 以自动生成 pkg-plist。如果 Port 包含需要编译的代码,请指定 compiles。
desktop-file-utils可能的参数:(无)
使用来自 的 update-desktop-database。在不干扰 Port Makefile 中任何其他安装后步骤的情况下,将运行额外的安装后步骤。会在 plist 中添加一行 。仅在 Port 提供包含 MimeType 条目的 .desktop 文件时使用此宏。
desthack可能的参数:(无)
更改 GNU configure 的行为,以便在原始软件不支持 DESTDIR 时正确处理。
display可能的参数:(无),ARGS
设置虚拟显示环境。如果环境变量 DISPLAY 未设置,则会将 Xvfb 添加为构建依赖,并将 CONFIGURE_ENV 扩展为当前运行的 Xvfb 实例的 Port 号。ARGS 参数默认值为 install,控制何时启动和停止虚拟显示。
dos2unix可能的参数:(无)
Port 中包含需要转换为 Unix 格式的 DOS 行结束符。可以设置多个变量来控制哪些文件将被转换。默认情况下,将转换 所有 文件,包括二进制文件。有关示例,请参见 。
DOS2UNIX_REGEX:根据正则表达式匹配文件名。
DOS2UNIX_FILES:匹配字面文件名。
DOS2UNIX_GLOB:根据 glob 模式匹配文件名。
drupal可能的参数:7,module,theme
自动化安装作为 Drupal 主题或模块的 Port。使用 Port 所期望的 Drupal 版本。例如,USES=drupal:7,module 表示该 Port 创建一个 Drupal 7 模块。可以使用 USES=drupal:7,theme 指定 Drupal 7 主题。
ebur128可能的参数:(无),build,lib,run,test
添加对 的依赖。它允许通过使用 make.conf 中的 DEFAULT_VERSIONS 来透明地依赖 rust 或 legacy 版本。例如,要使用传统版本,可以在 DEFAULT_VERSIONS+=ebur128=legacy 中设置。
当不使用任何参数时,行为与提供 lib 参数时相同。其余参数提供相应的依赖类别。
eigen可能的参数:2,3,build(默认),run
添加对 的依赖。
electronfix可能的参数:31,32,33
为容易移植以二进制形式分发的 Electron 应用程序提供支持。根据使用的参数,添加对 ,,或 的构建和运行时依赖。
该框架提供以下变量,Port 可以设置:
ELECTRONFIX_SYMLINK_FILES:要从 Electron 分发版创建符号链接的文件列表。
ELECTRONFIX_MAIN_EXECUTABLE:要替换为原始 Electron 二进制文件的主可执行文件名。
elfctl可能的参数:(无),build(默认),stage
通过设置 ELF_FEATURES 设置 ELF 二进制文件功能控制注释。
当没有参数或提供 build 参数时,将操作 BUILD_WRKSRC 中的二进制文件,ELF_FEATURES 中列出的文件相对于 BUILD_WRKSRC。当提供 stage 参数时,将操作 STAGEDIR 中的二进制文件,ELF_FEATURES 中列出的文件相对于 STAGEDIR。
示例 5. 使用 elfctl
featurelist 的格式描述见 。
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 的额外文件列表。
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)
erlang可能的参数:(无),enc,rebar,rebar3
为 添加构建和运行时依赖。根据参数不同,添加额外的构建依赖。enc 添加对 的依赖,rebar 添加对 的依赖,rebar3 添加对 的依赖。
此外,Port 可以使用以下变量:
ERL_APP_NAME:Erlang 应用程序名称,安装在 Erlang 的 lib 目录中(去掉版本)
ERL_APP_ROOT:此 Erlang 应用程序的根目录
REBAR_CMD:rebar 命令的路径
fakeroot可能的参数:(无)
更改构建系统的一些默认行为,以允许以用户身份安装。有关 fakeroot 的更多信息,请参见 。
fam可能的参数:(无),fam,gamin
使用文件修改监视器作为库依赖,可以选择使用 或 。最终用户可以设置 WITH_FAM_SYSTEM 来指定其首选项。
firebird可能的参数:(无),25
添加对 Firebird 数据库客户端库的依赖。
fonts可能的参数:(无),fc,fontsdir(默认),none
添加一个运行时依赖,所需工具用于注册字体。根据不同的参数,添加 @fc ${FONTSDIR} 行,@fontsdir ${FONTSDIR} 行,或者如果参数是 none 则不添加任何行到 plist。FONTSDIR 默认为 ${PREFIX}/share/fonts/${FONTNAME},FONTNAME 默认为 ${PORTNAME}。将 FONTSDIR 添加到 PLIST_SUB 和 SUB_LIST。
fortran可能的参数:gcc(默认)
使用 GNU Fortran 编译器。
fpc可能的参数:(无),run
为基于 Free Pascal 的 Port 提供支持。它将安装 Free Pascal 编译器和单元。
添加对 的构建依赖。
如果指定了 run 参数,则还会添加运行时依赖。
fuse可能的参数:2(默认),3
该 Port 将依赖 FUSE 库,并根据 FreeBSD 的版本处理对内核模块的依赖。
gem可能的参数:(无),noautoplist
处理 RubyGems 的构建。如果使用 noautoplist,则不会自动生成 packing list。
这意味着需要使用 USES=ruby。
gettext可能的参数:(无)
已弃用。将同时包含 gettext-runtime 和 gettext-tools。
gettext-runtime可能的参数:(无),lib(默认),build,run
使用 devel/gettext-runtime。默认情况下,未指定参数或使用 lib 参数时,会添加对 libintl.so 的库依赖。build 和 run 参数分别表示构建时和运行时依赖 gettext。
gettext-tools可能的参数:(无),build(默认),run
使用 devel/gettext-tools。默认情况下,未指定参数或使用 build 参数时,会注册构建时依赖 msgfmt。使用 run 参数时,注册运行时依赖。
ghostscript可能的参数:*X*,build,run,nox11
可以使用特定版本 X。可选版本有 7,8,9,以及 agpl(默认)。nox11 表示需要使用 -nox11 版本的 Port。build 和 run 分别会添加构建时和运行时的 Ghostscript 依赖。默认情况下,两者都会添加。
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 库的依赖。
gmake可能的参数:(无)
使用 作为构建时依赖,并设置环境以使用 gmake 作为构建的默认 make。
gnome可能的参数:(无)
提供一种简便的方式来依赖 GNOME 组件。组件应列在 USE_GNOME 中。可用的组件有:
atk
atkmm
cairo
cairomm
默认依赖是构建时和运行时依赖,可以通过 :build 或 :run 来更改。例如:
有关更多信息,请参阅 。
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 的额外构建参数。
有关使用示例,请参阅 。
gperf可能的参数:(无)
如果 gperf 不在基本系统中,添加对 的构建时依赖。
grantlee可能的参数:5,selfbuild
处理对 Grantlee 的依赖。指定 5 以依赖基于 Qt5 的版本,。selfbuild 用于 来获取其版本号。
groff可能的参数:build,run,both
如果基本系统中没有 groff,则注册对 的依赖。
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. 常见用法
gstreamer可能的参数:(无)
提供一种简便的方法来依赖 GStreamer 组件。组件应列在 USE_GSTREAMER 中。可用的组件有:
a52dec
aalib
amrnb
amrwbdec
guile可能的参数:(无),X.Y,flavors,build,run,alias,conflicts
添加对 Guile 的依赖。默认情况下,这是对适当的 libguile*.so 的库依赖,除非通过 build 和/或 run 选项覆盖。alias 选项根据需要配置 BINARY_ALIAS(请参见 )。
默认版本通过常规的 DEFAULT_VERSIONS 机制设置;如果默认版本不是列表中的版本之一,则使用可用的最新版本。
使用 Guile 的应用程序通常只构建单一版本的 Guile。然而,扩展或库模块应使用 flavors 选项,以构建多个版本的 Guile。
更多信息请参见 。
horde可能的参数:(无)
添加对 的构建时和运行时依赖。如果需要,可以使用 USE_HORDE_BUILD 和 USE_HORDE_RUN 添加其他 Horde 依赖项。更多信息请参见 。
iconv可能的参数:(无),lib,build,patch,translit,wchar_t
使用 iconv 函数,来自 Port 的构建时和运行时依赖,或者来自基本系统的 iconv。默认情况下,如果没有指定参数或指定了 lib 参数,则表示使用 iconv 作为构建时和运行时依赖。build 表示仅作为构建时依赖,patch 表示仅作为补丁时依赖。如果 Port 使用 WCHAR_T 或 //TRANSLIT iconv 扩展,请添加相关参数以确保使用正确的 iconv。更多信息请参见 。
imake可能的参数:(无),env,notall,noman
将 添加为构建时依赖,并在 configure 阶段运行 xmkmf -a。如果指定了 env 参数,则不会设置 configure 目标。如果 -a 标志对 Port 有问题,请添加 notall 参数。如果 xmkmf 无法生成 install.man 目标,则添加 noman 参数。
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 文件所在的目录。
jpeg可能的参数:lib (default, implicit), build, run
帮助处理对 jpeg 的依赖。
如果提供了 lib 参数或没有提供参数,则会向 Port 添加库依赖。
如果提供了 build 参数,则会向 Port 添加构建时依赖。
如果提供了 run 参数,则会向 Port 添加运行时依赖。
如果提供了 both 参数,则会向 Port 添加构建时依赖和运行时依赖。
该框架提供了以下可以由 Port 设置的变量:
JPEG_PORT 指定要使用的 JPEG 实现。可选值包括:
(默认)
kde可能的参数:5
添加对 KDE 组件的依赖。更多信息请参见 。
kmod可能的参数:(none), debug
为内核模块 Port 填充模板,当前包括:
将 kld 添加到 CATEGORIES。
设置 SSP_UNSAFE。
如果在 SRC_BASE 中找不到内核源代码,则设置 IGNORE。
kodi可能的参数:(none), noautoplist
提供对 插件的支持。如果提供了 noautoplist 参数,则不会自动生成 plist。
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,则使用 作为构建依赖。
ldap可能的参数:(none), <版本>, client, server
注册对 的依赖。如果设置了特定的 <版本>(无点号表示法),则使用该版本。否则,它会尝试找到当前安装的版本。如果需要,它会回退到 bsd.default-versions.mk 中找到的默认版本。client 指定对客户端库的运行时依赖,这是默认行为。server 指定对服务器的运行时依赖。
Port 可以访问以下变量:
IGNORE_WITH_OPENLDAP:如果 Port 不支持某个版本的 OpenLDAP,可以定义此变量。
WITH_OPENLDAP_VER:用户定义的变量,用于设置 OpenLDAP 版本。
OPENLDAP_VER:检测到的 OpenLDAP 版本。
lha可能的参数:(none)
将 EXTRACT_SUFX 设置为 .lzh
libarchive可能的参数:(none)
注册对 的依赖。任何依赖 libarchive 的 Port 必须包含 USES=libarchive。
libedit可能的参数:(none)
注册对 的依赖。任何依赖 libedit 的 Port 必须包含 USES=libedit。
libtool可能的参数:(none), keepla, build
修补 libtool 脚本。所有使用 libtool 的 Port 必须添加此项。keepla 参数可用于保留 .la 文件。一些 Port 没有自己的 libtool 副本,需要对 进行构建时依赖,使用 :build 参数添加此依赖。
linux可能的参数:c6, c7
Linux 兼容性框架 Port。指定 c6 以依赖于 CentOS 6 包。指定 c7 以依赖于 CentOS 7 包。可用的包有:
allegro
alsa-plugins-oss
alsa-plugins-pulseaudio
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 的安装前缀
localbase可能的参数: (无), ldflags
确保使用来自 LOCALBASE 的库,而不是来自基本系统的库。指定 ldflags 可以将 -L${LOCALBASE}/lib 添加到 LDFLAGS,而不是 LIBS。依赖于基本系统中也存在的库的 Ports 应该使用此选项。它也被其他一些 USES 内部使用。
lua可能的参数: (无), XY, XY+, -XY, XY-ZA, module, flavors, build, run, env
添加对 Lua 的依赖。默认情况下,这是一个库依赖,除非通过 build 和/或 run 选项覆盖。env 选项防止添加任何依赖,但仍定义所有常规变量。
默认版本由通常的 DEFAULT_VERSIONS 机制设置,除非指定了版本或版本范围作为参数,例如 51 或 51-54。
使用 Lua 的应用程序通常仅为单个 Lua 版本构建。然而,旨在通过 Lua 代码加载的库模块应使用 module 选项以构建多个版本。
有关更多信息,请参见 。
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)
有关更多信息,请参见 。
lxqt可能的参数: (无)
处理 LXQt 桌面环境的依赖。使用 USE_LXQT 来选择所需的组件。有关更多信息,请参见 。
magick可能的参数: (无), X, build, nox11, run, test
添加对 ImageMagick 的库依赖。可以使用特定版本 X。可用版本为 6 和 7(默认)。nox11 表示需要使用 -nox11 版本的 Port。build,run 和 test 分别添加对 ImageMagick 的构建、运行时和测试依赖。
makeinfo可能的参数: (无)
如果基本系统中没有 makeinfo,则添加一个构建时依赖。
makeself可能的参数: (无)
表示分发文件是 makeself 存档,并设置相应的依赖。
mate可能的参数: (无)
提供一种简单的方法来依赖 MATE 组件。组件应列在 USE_MATE 中。可用的组件有:
autogen
caja
common
controlcenter
默认的依赖关系是构建和运行时的,可以通过 :build 或 :run 进行更改。例如:
meson可能的参数: (无)
为基于 Meson 的项目提供支持。有关更多信息,请参见 。
metaport可能的参数: (无)
设置以下变量以简化创建 metaport: MASTER_SITES,DISTFILES,EXTRACT_ONLY,NO_BUILD,NO_INSTALL,NO_MTREE,NO_ARCH。
minizip可能的参数: (无), ng
分别添加对 或 的库依赖。
mlt可能的参数: 7, nodepend
为依赖 的 Ports 提供支持。
如果提供了 nodepend 参数,则不生成库依赖。此参数仅对 multimedia/mlt7* Ports 有意义。
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 版本。
mono可能的参数: (无), nuget
通过设置适当的依赖,添加对 Mono(当前仅支持 C#)框架的依赖。
当 Port 使用 nuget 包时,指定 nuget。需要设置 NUGET_DEPENDS,其格式为 name=version,包含 nuget 包的名称和版本。可以使用 name=version:_origin_ 添加可选的包源。
辅助目标 buildnuget 将基于提供的 packages.config 输出 NUGET_DEPENDS 的内容。
motif可能的参数: (无)
使用 作为库依赖。最终用户可以在 make.conf 中设置 WANT_LESSTIF 来使用 作为依赖,而不是 。同样,在 make.conf 中设置 WANT_OPEN_MOTIF_DEVEL 将添加对 的依赖。
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。
ncurses可能的参数: (无), base, port
使用 ncurses,并设置一些有用的变量。
nextcloud可能的参数: (无)
通过添加对 的运行时依赖,添加对 Nextcloud 应用程序的支持。
ninja可能的参数: (无), build, make(默认), run
如果指定了 build 或 run 参数,则分别添加对 的构建或运行时依赖。如果提供 make 或没有参数,则使用 ninja 来构建该 Port,而不是 make。make 隐含了 build。如果 NINJA_DEFAULT 变量设置为 samurai,则将依赖关系设置为 。
nodejs可能的参数: (无), build, run, current, lts, 10, 14, 16, 17
使用 nodejs。添加对 的依赖。如果指定了受支持的版本,则必须同时指定 run 和/或 build。
objc可能的参数: (无)
如果基本系统不支持,则添加 Objective C 依赖(编译器、运行时库)。
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}
octave可能的参数: (无)、env
使用 。env 仅加载一个 OCTAVE_VERSION 环境变量。
openal可能的参数:al、soft(默认)、si、alut
使用 OpenAL。可以指定后端,默认使用软件实现。用户可以通过设置 WANT_OPENAL 来指定首选后端。有效的值包括 soft(默认)和 si。
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 更改默认文件名。
pear可能的参数:env
添加对 的依赖。它将为使用 PHP 扩展和应用程序仓库的软件设置默认行为。使用 env 参数仅设置 PEAR 环境变量。有关更多信息,请参见 。
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 是隐式的。
有关更多信息,请参见 。
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
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中使用这三个变量之一。
pkgconfig可能的参数: (无)、build(默认)、run、both
使用 。如果没有参数或使用 build 参数,则意味着将 pkg-config 作为构建时的依赖项。run 表示运行时依赖项,both 表示构建时和运行时的依赖项。
pure可能的参数: (无)、ffi
使用 。主要用于构建相关的 pure port。使用 ffi 参数时,它意味着将 作为运行时依赖项。
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。例如:
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 忽略的测试。
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 的依赖。
qmail可能的参数: (无)、build、run、both、vars
使用 。使用 build 参数时,意味着将 qmail 作为构建时的依赖项。run 表示运行时依赖项。如果不带参数或使用 both 参数,则表示构建时和运行时的依赖项。vars 将仅设置 QMAIL 变量供 port 使用。
qmake可能的参数: (无)、norecursive、outsource、no_env、no_configure
使用 QMake 进行配置。更多信息请参见 。
qt可能的参数: 5、6、no_env
添加对 Qt 组件的依赖。no_env 参数直接传递给 USES= qmake。更多信息请参见 。
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 分发文件。
readline可能的参数: (无)、port
将 readline 作为库依赖项,并根据需要设置 CPPFLAGS 和 LDFLAGS。如果使用 port 参数,或如果基本系统中没有 readline,则会添加对 的依赖。
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)。
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 版本,应该使用此变量。
scons可能的参数: (无)
为使用 提供支持。更多信息请参见 。
sdl可能的参数: sdl
为使用 SDL 软件包提供支持。变量 USE_SDL 是强制性的,并指定要添加为依赖的组件。
当前支持的 SDL1.2 模块有:
sdl
console
gfx
image
当前支持的 SDL2 模块有:
sdl2
gfx2
image2
mixer2
当前支持的 SDL3 模块有:
sdl3
image3
ttf3
shared-mime-info可能的参数: (无)
使用来自 的 update-mime-database。此宏会自动在安装后步骤中添加,以确保该 port 在需要时仍能指定自己的安装后步骤。同时,它还会将 条目添加到 plist 中。
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 文件,可以执行:
sqlite可能的参数: (无), 2, 3
添加对 SQLite 的依赖。默认使用版本 3,但也可以使用 :2 修饰符来指定版本 2。
sbrk可能的参数: (无)
标记该 port 在 aarch64 和 riscv64 上为 BROKEN。
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_:
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。
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 库的路径
terminfo可能的参数:(无)
将 添加到 plist。当该 Port 安装 *.terminfo 文件到 ${PREFIX}/share/misc 时使用。
tex可能的参数:(无)
提供对 tex 的支持。加载所有与 TEX 相关的默认变量,并且不添加任何对其他 Ports 的依赖。
变量用于指定需要哪些 TEX 模块。
USE_TEX 运行时所需的 TEX 扩展列表。在扩展名后添加 :build 来添加构建时依赖,:run 添加运行时依赖,:test 添加测试时依赖,:extract 添加提取时依赖。例如:base texmf:build source:run
当前可能的参数如下:
base
texmf
source
docs
tk与 tcl 的参数相同
当同时使用 Tcl 和 Tk 时的小包装器。返回的变量与使用 Tcl 时相同。
trigger可能的参数:(无)
提供对需要由 执行触发器的 Ports 的支持。触发器在事务结束时执行,如果条件满足。
可以通过 Ports 设置以下变量:
TRIGGERS 打包的触发器列表。默认为 ${PORTNAME}。
触发器以 UCL 格式指定,通常放置在 Port 的 files/ 目录中。
uidfix可能的参数:(无)
更改构建系统的一些默认行为(主要是变量),以允许以普通用户身份安装该 Port。在使用 或补丁之前,请先尝试此方法。
uniquefiles可能的参数:(无),dirs
通过添加前缀或后缀使文件或目录“唯一”。如果使用 dirs 参数,Port 需要一个基于 UNIQUE_PREFIX 的前缀(且仅需前缀),适用于标准目录 DOCSDIR、EXAMPLESDIR、DATADIR、WWWDIR、ETCDIR。以下变量可供 Port 使用:
UNIQUE_PREFIX:用于目录和文件的前缀。默认值:${PKGNAMEPREFIX}。
UNIQUE_PREFIX_FILES:需要添加前缀的文件列表。默认值:空。
UNIQUE_SUFFIX:用于文件的后缀。默认值:${PKGNAMESUFFIX}。
vala可能的参数:build,lib,no_depend
添加对 的构建或库依赖。no_depend 参数保留给 本身。
varnish可能的参数:4(默认),6,7
处理 Varnish Cache 的依赖关系。添加对 的依赖。
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。
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。
xfce可能的参数:(无),gtk2
为 Xfce 相关 Ports 提供支持。有关详细信息,请参阅 。
gtk2 参数指定该 Port 需要 GTK2 支持。它添加了一些核心组件提供的额外功能,例如 和 。
xorg可能的参数:(无)
提供一种简便的方法来依赖 X.org 组件。这些组件应列在 USE_XORG 中。可用的组件有:
表 1. 可用的 X.Org 组件
xorg-cat可能的参数:app,data,doc,driver,font,lib,proto,util,xserver 和(无)或单独的 autotools(默认),meson
提供对构建 Xorg 组件的支持。它会设置所需的常见依赖项和适当的配置环境。此选项仅适用于 Xorg 组件。
类别必须与上游类别匹配。
第二个参数是要使用的构建系统。默认是 autotools,但也支持 meson。
zip可能的参数:(无),infozip
指示分发文件使用 ZIP 压缩算法。对于使用 InfoZip 算法的文件,必须传递 infozip 参数以设置适当的依赖关系。
AUTORECONF_WRKSRCALT_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
GSSAPILDFLAGSGSSAPILIBDIR
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。框架将负责创建和删除所需的目录。
alsalibatk
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
serverembeddedserverembeddedclientIGNORE_WITH_MYSQLplperl
plpython
pltcl
server
designer
designerplugin
doc
gui
multimedia
network
opengl
qscintilla2
sip
sql
svg
test
webkit
xml
xmlpatterns
script
scripttools
webkitwidgets
widgets
locationlottiemultimedianetworkauthpositioningquick3dquickcontrols2quickcontrolsquicktimelineremoteobjectsscriptscxmlsensorsserialbusserialportshadertoolsspeechsvgtoolstranslationsvirtualkeyboardwaylandwebchannelwebenginewebglpluginwebsocketswebviewx11extrasxmlpatternsmm
net
pango
sound
ttf
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 访问库
pixman
USES= bison perlUSES= tar:xzUSES= drupal:7,themeUSES= pgsql:9.3+ cpe python:2.7,buildELF_FEATURES= featurelist:path/to/file1 \
featurelist:path/to/file2USES= gnome
USE_GNOME= gnomemenus3:build intlhackOPTIONS_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-gssapiUSES= mate
USE_MATE= menus:build intlhackUSES= php:ext
USE_PHP= wddx
PHP_MOD_PRIO= 40USES= pyqt
USE_PYQT= core doc_build designer_runPORTNAME= networkauth
DISTVERSION= ${QT5_VERSION}
USES= qt-dist:5PORTNAME= websockets
PORTVERSION= ${QT6_VERSION}
USES= qt-dist:6PORTNAME= gui
DISTVERSION= ${QT5_VERSION}
USES= qt-dist:5,baseSHEBANG_LANG= luaSHEBANG_LANG= ksh
ksh_OLD_CMD= "/usr/bin/env ksh" /bin/ksh /usr/bin/ksh
ksh_CMD= ${LOCALBASE}/bin/kshpython_OLD_CMD= /opt/bin/python2.7USES= shebangfix
SHEBANG_REGEX= ./scripts/.*\.(sh|pl|cgi)USES= shebangfix
SHEBANG_GLOB= *.sh *.plUSES= shebangfix
SHEBANG_FILES= scripts/foobar.pl scripts/*.shBROKEN_SSL= libressl
BROKEN_SSL_REASON_libressl= 需要 OpenSSL 中才有的特性有时,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 变量。关于如何处理这个问题的示例可以在 和 中找到。
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。
在创建符号链接时,强烈建议使用相对链接。使用 ${RLN} 可以自动创建相对符号链接。它在后台使用 ,自动计算要创建的相对链接。
示例 1. 自动创建相对符号链接
${RLN} 使用 的相对符号链接功能,使得创建者不必手动计算相对路径。
将生成:
本节解释了为什么捆绑的依赖库被认为是不好的,以及如何处理它们。
一些软件要求开发者找到第三方库并将所需的依赖添加到 Port 中。其他软件则将所有必需的库打包在分发文件中。第二种方法看起来一开始更容易,但存在一些严重的缺点:
以下列表 loosely 基于 和 的维基页面,均由 许可证授权。
安全性
如果在上游库中发现漏洞并进行修复,可能不会在与 Port 捆绑的库中修复这些漏洞。一个原因可能是作者没有意识到这个问题。这意味着开发者必须修复它们,或升级到一个无漏洞的版本,并向作者提交补丁。这一过程需要时间,导致软件在必要时被暴露在漏洞风险中。这也使得协调修复变得更加困难,且可能会泄漏漏洞的细节。
错误
这个问题类似于上一段提到的安全问题,但一般不如安全问题严重。
分叉
库被捆绑后,作者更容易对上游库进行分叉。虽然从表面上看,这样做更方便,但这意味着代码与上游分叉,使得解决安全问题或其他问题变得更加困难。原因之一是补丁变得更难以应用。
分叉的另一个问题是,由于代码与上游分叉,bug 需要重复解决,而不是集中在一个地方解决。这违背了开源软件的初衷。
符号冲突
当系统中已安装了某个库时,它可能会与捆绑版本发生冲突。这可能会导致编译或链接时立即出错,也可能导致运行时错误,后者可能更难追踪。后一种问题可能是因为两个库的版本不兼容。
许可问题
当捆绑来自不同来源的项目时,许可问题可能更容易出现,尤其是当许可不兼容时。
资源浪费
捆绑的库在多个层面上浪费资源。特别是当这些库已经存在于系统上时,构建实际应用的时间会变得更长。在运行时,它们可能占用不必要的内存,而系统全局库已经被其他程序加载,而捆绑的库却由另一个程序加载。
努力的浪费
当一个库需要为 FreeBSD 打补丁时,这些补丁必须再次应用到捆绑库中。这浪费了开发者的时间,因为这些补丁可能无法干净地应用。并且很难发现这些补丁其实是必需的。
尽可能使用未捆绑版本的库,通过向 Port 添加 LIB_DEPENDS 来指定依赖。如果这种 Port 还不存在,考虑创建一个新的 Port。
仅在上游有良好的安全记录并且使用未捆绑版本会导致过于复杂的补丁时,才使用捆绑库。
重要
在一些非常特殊的情况下,例如仿真器(如 Wine),Port 必须捆绑库,因为这些库属于不同架构,或者它们已被修改以适应软件的需求。在这种情况下,这些库不应该暴露给其他 Port 进行链接。可以在 Port 的 Makefile 中添加
BUNDLE_LIBS=yes。这将告诉 不计算提供的库。在将此添加到 Port 之前,请始终向 Ports 管理团队 <> 询问。
如果 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,以强制重新编译该库的新版本。
许可证各不相同,其中一些对应用程序如何打包、是否可以盈利性销售等方面有一定限制。
重要
Port 维护者有责任阅读软件的许可条款,并确保 FreeBSD 项目不会因通过 FTP/HTTP 或 CD-ROM 再分发源代码或已编译的二进制文件而违反相关条款。如果有疑问,请联系 。
在这种情况下,可以设置下节中说明的变量。
NO_PACKAGE此变量表示我们不能生成应用程序的二进制包。例如,许可协议可能禁止二进制再分发,或者可能禁止从修补过的源代码创建的包的分发。
然而,Port 的 DISTFILES 可以自由地在 FTP/HTTP 上镜像。它们也可以分发到 CD-ROM(或类似媒体),除非同时设置了 NO_CDROM。
如果二进制包没有普遍的用途,并且必须始终从源代码编译应用程序,请使用 NO_PACKAGE。例如,如果应用程序在编译时硬编码了与站点特定的配置信息,请设置 NO_PACKAGE。
设置 NO_PACKAGE 为说明为什么不能生成包的字符串。
NO_CDROM仅此变量表示,尽管我们允许生成二进制包,但我们不能将这些包或 Port 的 DISTFILES 放到 CD-ROM(或类似媒体)上进行转售。然而,二进制包和 Port 的 DISTFILES 仍然可以通过 FTP/HTTP 进行分发。
如果同时设置了 NO_PACKAGE 和 NO_CDROM,则只有 Port 的 DISTFILES 可用,并且仅通过 FTP/HTTP 分发。
设置 NO_CDROM 为说明为什么不能在 CD-ROM 上重新分发该 Port 的字符串。例如,如果该 Port 的许可证仅允许“非商业”使用,可以使用此设置。
NOFETCHFILES在 NOFETCHFILES 中定义的文件不能从任何 MASTER_SITES 获取。例如,当文件由供应商提供在 CD-ROM 上时,就是一个这样的文件。
检查这些文件是否在 MASTER_SITES 上可用的工具需要忽略这些文件,并且不报告它们的可用性。
RESTRICTED如果应用程序的许可既不允许镜像应用程序的 DISTFILES 也不允许以任何方式分发二进制包,请单独设置此变量。
不要与 RESTRICTED 一起设置 NO_CDROM 或 NO_PACKAGE,因为后者变量已经包含了前者的含义。
将 RESTRICTED 设置为说明为何该 Port 不能再分发的字符串。通常,这表示该 Port 包含专有软件,用户需要手动下载 DISTFILES,可能需要在注册软件或同意接受最终用户许可协议(EULA)的条款后进行下载。
RESTRICTED_FILES当设置 RESTRICTED 或 NO_CDROM 时,此变量默认值为 ${DISTFILES} ${PATCHFILES},否则为空。如果只有部分分发文件受到限制,可以设置此变量列出它们。
LEGAL_TEXT如果 Port 有上述变量未涵盖的法律问题,请将 LEGAL_TEXT 设置为解释该问题的字符串。例如,如果 FreeBSD 获得了特别许可来重新分发二进制文件,此变量必须注明这一点。
LEGAL设置上述任何变量的 Port 必须同时添加到 /usr/ports/LEGAL。第一列是匹配受限 distfiles 的通配符,第二列是 Port 的来源,第三列是 make -VLEGAL 的输出。
声明“此 Port 的 distfiles 必须手动获取”的首选方式如下:
这不仅通知用户,还在用户的机器上设置了适当的元数据,供自动化程序使用。
请注意,此段落必须在包含 bsd.port.pre.mk 后添加。
FreeBSD 的 Ports 框架支持通过使用多个 make 子进程来进行并行构建,这使得 SMP 系统可以利用所有可用的 CPU 功率,从而加快 Port 构建的速度和效果。
这是通过将 -jX 标志传递给在供应商代码上运行的 来实现的。这是 Port 的默认构建行为。不幸的是,并非所有 Port 都能很好地处理并行构建,因此可能需要显式禁用此功能,方法是添加 MAKE_JOBS_UNSAFE=yes 变量。当一个 Port 因竞争条件而导致间歇性构建失败时,就需要使用这个变量。
重要
设置
MAKE_JOBS_UNSAFE时,必须非常重要地在 Makefile 中进行说明,或者至少在提交信息中说明 为什么 启用时 Port 无法构建。否则,在以后提交更新时,几乎不可能修复问题或测试问题是否已经解决。
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 也应该如此。
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 传递额外的环境变量。
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的默认值关闭。 中说明的辅助工具使用相同的语义,但适用于可选值。
scons如果 Port 使用 SCons,请定义 USES=scons。
为了让第三方 SConstruct 尊重传递给 SCons 的所有环境变量(即最重要的 CC/CXX/CFLAGS/CXXFLAGS),请修改 SConstruct,使得构建 Environment 如下构建:
之后,可以使用 env.Append 和 env.Replace 进行修改。
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 框架中定义的许可证名称不匹配。需要将它们翻译为 中的名称。
meson对于使用 Meson 的 Port,请定义 USES=meson。
表格 5. 使用 meson 的 Port 变量
示例 8. USES=meson 示例
此代码片段演示了在 Port 中使用 Meson。
对于使用 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。
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,目前还需要以下修复:
如果一个 Port 需要任何 GNU Autotools 软件,添加 USES=autoreconf。有关更多信息,请参阅 。
gettext如果 Port 需要 gettext,请设置 USES=gettext,该 Port 将继承来自 的 libintl.so 依赖项。有关 gettext 用法的其他值,请参阅 。
一个比较常见的情况是 Port 使用 gettext 和 configure。通常,GNU configure 应该能够自动定位 gettext。
如果自动定位失败,可以通过 CPPFLAGS 和 LDFLAGS 传递 gettext 的位置,使用 localbase 如下:
一些软件产品允许禁用 NLS。例如,通过向 configure 传递 --disable-nls。在这种情况下,Port 必须根据 NLS 选项的状态有条件地使用 gettext。对于低到中等复杂度的 Port,可以使用以下惯用法:
或者使用较旧的选项方法:
接下来需要做的工作是安排使消息目录文件条件地包含在打包列表中。Makefile 部分的这个任务已经由惯用法提供。它在 部分中进行了说明。简而言之,pkg-plist 中每个出现的 %%NLS%% 将在 NLS 被禁用时替换为 "@comment",或者在 NLS 启用时替换为空字符串。因此,如果 NLS 关闭,以 %%NLS%% 为前缀的行将在最终的打包列表中变成注释;否则,前缀将直接被省略。然后,在 pkg-plist 中每个消息目录文件路径之前插入 %%NLS%%。例如:
在高复杂度的情况下,可能需要更高级的技术,例如 。
有一点需要注意的是,安装消息目录文件时,目标目录必须位于 LOCALBASE/share/locale 下,并且这些目录不应由 Port 创建或删除。最常见的语言有各自的目录列在 PORTSDIR/Templates/BSD.local.dist 中。许多其他语言的目录由 Port 管理。请查阅其 pkg-plist 并查看该 Port 是否会为独特的语言安装消息目录文件。
如果 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,设置:
在 Ports 中提供的 X11 实现是 X.Org。如果应用程序依赖于 X 组件,添加 USES= xorg 并设置 USE_XORG 为所需的组件列表。完整的组件列表可以在 中找到。
Mesa 项目旨在提供免费的 OpenGL 实现。要指定对该项目的不同组件的依赖,使用 USES= gl 和 USE_GL。有关可用组件的完整列表,请参见 。为了兼容性,yes 的值会映射为 glu。
示例 19. USE_XORG 示例
示例 20. 使用 X11 相关变量
如果 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。
如果 Port 安装了 X Window System 字体,请将它们放置在 LOCALBASE/lib/X11/fonts/local 中。
DISPLAY某些应用程序需要一个工作的 X11 显示器来成功编译。这对于没有图形界面的机器来说是一个问题。当使用此变量时,构建基础设施将启动虚拟帧缓冲 X 服务器。然后,工作 DISPLAY 会传递给构建过程。有关可能的参数,请参见 。
桌面条目()提供了一种在安装新程序时自动调整桌面功能的方法,无需用户干预。例如,新安装的程序会自动出现在兼容的桌面环境的应用程序菜单中。桌面条目起源于 GNOME 桌面环境,但现在已经成为标准,并且可以与 KDE 和 Xfce 一起使用。这种自动化功能对用户来说是一个真正的便利,建议可以在桌面环境中使用的应用程序采用桌面条目。
包含预定义 *.desktop 文件的 Port 必须在 pkg-plist 中包含这些文件,并将它们安装到 $LOCALBASE/share/applications 目录中。 可以用来安装这些文件。
如果 Port 的 portname.desktop 中包含 MimeType 条目,安装和卸载后必须更新桌面数据库。为此,定义 USES= desktop-file-utils。
DESKTOP_ENTRIES 创建桌面条目可以通过使用 DESKTOP_ENTRIES 来轻松为应用程序创建桌面条目。一个名为 name.desktop 的文件将自动创建、安装,并添加到 pkg-plist 中。语法如下:
可用的类别列表可以在 上找到。StartupNotify 表示该应用程序是否支持启动通知。启动通知通常是一个图形指示器,如出现在鼠标指针、菜单或面板上的时钟,表示程序正在启动。兼容启动通知的程序在启动后会清除指示器,而不兼容的程序则永远不会清除该指示器(可能会让用户困惑和恼火),因此必须将 StartupNotify 设置为 false,以便根本不显示该指示器。
示例:
DESKTOP_ENTRIES 会安装到由 DESKTOPDIR 变量指向的目录中。DESKTOPDIR 默认值为 ${PREFIX}/share/applications
本章解释了 Port 中使用的 GNOME 框架。该框架可以大致分为基础组件、GNOME 桌面组件和一些简化 Port 维护者工作的特殊宏。
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 之后设置。
本节解释了哪些宏是可用的,以及如何使用它们。就像在上述示例中使用的那样。更多关于 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 注册数据库中进行跟踪。
要获得更多有关 GNOME Port 的帮助,可以参考一些 示例。如果需要更多帮助,访问 查找联系信息。这些组件分为当前正在使用的 GNOME 组件和旧版组件。如果组件支持参数,它们将列在说明中的括号中。第一个参数为默认值。如果组件默认添加到构建和运行依赖项中,则会显示“Both”。
表 11 废弃组件:请勿使用
注意
有关 Qt 本身的一些 Port,请参阅 。
Ports 提供了对 Qt 5 和 Qt 6 的支持,分别通过 USES+=qt:5 和 USES+=qt:6。将 USE_QT 设置为所需的 Qt 组件(库、工具、插件)列表。
Qt 框架导出了一些可以供 Port 使用的变量,下面列出了一些:
表 12. 使用 Qt 的 Port 提供的变量
每个 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 后缀:
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 项目文件中直接修复此问题。
如果应用程序依赖于 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 中指定它们。
依赖 LXQt 的应用程序应设置 USES+= lxqt 并将 USE_LXQT 设置为所需组件的列表,如下表所示。
表 19. 可用的 LXQt 组件
示例 24. USE_LXQT 示例
这是一个简单的示例,USE_LXQT 会添加 LXQt 库的依赖。所需的 LXQt 组件和其他依赖项可以通过配置日志来确定。
如果 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 中定义。
当 Port 需要使用 Apache Ant 构建时,它必须定义 USE_ANT。Ant 被认为是子构建命令。当 Port 未定义 do-build 目标时,系统将设置一个默认的目标,该目标根据 MAKE_ENV、MAKE_ARGS 和 ALL_TARGET 运行 Ant。这与 中文档说明的 USES= gmake 机制类似。
在移植 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,有一个定义明确的政策,详情请见 。
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 应用程序。
PHP Web 应用程序通过 USES=php 声明对 PHP 的依赖。更多信息请参考 。
移植 PEAR 模块是一个非常简单的过程。
在 Port 的 Makefile 中添加 USES=pear。该框架将把相关文件安装到正确的位置,并在安装时自动生成 plist。
示例 25. PEAR 类的 Makefile 示例
技巧
PEAR 模块将使用 自动进行 flavor 化。
注意
如果使用非默认的
PEAR_CHANNEL,则构建时和运行时的依赖项将自动添加。
重要
PEAR 模块不需要定义
PKGNAMESUFFIX,该值会自动使用PEAR_PKGNAMEPREFIX填充。如果 Port 需要添加PKGNAMEPREFIX,则必须同时使用PEAR_PKGNAMEPREFIX来区分不同的 flavor。
同样,移植 Horde 模块是一个简单的过程。
在 Port 的 Makefile 中添加 USES=horde。该框架将把相关文件安装到正确的位置,并在安装时自动生成 plist。
USE_HORDE_BUILD 和 USE_HORDE_RUN 变量可以用于添加构建时和运行时对其他 Horde 模块的依赖。有关可用模块的完整列表,请参见 Mk/Uses/horde.mk。
示例 26. Horde 模块的 Makefile 示例
技巧
由于 Horde 模块也是 PEAR 模块,它们将使用 自动进行 flavor 化。
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。
Ports 支持多个 Tcl/Tk 版本的并行安装。Ports 应该至少支持默认的 Tcl/Tk 版本和更高版本,可以通过 USES=tcl 来指定。也可以通过附加版本号 :_xx_ 来指定所需的 tcl 版本,例如 USES=tcl:85。
表 27. 使用 Tcl/Tk 的 Ports 最有用的只读变量
有关这些变量的完整说明,请参阅 和 以及 。这些变量的完整列表可在 /usr/ports/Mk/Uses/tcl.mk 中找到。
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。
本节介绍了 wxWidgets 库在 Ports 树中的状态以及与 Ports 系统的集成。
wxWidgets 库有多个版本,它们之间存在冲突(安装的文件同名)。在 Ports 树中,这个问题通过为每个版本使用版本号后缀来解决,使每个版本安装在不同的路径下。
显而易见的缺点是每个应用程序都需要修改,以找到预期的版本。幸运的是,大多数应用程序会调用 wx-config 脚本来确定所需的编译器和链接器标志。该脚本的名称在每个可用版本中都是不同的。大多数应用程序会尊重环境变量,或接受配置参数来指定要调用的 wx-config 脚本。否则,它们必须进行补丁处理。
为了让 port 使用特定版本的 wxWidgets,提供了两个可供定义的变量(如果只定义了其中一个,另一个将设置为默认值):
表 28. 选择 wxWidgets 版本的变量
可用的 wxWidgets 版本及其在树中的对应 Port 如下:
表 29. 可用的 wxWidgets 版本
可以设置为这些组合之一,多个版本之间用空格分隔:
表 30. wxWidgets 版本规范
还有一些变量用于从可用版本中选择首选版本。它们可以设置为一个版本列表,列表中的第一个版本将具有更高的优先级。
表 31. 选择首选 wxWidgets 版本的变量
还有一些应用程序,尽管不是 wxWidgets 库,但与它们相关。这些应用程序可以在 WX_COMPS 中指定。可用的组件如下:
表 32. 可用的 wxWidgets 组件
每个组件的依赖类型可以通过添加后缀来选择,后缀与组件名称之间用分号分隔。如果没有指定后缀,则会使用默认类型(请参见 )。可用的依赖类型如下:
表 33. 可用的 wxWidgets 依赖类型
组件的默认依赖类型在下表中列出:
表 34. 默认 wxWidgets 依赖类型
示例 28. 选择 wxWidgets 组件
以下片段对应一个使用 wxWidgets 版本 2.4 及其贡献库的 port:
要检测已安装的版本,可以定义 WANT_WX。如果没有设置为特定版本,则组件将带有版本后缀。检测后,HAVE_WX 将会被填充。
示例 29. 检测已安装的 wxWidgets 版本和组件
此片段可以用于一个使用 wxWidgets 的 port,如果它已安装,或者选择了某个选项。
此片段可以用于一个启用 wxPython 支持的 port,如果 wxWidgets 已安装或者选中了相关选项,此外还包括版本 2.8。
这些变量可以在 port 中使用(在定义了 后)。
表 35. 为使用 wxWidgets 的 Ports 定义的变量
定义 WX_PREMK 以便在包含 bsd.port.pre.mk 后可以使用这些变量。
重要
当定义了
WX_PREMK,则版本、依赖、组件和定义的变量在修改 wxWidgets port 变量 后 包含 bsd.port.pre.mk 时不会发生变化。
示例 30. 在命令中使用 wxWidgets 变量
此片段展示了如何通过运行 wx-config 脚本来获取完整的版本字符串,将其分配给变量并传递给程序,使用 WX_PREMK。
注意
当 wxWidgets 变量位于目标中时,无需使用
WX_PREMK,可以安全地在命令中使用这些变量。
configure 参数一些 GNU configure 脚本仅通过设置 WX_CONFIG 环境变量无法找到 wxWidgets,可能需要额外的参数。可以使用 WX_CONF_ARGS 提供这些参数。
表 36. WX_CONF_ARGS 的合法值
本节介绍了 Lua 库在 Ports 树中的状态及其与 Ports 系统的集成。
Lua 库和对应的解释器有多个版本,它们之间存在冲突(安装文件时会使用相同的名称)。在 Ports 树中,通过使用版本号后缀将每个版本安装为不同的名称来解决这个问题。
显而易见的缺点是,每个应用程序都需要修改以找到期望的版本。但是,可以通过向编译器和链接器添加一些额外的标志来解决此问题。
使用 Lua 的应用程序通常应仅为一个版本构建。然而,针对 Lua 的可加载模块会为其支持的每个 Lua 版本构建单独的版本,并且依赖这些模块的 Port 应该通过在 Port 源中使用 @${LUA_FLAVOR} 后缀来指定版本。
使用 Lua 的 Port 应该有以下形式的行:
如果需要特定版本的 Lua 或版本范围,可以按 XY(可以多次使用)、XY+、-XY 或 XY-ZA 的格式指定。如果 DEFAULT_VERSIONS 设置的默认 Lua 版本位于请求的范围内,则将使用它,否则将使用默认版本最接近请求的版本。例如:
请注意,版本选择不会尝试基于已安装的 Lua 版本进行调整。
注意
使用
XY+格式的版本指定应该谨慎,Lua 的 API 在每个版本中都会有所变化,配置工具如 CMake 或 Autoconf 在未来的 Lua 版本上通常无法正常工作,直到它们被更新为支持这些版本。
使用 Lua 的软件可能已经编写为自动检测正在使用的 Lua 版本。通常,Port 应该覆盖这一假设,强制使用如上所述选择的特定 Lua 版本。根据正在移植的软件,这可能需要以下任何或所有操作:
使用 LUA_VER 作为参数的一部分,通过 CONFIGURE_ARGS 或 CONFIGURE_ENV(或其他构建系统的等效项)传递给软件的配置脚本;
向 CFLAGS、LDFLAGS 和 LIBS 分别添加 -I${LUA_INCDIR}、-L${LUA_LIBDIR} 和 -llua-${LUA_VER}
一个安装 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 之外。
在 Port 中可以使用以下变量。
表 37. 使用 Lua 的 Port 中定义的变量
对于指定了 module 参数的 Port,还有以下附加变量:
表 38. Lua 模块 Port 中定义的变量
示例 31. 使用 Lua 的应用程序 Makefile
此示例展示了如何引用运行时所需的 Lua 模块。请注意,引用必须指定一个 flavors。
32. 简单 Lua 模块的 Makefile
本节介绍了 Guile 在 Ports 树中的状态以及它与 Ports 系统的集成。
Guile 库和相应的解释器有多个版本,它们之间存在冲突(以相同的名称安装文件)。在 Ports 树中,通过使用版本号后缀将每个版本安装为不同的名称来解决这个问题。在大多数情况下,应用程序应该通过提供的配置变量检测正确的版本,并使用 pkg-config 来确定名称和相关路径。然而,一些应用程序(尤其是那些使用自己配置规则的应用程序,如 cmake 或 meson)将始终尝试使用最新版本。在这种情况下,要么修补 Port,要么声明构建冲突(见下文的 conflicts 选项),以确保在非 poudriere 构建时生成正确的依赖项。
使用 Guile 的应用程序通常应该仅为一个版本构建,最好是 DEFAULT_VERSIONS 中指定的版本,或者如果不支持该版本,则为它们支持的最新版本。然而,Guile 或 Scheme 库,或 Guile 的扩展模块,会为它们支持的每个 Guile 版本分别构建一个 flavors,并且这些模块的依赖关系应该使用 @${GUILE_FLAVOR} 后缀来指定 Port 来源。
使用 Guile 的 Port 应该定义 USES=guile:arg,arg…,并根据以下参数选择适当的值:
表 39. 使用 Guile 的 Ports 定义的参数
有一些额外的参数可用于处理特殊情况;详细信息请参见 Mk/Uses/guile.mk。
除非指定了 build 或 run,否则 LIB_DEPENDS 会同时接收 libguile 库依赖项以及 Guile 版本所需的其他依赖项,例如 libgc。通常情况下,Port 不需要与其使用 Guile 相关的其他依赖项。
使用 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。
安装 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 应创建子目录,详见下文。
这些变量在 Port 中可用。
表 40. 使用 Guile 的 Port 所定义的变量
以下内容定义了作为变量和 PLIST_SUB 条目的路径替代。变量形式以 _DIR 作为后缀,并且是完整路径(以 GUILE_PREFIX 为前缀)。
表 41. 使用 Guile 的 Port 定义的路径替代
iconvFreeBSD 操作系统自带了本地的 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 可用性
需要 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 提供除了它本身之外的子依赖项。
依赖于 Budgie 桌面的应用程序或库应设置 USES=budgie 并将 USE_BUDGIE 设置为所需组件的列表。
所有应用程序小部件通过 org.budgie_desktop.Raven 服务进行通信。默认的依赖项是 lib 和运行时,可以通过 :build 或 :run 来更改。例如:
示例 40. USE_BUDGIE 示例
使用以下 USES 宏之一来添加数据库依赖项,具体参考 。
数据库 USES 宏
表 42 数据库宏
示例 41. 使用 Berkeley DB 6
详见 。
示例 42. 使用 MySQL
当 Port 需要 MySQL 客户端库时,添加:
详见 。
示例 43. 使用 PostgreSQL
当 Port 需要 PostgreSQL 9.6 或更高版本的服务器时,添加:
详见 。
示例 44. 使用 SQLite 3
详见 。
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 关键字,通过运行修改当前运行系统的命令,包括启动或停止服务。
在提交一个包含 rc.d 脚本的 Port 之前,尤其是提交之前,请查阅以下检查清单,以确保它已经准备好。
Port 可以检查其中的大部分内容,但它不能替代适当的代码审查。
如果这是一个新文件,它是否具有 .sh 扩展名?如果是的话,必须将其更改为 file.in,因为 rc.d 文件不能以该扩展名结尾。
文件名(去掉 .in 后),PROVIDE 行和 $ name 是否匹配?文件名与 PROVIDE 匹配可以使调试变得更容易,特别是对于 问题。匹配文件名和 $ name 可以更容易地弄清楚哪些变量在 rc.conf[.local] 中是相关的。这也是所有新脚本的政策,包括基本系统中的脚本。
一些 Ports 需要特定的用户帐户,通常是运行该用户的守护进程。对于这些 Ports,请从 50 到 999 中选择一个 唯一 的 UID,并在 ports/UIDs(用于用户)和 ports/GIDs(用于组)中注册它。用户和组的唯一标识符应当相同。
当需要为 Port 创建新用户或组时,请包括这两个文件的补丁。
然后在 Makefile 中使用 USERS 和 GROUPS,用户将在安装该 Port 时自动创建。
当前保留的 UID 和 GID 列表可以在 ports/UIDs 和 ports/GIDs 中找到。
一些 Ports(例如内核加载模块)需要内核源代码文件,以便能够编译。正确的判断用户是否已安装这些文件的方法如下:
除了这个检查,kmod 特性会处理这些 Ports 需要考虑的大部分事项。
Ports 不得打包或安装 Go 库或源代码。Go Ports 必须在正常的获取阶段获取所需的依赖项,并且只应安装用户所需要的程序和内容,而不是 Go 开发人员需要的内容。
Ports 应该(按优先顺序):
使用与包源一起提供的供应依赖项。
获取上游指定的依赖版本(如果使用 go.mod、vendor.json 或类似文件)。
作为最后的手段(如果没有包含依赖或未明确指定版本)获取上游开发/发布时可用的依赖版本。
与 Go 语言一样,Ports 不得打包或安装 Haskell 库。Haskell Ports 必须静态链接它们的依赖,并在获取阶段获取所有的分发文件。
许多现代 shell(包括 bash、fish、tcsh 和 zsh)都支持参数和/或选项的 Tab 补全。这种支持通常来自完成文件,这些文件包含如何为某个命令工作进行 Tab 补全的定义。Ports 有时会附带自己的完成文件,或者 Port 维护者可能已经自己创建了它们。
如果有可用的完成文件,应该始终安装它们。没有必要为此创建选项。如果使用了选项,则始终在 OPTIONS_DEFAULT 中启用它。
表 43. 完整的 shell 完成文件名
不要注册对 shell 本身的任何依赖。
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)
如果没有使用 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
3.0
单一版本
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
libexo
libgui
libmenu
libutil
panel
thunar
libbudgie
桌面核心(库)
libmagpie
Budgie 的 X11 窗口管理器和合成器库
raven
用于访问不同应用程序小部件的面板一体化中心
screensaver
桌面特定的屏幕保护程序
数据库
USES 宏
Berkeley DB
MariaDB, MySQL, Percona
PostgreSQL
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}
QT_LIBDIR
concurrent
akonadicontacts
JAVA_EXTRACT
JAVA_HOME
APACHEETCDIR
PYTHON_SITELIBDIR
PY_FUTURES
WISH
LUA_LIBDIR
xfconf
# service name stopNO_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/fooUSE_LDCONFIG= yesUSE_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}
.endifUSES= cmake
CMAKE_SOURCE_PATH= ${WRKSRC}/subprojectCMAKE_ON= VAR1 VAR2
CMAKE_OFF= VAR3CMAKE_ARGS= -DVAR1:BOOL=TRUE -DVAR2:BOOL=TRUE -DVAR3:BOOL=FALSEenv = 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=enabledPORTNAME= 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/cliPORTNAME= 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-goGO_TARGET= ./dnscrypt-proxy:${PREFIX}/sbin/dnscrypt-proxyPORTNAME= 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:secpBINARY_ALIAS= git=trueUSES= gettext
GNU_CONFIGURE= yesUSES= gettext localbase:ldflags
GNU_CONFIGURE= yesGNU_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.mop5-IO-Tee>=0.64:devel/p5-IO-Teelib/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.gzUSES= perl5
USE_PERL5= buildUSES= perl5
USE_PERL5= patch build runUSES= perl5
USE_PERL5= configureUSES= perl5
USE_PERL5= modbuildUSES= perl5
USE_PERL5= modbuildtinyUSES= gl xorg
USE_GL= glu
USE_XORG= xrender xft xkbfile xt xaw# 使用一些 X11 库
USES= xorg
USE_XORG= x11 xpmUSES= displayDESKTOP_ENTRIES= "NAME" "COMMENT" "ICON" "COMMAND" "CATEGORY" StartupNotifyDESKTOP_ENTRIES= "ToME" "基于 JRR Tolkien 作品的 Roguelike 游戏" \
"${DATADIR}/xtra/graf/tome-128.png" \
"tome -v -g" "Application;Game;RolePlaying;" \
falseUSE_GNOME= gtk30PORTNAME= 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.xmlGCONF_SCHEMAS=my_app.schemas my_app2.schemas my_app3.schemasINSTALLS_OMF=yesUSES= qt:5
USE_QT= gui buildtools_build qmake_buildCONFIGURE_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_buildQMAKE_ARGS+= INCLUDEPATH+=${LOCALBASE}/include \
LIBS+=-L${LOCALBASE}/libUSES= cmake kde:5 qt:5
USE_KDE= ecm
USE_QT= core buildtools_build qmake_buildUSES= cmake lxqt qt:5 tar:xz
USE_QT= core dbus widgets buildtools_build qmake_build
USE_LXQT= buildtools libfmqtPLIST_FILES+= ${JAVAJARDIR}/myport.jarTOMCATDIR= ${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 mixerUSE_WX= 2.8
WX_COMPS= wx contribWANT_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
.endifUSE_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
.endifUSE_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}"
.endifUSES= luaUSES= lua:52-53USES= lua:modulePKGNAMEPREFIX= ${LUA_PKGNAMEPREFIX}USES= lua:flavorsPORTNAME= 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}/MakefileUSES= 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= libmenuUSES= xfce:gtk2
USE_XFCE= libmenu xfconfUSES= xfce
USE_XFCE= panelUSES= xfce
USE_XFCE= libexo libmenu libutil panelUSES= budgie
USE_BUDGIE= screensaver:buildUSES= budgie gettext gnome meson pkgconfig
USE_BUDGIE= libbudgieUSES= bdb:6USES= mysqlUSES= pgsql:9.6+
WANT_PGSQL= serverUSES= sqlite:3USE_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: LOGINKEYWORD: shutdowndoormand_flags=""USERS= pulse
GROUPS= pulse pulse-access pulse-rtUSES= kmod这里是 sys/param.h 中定义的 __FreeBSD_version 值的方便列表:
表 1. FreeBSD 15 __FreeBSD_version 值
表格 2. FreeBSD 14 __FreeBSD_version 值
表 3. FreeBSD 13 __FreeBSD_version 值
表 4.FreeBSD 12 __FreeBSD_version 值
第 5 表 FreeBSD 11 __FreeBSD_version 值
表 6. FreeBSD 10 __FreeBSD_version 值
表 7. FreeBSD 9 __FreeBSD_version 值
表 8. FreeBSD 8 __FreeBSD_version 值
表 9. FreeBSD 7 __FreeBSD_version 值
表 10. FreeBSD 6 __FreeBSD_version 值
表 11. FreeBSD 5 __FreeBSD_version 值
表 12. FreeBSD 4 __FreeBSD_version 值
表 13. FreeBSD 3 __FreeBSD_version 值
表 14. FreeBSD 2.2 __FreeBSD_version 值
注意
注意,2.2-STABLE 有时在 2.2.5-RELEASE 发布后以"2.2.5-STABLE"的形式标识自身。之前的模式是年份后跟月份,但社区决定改为从 2.2 开始采用更直接的主/次系统。这是因为在几个分支上的并行开发使得仅凭实际发布日期来分类发布变得不可行。不要担心旧的-CURRENT 版本;它们仅列在此供参考。
表 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
2023 年 8 月 24 日
15.0-CURRENT.
1500001
2023 年 9 月 17 日
在为 powerpc 实现 fpu_kern_enter 和 fpu_kern_leave 之后的 15.0-CURRENT。
1500002
2023 年 10 月 18 日
在更改 nfscommon 和 nfscl 模块之间的内部 KAPI 后的 15.0-CURRENT。
1500003
2023 年 11 月 1 日
在去除 inode64 转换的向前兼容代码后的 15.0-CURRENT。
1500004
2023 年 11 月 23 日
添加一个名为 vfs_exjail_clone() 的新 VFS 函数后,15.0-CURRENT 将会被 ZFS 模块使用。
1500005
2023 年 11 月 27 日
15.0-CURRENT 经历了一系列树上的机械更改:删除了 SCCS 标识,删除了#if 0 的版权字符串,在此大变革之后进行了机械样式修复并从 sys/cdefs.h 中删除了一些宏。
1500006
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
2023 年 12 月 11 日
在 libc 中为 Linux 兼容性暴露 execvpe 后的 15.0-CURRENT。
1500008
2023 年 12 月 24 日
LinuxKPI 更改后的 15.0-CURRENT。
1500009
2024 年 1 月 11 日
添加 vnode_pager_clean_async(9)和 vnode_pager_clean_sync(9)后的 15.0-CURRENT。
1500010
2024 年 1 月 12 日
在 nfscommon 和 nfscl 模块之间更改内部 KAPI 后的 15.0-CURRENT。
1500011
2024 年 1 月 17 日
添加 zfs.dataset 支持后,15.0-CURRENTjail(8)。
1500012
2024 年 1 月 24 日
在添加 kern_openatfp(9)和 kcmp(2)之后的 15.0-CURRENT。
1500013
2024 年 2 月 7 日
添加 libsys 后的 15.0-CURRENT。
1500014
2024 年 2 月 11 日
将 clang 和其他 LLVM 可执行文件切换为构建为 PIE 后的 15.0-CURRENT。
1500015
2024 年 3 月 13 日
从新总线资源 API 中的多个函数中删除冗余 type 和 rid 参数后的 15.0-CURRENT。
1500016
2024 年 3 月 18 日
引入 livedump_start_vnode(9) 后的 15.0-CURRENT。
1500017
2024 年 3 月 20 日
在修复构建最近的 boost 库时的 clang 断言或崩溃后的 15.0-当前
1500018
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
2024 年 5 月 31 日
通过将 CLOCK_BOOTTIME 重新定义为 CLOCK_MONOTONIC 而不是 CLOCK_UPTIME,更新为 15.0-CURRENT。
1500020
2024 年 7 月 12 日
移除对构建 armv6 的支持后,更新为 15.0-CURRENT。
1500021
2024 年 7 月 21 日
在 LinuxKPI 更改后,更新为 15.0-CURRENT。
1500022
2024 年 7 月 29 日
移除内核堆栈交换支持后,更新为 15.0-CURRENT。
1500023
2024 年 7 月 30 日
向 malloc(9) 添加新标志后,更新为 15.0-CURRENT。
1500024
2024 年 10 月 2 日
将 libmd.so.6 升级为 libmd.so.7 后,更新为 15.0-CURRENT。
1500025
2024 年 10 月 6 日
在扩展 vm_object 中的 flags 字段后,更新为 15.0-CURRENT。
1500026
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
2024 年 11 月 14 日
在隐藏 struct ifnet 并更改 sound(4) 的设备注册 KPI 后,更新为 15.0-CURRENT。
1500028
2024 年 11 月 25 日
添加 TDA_PSELECT 标志以实现信号掩码的提前恢复后,更新为 15.0-CURRENT。
1500029
2024 年 12 月 6 日
在添加 bus_attach_children、bus_detach_children 和 bus_identify_children 后,更新为 15.0-CURRENT。
1500030
2025 年 1 月 2 日
更改 bus_generic_detach 以在分离子设备后删除它们,更新为 15.0-CURRENT。
1500037
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
2021 年 1 月 22 日
14.0-CURRENT.
1400001
2021 年 1 月 23 日
在添加符号链接支持后的 14.0-CURRENT 进行无锁查找。
1400002
2021 年 1 月 26 日
1300000
2018 年 10 月 19 日
13.0-CURRENT.
1300001
2018 年 10 月 25 日
在提升 OpenSSL 共享库版本号后的 13.0-CURRENT
1300002
2018 年 10 月 25 日
1200000
2016 年 7 月 7 日
12.0-CURRENT.
1200001
2016 年 7 月 12 日
从 [a-z] -type 范围中删除协同比较后的 12.0-CURRENT。
1200002
2016 年 8 月 18 日
1100000
2013 年 10 月 10 日
11.0-CURRENT.
1100001
2013 年 10 月 19 日
添加对"首次启动"rc.d 脚本支持后的 11.0-CURRENT,因此ports可以利用此功能。
1100002
2013 年 11 月 5 日
1000000
2011 年 9 月 26 日
10.0-CURRENT.
1000001
2011 年 11 月 4 日
添加 posix_fadvise(2)系统调用后的 10-CURRENT。
1000002
2011 年 12 月 12 日
900000
2009 年 8 月 22 日
9.0-CURRENT.
900001
2009 年 9 月 8 日
导入 x86emu 后的 9.0-CURRENT,这是一个用于模拟实模式 x86 CPU 的软件仿真器,来自 OpenBSD。
900002
2009 年 9 月 23 日
800000
2007 年 10 月 11 日
8.0-CURRENT。将宽字节和单字节 ctype 分开。
800001
2007 年 10 月 16 日
8.0-CURRENT 在 libpcap 0.9.8 和 tcpdump 3.9.8 导入后。
800002
2007 年 10 月 21 日
700000
2005 年 7 月 11 日
7.0-CURRENT.
700001
2005 年 7 月 23 日
在所有自 RELENG_5 以来未更改的共享库版本提升后的 7.0-CURRENT。
700002
2005 年 8 月 13 日
600000
2004 年 8 月 18 日
6.0-CURRENT
600001
2004 年 8 月 27 日
在内核中永久启用 PFIL_HOOKS 后的 6.0-CURRENT 。
600002
2004 年 8 月 30 日
500000
2000 年 3 月 13 日
5.0-CURRENT
500001
2000 年 4 月 18 日
添加额外的 ELF 头字段,并更改 ELF 二进制品牌方法后的 5.0-CURRENT。
500002
2000 年 5 月 2 日
400000
1999 年 1 月 22 日
4.0-CURRENT 在 3.4 分支之后
400001
1999 年 2 月 20 日
在动态链接处理更改后的 4.0-CURRENT
400002
1999 年 3 月 13 日
300000
1996 年 2 月 19 日
3.0-CURRENT 在 mount(2)更改之前
300001
1997 年 9 月 24 日
挂载(2)更改后的 3.0-CURRENT
300002
1998 年 6 月 2 日
220000
1997 年 2 月 19 日
2.2-RELEASE
(not changed)
2.2.1-RELEASE
(not changed)
119411
2.0-RELEASE
199501
1995 年 3 月 19 日
2.1-CURRENT
199503
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