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...
2024.7.2 机器翻译至 5.18
版权所有 © 2000-2023 FreeBSD 文档项目
商标
FreeBSD 是 FreeBSD 基金会的注册商标。
Sun、Sun 微系统、Java、Java 虚拟机、JDK、JRE、JSP、JVM、Netra、OpenJDK、Solaris、StarOffice、SunOS 和 VirtualBox 是 Sun 微系统公司在美国和其他国家的商标或注册商标。
UNIX 是 The Open Group 在美国和其他国家的注册商标。
制造商和销售商用来区分其产品的许多名称被视为商标。如果这些名称出现在本文档中,并且 FreeBSD 项目意识到了商标声明,则这些名称后面将跟随“™”或“®”符号。
FreeBSD Ports 集合是几乎所有人在 FreeBSD 上安装应用程序 ("ports") 的方式。与 FreeBSD 的其他一切一样,这主要是志愿者的努力。阅读本文档时要牢记这一点。
在 FreeBSD 中,任何人都可以提交一个新port,或自愿维护一个现有的未维护的port。不需要特殊的提交特权。
对制作新port或升级现有ports感兴趣吗?太棒了!
接下来是创建一个适用于 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 来设置使用正确的值。 看看有什么简单的开始吧?看看所请求的ports列表,看看你是否可以处理其中的一个(或多个)。
对于任何port,都需要两个描述文件,无论它们实际上是否打包。它们是 pkg-descr 和 pkg-plist。它们的 pkg-前缀使它们与其他文件区分开来。
这是一个关于 port 的较长描述。简洁地解释 port 的功能即可。
这不是一个关于如何使用或编译 port 的手册或深入描述!请小心复制 README 或 man 手册。太多时候它们不是对 port 的简明描述,或者格式不合适。例如,man 手册使用了两端对齐的间距,在等宽字体下看起来特别糟糕。 另一方面,pkg-descr 的内容必须比 Makefile 中的 COMMENT 行长。它必须更深入地解释 port 是关于什么的。
一个写得很好的 pkg-descr 完全描述了 port,让用户无需查阅文档或访问网站即可了解软件的功能、用途以及特别好的功能。提到某些要求,如图形工具包、重要的依赖项、运行时环境或实现语言,有助于用户决定这个 port 是否适合他们。
此文件列出了port安装的所有文件。它也被称为“包装清单”,因为该软件包是通过打包在此处列出的文件而生成的。路径名是相对于安装前缀(通常为/usr/local)。
这里有一个小例子:
有关包装清单的详细信息,请参阅 pkg-create(8) 手册页。
只有一种情况可以省略 pkg-plist 。如果 port 只安装少量文件,请将它们列在 PLIST_FILES 中,位于 port 的 Makefile 内。例如,我们可以通过将这些行添加到 Makefile 中而无需在上述 oneko port 中使用 pkg-plist:
稍后我们将看到如何使用 pkg-plist 和 PLIST_FILES 来实现更复杂的任务。
请使用 portlint 查看port是否符合我们的指南。ports-mgmt/portlint 程序是ports集合的一部分。特别要检查 Makefile 是否格式正确,包的命名是否恰当。
在提交新 port 之前,请阅读做和不做的部分。
当满意于port时,唯一剩下的就是将其放入主 FreeBSD ports树中,并使所有其他人对此感到满意。
接下来,创建一个 patch(1)文件。假设port被称为 oneko ,并且属于 games 类别。
创建一个新的.diff 文件以供 New Port使用的示例
添加所有带有 git add . 的文件,然后使用 git diff 查看差异。例如:
确保所有必需的文件都已包含,然后将更改提交到您的本地分支并使用 git format-patch 生成补丁
使用 git format-patch 生成的补丁将包括作者身份和电子邮件地址,使开发人员更容易应用补丁(使用 git am )并给予适当的信用。
为了让提交者更容易将补丁应用于其 ports 树的工作副本,请从您的 ports 树的基础生成 .diff 文件。
使用 Ports & 软件包 产品,个别 Port 组件,按照显示的指南提交 oneko.diff 与错误提交表单。在 PR 的描述字段中添加程序的简短描述(可能是 COMMENT 的简短版本),并记得添加 oneko.diff 作为附件。
提交port后,请耐心等待。将新port包含在 FreeBSD 中的时间可能从几天到几个月不等。问题报告数据库的简单搜索表格可以在 https://bugs.freebsd.org/bugzilla/query.cgi 进行搜索。
要获取开放port PR 的列表,请在搜索表单中选择 Open 和Ports & 软件包,然后点击搜索。
在查看了新的port之后,如果有必要,我们会回复并将其提交到树中。提交者的姓名也将被添加到其他文件以及额外的 FreeBSD 贡献者列表中。
用于导出本书的 pdf,打印的话比 gitbook 导出的应该要好点。该脚本运行于 FreeBSD。
FreeBSD 手册
FreeBSD Port 开发者手册
FreeBSD 官方文章
《FreeBSD 项目模型》、《FreeBSD 常见问题解答》、《4.4BSD 操作系统设计与实现》
FreeBSD 架构手册
FreeBSD 开发者手册
FreeBSD 发行说明
FreeBSD 状态报告
在私有目录中解压 tarball 的副本,并进行任何必要的更改,以使port可以在当前版本的 FreeBSD 下正确编译。仔细跟踪每一步,因为不久之后将需要自动化这个过程。当port完成时,所有操作,包括文件的删除、添加或修改,都必须能够使用自动化脚本或补丁文件完成。
如果port需要显著的用户交互/定制来编译或安装,请查看 Larry Wall 的经典 Configure 脚本之一,并尝试做类似的事情。新的ports集合的目标是使每个port尽可能“即插即用”地为终端用户服务,同时使用最少的磁盘空间。
首先,当用户在port的目录中首次输入 make 时发生的事件序列是这样的。在另一个窗口中有 bsd.port.mk 可以帮助理解这个过程。
但不用担心,了解 bsd.port.mk 的工作原理的人并不多... :-)
运行 fetch 目标。 fetch 目标负责确保 tarball 在本地 DISTDIR 存在。 如果 fetch 在 DISTDIR 找不到所需的文件,它将查找 Makefile 中设置的 URL MASTER_SITES ,以及我们放置备份文件的 FTP 镜像。 然后,它将尝试使用 FETCH 检索命名的分发文件,假定请求站点可以直接访问互联网。 如果成功,它将保存文件在 DISTDIR 以供将来使用并继续进行。
运行 extract 目标。它在 DISTDIR 中查找 port 的分发文件(通常是压缩的 tarball),并将其解压缩到由 WRKDIR 指定的临时子目录中(默认为 work)。
运行 patch 目标。 首先,应用在 PATCHFILES 中定义的任何补丁。 其次,如果在 PATCHDIR 中找到任何名为 patch-*的补丁文件(默认为文件子目录),则按照字母顺序在此时应用它们。
该 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 目标。
现在用户输入 make install 时发生的情况更清楚了,让我们来看看创建完美port的建议步骤。
获取原始来源文件(通常)以一个压缩的 tar 文件(foo.tar.gz 或 foo.tar.bz2)并将其复制到 DISTDIR 。在可能的情况下,始终使用主流来源。
将变量 MASTER_SITES 设置为反映原始 tarball 位于何处。在 bsd.sites.mk 中存在大多数主流站点的快捷定义。请尽可能使用这些站点和相关定义,以帮助避免在源代码库中多次重复相同信息的问题。随着这些站点随时间而变化,对于所有参与者来说,这变成了一个维护的噩梦。有关详细信息,请参见 MASTER_SITES 。
如果没有与互联网连接良好的 FTP/HTTP 站点,或者只能找到格式非标准且令人恼火的站点,请将副本放在可靠的 FTP 或 HTTP 服务器上(例如主页)。
如果找不到方便且可靠的位置来放置分发文件,则可以将其"存放"在 ftp.FreeBSD.org 上;但是,这是最不希望的解决方案。必须将分发文件放置在某人的 freefall 帐户的~/public_distfiles/中。请要负责port的人这样做。此人还将 MASTER_SITES 设置为 LOCAL/username ,其中 username 是他们的 FreeBSD 集群登录名。
如果port的分发文件一直在没有任何作者版本更新的情况下不断更改,请考虑将分发文件放在主页上,并将其列为第 MASTER_SITES 个。试图说服port作者不要这样做;确实有助于建立某种源代码控制。托管特定版本将防止用户遇到 checksum mismatch 错误,还能减少我们 FTP 站点维护者的工作量。此外,如果port只有一个主站点,建议在主页上备份并将其列为第二 MASTER_SITES 个。
如果port需要来自互联网上可用的额外补丁,也将它们获取并放入 DISTDIR 中。不必担心它们来自主要源压缩包所在的站点之外,我们有办法处理这些情况(请参阅下面的 PATCHFILES 的描述)。
在准备port时,可以使用 diff(1)记录已添加或更改的文件,以便稍后提供给 patch(1)。这样做时,通常涉及在进行任何更改之前使用.orig 后缀保存原始文件的副本。
所有更改完成后, cd 返回到port目录。使用 make makepatch 在文件目录中生成更新的补丁文件。
补丁文件存储在 PATCHDIR 中,通常是 files/,从那里它们将自动应用。所有补丁必须相对于 WRKSRC 。通常 WRKSRC 是 WRKDIR 的一个子目录,即提取 dist 文件的目录。使用 make -V WRKSRC 查看实际路径。补丁名称必须遵循这些规则:
避免多个补丁修改同一文件。例如,同时使用 patch-foobar.c 和 patch-foobar.c2 对${WRKSRC}/foobar.c 进行更改会使它们变得脆弱且难以调试。
创建补丁文件名称时,请将每个下划线( _ )替换为两个下划线( __ ),将每个斜杠( / )替换为一个下划线( _ )。例如,要为名为 src/freeglut_joystick.c 的文件打补丁,请将相应的补丁命名为 patch-src_freeglut__joystick.c。不要命名为 patch-aa 或 patch-ab。在补丁名称中始终使用路径和文件名。使用 make makepatch 会自动生成正确的名称。
如果修改是相关的,并且补丁的命名合适,一个补丁可能会修改多个文件。例如,patch-add-missing-stdlib.h。
仅使用 [-+._a-zA-Z0-9] 字符来命名补丁。特别是,不要使用 :: 作为路径分隔符,而要使用 _ 。
在补丁中尽量减少非功能性空白变更的数量。在开源世界中,项目通常共享大量的代码库,但遵循不同的样式和缩进规则。当从一个项目中提取工作的功能块来修复另一个项目中的类似区域时,请务必小心:生成的补丁可能充满了非功能性的变更。这不仅增加了 ports 代码库的大小,而且使得难以确定到底是什么导致了问题,以及到底做了哪些改动。
如果必须删除文件,请在 post-extract 目标中执行,而不是作为补丁的一部分。
补丁被保存在名为 patch-的文件中,其中表示被打补丁的文件路径名,比如 patch-Imakefile 或 patch-src-config.h。文件名不以 patch-开头的补丁将不会自动应用。
文件修改后,使用 diff(1)记录原始版本和修改后版本之间的差异。 -u 导致 diff(1)生成"unified"格式的差异,这是首选格式。
当为新添加的文件生成补丁时, -N 用于告诉 diff(1)将不存在的原始文件视为存在但为空:
使用递归( -r )选项对 diff(1) 生成补丁是可以的,但请查看生成的补丁,以确保其中没有不必要的垃圾。特别是,两份备份文件之间的差异,port 使用 Imake 或 GNU configure 时的 Makefile 等都是不必要的,必须删除。如果需要编辑 configure.in 并运行 autoconf 重新生成 configure ,不要采用 configure 的差异(它通常会增长到几千行!)。相反,定义 USES=autoreconf 并获取 configure.in 的差异。
可以直接从 port Makefile 使用 sed(1) 的就地模式进行简单替换。当更改使用变量的值时,这非常有用。
经常,正在移植的软件在源文件中使用 CR/LF 约定。这可能会导致进一步打补丁、编译器警告或脚本执行(如{{ 0 }})出现问题。要快速将所有文件从 CR/LF 转换为 LF,将此条目添加到{{ 1001 }} Makefile 中:
可以提供要转换的特定文件列表:
使用 DOS2UNIX_REGEX 来转换子目录中的一组文件。它的参数是一个与 find(1) 兼容的正则表达式。有关格式的更多信息请参阅 re_format(7)。这个选项对于转换给定扩展名的所有文件非常有用。例如,转换所有源代码文件,保留二进制文件不变:
类似的选项是 DOS2UNIX_GLOB ,它对列出的每个元素运行 find 。
可以设置转换的基础目录。当存在多个 distfiles 且其中几个包含需要进行换行符转换的文件时,这非常有用。
一些ports需要仅在特定的 FreeBSD 版本或者特定选项启用或禁用时才应用的补丁。有条件的补丁通过将补丁文件的完整路径放置在 EXTRA_PATCHES 中指定。有条件的补丁文件名通常以 extra-开头,尽管这不是必要的。然而,它们的文件名不得以 patch-开头。如果是这样,框架会无条件地应用它们,这在有条件的补丁中是不希望的。
示例 1. 为特定的 FreeBSD 版本应用补丁
示例 2. 可选地应用补丁
当选项需要补丁时,使用 opt_EXTRA_PATCHES 和 opt_EXTRA_PATCHES_OFF 条件地应用补丁到 opt 选项上。有关更多信息,请参见通用变量替换。
示例 3. 使用 EXTRA_PATCHES 与目录
有时候,一个特性可能需要很多补丁,在这种情况下,可以将 EXTRA_PATCHES 指向一个目录,它会自动应用该目录中所有名为 patch-*的文件。
在${PATCHDIR}中创建一个子目录,并将补丁移动到其中。例如:
然后将其添加到 Makefile 中:
框架将使用该目录中所有名为 patch-*
的文件。
在 configure 脚本中包含任何额外的定制命令,并将其保存在 scripts 子目录中。如上所述,也可以使用名为 pre-configure 或 post-configure 的 Makefile 目标和/或脚本来完成此操作。
如果 port 需要用户输入来构建、配置或安装,请在 Makefile 中设置 IS_INTERACTIVE 。这将允许“隔夜构建”跳过它。如果用户在其环境中设置变量 BATCH (以及用户设置变量 INTERACTIVE ,那么只建立那些需要交互的 ports)。这将节省大量在不断构建 ports 的一组计算机上浪费的时间(参见下文)。
也建议如果有合理的默认答案可以回答问题,设置 PACKAGE_BUILDING 来关闭交互式脚本。这样我们可以为光盘和 FTP 构建软件包。
确保port规则确实按照所需方式执行,包括打包port。以下是需要验证的重要点:
pkg-plist 不包含任何 port 未安装的内容。
pkg-plist 包含 port 安装的所有内容。
install 目标可以安装 port。这可以验证安装脚本的正确性。
port可以使用 deinstall 目标正确卸载。这验证了卸载脚本的正确性。
port在 fetch 目标阶段期间只能访问网络资源。这对于软件包构建者(如ports-mgmt/poudriere)非常重要。
确保 make package 可以作为普通用户运行(即不是作为 root )。如果失败,可能需要修补软件。另请参阅 fakeroot 和 uidfix 。
过程: 推荐的测试顺序
make stage
make stage-qa
make package
make install
make deinstall
make package
(作为用户)
确保在任何阶段都不显示警告信息。
使用Ports集合的ports-mgmt/poudriere 可以进行全面的自动化测试,请查看 poudriere 以获取更多信息。它保持在 jails ,可以在不影响主机系统状态的情况下测试上述所有步骤。
只需键入 make makesum
。ports框架将自动生成 distinfo。请勿尝试手动生成文件。
配置 Makefile 非常简单,我们建议在开始之前查看现有示例。此外,本手册中还有一个示例 Makefile,请查看并遐照该模板中的变量和部分顺序,以使其他人更容易阅读port。
在设计新的 Makefile 时,请依次考虑这些问题:
它是否存储在 DISTDIR 中,作为一个标准的 gzip ped 压缩包,命名类似于 foozolix-1.2.tar.gz?如果是,请继续下一步。如果不是,发行文件格式可能需要覆盖 DISTVERSION , DISTNAME , EXTRACT_CMD , EXTRACT_BEFORE_ARGS , EXTRACT_AFTER_ARGS , EXTRACT_SUFX 或 DISTFILES 中的一个或多个。
在最坏的情况下,创建一个自定义 do-extract 目标来覆盖默认设置。这几乎是不必要的。
port 的 Makefile 的第一部分将命名 port、描述其版本号并将其列入正确的类别。
PORTNAME
将 PORTNAME 设置为软件的基本名称。它用作 FreeBSD 包的基础,以及 DISTNAME 。
将 DISTVERSION 设置为软件的版本号。
PORTVERSION 是用于 FreeBSD 软件包的版本号。它将自动从 DISTVERSION 派生,以兼容 FreeBSD 的软件包版本方案。如果版本包含字母,可能需要设置 PORTVERSION 而不是 DISTVERSION 。
有时候,一些软件将使用与 DISTVERSION 在 PORTVERSION 中翻译方式不兼容的版本方案。
示例 1. 使用 pkg-version(8) 比较版本
pkg version -t 接受两个版本作为参数,如果第一个版本小于、等于或大于第二个版本,它将分别返回 < 、 = 或 > 。
1.2 和 1.2 相等,因为它们的版本相同。
1.2 和 1.2.0 相等,因为零等于零。
1.2 在 1.2.p1 之后,如 .p1 ,想象“预发布 1”。
1.2.a1 在 1.2.b1 之前,如“alpha”和“beta”,而 a 在 b 之前。
1.2 是在 1.2p1 之前的 2p1 ,可以理解为“2,补丁级别 1”,这是在任何 2.X 之后但在 3 之前的版本。
在这里, a , b 和 p 被用作类似于“alpha”,“beta”或“预发布”和“补丁级别”的含义,但它们只是字母,并按字母顺序排序,因此可以使用任何字母,它们将被适当排序。
表 1. DISTVERSION 的示例和衍生 PORTVERSION
0.7.1d
0.7.1.d
10Alpha3
10。a3
3Beta7-pre2
3.b7.p2
8:f_17
8f.17
Example 2. 使用 DISTVERSION
当版本仅包含由点、破折号或下划线分隔的数字时,请使用 DISTVERSION 。
它将生成 1.2.4 的 PORTVERSION 。
例 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"或"预发布"
当版本包含以点、破折号或下划线分隔的数字,并且使用字母表示"alpha"、"beta"或"预发布",即在不带字母的版本之前,使用 DISTVERSION 。
两者都会生成 PORTVERSION 的 1.2.p4 ,这比 1.2 更早。pkg-version(8) 可以用来检查这个事实:
例 5. 当版本包含字母时,意味着 “补丁级别” 时不使用 DISTVERSION 。
当版本包含不是指“alpha”、“beta”或“pre”而是更多地表示“补丁级别”的字母,且表示该字母之后的版本,使用 PORTVERSION 。
在这种情况下,使用 DISTVERSION 是不可能的,因为它会生成一个在 1.2 之前而不是之后的 1.2.p4 版本。pkg-version(8)会验证这一点:
1.2 在 1.2p4 之前,这正是所需的。
对于一些更高级的示例,当软件的版本与 FreeBSD 的确不兼容时,或者当发行文件不包含版本本身时,请参见。
PORTREVISION
PORTREVISION 是一个单调递增的值,每次增加 DISTVERSION 时都会重置为 0,通常在每次有新的官方供应商发布时。如果 PORTREVISION 非零,则该值将附加到软件包名称上。对 PORTREVISION 的更改由像 pkg-version(8)这样的自动化工具使用,以确定是否有新的软件包可用。
每次对影响生成软件包的port的更改必须增加 PORTREVISION 。这包括仅影响使用非默认选项构建的软件包的更改。
PORTREVISION 必须提升的示例情况:
添加补丁以修复安全漏洞、错误或向port添加新功能的情况。
更改 port 的 Makefile,以启用或禁用软件包的编译时选项。
更改软件包的打包列表或安装时行为。例如,更改生成软件包初始数据的脚本,如 ssh(1) 主机密钥的脚本。
提升 port 的共享库依赖版本(在这种情况下,安装旧软件包后尝试安装更新版本的依赖库将失败,因为它将寻找旧的 libfoo.x 而不是 libfoo.(x+1))。
具有重大功能差异的port distfile 的静默更改。例如,对 distfile 的更改需要对 distinfo 进行更正,但旧版本和新版本的 DISTVERSION 没有相应的更改,显示代码的重大更改。
对 MAINTAINER 的更改。
不需要 PORTREVISION 增量的示例更改:
对 port 骨架的样式更改,对生成的软件包没有功能上的影响。
对 MASTER_SITES 或其他对 port 有功能影响但不影响生成软件包的更改。
对 distfile 的琐碎补丁,如拼写错误的更正,这些不重要到用户必须费力升级的程度。
修复构建问题,使软件包在先前无法通过编译的情况下能够通过编译。只要更改不会在软件先前已构建的任何其他平台上引入任何功能更改。由于 PORTREVISION 反映了软件包的内容,如果软件包先前无法构建,则无需增加 PORTREVISION 来标记更改。
一个经验法则是决定提交给port的更改是否会使一些人受益。不管是因为增强、修复,还是由于新的软件包实际上是否会起作用。然后将其与那个事实权衡是否会导致每个定期更新其ports树的人都被迫进行更新。如果是的话,必须增加 PORTREVISION 。
PORTEPOCH
有时,软件供应商或 FreeBSD porter 会做一些愚蠢的事情,发布的新版软件实际上比以前的版本数值上更小。例如,这是一个 port 的例子,从 foo-20000801 变为 foo-1.0(前者将被错误地视为更新版本,因为 20000801 在数值上大于 1)。
的输出表明版本 0.031 被认为大于版本 0.29,这对于 porter 来说可能并不明显。
在这种情况下, PORTEPOCH 必须增加。如果 PORTEPOCH 非零,它会如上节第 0 节所述附加到软件包名称后面。 PORTEPOCH 永远不能减少或重置为零,因为这会导致与更早时期的软件包比较失败。例如,软件包将不会被检测为过时。新版本号,在上例中的 1.0,1 ,数值上仍然小于之前的版本 20000801,但自动工具会特别对待 ,1 后缀,并发现其大于之前软件包的隐含后缀 ,0 。
PORTEPOCH 重置错误地导致了无尽的痛苦。如果上述讨论不够清晰,请参阅 FreeBSD ports 邮件列表。
预期 PORTEPOCH 将不会用于 ports 的大部分情况下,明智地使用 DISTVERSION ,或者小心地使用 PORTVERSION ,往往可以在软件的未来版本结构变化时预防必要的情况。然而,FreeBSD porter 在供应商发布没有官方版本号的情况下(例如代码“快照”发布)需要小心。诱因是用发布日期标记发布,这会在新的“官方”版本发布时造成问题,如上例所示。
例如,如果在 20000917 发布了一个快照版本,并且软件的上一个版本是版本 1.2 ,不要为 DISTVERSION 使用 20000917 。正确的方式是 DISTVERSION 的 1.2.20000917 ,或类似方式,使得后续发布,如 1.3 ,仍然是一个数字上更大的值。
gtkmumble port中,版本 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
两个可选变量, PKGNAMEPREFIX 和 PKGNAMESUFFIX ,与 PORTNAME 和 PORTVERSION 结合形成 PKGNAME ,如 ${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION} 。请确保这符合我们的良好软件包命名准则。特别是,在 PORTVERSION 中使用连字符( - )是不允许的。另外,如果软件包名称具有语言或编译特定部分(请查看下文),请使用 PKGNAMEPREFIX 和 PKGNAMESUFFIX ,分别。不要将它们作为 PORTNAME 的一部分。
这些是命名包时要遵循的约定。这是为了使包目录易于扫描,因为已经有成千上万个包,如果他们伤害他们的眼睛,用户将会离开!
包名称采用语言_区域-名称-已编译.具体-版本.数字 的形式。
包名被定义为 ${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION} 。确保设置变量符合该格式。
语言_地区-
FreeBSD 致力于支持其用户的母语。当port特定于某种语言时,“语言_”部分是由 ISO-639 定义的自然语言的两字母缩写。例如, ja 代表日语, ru 代表俄语, vi 代表越南语, zh 代表中文, ko 代表韩语, de 代表德语。
如果 port 特定于语言区域内的某个区域,请添加两位国家代码。例如, en_US 代表美式英语, fr_CH 代表瑞士法语。
语言部分设置在 PKGNAMEPREFIX 。
名字
确保 port 的名称和版本明确定义并放置在 PORTNAME 和 DISTVERSION 处。 PORTNAME 的唯一原因包含版本部分是如果上游分发真的是以这种方式命名,如 textproc/libxml2 或 japanese/kinput2-freewnn ports。否则, PORTNAME 不能包含任何特定版本信息。几个 ports 具有相同 PORTNAME 是相当正常的,就像 www/apache* ports 一样;在这种情况下,通过 PKGNAMEPREFIX 和 PKGNAMESUFFIX 值来区分不同版本(和不同的索引条目)是很自然的。
有一个传统,即通过在前面加上 p5- 并将双冒号分隔符转换为连字符来对 Perl 5 模块进行命名。例如, Data::Dumper 模块变成为 p5-Data-Dumper 。
-compiled.specifics
如果port可以用不同的硬编码默认值构建(通常是ports系列中的目录名称的一部分),则-compiled.specifics 部分表示编译默认值。连字符是可选的。示例包括纸张尺寸和字体单位。
-compiled.specifics 部分设置为 PKGNAMESUFFIX 。
-版本.号
版本字符串遵循短横线( - )并且是由整数和单个小写字母组成的以句点分隔的列表。特别是,版本字符串内部不允许有另一个短横线。唯一的例外是字符串 pl (表示“补丁级”),只能在软件中没有主版本号和次版本号时使用。如果软件版本中包含“alpha”、“beta”、“rc”或“pre”之类的字符串,取第一个字母并立即放在句点之后。如果在这些名称之后还有版本字符串,则数字跟在单个字母后面,而它们之间不需要额外的句点(例如, 1.0b2 )。
这个想法是通过查看版本字符串使ports更容易排序。特别是,请确保版本号组件始终由句点分隔,并且如果日期是字符串的一部分,请使用 dyyyy.mm.dd 格式,而不是 dd.mm.yyyy 或非 Y2K 兼容的 yy.mm.dd 格式。很重要的是用一个字母(这里 d )作为版本的前缀,以防发布具有实际版本号的版本,这个版本号在数字上小于 yyyy 。
这里有一些(真实的)示例,说明如何将软件作者称之为的名称转换为适当的软件包名称,对于每行,仅在 DISTVERSION 或 PORTVERSION 中的一个设置,取决于在port的 Makefile 中将使用哪个:
表 2。软件包命名示例
mule-2.2.2
(空)
mule
(空)
2.2.2
无需更改
mule-1.0.1
(空)
mule
1
1.0.1
这是 mule 的第一个版本,第二个版本已经存在
EmiClock-1.0.2
(空)
emiclock
(空)
1.0.2
单个程序不使用大写名称
rdist-1.3alpha
(空)
rdist
(空白)
1.3alpha
版本将会是 1.3.a
es-0.9-beta1
(empty)
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
(empty)
psutils
-letter
1.13
软件包构建时硬编码的纸张大小
pkfonts
(空白)
pkfonts
300
1.0
300dpi 字体包
如果原始来源中绝对没有版本信息的痕迹,并且原作者不太可能发布另一个版本,则只需将版本字符串设置为 1.0 (如上面的 piewm 示例)。否则,请询问原作者或使用源文件发布的日期字符串( dyyyy.mm.dd ,或 dyyyymmdd )作为版本。
评论是对port的一行描述,由 pkg info 显示。撰写评论时,请遵循以下规则:
评论字符串应为 70 个字符或更少。
不要包括软件的软件包名称或版本号。
评论必须以大写字母开头,结尾不加句点。
不要以不定冠词开头(即 A 或 An)。
首字母大写命名,如 Apache、JavaScript 或 Perl。
对于词汇列表,请使用串行逗号:“绿色、红色和蓝色”。
检查拼写错误。
这是一个例子:
在 Makefile 中,COMMENT 变量紧随 MAINTAINER 变量之后。
每个port应指向提供有关该软件的更多信息的网站。
如果可能的话,这应该是由软件开发人员维护的官方项目网站。
但它也可以是源代码库中的目录或资源:
WWW 变量紧随 Makefile 中的 COMMENT 变量之后。
如果相同内容可以通过 HTTP 和 HTTPS 访问,则应使用以 https:// 开头的 URL。如果 URI 是网站或目录的根目录,则必须以斜杠结尾。
这些信息过去放在 pkg-descr 文件的最后一行。现已移到 Makefile 中以便更容易维护和处理。在 pkg-descr 文件末尾有 WWW: 行已被弃用。
每个port必须记录其可用的许可证。如果它不是一个 OSI 批准的许可证,还必须记录任何关于重新分发的限制。
LICENSE
对于许可证的简称或适用的多个许可证。
如果它是预定义许可证列表中列出的许可证之一,则只能设置 LICENSE_FILE 和 LICENSE_DISTFILES 变量。
如果这是未在ports框架中定义的许可证(请参阅预定义许可证列表),则必须设置 LICENSE_PERMS 和 LICENSE_NAME ,以及 LICENSE_FILE 或 LICENSE_TEXT 。 LICENSE_DISTFILES 和 LICENSE_GROUPS 也可以设置,但不是必需的。
预定义的许可证显示在预定义许可证列表中。当前列表始终可在 Mk/bsd.licenses.db.mk 中找到。
示例 28。最简单的用法,预定义许可证
当某些软件的 README 中写着"This software is under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version."但没有提供许可证文件时,请使用以下内容:
软件提供许可文件时,请使用此文件:
对于预定义许可证, 默认权限为 dist-mirror dist-sell pkg-mirror pkg-sell auto-accept 。
表 7。预定义许可证列表
AGPLv3
GNU Affero General Public License version 3
FSF GPL OSI
(默认)
AGPLv3+
GNU Affero General Public License version 3 (或更高)
FSF GPL OSI
(默认)
APACHE10
Apache 许可证 1.0
FSF
(默认)
APACHE11
Apache 许可证 1.1
FSF OSI
(默认)
APACHE20
Apache 许可证 2.0
FSF OSI
(默认)
ART10
艺术许可证版本 1.0
OSI
(默认)
ART20
艺术许可证版本 2.0
FSF GPL OSI
(默认)
ARTPERL10
艺术许可证(perl)版本 1.0
OSI
(默认)
BSD
BSD 许可证通用版本(已弃用)
FSF OSI COPYFREE
(默认)
BSD2CLAUSE
BSD 2 条款“简化”许可证
FSF OSI COPYFREE
(默认)
BSD3CLAUSE
BSD 三条款“新”或“修订”许可证
FSF OSI COPYFREE
(默认)
BSD4CLAUSE
BSD 四条款“原始”或“旧”许可证
FSF
(默认)
BSL
Boost 软件许可证
FSF OSI COPYFREE
(默认)
CC-BY-1.0
知识共享 署名 1.0
(默认)
CC-BY-2.0
知识共享 署名 2.0
(默认)
CC-BY-2.5
知识共享 署名-相同方式共享 2.5
(默认)
CC-BY-3.0
知识共享 署名 3.0
(默认)
CC-BY-4.0
知识共享 署名 4.0
(默认)
CC-BY-NC-1.0
创作共用署名-非商业性使用 1.0
dist-mirror<code>pkg-mirror</code>auto-accept
CC-BY-NC-2.0
创作共用署名-非商业性使用 2.0
dist-mirror<code>pkg-mirror</code>auto-accept
CC-BY-NC-2.5
知识共享署名-非商业性使用 2.5
dist-mirror<code>pkg-mirror</code>auto-accept
CC-BY-NC-3.0
知识共享署名-非商业性使用 3.0
dist-mirror<code>pkg-mirror</code>auto-accept
CC-BY-NC-4.0
知识共享署名-非商业性使用 4.0
dist-mirror<code>pkg-mirror</code>auto-accept
CC-BY-NC-ND-1.0
创作共用 署名-非商业性使用-禁止演绎 1.0
dist-mirror<code>pkg-mirror</code>auto-accept
CC-BY-NC-ND-2.0
创作共用 署名-非商业性使用-禁止演绎 2.0
dist-mirror<code>pkg-mirror</code>auto-accept
CC-BY-NC-ND-2.5
创作共用 署名-非商业性使用-禁止演绎 2.5
dist-mirror<code>pkg-mirror</code>auto-accept
CC-BY-NC-ND-3.0
知识共享 署名 非商业性 使用 禁止演绎 3.0
dist-mirror<code>pkg-mirror</code>auto-accept
CC-BY-NC-ND-4.0
知识共享 署名 非商业性 使用 禁止演绎 4.0
dist-mirror<code>pkg-mirror</code>auto-accept
CC-BY-NC-SA-1.0
知识共享 署名 非商业性 使用 禁止演绎 相同方式共享 1.0
dist-mirror<code>pkg-mirror</code>auto-accept
CC-BY-NC-SA-2.0
创作共用署名-非商业性使用-相同方式共享 2.0
dist-mirror<code>pkg-mirror</code>auto-accept
CC-BY-NC-SA-2.5
创作共用署名-非商业性使用-相同方式共享 2.5
dist-mirror<code>pkg-mirror</code>auto-accept
CC-BY-NC-SA-3.0
创作共用署名-非商业性使用-相同方式共享 3.0
dist-mirror<code>pkg-mirror</code>auto-accept
CC-BY-NC-SA-4.0
知识共享 署名-非商业性使用-相同方式共享 4.0 国际许可协议
dist-mirror<code>pkg-mirror</code>auto-accept
CC-BY-ND-1.0
知识共享 署名-禁止演绎 1.0 国际许可协议
(默认)
CC-BY-ND-2.0
创作共用 姓名表示 禁止演绎 2.0
(默认)
CC-BY-ND-2.5
创作共用 姓名表示 禁止演绎 2.5
(默认)
CC-BY-ND-3.0
署名-禁止演绎 3.0 国际 (Creative Commons Attribution No Derivatives 3.0)
(默认)
CC-BY-ND-4.0
创作共用署名禁止演绎 4.0
(默认)
CC-BY-SA-1.0
创作共用署名相同方式共享 1.0
(默认)
CC-BY-SA-2.0
创建共享署名-相同方式共享 2.0
(默认)
CC-BY-SA-2.5
创作共用署名-相同方式共享 2.5
(默认)
CC-BY-SA-3.0
创作共用署名-相同方式共享 3.0
(默认)
CC-BY-SA-4.0
创作共用署名-相同方式共享 4.0
(默认)
CC0-1.0
创作共用 CC0 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 Lesser General Public License version 2.1
FSF GPL OSI
(默认)
LGPL21+
GNU Lesser General Public License version 2.1(或更高版本)
FSF GPL OSI
(默认)
LGPL3
GNU Lesser General Public License 版本 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
开放作品许可证 (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
无许可证
COPYFREE FSF GPL
(默认)
WTFPL
你想干什么都行公共许可证第 2 版
GPL FSF COPYFREE
(默认)
WTFPL1
做你他妈想做的公共许可证版本 1
GPL FSF COPYFREE
(默认)
ZLIB
zlib 许可证
GPL FSF OSI
(默认)
ZPL21
Zope 公共许可证版本 2.1
GPL OSI
(默认)
权限。如果为空使用 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_PACKAGE 。软件包将不会从 FreeBSD 软件包 CDN https://pkg.freebsd.org/分发。
允许销售软件包。该软件包将出现在安装程序映像上。
禁止销售软件包。这相当于设置 NO_CDROM 。该软件包将不会出现在安装程序映像上。
默认情况下, auto-accept 许可证已被接受。仅当用户定义了 LICENSES_ASK 才会显示提示要接受许可证。除非许可证规定用户必须接受许可证条款,否则请使用此选项。
默认情况下, no-auto-accept 许可证未被接受。用户将被要求始终确认接受此许可证。如果许可证规定用户必须接受其条款,则必须使用此选项。
当同时存在 permission 和 no-permission 时, no-permission 将取消 permission 。
当 permission 不存在时,视为 no-permission 。
一些缺失的权限将会阻止 port(以及所有依赖它的 ports)可被软件包用户使用: 没有 auto-accept 权限的 port 永远不会被构建,并且所有依赖它的 ports 将被忽略。 没有 pkg-mirror 许可的port将在构建后被移除,以及所有依赖于它的ports,它们最终将被分发。
示例 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 取消权限。所得到的权限列表是 dist-mirror pkg-mirror auto-accept。分发文件和软件包将不会在安装镜像上可用。
许可组所属的组
预定义许可组列表
FSF
自由软件基金会批准,请查看 FSF 许可及合规团队。
GPL
GPL 兼容
OSI
OSI 批准,请查看开放源代码组织开源许可证页面。
COPYFREE
遵守 Copyfree 标准定义,请参见 Copyfree 许可证页面。
FONTS
字体许可证
授权的完整名称。
示例 31. LICENSE_NAME
包含许可证文本的文件的完整路径,通常是 ${WRKSRC}/some/file。如果文件不在 distfile 中,并且其内容太长而无法放入 LICENSE_TEXT 中,则将其放入 ${FILESDIR} 中的新文件中。
示例 32. LICENSE_FILE
用作许可证的文本。在许可证不在分发文件中且其文本较短时非常有用。
示例 33. LICENSE_TEXT
适用许可证的发行文件。默认适用于所有发行文件。
示例 34. LICENSE_DISTFILES
当发行文件不全都具有相同的许可证时使用。例如,一个具有代码许可证,另一个具有一些不能重新分发的艺术作品时:
LICENSE_COMB
设置为 multi 如果所有许可证适用。如果有任何许可证适用,则设置为 dual 。默认为 single 。
示例 35。双重许可证
当一个port说"本软件可以根据 GNU 通用公共许可证或艺术许可证进行分发"时,这意味着可以使用任一许可证。使用这个:
如果提供许可文件,请使用此选项:
示例 36. 多个许可证
当port的一部分具有一个许可证,而另一部分具有不同的许可证时,请使用 multi :
如果port anchors 其主目录树位置不在 PREFIX
之外,请使用 MANDIRS
来指定这些目录。请注意,与手册页对应的文件必须放在 pkg-plist 中,以及其他文件一起。 MANDIRS
的目的是启用手册页的自动压缩,因此文件名会加上.gz 后缀。
5.3.1. CATEGORIES
当一个软件包被创建时,它被放置在 /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。
Emacs 模式与模式支持的应用程序放在同一个 ports 类别中,而不是在 editors 中。例如,用于编辑某些编程语言的源文件的 Emacs 模式放入 lang。
Ports 安装可加载内核模块也在它们的 CATEGORIES 行中有虚拟类别 kld。这是通过添加 USES=kmod 自动处理的事项之一。
如果与其他非虚拟类别中没有出现 misc,则表示如果在 CATEGORIES 中有 misc 与其他内容,则可以安全删除 misc 并将 port 仅放置在另一个子目录中。
如果 port 真的没有其他适合的地方,请放入 misc。
如果类别没有明确定义,请在 bug 数据库中 port 提交时添加一条评论,以便在导入之前讨论。作为提交者,请发送一封邮件到 FreeBSD ports 邮件列表,以便我们可以首先讨论。太多情况下,新的 ports 被导入到错误的类别,然后立即移动。
随着Ports收藏品的增长,引入了各种新分类。新分类可以是虚拟分类-即不在ports树中具有相应子目录的分类- 或物理分类-即在ports树中具有相应子目录的分类。本节讨论了创建新物理分类涉及的问题。在提出新分类之前,请仔细阅读。
我们现有的做法是避免创建新的物理分类,除非逻辑上大量的ports应属于该分类,或者应属于该分类的ports是一个逻辑上独特且受到有限普遍兴趣的群体(例如,与口头人类语言有关的分类),或者最好两者兼而有之。
这样做的理由是,这样的变化会给所有跟踪Ports Collection 变化的提交者和用户带来相当多的工作量。此外,拟议的类别变动似乎自然而然地会引起争议。(也许这是因为对于何时一个类别“太大”没有明确的共识,或者类别是否应该适合浏览(以及理想的类别数量是多少),等等。)
这是程序:
在 FreeBSD ports 邮件列表上提出新类别。包括新类别的详细理由,包括为什么现有类别不够用,以及要移动的现有ports列表。(如果在 Bugzilla 中有适合该类别的新ports,也将它们列出。)如果您是维护者和/或提交者,请提及,因为这可能有助于案例。
参与讨论
如果看起来支持这个想法,请提交包括理由和需要移动的现有ports列表的 PR。理想情况下,这个 PR 还会包括以下补丁:
一旦它们被复制,为新的ports创建 Makefiles
新类别的 Makefile
旧类别的ports的 Makefile
依赖旧ports的ports的 Makefiles
对于额外的学分,请包括根据提交者指南中的程序需要更改的其他文件。
如果该 PR 获得批准,一个 committer 需要按照提交者指南中概述的其余程序继续操作。
提议新建虚拟类别类似于上述过程,但涉及较少操作,因为不必移动任何 ports。在这种情况下,将包括在 PR 中的唯一补丁是那些将新类别添加到受影响 ports 的 CATEGORIES 中。
有时候有人提议用 2 级结构或其他一些关键字结构重新组织类别。到目前为止,这些提议都没有任何进展,因为虽然很容易提出,但要将现有的 ports 集合整体重新组织的工作量令人望而却步。在发布这个想法之前,请阅读邮件列表存档中关于这些提议的历史。此外,请准备好接受挑战,以提供一个工作原型。
如果port需要通过使用变量(例如,分辨率或纸张大小)采用不同的值来构建略有不同版本的软件包,则为每个软件包创建一个子目录,以使用户更容易看到该怎么做,但尽量共享尽可能多的文件。通常,通过巧妙使用变量,只需要在除一个之外的所有目录中使用非常简短的 Makefile。在唯一的 Makefile 中,使用 MASTERDIR 来指定其余文件所在的目录。此外,将变量作为 PKGNAMESUFFIX 的一部分,以便软件包将具有不同的名称。
这将通过一个例子最好地展示。这是打印/pkfonts300/Makefile 的一部分;
print/pkfonts300 还具有所有常规的补丁、软件包文件等。在那里运行 make ,它将采用分辨率(300)的默认值,并正常构建port。
至于其他分辨率,这是整个 print/pkfonts360/Makefile:
(print/pkfonts118/Makefile、print/pkfonts600/Makefile,以及所有其他文件都类似)。 MASTERDIR 定义告诉 bsd.port.mk 正规子目录集(例如 FILESDIR 和 SCRIPTDIR )应位于 pkfonts300 下。 RESOLUTION=360 行将覆盖 pkfonts300/Makefile 中的 RESOLUTION=300 行,并且 port 将以分辨率设置为 360 构建。
许多应用程序依赖于其他组件。这是大多数类 Unix 操作系统(包括 FreeBSD)非常方便的功能。多个应用程序可以共享通用的依赖项,而不是将每个需要它的软件包或包装都捆绑在一起。有七个变量可以用来确保用户机器上的所有必需部分都存在。此外,还有一些预先支持的依赖变量用于常见情况,以及一些用于控制依赖项行为的额外变量。
LIB_DEPENDS
此变量指定此port依赖的共享库。这是一个包含 lib:dir 个元组的列表,其中 lib 是共享库的名称, dir 是查找共享库的目录,以防找不到。例如,
将搜索一个带有任何版本的共享 jpeg 库,并下降到ports树的 graphics/jpeg 子目录以构建和安装它(如果找不到)。
依赖关系检查两次,一次在 build 目标内部,然后在 install 目标内部。此外,依赖项的名称将放入软件包中,因此如果用户系统上没有的话, pkg install (参见 pkg-install(8)) 将自动安装它。
RUN_DEPENDS
此变量指定了运行时此 port 依赖的可执行文件或文件。它是一个列表,其中每个元素是 path:dir [: target ] 元组,其中 path 是可执行文件或文件的名称,dir 是在其中查找它的目录(如果不可用),target 是在该目录中调用的目标。如果路径以斜杠开头( / ),则将其视为文件,并检查其是否存在于 test -e 中;否则,假定它是可执行文件,并使用 which -s 来确定该程序是否存在于搜索路径中。
例如,
如果文件或目录 /usr/local/news/bin/innd 不存在,则从 ports 树的 news/inn 子目录构建并安装它。如果在搜索路径中找不到名为 xmlcatmgr 的可执行文件,则会进入 textproc/xmlcatmgr 进行构建和安装。
依赖项从 install 目标内部进行检查。此外,将依赖项的名称放入包中,这样 pkg install (参见 pkg-install(8)) 将在用户系统上自动安装它,如果它尚未安装。如果与 DEPENDS_TARGET 相同,则可以省略目标部分。
一个相当常见的情况是 RUN_DEPENDS 与 BUILD_DEPENDS 完全相同,特别是如果转移的软件是用一种脚本语言编写的,或者如果它需要相同的构建和运行时环境。在这种情况下,直接将一个赋值给另一个既诱人又直观:
然而,这种赋值可能会使运行时依赖性中出现未在port的原始 BUILD_DEPENDS 中定义的条目。这是由于 make(1)对变量赋值的惰性评估。考虑一个带有 USE_* 的 Makefile,这些被ports/Mk/bsd.*.mk 处理以增加初始构建依赖项。例如, USES= gmake 将 devel/gmake 添加到 BUILD_DEPENDS 中。为了防止这种额外的依赖关系污染 RUN_DEPENDS ,请创建另一个带有当前 BUILD_DEPENDS 内容的变量,并将其分配给 BUILD_DEPENDS 和 RUN_DEPENDS :
BUILD_DEPENDS
该变量指定此 port 需要构建的可执行文件或文件。与 RUN_DEPENDS 一样,它是一个 path:dir [: target ] 元组的列表。例如,
将检查一个名为 unzip 的可执行文件,如果未找到,则会进入 ports 树的 archivers/unzip 子目录来构建和安装它。
FETCH_DEPENDS
此变量指定执行文件或文件所需获取的port。就像前两个一样,它是 path:dir 的列表[: target ]元组。例如,
将检查名为 ncftp2 的可执行文件,并进入ports树的 net/ncftp2 子目录以构建和安装它(如果找不到)。
依赖项从 fetch 目标中检查。如果与 DEPENDS_TARGET 相同,则可以省略目标部分。
EXTRACT_DEPENDS
此变量指定此 port 提取所需的可执行文件或文件。与之前一样,它是一个 path:dir [: target ] 元组的列表。例如,
将检查名为 unzip 的可执行文件,并进入 ports 树的 archivers/unzip 子目录进行构建和安装(如果未找到)。
依赖项是从 extract 目标内部检查的。如果与 DEPENDS_TARGET 相同,则可以省略目标部分。
PATCH_DEPENDS
此变量指定此port需要打补丁的可执行文件或文件。与前面类似,这是 path:dir : target ] 元组的列表。例如,
将进入ports树的 java/jfc 子目录以提取它。
依赖项是从 patch 目标内部检查的。如果与 DEPENDS_TARGET 相同,则可以省略目标部分。
USES
可以添加参数来定义 port 使用的不同功能和依赖关系。通过将此行添加到 Makefile 中指定。
要查看所有值的完整列表,请参阅使用 USES 宏。
USE_*
有几个变量存在以定义许多 ports 共享的常见依赖项。它们的使用是可选的,但有助于减少 port Makefiles 的冗长。它们每个都被样式化为 USE_* 。这些变量只能在 port Makefiles 和 ports/Mk/bsd.*.mk 中使用。它们不适用于用户可设置的选项 - 为此请使用 PORT_OPTIONS 。
(其中 X.Y 是版本号)会为每个 port 添加对 gccXY 的依赖,包括 lang/gccXY 本身!
表 8. USE_*
| For example:
与 gmake 和 configure 相关的变量在 Building Mechanisms 中描述,而 autoconf、automake 和 libtool 在 Using GNU Autotools 中描述。与 Perl 相关的变量在 Using Perl 中描述。X11 变量在 Using X11 中列出。Using Gnome 处理 GNOME 相关的变量,Using KDE 处理 KDE 相关的变量。Using Java 记录了 Java 变量,而 Web Applications 包含有关 Apache、PHP 和 PEAR 模块的信息。Python 在 Using Python 中讨论,而 Ruby 在 Using Ruby 中讨论。Using SDL 提供用于 SDL 应用程序的变量,最后,Using Xfce 包含有关 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,请使用变量 ${NONEXISTENT} 作为 BUILD_DEPENDS 或 RUN_DEPENDS 的第一个字段。只有在需要另一个port的来源时才使用它。通过指定目标也可以节省编译时间。例如
将始终下降到 jpeg port 并提取它。
ports 构建技术不容忍循环依赖。一旦引入,全世界某处的 FreeBSD 安装几乎立即会出问题,许多其他人很快也会遇到类似情况。这些问题真的很难检测。如果有疑问,在进行更改之前,请确保运行: cd /usr/ports; make index 。这个过程在老旧机器上可能会很慢,但它可能能够避免许多人,包括你自己,在这个过程中遇到大量烦恼。
依赖关系必须通过显式声明或使用 OPTIONS 框架来声明。使用其他方法如自动检测会使索引复杂化,这会给 port 和软件包管理带来问题。
示例 37. 错误声明可选依赖项
尝试自动添加依赖项的问题在于个体port之外的文件和设置随时可能发生变化。例如:建立索引,然后安装一批ports。但其中一个ports安装了被测试的文件。因为安装的port意外地具有一个新的依赖项,所以索引现在是不正确的。即使重新构建索引,如果其他ports也根据其他文件的存在确定它们对依赖项的需求,索引可能仍然是错误的。
示例 38.可选依赖项的正确声明
测试选项变量是正确的方法。只要选项在构建索引之前被定义,它不会引起一批ports的索引不一致。然后可以使用简单脚本来自动构建、安装和更新这些ports及其包。
由于它影响ports基础架构并涉及移动和修补许多ports,还可能在构建集群上运行回归测试,因此请将 PR 分配给Ports管理团队。
USE_GCC
'port需要 GCC( gcc 或 g++ )来构建。一些ports需要特定的旧版本 GCC,一些需要现代的最新版本。通常设置为 yes (表示始终使用来自ports的稳定、现代 GCC,见 Mk/bsd.default-versions.mk 中的 GCC_DEFAULT )。这也是默认值。也可以指定确切的版本,例如 10 。当基础系统中的 GCC 满足请求的版本时,使用它,否则从ports构建适当的编译器,并相应调整 CC 和 CXX 。版本说明符后的 :build 参数仅增加了构建时间依赖于port。'
'例如:'
USE_GCC=yes # port requires a current version of GCC
USE_GCC=11:build # port requires GCC 11 at build time only
--
---------------------------------------------------------------------
如果软件包需要安装 GNU info 文件,请在 INFO 中列出它们(不包括尾部 .info ),每个文档一项。这些文件假定安装到 PREFIX/INFO_PATH。如果软件包使用不同位置,请更改 INFO_PATH 。然而,这不是推荐的做法。这些条目只包含相对于 PREFIX/INFO_PATH 的路径。例如,lang/gcc34 将 info 文件安装到 PREFIX/INFO_PATH/gcc34, INFO 将类似于这样:
适当的安装/卸载代码将在包注册之前自动添加到临时的 pkg-plist 中。
Portscout 是一个自动化的 distfile 检查实用程序,适用于 FreeBSD Ports集合,详细描述在 Portscout:FreeBSD Ports Distfile Scanner 中。
PORTSCOUT 定义了限制 Portscout distfile 扫描器的特殊条件。
设置 PORTSCOUT 的情况包括:
当需要忽略特定版本的 distfiles 时。例如,要排除版本 8.2 和版本 8.3 以使其不被 distfile 版本检查所影响,添加:
当完全禁用 distfile 版本检查时。例如,如果一个 port 永远不会被更新,添加:
当必须检查特定版本或特定的主要和次要修订版本的 distfile。例如,如果只有版本 0.6.4 必须被监视,因为更新版本与 FreeBSD 兼容性存在问题,添加:
当提供的版本列表 URL 与下载 URL 不同。例如,为了将 distfile 版本检查限制在数据库/pgtune port 的下载页面上,添加:
每个port都提取到一个必须可写的工作目录中。ports系统默认将 DISTFILES 解压到一个名为 ${DISTNAME} 的目录中。换句话说,如果 Makefile 有:
然后port的分发文件包含一个顶层目录 foo-1.0,其余文件位于该目录下。
如果不是这种情况,可以覆盖许多变量。
WRKSRC
该变量列出了应用程序的 distfiles 解压缩时创建的目录的名称。如果我们之前的示例解压缩到一个名为 foo(而不是 foo-1.0)的目录中,请写:
或者可能
WRKSRC_SUBDIR
如果用于port的源文件位于提取的分发文件的子目录中,请将 WRKSRC_SUBDIR 设置为该目录。
NO_WRKSUBDIR
如果port根本不提取到任何子目录中,则将 NO_WRKSUBDIR 设置为表示这一点。
有三个不同的变量来注册包和ports之间的冲突: CONFLICTS , CONFLICTS_INSTALL 和 CONFLICTS_BUILD 。
当移除几个冲突的ports之一时,建议在其他ports中保留 CONFLICTS 几个月,以迎合那些偶尔更新一次的用户。
CONFLICTS_INSTALL
如果软件包无法与其他软件包共存(因为文件冲突、运行时不兼容等)。在构建阶段之后、安装阶段之前进行 CONFLICTS_INSTALL 检查。
CONFLICTS_BUILD
如果port在其他特定ports已安装时无法构建。构建冲突不记录在生成的软件包中。
CONFLICTS
如果port在某个特定port已安装的情况下无法构建,并且生成的软件包无法与其他软件包共存。在构建阶段和安装阶段之前进行 CONFLICTS 检查。
CONFLICTS* 变量值中的每个以空格分隔的项目都会与除正在
但是以下命令会报告冲突,因为安装的软件包基本名称是 git-lite ,而 git 将被构建,但不能与 git-lite 一起安装:
没有该功能,Makefile 将需要为每个风味列出一个 _flavor__CONFLICTS_INSTALL ,列出每个其他风味。
这些变量中最常见的内容是另一个port的软件包基名。软件包基名是没有附加版本的软件包名称,可以通过运行 make -V PKGBASE 获得。
示例 46. CONFLICTS* 的基本用法
如果 dns/bind910 存在,则无法安装 dns/bind99,因为它们安装相同的文件。首先收集要使用的软件包基础:
然后将其添加到 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 Makefiles 中设置。
Flavors 是拥有port 的多种变体的一种方式。port 被构建多次,具有不同的变化。
例如,一个 port 可能具有许多功能和相当多依赖项的正常版本,以及仅具有基本功能和最少依赖项的轻量级“lite”版本。
另一个例子可能是,一个 port 可以具有一个基于 GTK 的 flavor 和一个基于 QT 的 flavor,具体取决于它使用哪个工具包。
当使用 lua:module 或 lua:flavors 时,port将自动填充 Lua 版本支持的 FLAVORS 。但是,不应该期望普通应用程序(而不是 Lua 模块)使用此功能; 嵌入或以其他方式使用 Lua 的大多数应用程序应简单地使用 USES=lua 。
LUA_FLAVOR 可用(必须使用),以便依赖于正确的依赖项版本,无论 port 是否使用了 flavors 或 module 参数。
有关更多信息,请参阅 Lua 使用。
accessibility
Ports 以帮助残疾用户。
afterstep*
arabic
阿拉伯语支持。
archivers
存档工具。
astro
天文 ports.
audio
声音支持。
benchmarks
基准测试工具。
biology
生物学相关软件。
cad
计算机辅助设计工具。
chinese
中文语言支持。
comms
通讯软件。
主要是用于与串口port通信的软件。
converters
字符代码转换器。
databases
数据库。
deskutils
在计算机发明之前曾出现在桌面上的东西。
devel
开发工具
不要只因为它们是库而将其放在这里。除非它们确实不属于其他任何类别,否则它们不应该被放在这个类别中。
dns
DNS 相关软件。
docs*
FreeBSD 文档的 Meta-ports。
editors
普通编辑者。
专用编辑器属于这些工具的部分。例如,数学公式编辑器将属于数学,并有编辑器作为第二类别。
education*
与教育相关的软件。
这包括主要或实质上旨在帮助用户学习特定主题或一般学习的应用程序、实用程序或游戏。它还包括课程编写应用程序、课程交付应用程序以及课堂或学校管理应用程序
elisp*
Emacs-lisp ports.
emulators
用于其他操作系统的模拟器。
终端模拟器不属于此处。基于 X 的模拟器放入 x11,基于文本的放入 comms 或 misc,具体取决于其功能。
enlightenment*
Ports 相关于 Enlightenment 窗口管理器。
finance
货币、金融及相关应用。
french
法语语言支持。
ftp
FTP 客户端和服务器实用程序。
如果 port 同时支持 FTP 和 HTTP,请将其放在 ftp 中,并使用 www 作为次要类别。
games
游戏。
geography*
地理相关的软件。
german
德语语言支持。
gnome*
来自 GNOME 项目的 Ports
gnustep*
GNUstep 桌面环境相关软件。
graphics
图形实用工具。
hamradio*
业余无线电软件。
haskell*
与 Haskell 语言相关的软件。
hebrew
希伯来语言支持。
hungarian
匈牙利语支持。
irc
互联网中继聊天工具。
japanese
日语语言支持。
java
Java™ 语言相关的软件。
对于 port,Java 类别不能是唯一的一个。除了与 Java 语言直接相关的内容外,还鼓励使用者不要将 Java 作为 port 的主要类别。
kde*
Ports 来自 KDE 项目(通用)。
kde-applications*
KDE 项目的应用程序。
kde-frameworks*
KDE 项目的附加库,用于与 Qt 编程。
kde-plasma*
KDE 项目的桌面环境。
kld*
可加载内核模块。
korean
韩语语言支持。
lang
编程语言。
linux*
Linux 应用程序和支持实用程序。
lisp*
与 Lisp 语言相关的软件。
邮件软件。
mate*
Ports相关于 MATE 桌面环境,这是 GNOME 2 的一个分支。
math
数值计算软件和其他数学实用程序。
mbone*
MBone 应用。
misc
其他实用工具
这不属于其他任何类别的事物。如果可能的话,请尽量找到一个比 misc 更好的分类,因为 ports 在这里往往被忽视。
multimedia
多媒体软件。
net
各种网络软件。
net-im
即时通讯软件。
net-mgmt
网络管理软件。
net-p2p
对等网络应用程序。
net-vpn*
虚拟私人网络应用。
news
USENET 新闻软件。
parallel*
处理计算机并行性的应用程序。
pear*
Ports 与 Pear PHP 框架相关。
perl5*
Ports 需要 Perl 版本 5 才能运行。
plan9*
来自 Plan9 的各种程序。
polish
波兰语支持。
ports-mgmt
Ports 用于管理、安装和开发 FreeBSD ports 和软件包。
portuguese
葡萄牙语支持。
打印软件。
桌面出版工具(预览器等)也属于这里。
python*
与 Python 语言相关的软件。
ruby*
Ruby 语言相关的软件。
rubygems*
RubyGems 软件包的 Ports。
russian
俄语语言支持。
scheme*
Scheme 语言相关的软件。
science
不属于其他类别(如天文学、生物学和数学等)的科学ports。
security
安全实用程序。
shells
命令行 shells。
spanish*
西班牙语言支持。
sysutils
系统实用程序
tcl*
用于使用 Tcl 运行的Ports。
textproc
文本处理实用工具。
不包括桌面出版工具,这些工具用于打印。
tk*
Ports 使用 Tk 运行。
ukrainian
乌克兰语支持。
vietnamese
越南语支持。
wayland*
Ports 支持 Wayland 显示服务器。
windowmaker*
Ports 以支持 Window Maker 窗口管理器。
www
与万维网相关的软件。
HTML 语言支持也属于此范畴。
x11
X Window 系统及其相关内容。
该类别仅适用于直接支持窗口系统的软件。请勿将普通 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*
Ports 与 Xfce 桌面环境相关。
zope*
支持 Zope。
请在这里设置您的邮件地址。谢谢。:-)
作为 MAINTAINER 值,只允许使用单一地址,不允许包含注释部分。使用的格式为 user@hostname.domain 。请勿在此条目中包含任何描述性文本,例如真实姓名。这只会混淆Ports基础设施和大多数使用它的工具。
维护者负责保持port的更新,并确保其正常工作。有关port维护者职责的详细描述,请参阅《port维护者的挑战》。
我们保留修改维护者提交内容的权利,以更好地符合Ports集合的现有政策和风格,无需提交者或维护者的明确祝福。此外,大型基础设施更改可能会导致port被修改,而无需维护者的同意。这类变更永远不会影响port的功能。
使用 bsd.port.mk 中提供的宏来确保 port 的 *-install 目标文件的正确模式。在 pkg-plist 中直接设置相应条目的所有权,如 @(owner,group,) , @owner owner 和 @group group 。这些操作符在被覆盖之前一直有效,或者直到 pkg-plist 的末尾,因此在不再需要它们时记得重置。默认所有权为 root:wheel 。更多信息请参阅基础关键字。
INSTALL_PROGRAM 是一个安装二进制可执行文件的命令。
INSTALL_SCRIPT
is a command to install executable scripts.
INSTALL_LIB
is a command to install shared libraries (but not static libraries).
INSTALL_KLD
is a command to install kernel loadable modules. Some architectures do not like having the modules stripped, so use this command instead of INSTALL_PROGRAM
.
INSTALL_DATA 是一个安装可共享数据的命令,包括静态库。
INSTALL_MAN 是一个安装 man 手册页和其他文档的命令(它不压缩任何内容)。
这些变量被设置为 install(1) 命令,带有适合每种情况的相应标志。
安装的二进制文件应进行剥离。除非绝对必要,否则不要手动剥离二进制文件。 INSTALL_PROGRAM 宏同时安装和剥离二进制文件。 INSTALL_LIB 宏对共享库执行相同操作。
当文件必须被剥离,但既不希望使用 INSTALL_PROGRAM 也不希望使用 INSTALL_LIB 宏时, ${STRIP_CMD} 会剥离程序或共享库。这通常在 post-install 目标内完成。例如:
当需要剥离多个文件时:
使用 file(1) 检查文件是否已经被剥离。二进制文件被 file(1) 报告为 stripped 或 not stripped 。另外,strip(1) 将检测已经被剥离的程序并干净地退出。
当定义变量 WITH_DEBUG 时,elf 文件不得被剥离。 框架自动处理提供的变量( STRIP_CMD , INSTALL_PROGRAM , INSTALL_LIB ,…)和 USES 。 一些软件在其 LDFLAGS 中添加 -s ,在这种情况下,如果设置了 WITH_DEBUG ,则删除 -s ,或者无条件地删除它并在 post-install 中使用 STRIP_CMD 。
有时候,必须安装大量文件,并保留它们的层次结构。例如,将整个目录树从 WRKSRC 复制到目标目录下的 PREFIX 。注意, PREFIX 、 EXAMPLESDIR 、 DATADIR 等路径变量必须始终以 STAGEDIR 开头,以遵循分段(见分段)。
针对这种情况,存在两个宏。使用这些宏的优势是它们确保目标文件的正确所有权和权限。第一个宏, COPYTREE_BIN ,将所有安装的文件设置为可执行,因此适合安装到 PREFIX/bin。第二个宏, COPYTREE_SHARE ,不会对文件设置可执行权限,因此适合安装到 PREFIX/share 目标下的文件。
这个示例将在port的适当示例位置中安装供应商 distfile 目录中 examples 目录的内容。
这个示例将夏季月份的数据安装到 DATADIR 的夏季子目录中。
额外的 find 参数可以通过第三个参数传递给 COPYTREE_* 宏。例如,要安装第一个示例中除了 Makefiles 之外的所有文件,可以使用以下命令。
这些宏不会将安装的文件添加到 pkg-plist 中。必须手动添加它们。对于可选的文档( PORTDOCS ,请参阅安装额外文档)和示例( PORTEXAMPLES ),必须在 pkg-plist 中添加 %%PORTDOCS%% 或 %%PORTEXAMPLES%% 前缀。
如果软件除了标准的 man 和 info 页面外还有一些对用户有用的文档,请在 DOCSDIR 下安装它们。这可以像前一项一样在 post-install 目标中完成。
Create a new directory for the port. The directory name is DOCSDIR
. This usually equals PORTNAME
. However, if the user might want different versions of the port to be installed at the same time, the whole PKGNAME
can be used.
这里是一些方便的变量以及它们在使用 Makefile 时的默认展开方式:
DATADIR 展开为 PREFIX/share/PORTNAME.
DATADIR_REL 展开为 share/PORTNAME.
DOCSDIR 会展开为 PREFIX/share/doc/PORTNAME。
DOCSDIR_REL 会展开为 share/doc/PORTNAME。
EXAMPLESDIR 会展开为 PREFIX/share/examples/PORTNAME。
" EXAMPLESDIR_REL "被扩展为 share/examples/PORTNAME。
这些变量被导出到 PLIST_SUB 中。它们的值将作为相对于 PREFIX 的路径名显示在那里。也就是说,默认情况下,share/doc/PORTNAME 将被 %%DOCSDIR%% 在包装清单中替换,并依此类推。(请参阅 pkg-plist 替换的更多信息。)
所有有条件安装的文档文件和目录都包含在 pkg-plist 中,带有 %%PORTDOCS%% 前缀,例如:
作为在 pkg-plist 中列举文档文件的替代方法,port 可以将变量 PORTDOCS 设置为要添加到最终打包列表中的文件名和 shell 通配符模式的列表。 这些名称将是相对于 DOCSDIR 的。因此,利用 PORTDOCS 的 port ,并且对其文档使用非默认位置的 DOCSDIR 必须相应地设置。 如果目录在此变量中列出或被通配符匹配,则包含的文件和目录的整个子树将在最终打包列表中注册。 如果已取消 DOCS 选项,则不会安装或添加到 port 打包列表中的文件和目录。 如上所示在 PORTDOCS 处安装文档仍由 port 本身决定。 利用 PORTDOCS 的典型示例:
安装在 DATADIR 和 EXAMPLESDIR 下的文件的 PORTDOCS 等效物分别是 PORTDATA 和 PORTEXAMPLES 。 pkg-message 的内容在安装时显示。有关使用 pkg-message 的详细信息,请参见 pkg-message 部分。pkg-message 不需要添加到 pkg-plist 中。
试着让 port 把东西放在 PREFIX 的正确子目录中。一些 ports 把所有东西混在一起放入具有 port 名称的子目录中,这是不正确的。此外,许多 ports 把除了二进制文件、头文件和手册页面之外的所有东西都放在 lib 的子目录中,这与 BSD 模式不太相符。许多文件必须移动到以下目录之一:etc(设置/配置文件)、libexec(内部启动的可执行文件)、sbin(超级用户/管理员的可执行文件)、info(信息浏览器的文档)或 share(体系结构无关的文件)。有关详细信息,请参阅 hier(7);适用于 /usr 的规则几乎适用于 /usr/local。例外是处理 USENET "news" 的 ports。它们可以使用 PREFIX/news 作为文件的目的地。
Makefile 的第二部分描述了必须下载的文件以构建port以及它们可以在哪里下载。
DISTNAME
DISTNAME 是软件作者称呼 port 的名称。 DISTNAME 默认为 ${PORTNAME}-${DISTVERSIONPREFIX}${DISTVERSION}${DISTVERSIONSUFFIX} ,如果没有设置, DISTVERSION 默认为 ${PORTVERSION} ,所以只有在必要时才覆盖 DISTNAME 。 DISTNAME 仅在两个地方使用。首先,分发文件列表( DISTFILES )默认为 ${DISTNAME}${EXTRACT_SUFX} 。其次,分发文件将被解压到名为 WRKSRC 的子目录中,默认为 work/${DISTNAME}。
一些供应商的分发名称不符合 ${PORTNAME}-${PORTVERSION} 方案,可以通过设置 DISTVERSIONPREFIX 、 DISTVERSION 和 DISTVERSIONSUFFIX 自动处理。 PORTVERSION 将自动从 DISTVERSION 派生。
如果上游版本方案可以转换为ports兼容的版本方案,请将某个变量设置为上游版本,不要使用 DISTVERSION 作为变量名。根据您创建的变量设置 PORTVERSION 为计算版本,并相应地设置 DISTNAME 。
如果上游版本方案不能轻易地转换为ports兼容的值,请将 PORTVERSION 设置为一个合理的值,并用上游版本直接设置 DISTNAME 和 PORTNAME 。
示例 6.手动派生 PORTVERSION
BIND9 使用一种与 ports 版本不兼容的版本方案(其版本中包含 - ),并且不能使用 DISTVERSION 派生版本,因为在 9.9.9 发布后,它将以 9.9.9-P1 形式发布“补丁级别”。DISTVERSION 会将其转换为 9.9.9.p1 ,在 ports 版本方案中意味着 9.9.9 预发布版本 1,位于 9.9.9 之前而不是之后。因此, PORTVERSION 是手动从 ISCVERSION 变量派生而来以输出 9.9.9p1 。
ports 框架和 pkg 排序版本的顺序是使用 pkg-version(8) 的 -t 参数进行检查的:
< sign represents the first argument passed to -t is less than the second argument. 9.9.9 before 9.9.9p1 .
In port Makefile, for example dns/bind99, it is achieved by:
Define upstream version in ISCVERSION , with a comment saying why it is needed. Use ISCVERSION to get a ports-compatible PORTVERSION . Use ISCVERSION directly to get the correct URL for fetching the distribution file. Use ISCVERSION directly to name the distribution file.
例 7. 从 PORTVERSION 派生 DISTNAME
有时,发布文件名与软件版本几乎没有关系。
在 comms/kermit 中,发行文件中仅包含版本的最后一个元素:
0 make(1)修改器返回变量的后缀,在本例中是 1。分发文件将正确生成为 2。
示例 8。特殊情况 1
有时,软件名称、版本及其分发的分发文件之间没有关联。
来自音频/libworkman:
示例 9。异国风情案例 2
在 comms/librs232 中,分发文件没有版本号,因此需要使用 DIST_SUBDIR :
MASTER_SITES
记录指向原始压缩包的 FTP/HTTP-URL 的目录部分在 MASTER_SITES 中。不要忘记结尾的斜杠 (/)!
如果在系统上找不到它们, make 宏将尝试使用该规范从 FETCH 抓取分发文件。
推荐包含多个站点在列表中,最好来自不同的大陆。这将防范广域网问题。
快捷缩写可用于流行的存档,如 SourceForge( SOURCEFORGE ),GNU( GNU )或 Perl CPAN( PERL_CPAN )。 MASTER_SITES 可以直接使用它们:
较旧的扩展格式仍然有效,但所有 ports 已转换为紧凑格式。扩展格式如下所示:
这些值和变量在 Mk/bsd.sites.mk 中定义。新条目经常添加,因此在提交 port 之前,请务必检查该文件的最新版本。
如果 MASTER_SITE_SUBDIR ,请使用这个:
对于一些在 SourceForge 上有可预测目录结构的流行站点,存在几个“魔法”宏。对于这些站点,只需使用缩写,系统将自动选择子目录。对于以 Stardict 命名的port,版本为 1.2.3 ,并托管在 SourceForge 上的情况,添加这行:
推断一个名为 /project/stardict/stardict/1.2.3 的子目录。如果推断的目录不正确,可以重写:
这也可以写成
表 4. 魔法 MASTER_SITES 宏
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/-.*//}
DEBIAN
pool/main/${PORTNAME:C/^((lib)?.).*$/\1/}/${PORTNAME}
FARSIGHT
${PORTNAME}
FESTIVAL
${PORTREVISION}
GCC
releases/${DISTNAME}
GENTOO
distfiles
GIMP
${PORTNAME}/${PORTVERSION:R}/
GH
${GH_ACCOUNT}/${GH_PROJECT}/tar.gz/${GH_TAGNAME}?dummy=/
GHC
${GH_ACCOUNT}/${GH_PROJECT}/
GNOME
sources/${PORTNAME}/${PORTVERSION:C/^(\.[0-9]).*/\1/}
GNU
${PORTNAME}
GNUPG
${PORTNAME}
GNU_ALPHA
${PORTNAME}
HORDE
${PORTNAME}
LODEV
${PORTNAME}
MATE
${PORTVERSION:C/^(\.[0-9]).*/\1/}
MOZDEV
${PORTNAME:tl}
NL
${PORTNAME}
QT
archive/qt/${PORTVERSION:R}
SAMBA
${PORTNAME}
SAVANNAH
${PORTNAME:tl}
SF
${PORTNAME:tl}/${PORTNAME:tl}/${PORTVERSION}
USE_GITHUB
如果分发文件来自 GitHub 上的特定提交或标签,而该文件没有官方发布的版本,有一种简单的方法可以自动设置正确的 DISTNAME 和 MASTER_SITES 。
这些变量可用:
表 5. USE_GITHUB 描述|变量|描述|默认值| | ----------| -------------| ---------| | GH_ACCOUNT |托管项目的 GitHub 用户的帐户名称| ${PORTNAME} | | GH_PROJECT |GitHub 上的项目名称| ${PORTNAME} | | GH_TAGNAME |要下载的标签名称(2.0.1、哈希值等)在此处使用分支名称是不正确的。也可以使用提交 ID 的哈希值进行快照。| ${DISTVERSIONPREFIX}${DISTVERSION}${DISTVERSIONSUFFIX} | | GH_SUBDIR |当软件需要在 ${WRKSRC} 中提取额外的分发文件时,可以使用此变量。有关更多信息,请参阅从 GitHub 获取多个文件的示例。|(无)|
示例 10. USE_GITHUB 的简单用法
在尝试为来自 FreeBSD 用户在 github 上 https://github.com/freebsd/pkg/的 pkg 版本 1.2.7 制作port时,Makefile 看起来会像这样(示例中稍微简化):
它会自动将 MASTER_SITES 设置为 GH 并将 WRKSRC 设置为 ${WRKDIR}/pkg-1.2.7 。
示例 11. 更完整地使用 USE_GITHUB
在尝试为 github 上的 FreeBSD 用户创建 bleeding edge 版本的 pkg 时,网址为 https://github.com/freebsd/pkg/,Makefile 最终看起来像这样(为了示例稍作删减):
它将自动将 MASTER_SITES 设置为 GH ,并将 WRKSRC 设置为 ${WRKDIR}/pkg-6dbb17b 。
20140411 是引用的提交日期,而不是编辑 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 之前(有关 pkg-version(8) 详细信息,请参阅使用 pkg-version(8) 进行版本比较)。
这意味着如果上游将来决定发布版本,将不需要使用 PORTEPOCH 。
示例 14. 使用 USE_GITHUB 访问两个版本之间的提交
如果软件的当前版本使用了 Git 标签,并且需要将 port 更新到一个新的中间版本(没有标签),可以使用 git-describe(1) 查找要使用的版本:
v0.7.3-14-gf0038b1 可以分为三个部分:
v0.7.3 这是在请求的提交之前提交历史中出现的最后一个 Git 标签。
-14 这意味着请求的提交, f0038b1 ,是在 v0.7.3 标签之后的第 14 次提交。
-gf0038b1 -g 意味着 "Git",而 f0038b1 是此引用指向的提交哈希。
这会创建一个随时间(也就是随提交)递增的版本方案,并且不会与创建 0.7.4 版本冲突。(有关 pkg-version(8)的版本比较细节,请参阅如何使用 pkg-version(8)进行版本比较):
如果请求的提交与标签相同,则默认显示较短描述。较长版本等效:
该 USE_GITHUB 框架还支持从 GitHub 的不同位置获取多个分发文件。它的工作方式与从多个位置获取多个分发或补丁文件非常相似。
多个值被添加到 GH_ACCOUNT , GH_PROJECT 和 GH_TAGNAME 。每个不同的值被分配到一个组。主要值可以没有组,也可以是 :DEFAULT 组。如果值与 USE_GITHUB 中列出的默认值相同,则可以省略该值的描述。
当有大量分发文件时, GH_TUPLE 也可以使用。它有助于将账户、项目、标签名和组信息保持在同一位置。
对于每个组,会创建一个 ${WRKSRC_group} 辅助变量,其中包含文件已提取到的目录。可以使用 ${WRKSRC_group} 变量在 post-extract 期间移动目录,或添加到 CONFIGURE_ARGS ,或根据需要使软件正确构建。
:group 部分必须仅用于一个分发文件。它被用作唯一键,并且多次使用将覆盖先前的值。
从 GitHub 获取多个文件时,有时无法从 GitHub 获取默认的分发文件。要禁用获取默认的分发文件,请设置:
示例 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 不存在。然后执行以下操作:
使用 USE_GITHUB 与多个分发文件一起使用 GH_TUPLE 的示例 16
这在功能上等同于与多个分发文件一起使用 USE_GITHUB ,但是使用 GH_TUPLE :
在上一个示例中使用了分组与 bar:icons,contrib 。由于无法进行分组,因此使用 GH_TUPLE 存在一些冗余信息。
示例 17. 如何在 Git 子模块中使用 USE_GITHUB ?
Ports作为上游存储库时有时使用子模块。有关更多信息,请参见 git-submodule(1)。
子模块的问题在于每个子模块都是单独的存储库。因此,它们必须分别获取。
使用 finance/moneymanagerex 作为一个例子,其 GitHub 仓库在 https://github.com/moneymanagerex/moneymanagerex/。它在根目录下有一个 .gitmodules 文件。这个文件描述了该仓库中使用的所有子模块,并列出了需要的额外仓库。这个文件将告诉您需要哪些额外的仓库:
唯一缺失的信息是要用作版本的提交哈希或标签。此信息在克隆仓库后可以找到:
它也可以在 GitHub 上找到。每个作为子模块的子目录显示为 directory @ hash ,例如, mongoose @ 2140e59 。
从 GitHub 获取信息似乎更为直接,而使用 git submodule status 所找到的信息将提供更有意义的信息。例如,在这里, lib/wxsqlite3 的提交哈希 fb66eb2 对应于 v3.4.0 。两者可以互换使用,但如果有标签可用,则使用标签。
现在,已收集到所有所需信息,可以编写 Makefile(仅显示 GitHub 相关行):
USE_GITLAB
类似于 GitHub,如果分发文件来自 gitlab.com 或托管 GitLab 软件,则这些变量可供使用,可能需要设置。
表格 6. USE_GITLAB 描述
GL_SITE
托管 GitLab 项目的站点名称
GL_ACCOUNT
托管项目的 GitLab 用户帐户名称
${PORTNAME}
GL_PROJECT
在 GitLab 上的项目名称
${PORTNAME}
GL_COMMIT
下载的提交哈希。必须是完整的 160 位,40 字符的十六进制 SHA1 哈希。这是 GitLab 的必需变量。
(none)
GL_SUBDIR
当软件需要在 ${WRKSRC} 中提取另一个分发文件时,可以使用此变量。有关更多信息,请参阅从 GitLab 获取多个文件中的示例。
(无)
示例 18. 使用 USE_GITLAB 的简单示例
在尝试为 https://gitlab.com/accounts-sso/libsignon-glib/ 上的 accounts-sso 用户版本 1.14 的 libsignon-glib 进行port时,Makefile 最终将如下所示来获取分发文件:
它將自動將 MASTER_SITES 設置為 gitlab.com,將 WRKSRC 設置為 ${WRKDIR}/libsignon-glib-e90302e342bfd27bc8c9132ab9d0ea3d8723fd03-e90302e342bfd27bc8c9132ab9d0ea3d8723fd03 。
例 19。更完整地使用 USE_GITLAB
如果上述port沒有版本控制,並且來自自託管 GitLab 站點的 foo 用戶項目欄位的 foobar https://gitlab.example.com/ ,那麼 Makefile 最終看起來會是這樣來獲取分發文件:
MASTER_SITES 設為 "https://gitlab.example.com" 並將 WRKSRC 設為 ${WRKDIR}/bar-9c1669ce60c3f4f5eb43df874d7314483fb3f8a6-9c1669ce60c3f4f5eb43df874d7314483fb3f8a6 。
USE_GITLAB 框架也支持从 GitLab 和 GitLab 托管站点获取多个分发文件。其工作方式与从多个位置获取多个分发或补丁文件以及从 GitLab 获取多个文件非常相似。
多个值被添加到 GL_SITE , GL_ACCOUNT , GL_PROJECT 和 GL_COMMIT 中。每个不同的值都分配给一个组。 USE_GITLAB 描述。
当有大量分发文件时,也可以使用 GL_TUPLE 。它有助于将站点、帐户、项目、提交和组信息保持在同一位置。
对于每个组,会创建一个 ${WRKSRC_group} 辅助变量,其中包含文件已提取到的目录。 ${WRKSRC_group} 变量可以在 post-extract 期间移动目录,或添加到 CONFIGURE_ARGS ,或任何需要软件构建正确的操作。
:group 部分必须仅用于一个分发文件。它被用作唯一键,多次使用将覆盖先前的值。
当使用 GitLab 获取多个文件时,有时不会从 GitLab 站点获取默认分发文件。要禁用获取默认分发,请设置:
示例 20. 使用 USE_GITLAB 与多个分发文件
有时候,需要获取多个分发文件。例如,当上游 git 仓库使用子模块时。这可以通过 GL_* 变量中的组轻松完成:
这将从 gitlab.com 获取两个分发文件,一个来自 gitlab.example.com 托管的 GitLab。默认的文件来自 https://gitlab.com/foo/foo,提交是 c189207a55da45305c884fe2b50e086fcad4724b 。第二个文件来自 icons 组,来自 https://gitlab.example.com:9434/gitlab/bar/foo-icons,提交是 ae7368cab1ca7ca754b38d49da064df87968ffe4 。第三个文件来自 https://gitlab.com/bar/foo-contrib,提交是 9e4dd76ad9b38f33fdb417a4c01935958d5acd2a 。分发文件命名为 foo-foo-c189207a55da45305c884fe2b50e086fcad4724b_GL0.tar.gz、bar-foo-icons-ae7368cab1ca7ca754b38d49da064df87968ffe4_GL0.tar.gz 和 bar-foo-contrib-9e4dd76ad9b38f33fdb417a4c01935958d5acd2a_GL0.tar.gz。
所有分发文件都在 ${WRKDIR} 中各自的子目录中提取。默认文件仍在 ${WRKSRC} 中提取,在此例中是${WRKDIR}/foo-c189207a55da45305c884fe2b50e086fcad4724b-c189207a55da45305c884fe2b50e086fcad4724b。每个额外的分发文件都在 ${WRKSRC_group} 中提取。在 icons 组中,它被称为 ${WRKSRC_icons} ,其中包含${WRKDIR}/foo-icons-ae7368cab1ca7ca754b38d49da064df87968ffe4-ae7368cab1ca7ca754b38d49da064df87968ffe4。具有 contrib 组的文件称为 ${WRKSRC_contrib} ,含有 ${WRKDIR}/foo-contrib-9e4dd76ad9b38f33fdb417a4c01935958d5acd2a-9e4dd76ad9b38f33fdb417a4c01935958d5acd2a 。
软件建构系统期望在其源代码的 ext/icons 子目录中找到图标,因此使用 GL_SUBDIR 。 GL_SUBDIR 确保 ext 存在,但 ext/icons 不存在。然后它这样做:
示例 21. 使用 USE_GITLAB 与使用多个发行文件 GL_TUPLE
这在功能上等同于使用多个发行文件,但使用 USE_GITLAB :
在之前的示例中使用了分组 bar:icons,contrib 。由于无法分组,一些冗余信息存在 GL_TUPLE 。
EXTRACT_SUFX
如果有一个分发文件,并且它使用奇数后缀来指示压缩机制,请设置 EXTRACT_SUFX 。
例如,如果分发文件命名为 foo.tar.gzip 而不是更常见的 foo.tar.gz,请写:
USES=tar[:xxx] , USES=lha 或 USES=zip 会根据需要自动将 EXTRACT_SUFX 设置为最常见的归档扩展名,有关详细信息,请参见 使用 USES 宏。 如果这些都未设置,则 EXTRACT_SUFX 默认为 .tar.gz 。
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}中。该目录可能不可写。
这不会与主站点分组功能发生冲突,添加一个组也是有效的:
(将其视为一个有些“高级主题”; 刚接触本文档的人可能希望先跳过此部分)。
本部分介绍了被称为 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 和 20 个站点中有 2 个文件,站点速度极慢,所有站点都载有 beta 版本,而 alpha 版本只能在第 20 个站点找到。如果维护者事先知道这些,要检查所有站点将是一种浪费,不是吗?这对美好的周末来说并不是一个好的开端!
现在你有了这个想法,想象更多的 DISTFILES 和更多的 MASTER_SITES 。我们的“distfiles 调查大师”肯定会欣赏这将带来的减轻网络负担的效果。
在接下来的部分中,将会提供有关这个想法在 FreeBSD 上的实现的信息。我们在 OpenBSD 的概念上有所改进。
本节将解释如何快速准备从不同站点和子目录中获取多个分发文件和补丁。我们在这里描述了一个简化 MASTER_SITES:n 使用情况。这将对大多数情景足够。更详细的信息可在详细信息中找到。
一些应用程序由必须从许多不同站点下载的多个分发文件组成。例如,Ghostscript 由程序的核心以及根据用户的打印机使用的大量驱动程序文件组成。其中一些驱动程序文件随核心提供,但许多其他文件必须从各种不同站点下载。
为支持此功能, DISTFILES 中的每个条目后面都可以跟着一个冒号和一个“组名”。然后每个在 MASTER_SITES 中列出的站点后面都跟着一个冒号,指示从该站点下载哪些分发文件的组。
例如,考虑一个应用程序,其源代码分为两部分,source1.tar.gz 和 source2.tar.gz,必须从两个不同的站点下载。port 的 Makefile 将包括类似于使用简化 MASTER_SITES:n 每个站点一个文件的行。
示例 22. 使用简化 MASTER_SITES:n 每个站点一个文件
多个发布文件可以具有相同的组。继续上一个示例,假设有第三个发布文件,source3.tar.gz,它从 ftp.example2.com 下载。然后 Makefile 将写成使用简化 MASTER_SITES:n 每个站点多个文件。
例 23. 更简化的使用 MASTER_SITES:n ,一个站点对应多个文件
好吧,之前的例子没有反映新 port 的需求?在本节中,我们将详细解释细粒度提取机制 MASTER_SITES:n 的工作原理及如何使用。
元素可以后缀为 :n ,其中 n 是``,也就是说,n 可以概念上是任何字母数字字符串,但我们现在将其限制为 [a-zA-Z_][0-9a-zA-Z_] 。此外,字符串匹配是区分大小写的;也就是说, n 与 N 是不同的。 然而,这些词不能用于后缀目的,因为它们具有特殊含义: default 、 all 和 ALL (它们在项 ii 中内部使用)。此外, DEFAULT 是一个特殊用途词(查看项目 3)。
后缀为 :n 的元素属于 n 组, :m 属于 m 组,依此类推。
没有后缀的元素是无组的,它们都属于特殊组 DEFAULT 。除非一个元素同时属于 DEFAULT 和其他组(查看项目 5),否则带有 DEFAULT 后缀的元素只是多余的。这些示例是等效的,但首选第一个:
组不是排他的,一个元素可以同时属于几个不同的组,一个组可以有几个不同的元素,也可以没有任何元素。
当一个元素同时属于几个组时,使用逗号运算符( , )。不必重复多次,并每次使用不同的后缀,我们可以一次列出一组在一个后缀内。例如, :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 。查看详细使用 MASTER_SITES:n 以及 MASTER_SITE_SUBDIR 和详细使用 MASTER_SITES:n 结合逗号运算符、多个文件、多个站点和多个子目录的例子 24。详细使用 MASTER_SITES:n 在 MASTER_SITE_SUBDIR 中
组 DEFAULT 内的目录 → old:n
组 NEW 内的目录 → new
例 25. 使用 MASTER_SITES:n 运算符、多个文件、多个站点和多个子目录的详细示例
前面的例子导致这种精细化的获取。站点按照它们将被使用的确切顺序列出。
将从 file1 获取
MASTER_SITE_OVERRIDE
MASTER_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
我如何将 bsd.sites.mk 中的一个特殊宏分组,例如,SourceForge( SF )?这已经尽可能简化了。请参见 SourceForge( SF )的详细使用 MASTER_SITES:n 。 使用 SourceForge 进行 MASTER_SITES:n 的详细用法( SF )
something.tar.gz 将从 SourceForge 中的所有站点获取。
我如何使用 PATCH* 与此?所有示例均使用 MASTER* 完成,但它们对于 PATCH* 也完全相同,如简化用法中所示 MASTER_SITES:n 与 PATCH_SITES 一样。 简化使用 MASTER_SITES:n 和 PATCH_SITES 的示例 27。
所有当前的 ports 保持不变。仅当元素后缀为 :n 时才会激活 MASTER_SITES:n 功能代码,尤其如第七项中所示的语法规则。
目标保持不变: checksum , makesum , patch , configure , build ,等等。除了 do-fetch , fetch-list , master-sites 和 patch-sites 的明显异常情况。
do-fetch :部署新分组后缀 DISTFILES 和 PATCHFILES ,它们与 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目标的更多信息,请查看项目 B。
新port目标
有 master-sites-n 和 patch-sites-n 目标,将列出相应组 n 中的元素 MASTER_SITES 和 PATCH_SITES 。例如, 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 。
DIST_SUBDIR
不要让port混乱/usr/ports/distfiles。如果port需要获取很多文件,或包含可能与其他ports(例如 Makefile)冲突的文件,请将 DIST_SUBDIR 设置为port的名称( ${PORTNAME} 或 ${PKGNAMEPREFIX}${PORTNAME} 可行)。这将把port所需的所有内容放入该子目录下,从默认的/usr/ports/distfiles 更改为/usr/ports/distfiles/${DIST_SUBDIR,实际上将所有内容放入该子目录。
它还将查看 http://distcache.FreeBSD.org 上备份主站点上具有相同名称的子目录(在 Makefile 中明确设置 DISTDIR 将无法完成此操作,请使用 DIST_SUBDIR 。)
许多应用程序可以使用可选或不同的配置构建。例如,自然语言(人类)的选择,GUI 与命令行,或支持的数据库类型。用户可能需要与默认配置不同的配置,因此ports系统提供了port作者可以使用的钩子来控制将构建哪个变体。适当支持这些选项将会使用户感到满意,并有效地以一的价格提供两个或更多ports。
OPTIONS
当 OPTIONS_* 给予用户安装port的对话框,显示可用选项,然后将这些选项保存到${PORT_DBDIR}/${OPTIONS_NAME}/options。下次构建port时,将重用这些选项。 PORT_DBDIR 默认为/var/db/ports。 OPTIONS_NAME 为port原点,下划线作为空格分隔符,例如 dns/bind99 将为 dns_bind99 。
当用户运行 make config (或首次运行 make build 时),框架会检查${PORT_DBDIR}/${OPTIONS_NAME}/options。如果该文件不存在,则使用 OPTIONS_* 的值,并显示一个对话框,其中可以启用或禁用选项。然后保存选项,并在构建port时使用配置的变量。
如果新版本的port添加了新的 OPTIONS ,将向用户显示对话框,并预填旧 OPTIONS 的保存值。
make showconfig 显示已保存的配置。使用 make rmconfig 删除已保存的配置。
OPTIONS_DEFINE 包含一个 OPTIONS 列表。这些是彼此独立的,不归类:
一旦定义, OPTIONS 被描述(可选,但强烈建议):
ports/Mk/bsd.options.desc.mk 包含许多常见 OPTIONS 的描述。虽然通常很有用,但如果描述对port 不够详细,请进行覆盖。
OPTIONS 可以作为单选项,每组只允许选择一个选项:
OPTIONS 可以作为单选选择分组,其中每个组允许选择零个或一个选项:
OPTIONS 也可以作为“多选”列表分组,其中至少要启用一个选项:
OPTIONS 也可以被分组为“多选”列表,其中可以启用任何选项或不启用任何选项:
OPTIONS 默认情况下未设置,除非它们在 OPTIONS_DEFAULT 中列出:
OPTIONS 定义必须出现在包含 bsd.port.options.mk 之前。只能在包含 bsd.port.options.mk 之后测试 PORT_OPTIONS 的值。也可以使用包含 bsd.port.pre.mk,并且在引入 bsd.port.options.mk 之前编写的 ports 中仍然广泛使用。但请注意,在包含 bsd.port.pre.mk 之后,一些变量将无法像预期的那样工作,通常是一些 USE_* 标志。
例 39。 OPTIONS 的简单用法。
例 40。检查未设置Port OPTIONS
上面显示的形式不鼓励使用。首选方法是使用配置开关来真正启用和禁用该功能以匹配该选项。
示例 41. OPTIONS 的实际使用
这些选项默认始终启用。
DOCS - 构建和安装文档。
NLS - 本地语言支持。
EXAMPLES - 构建和安装示例。
IPV6 - IPv6 协议支持。
当使用 GNU 配置脚本时,请留意自动检测激活的可选功能。通过在 CONFIGURE_ARGS 中添加 --without-xxx 或 --disable-xxx 来明确禁用不需要的可选功能。
例 42. 选项处理错误
在上面的例子中,假设系统上已安装了一个名为 libfoo 的库。用户不希望该应用程序使用 libfoo,因此在 make config 对话框中关闭了该选项。但是,应用程序的配置脚本检测到系统中存在该库,并在生成的可执行文件中包含其支持。现在,当用户决定从系统中删除 libfoo 时,ports 系统没有发出警告(对 libfoo 的依赖未被记录),但应用程序却会崩溃。
示例 43. 正确处理选项
作为另一种选择
有一些宏可以帮助简化根据选项设置而不同的条件值。为方便起见,提供了一个综合列表:
PLIST_SUB
, SUB_LIST
有关自动 %%OPT%% 和 %%NOOPT%% 生成,请参见 OPTIONS_SUB 。
有关更复杂的用法,请参见通用变量替换, OPT_VARIABLE 和 OPT_VARIABLE_OFF 。
CONFIGURE_ARGS
对于 --enable-x 和 --disable-x ,请参阅 OPT_CONFIGURE_ENABLE 。
对于 --with-x 和 --without-x ,请参阅 OPT_CONFIGURE_WITH 。
对于其他情况,请参阅 OPT_CONFIGURE_ON 和 OPT_CONFIGURE_OFF 。
对于布尔参数( 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_DEPTYPE 和 OPT_DEPTYPE_OFF 。
*
(Any variable)
最常用的变量有直接的辅助工具,请参见通用变量替换, OPT_VARIABLE 和 OPT_VARIABLE_OFF 。
对于没有特定辅助工具的任何变量,请参见 OPT_VARS 和 OPT_VARS_OFF 。
Options dependencies
当一个选项需要另一个选项才能工作时,请参见 OPT_IMPLIES 。
Options conflicts
当一个选项如果另一个选项也启用时无法工作,请参见 OPT_PREVENTS 和 OPT_PREVENTS_MSG 。
Build targets
当一个选项需要额外处理时,请参见附加构建目标, target-OPT-on 和 target-OPT-off 。
OPTIONS_SUB
如果 OPTIONS_SUB 设置为 yes ,那么添加到 OPTIONS_DEFINE 的每个选项将添加到 PLIST_SUB 和 SUB_LIST ,例如:
等价于:
当选择选项 OPT 时,对于 OPT_USE 中的每个 key=value 对,将值附加到相应的 USE_KEY 中。如果值中有空格,请用逗号替换,处理过程中它们将被改回空格。 OPT_USE_OFF 的工作方式相同,但当未选择 OPT 时。例如:
相当于:
5.14.3.3.1. OPT_CONFIGURE_ENABLE
当选择选项 OPT 时,对于每个条目 OPT_CONFIGURE_ENABLE ,然后将 --enable-entry 追加到 CONFIGURE_ARGS 中。当未选择选项 OPT 时,将 --disable-entry 追加到 CONFIGURE_ARGS 中。可以使用 = 符号指定可选参数。此参数仅追加到 --enable-entry 配置选项。例如:
等同于:
5.14.3.3.2. OPT_CONFIGURE_WITH
当选择选项 OPT 时,对于每个条目 OPT_CONFIGURE_WITH *,然后将 --with-_entry * 追加到 CONFIGURE_ARGS 中。当未选择选项 OPT 时,将 --without-entry 追加到 CONFIGURE_ARGS 中。可以使用 = 符号指定可选参数。此参数仅追加到 --with-entry 配置选项。例如:
等价于:
5.14.3.3.3. OPT_CONFIGURE_ON 和 OPT_CONFIGURE_OFF
当选定选项 OPT 时,如果定义了 OPT_CONFIGURE_ON 的值,则将其附加到 CONFIGURE_ARGS 上。 OPT_CONFIGURE_OFF 的工作方式相同,但当未选择 OPT 时。 例如:
等同于:
5.14.3.4.1. OPT_CMAKE_ON 和 OPT_CMAKE_OFF
当选择选项 OPT 时,如果已定义,则将 OPT_CMAKE_ON 的值追加到 CMAKE_ARGS 上。 OPT_CMAKE_OFF 的工作方式相同,但当未选择 OPT 时。例如:
等同于:
5.14.3.4.2. OPT_CMAKE_BOOL 和 OPT_CMAKE_BOOL_OFF
当选中选项 OPT 时,对于 OPT_CMAKE_BOOL 中的每个条目,将 -D_entry_:BOOL=true 附加到 CMAKE_ARGS 。当未选中选项 OPT 时,将 -D_entry_:BOOL=false 附加到 CONFIGURE_ARGS 。 OPT_CMAKE_BOOL_OFF 是相反的,当选中该选项时,将 -D_entry_:BOOL=false 附加到 CMAKE_ARGS ,当未选中该选项时,将 -D_entry_:BOOL=true 附加到 CMAKE_ARGS 。例如:
等同于:
5.14.3.5.1. OPT_MESON_ON 和 OPT_MESON_OFF
当选择 OPT 选项时,如果已定义, OPT_MESON_ON 的值将附加到 MESON_ARGS 。 OPT_MESON_OFF 的工作方式相同,但当未选择 OPT 时。例如:
等同于:
5.14.3.5.2. OPT_MESON_TRUE 和 OPT_MESON_FALSE
当选择选项 OPT 时,对于 OPT_MESON_TRUE 中的每个条目,然后将 -D_entry_=true 附加到 MESON_ARGS 。当未选择选项 OPT 时,将 -D_entry_=false 附加到 MESON_ARGS 。 OPT_MESON_FALSE 是相反的,当选择该选项时,将 -D_entry_=false 附加到 MESON_ARGS ,未选择该选项时附加到 -D_entry_=true 。例如:
相当于:
5.14.3.5.3. OPT_MESON_YES 和 OPT_MESON_NO
当选择选项 OPT 时,对于 OPT_MESON_YES 中的每个条目,然后将 -D_entry_=yes 追加到 MESON_ARGS 中。当未选择选项 OPT 时,将 -D_entry_=no 追加到 MESON_ARGS 中。 OPT_MESON_NO 则相反,选项选择时追加 -D_entry_=no 到 MESON_ARGS ,未选择选项时追加 -D_entry_=yes 。例如:
等同于:
5.14.3.5.4. OPT_MESON_ENABLED 和 OPT_MESON_DISABLED
当选择选项 OPT 时,对于每个 OPT_MESON_ENABLED 中的条目,然后 -D_entry_=enabled 被追加到 MESON_ARGS 中。当未选择选项 OPT 时, -D_entry_=disabled 被追加到 MESON_ARGS 中。 OPT_MESON_DISABLED 是相反的,当选择该选项时, -D_entry_=disabled 被追加到 MESON_ARGS 中,当未选择该选项时,追加 -D_entry_=enabled 。例如:
等同于:
当选择选项 OPT 时,如果已定义, OPT_QMAKE_ON 的值将附加到 QMAKE_ARGS 。 OPT_QMAKE_OFF 的工作方式相同,但当未选择 OPT 时。例如:
等同于:
OPT_IMPLIES
提供了在选项之间添加依赖关系的方法。
当选择 OPT 时,此变量中列出的所有选项也将被选中。使用前面描述的 OPT_CONFIGURE_ENABLE 来举例说明:
相当于:
示例 44. OPT_IMPLIES 的简单用法
此 port 具有 X11 选项,并且需要选择 X11 选项来构建。
提供了一种在选项之间添加冲突的方法。
当选择 OPT 时,列在 OPT_PREVENTS 中的所有选项都必须取消选择。如果设置了 OPT_PREVENTS_MSG 并触发冲突,将显示其内容以解释它们为什么冲突。例如:
大致相当于:
唯一的区别是第一个将在运行 make config 后写入错误,建议更改选定的选项。
示例 45。 OPT_PREVENTS 的简单使用
此port有 X509 和 SCTP 选项。两个选项都添加了补丁,但这些补丁相互冲突,因此不能同时选择。
提供了一种设置和追加变量的通用方法。
当选中选项 OPT 并定义了 OPT_VARS 时,从 OPT_VARS 中评估 key=value 和 key+=value 对。一个 = 会覆盖 KEY 的现有值,一个 += 会追加到该值。 OPT_VARS_OFF 的工作方式相同,但当未选择 OPT 时。
等价于:
这是由于 make(1) 变量扩展处理空白字符的方式。当 OPT_VARS= foo=bar baz 被扩展时,变量最终包含两个字符串, foo=bar 和 baz 。但提交者可能本意只想要一个字符串, foo=bar baz 。引用该值可以防止空格被用作分隔符。
另外,不要在 var= 符号后和值前添加额外的空格,否则它也会被分割为两个字符串。这样是行不通的:
对于任何这些依赖类型:
PKG_DEPENDS
EXTRACT_DEPENDS
PATCH_DEPENDS
FETCH_DEPENDS
BUILD_DEPENDS
LIB_DEPENDS
RUN_DEPENDS
当选择选项 OPT 时,如果已定义, OPT_DEPTYPE 的值将附加到 DEPTYPE 中。 OPT_DEPTYPE_OFF 的功能相同,但当未选择 OPT 时。例如:
等同于:
对于这些变量中的任何一个:
ALL_TARGET
BINARY_ALIAS
BROKEN
CATEGORIES
CFLAGS
CONFIGURE_ENV
CONFLICTS
CONFLICTS_BUILD
CONFLICTS_INSTALL
CPPFLAGS
CXXFLAGS
DESKTOP_ENTRIES
DISTFILES
EXTRACT_ONLY
EXTRA_PATCHES
GH_ACCOUNT
GH_PROJECT
GH_SUBDIR
GH_TAGNAME
GH_TUPLE
GL_ACCOUNT
GL_COMMIT
GL_PROJECT
GL_SITE
GL_SUBDIR
GL_TUPLE
IGNORE
INFO
INSTALL_TARGET
LDFLAGS
LIBS
MAKE_ARGS
MAKE_ENV
MASTER_SITES
PATCHFILES
PATCH_SITES
PLIST_DIRS
PLIST_FILES
PLIST_SUB
PORTDOCS
PORTEXAMPLES
SUB_FILES
SUB_LIST
TEST_TARGET
USES
当选择 OPT 选项时,如果已定义,则将 OPT_ABOVEVARIABLE 的值附加到 ABOVEVARIABLE 。 OPT_ABOVEVARIABLE_OFF 的工作方式相同,但当未选择 OPT 时。例如:
相当于:
如果 DOCS 选项已启用,则 ALL_TARGET 的最终值为 all doc ;如果该选项已禁用,则其值为 all 。
仅使用 Makefile 中的选项辅助行:
如果 DOCS 选项已启用,则 ALL_TARGET 的最终值为 doc ;如果该选项已禁用,则其值为 all 。
这些 Makefile 目标可以接受可选的额外构建目标:
pre-fetch
do-fetch
post-fetch
pre-extract
do-extract
post-extract
pre-patch
do-patch
post-patch
pre-configure
do-configure
post-configure
pre-build
do-build
post-build
pre-install
do-install
post-install
post-stage
pre-package
do-package
post-package
当选择选项 OPT 时,目标 TARGET-OPT-on (如果定义)在 TARGET 之后执行。 TARGET-OPT-off 的工作方式相同,但在未选择 OPT 时执行。例如:
等于:
当定义 BINARY_ALIAS 时,它将在一个目录中创建给定命令的符号链接,这个目录将被添加到 PATH 之前。
用它来替换构建阶段依赖的硬编码命令,而无需修改任何构建文件。
示例 48. 使用 BINARY_ALIAS 使 gsed 可用作 sed
一些 ports 期望 sed 表现得像 GNU sed,并使用 sed(1) 不提供的功能。在 FreeBSD 上可以从 textproc/gsed 获取 GNU sed。
使用 BINARY_ALIAS 来替换构建期间的 sed 为 gsed :
例 49。使用 BINARY_ALIAS 为硬编码 python3 命令提供别名
具有在构建脚本中硬编码引用 python3 的port将需要在构建时在 PATH 中可用。使用 BINARY_ALIAS 创建一个指向正确的 Python 3 二进制文件的别名:
有关 USES=python 的更多信息,请参阅使用 Python 。
要声明具有多个flavors的port,请将 FLAVORS 添加到其 Makefile。 FLAVORS 中的第一个flavor是默认的flavor。
示例 1. 基本Flavors用法
如果一个port有一个“精简”从属port,可以移除从属port,并且可以将port转换为flavors,使用如下命令:
示例 2. 另一个基本 Flavors 使用
如果一个 port 有一个 -nox11 从属 port,则可以移除从属 port,并将 port 转换为 flavors:
示例 3. 更复杂的 Flavors 使用
这是在 devel/libpeas 中存在的内容的稍微编辑过的摘录,该port使用 Pythonflavors。 默认的 Python 2 和 3 版本分别为 2.7 和 3.6,它将自动获取 FLAVORS=py27 py36
这个port不使用 USE_PYTHON=distutils ,但无论如何都需要 Pythonflavors。 为了防止 FLAVOR 为空,这会导致 make(1)错误,在字符串比较中使用 ${FLAVOR:U} 而不是 ${FLAVOR} 。 Gnome Python gobject3 绑定有两个不同的名称,一个用于 Python 2,pygobject3,一个用于 Python 3,py3gobject3。 configure 脚本必须在${WRKSRC}中运行,但我们只对构建和安装软件的 Python 2 或 Python 3 部分感兴趣,因此请适当设置构建和安装基本目录。 关于正确的 Python 3 配置脚本路径名称的提示。 当使用 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 可以轻松实现这一点:
Ports to support the window manager.
维护者志愿保持port良好工作状态。维护者对其ports负有主要责任,但并非独占所有权。Ports是为社区的利益而存在,实际上属于社区。这意味着除维护者之外的其他人也可以对port进行更改。对Ports集合的重大更改可能需要更改许多ports。FreeBSD Ports管理团队或其他团队的成员可能会修改ports以修复依赖性问题或其他问题,例如共享库更新的版本提升。 某些类型的修复工作得到了Ports管理团队的“全面批准”,允许任何提交者在任何port上修复这些类别的问题。这些修复工作无需维护者批准。 大多数ports的“全面批准”适用于基础设施更改、或者是琐碎且经过测试的构建和运行时修复。当前列表可在提交者指南的Ports部分找到。
对port的其他更改将发送给维护者进行审查和批准,然后才能提交。如果维护者在更新请求后两周内(不包括主要公共假期)未作回应,则视为维护者超时,可以在无需明确维护者批准的情况下进行更新。如果维护者在三个月内仍未回应,或者连续三次超时,则视为维护者擅自离职,并且他们的所有ports可以重新分配回池中。不包括在此规定之内的由Ports管理团队或安全官员团队维护的项目,对这些项目不得进行未经授权的提交。
Ports管理团队 保留出于任何原因撤销或覆盖任何人的维护权限的权利,安全官员团队 保留出于安全原因撤销或覆盖维护权限的权利。
Since only the files listed in pkg-plist are installed, it is safe to always install documentation to STAGEDIR
(see ). Hence .if
blocks are only needed when the installed files are large enough to cause significant I/O overhead.
On the other hand, if there is a DOCS option in the port, install the documentation in a post-install-DOCS-on
target. These targets are described in .
一个静态包列表是在Ports Collection 中作为 pkg-plist(带有或不带有变量替换)或嵌入到 Makefile 中通过 PLIST_FILES 和 PLIST_DIRS 的包列表。即使内容是由工具或目标在包含到Ports Collection 之前由提交者在 Makefile 中自动生成的(例如,使用 make makeplist ),这仍被视为静态列表,因为可以在不必下载或编译 distfile 的情况下审查它。
动态软件包列表是在port编译时生成的软件包列表,基于已安装的文件和目录。在下载和编译移植应用程序的源代码之前,或在运行 make clean 之后,无法检查它。
虽然使用动态软件包列表并非禁止,但维护者应尽可能使用静态软件包列表,因为这使用户能够通过可用的ports使用 grep(1)来发现,例如,哪个port安装了某个文件。动态列表应主要用于复杂的ports,其中软件包列表根据port的可选功能发生 drastical 变化(因此维护静态软件包列表是不可行的),或者根据使用的依赖软件版本更改软件包列表的ports。例如,使用 Javadoc 生成文档的ports。
当使用 python 和 USE_PYTHON=distutils 时,port将自动填入其支持的 Python 版本 FLAVORS 。
示例 7. 简单 USES=python
假设当前 Python 支持的版本为 2.7、3.4、3.5 和 3.6,而默认的 Python 2 和 3 版本分别为 2.7 和 3.6,使用 port 如下:
将获得这些 flavors: py27 ,和 py36 。
将获得这些 flavors: py27 , py34 , py35 和 py36 。
例 8. USES=python 的版本要求
假设当前 Python 支持的版本是 2.7、3.4、3.5 和 3.6,以及默认的 Python 2 和 3 版本是 2.7 和 3.6,具有 port 的:
将获得此 flavor: py27 .
将获得这些 flavors: py27 , py34 , 和 py35 .
将获得此 flavor: py36 .
将获得这些 flavors: py34 , py35 和 py36 。
PY_FLAVOR 可用于依赖于正确版本的 Python 模块。所有对特定 Python ports 版本的依赖应该使用 PY_FLAVOR ,而不是直接使用 FLAVOR 。
示例 9。对于不使用 distutils 的 Port。
如果默认的 Python 3 版本是 3.6,则以下操作将会把 PY_FLAVOR 设置为 py36 :
所有关键字也可以在括号中带有可选参数。参数包括所有者、组和模式。此参数用于引用的文件或目录。要更改配置文件的所有者、组和模式,请使用:
参数是可选的。如果只需要更改组和模式,请使用:
这是因为选项 plist 助手用于注释掉该行,因此它们需要放在最前面。有关更多信息,请参见 OPTIONS_SUB 。
@desktop-file-utils
安装和卸载后将运行 update-desktop-database -q 。永远不要直接使用,将 USES=desktop-file-utils 添加到 Makefile 中。
为传递为参数的目录添加一个 @dir 条目,并在安装和卸载后在该目录上运行 fc-cache -fs 。
为传递为参数的目录添加一个 @dir 条目,并在安装和卸载后在该目录上运行 mkfontscale 和 mkfontdir 。此外,在卸载时,如果字体.scale 和字体.dir 缓存文件为空,则会删除它们。
将作为参数传递的文件添加到 plist 中,并在安装和卸载时更新信息文档索引。此外,如果索引为空,则在卸载时删除索引。永远不应手动使用此功能,而应始终通过 INFO 进行操作。有关更多信息,请参阅信息文件。
在安装和卸载时运行 kldxref 目录。另外,在卸载时,如果目录为空,则会将其删除。
在卸载时将删除文件,并且如果文件不存在不会报错。
用于处理设置文件的安装,通过包中捆绑的示例文件。实际的非示例文件要么是第二个文件名(如果存在),要么是没有 .sample 扩展名的第一个文件名。
这个做三件事。首先,将作为参数传递的第一个文件,即示例文件,添加到 plist 中。然后,在安装时,如果未找到实际文件,则将示例文件复制到实际文件中。最后,在卸载时,如果实际文件没有被修改,则移除实际文件。查看更多信息,请参阅配置文件。
在安装和卸载时在目录上运行 update-mime-database
将作为参数传递的文件添加到 plist 中。
在安装时,将文件的完整路径添加到 /etc/shells,同时确保不会重复添加。在卸载时,从 /etc/shells 中移除。
@terminfo
不要单独使用。如果 port 安装 *.terminfo 文件,将其添加到其 Makefile 中。
在安装和卸载时,如果 tic 存在,从${PREFIX}/shared/misc/terminfo.db 中的*.terminfo 文件刷新。
有一些硬编码的关键字,在 pkg-create(8)中有详细文档。为了完整起见,它们也在这里有文档记录。
当文件的所有者、组或权限需要更改时,请使用空关键字作为占位符。 例如,要将文件的组设置为 games 并添加 setgid 位,请添加:
在软件包安装或卸载过程中执行命令。
@preexec 命令
在预安装脚本的一部分执行命令。
@postexec 命令
将命令作为安装后脚本的一部分执行。
@preunexec 命令
作为预卸载脚本的一部分执行命令。
@postunexec 命令
作为后卸载脚本的一部分执行命令。
如果命令包含这些序列中的任何一个,它们将在命令中内联展开。对于这些示例,假设 @cwd 设置为 /usr/local,最后提取的文件是 bin/emacs。
%F
展开为最后提取的文件名(如指定的那样)。在示例中是 bin/emacs。
%D
展开为当前目录前缀,如使用 @cwd 设置。在示例中是 /usr/local。
%B
扩展为完全限定文件名的基本名称,即当前目录前缀加上最后的文件规范,减去尾部文件名。在这个例子中,那将是 /usr/local/bin。
%f
扩展为完全限定名称的文件名部分,或 %B 的相反。在这个例子中,emacs。
将所有随后提取的文件的默认权限设置为模式。格式与 chmod(1) 使用的格式相同。无参数使用可将权限设置为默认权限(在打包时文件的模式)。
将所有后续文件的默认所有权设置为用户。不带参数使用可将其设置回默认所有权( root )。
将所有后续文件的默认组所有权设置为组。不带参数使用可将默认组所有权设置回默认值( wheel )。
打包时忽略此行。
声明目录名称。默认情况下,软件包安装在 PREFIX 下创建的目录会自动删除。当需要创建 PREFIX 下的空目录,或者目录需要具有非默认所有者、组或模式时,请使用此选项。需要注册 PREFIX 外的目录。例如,/var/db/${PORTNAME} 需要有一个 @dir 条目,而 ${PREFIX}/shared/${PORTNAME} 不需要,如果它包含文件或使用默认所有者、组和模式。
在安装或卸载过程中执行命令。请改用 @preexec * 命令, @postexec 命令, @preunexec 命令, @postunexec 命令*。
声明要在卸载时删除的目录名称。默认情况下,包安装时在 PREFIX 下创建的目录在卸载包时会被删除。
声明要删除的目录名称,如 @dirrm ,但如果无法删除目录,则不发出警告。
包列表文件可以通过在 ${PORTSDIR}/Keywords 目录中定义的关键字进行扩展。 每个关键字的设置存储在一个名为 keyword.ucl 的 UCL 文件中。 该文件必须至少包含以下部分之一:
attributes
action
pre-install
post-install
pre-deinstall
post-deinstall
pre-upgrade
post-upgrade
attributes
更改关键字使用的所有者、组或模式。 包含一个关联数组,其中可能的键是 owner , group 和 mode 。 值分别为用户名、组名和文件模式。 例如:
action
定义关键字参数的处理方式。 包含一个数组,其中可能的值为:
setprefix
设置下一个 plist 条目的前缀。
dir
注册一个目录,在安装时创建并在卸载时删除。
dirrm
注册一个目录,在卸载时删除。已弃用。
dirrmtry
注册一个目录以尝试并在卸载时删除。已弃用。
file
注册一个文件。
setmode
设置下一个属性列表条目的模式。
setowner
设置下一个 plist 条目的所有者。
setgroup
设置下一个 plist 条目的组。
comment
不做任何事情,相当于不输入 action 部分。
ignore_next
忽略 plist 中的下一个条目。
arguments
如果设置为 true ,则添加参数处理,将整行分割为编号参数 %@ , %1 , %2 等。例如,对于此行:
%1 和 %2 将包含:
它还影响 action 条目的工作方式。当有多个参数时,必须指定参数编号。例如:
pre-install
, post-install
, pre-deinstall
, post-deinstall
, pre-upgrade
, post-upgrade
这些关键字包含要在安装、卸载或升级软件包之前或之后执行的 sh(1)脚本。除了通常在 @preexec 命令, @postexec 命令, @preunexec 命令, @postunexec 命令中描述的 @exec %foo 占位符之外,还有一个新的占位符 %@ ,代表关键字的参数。
示例 2. @dirrmtryecho 关键字的示例
此关键字有两个作用,它向装箱清单添加一行 @dirrmtry directory ,并在卸载软件包时回显目录已被删除的事实。
示例 3. 真实案例, @sample 如何被实现
这个关键字有三个作用。它将作为参数传递的第一个文件名添加到 @sample 的打包列表中,将复制示例到实际配置文件的 post-install 脚本指令添加到打包列表中,如果实际配置文件不存在,则添加 post-deinstall 指令以移除配置文件,如果配置文件尚未被修改。
一些ports,特别是 p5- ports,需要根据它们配置的选项(或 p5- ports的版本)更改它们的 pkg-plist。为了简化此过程,pkg-plist 中的任何 %%OSREL%% , %%PERL_VER%% 和 %%PERL_VERSION%% 的实例将被适当替换。 %%OSREL%% 的值是操作系统的数字修订版(例如, 4.9 )。 %%PERL_VERSION%% 和 %%PERL_VER%% 是 perl 的完整版本号(例如, 5.8.9 )。有关port文档文件的其他几个 %%VARS%% 描述在相关部分中。
要进行其他替换,请使用 PLIST_SUB 设置一个 VAR=VALUE 对列表,并将 %%VAR%% 的实例替换为 pkg-plist 中的 VALUE。
例如,如果port在特定版本子目录中安装了许多文件,请使用版本的占位符,这样每次更新port时就不必重新生成 pkg-plist。例如,设置:
在 Makefile 中使用 %%OCTAVE_VERSION%% ,在 pkg-plist 中显示版本的地方都使用 %%OCTAVE_VERSION%% 。当port升级时,无需编辑 pkg-plist 中的数十行(或在某些情况下,数百行)。
如果文件是根据port中设置的选项条件性安装的,则处理的通常方法是在需要时,为启用选项的行在 pkg-plist 行的前面加上 %%OPT%% ,或者在禁用选项时加上 %%NO_OPT%% ,并且在 Makefile 中添加 OPTIONS_SUB=yes 。有关更多信息,请参见 OPTIONS_SUB 。
例如,如果只有在启用 X11 选项时才安装文件,并且 Makefile 中包含:
在 pkg-plist 中,像这样,在仅在选项启用时被安装的行前面加上 %%X11%% :
在读取 PLIST 并写入 TMPPLIST(默认:WRKDIR/.PLIST.mktmp)之间,将在 pre-install 和 do-install 目标之间进行替换。因此,如果 port 在生成 PLIST 时,应在 pre-install 之前或之中这样做。另外,如果 port 需要编辑生成的文件,则应在 post-install 中将其编辑为名为 TMPPLIST 的文件。
另一种修改 port 打包清单的方法是基于设置变量 PLIST_FILES 和 PLIST_DIRS 。每个变量的值被视为要写入 TMPPLIST 的路径名列表,以及 PLIST 内容。虽然 PLIST_FILES 和 PLIST_DIRS 中列出的名称将按照上述描述进行 %%VAR%% 替换,但最好直接使用 ${VAR} 。除此之外, PLIST_FILES 中的名称将不经修改地出现在最终的打包清单中,而 @dir 将被添加到 PLIST_DIRS 中的名称之前。要生效,必须在写入 TMPPLIST 之前设置 PLIST_FILES 和 PLIST_DIRS ,也就是在 pre-install 或更早的时候。
有时候,仅使用 OPTIONS_SUB 是不够的。在这些情况下,在 Makefile 中添加特定的 TAG 到 PLIST_SUB ,并赋予特殊值 @comment ,使得软件包工具忽略该行。例如,如果仅当 X11 选项打开且架构为 i386 时才安装某些文件:
首先,确保 port 几乎完成,只有 pkg-plist 缺失。 运行 make makeplist 将显示一个 pkg-plist 的示例。 makeplist 的输出必须仔细检查正确性,因为它尝试自动猜测一些事情,可能会出错。
用户配置文件应安装为 filename.sample,正如在配置文件中所述。 不得列出 info/dir,并且必须根据信息文件部分中的注释添加适当的 install-info 行。 由port安装的任何库都必须按照共享库部分中指定的方式列出。
有时需要替换的字符串需要非常具体,以避免不受欢迎的替换。 这是较短值的常见问题。
要解决这个问题,对于每个 PLACEHOLDER=value ,可以设置一个 PLACEHOLDER_regex=regex ,其中 regex 部分更精确地匹配值。
示例 1. 使用 PLIST_SUB 与正则表达式
Perl ports 可以在特定树中安装与架构相关的文件。在 FreeBSD 上为了便于移植,这个树被称为 mach 。例如,一个port安装一个路径包含 mach 的文件,该路径字符串的部分可能被替换为错误的值。考虑这个 Makefile:
port 安装的文件有:
错误地运行 make makeplist 会生成:
将 Makefile 中的 PLIST_SUB 行更改为:
现在 make makeplist 正确生成:
如果port将配置文件安装到 PREFIX/etc(或其他位置),请勿在 pkg-plist 中列出它们。这将导致 pkg delete 删除用户精心编辑过的文件,并重新安装时会将它们清除。
如果有非常充分的理由不默认安装工作配置文件,则只需在 pkg-plist 中列出示例文件名,而不包含后面跟着一个空格部分的 @sample ,并添加一条消息指出用户必须在软件正常工作之前复制和编辑该文件。
或
格式为 @sample sample-file actual-config-file 。
本节解释了创建port时要考虑的最常见事项。
有时,port Makefile 可能会非常长。例如,rust ports 可能会有一个非常长的 CARGO_CRATES 列表。在其他情况下,Makefile 可能会有根据架构变化的代码。在这种情况下,将原始 Makefile 拆分为多个文件可能很方便。bsd.port.mk 会自动将某些类型的 Makefile 包含到主 port Makefile 中。
这些是框架自动处理的文件(如果找到的话):
Makefile.crates。 在 audio/ebur128 中可以找到一个示例。
Makefile.inc。 在 net/ntp 中可以找到一个示例。
Makefile.${ARCH}-${OPSYS}
Makefile.${OPSYS}. 一个示例可在 net/cvsup-static 中找到。
Makefile.${ARCH}
Makefile.local
将port的打包清单拆分为多个文件也是通常做法,如果清单在不同架构之间变化很大或取决于所选的风味。在这种情况下,每个架构的 pkg-plist 文件的命名遵循 pkg-plist.${ARCH}或 pkg-plist.${FLAVOR}的模式。如果存在多个 pkg-plist 文件,框架不会自动创建打包清单。选择适当的 pkg-plist 并将其分配给 PLIST 变量是 porter 的责任。如何处理这种情况的示例可以在 audio/logitechmediaserver 和 deskutils/libportal 中找到。
bsd.port.mk 期望ports与“阶段目录”一起工作。这意味着port不能直接将文件安装到常规目标目录(例如,在 PREFIX 下),而是安装到一个单独的目录,然后从该目录构建软件包。在许多情况下,这不需要 root 权限,使得可以作为非特权用户构建软件包。使用分阶段,port被构建并安装到阶段目录 STAGEDIR 中。从阶段目录创建软件包,然后安装到系统上。Automake 工具将此概念称为 DESTDIR ,但在 FreeBSD 中, DESTDIR 有不同的含义(请参阅 PREFIX 和 DESTDIR )。
元 ports,或者不安装文件而只依赖其他 ports 的 ports,必须避免不必要地将 mtree(8) 提取到阶段目录。这是软件包的基本目录布局,这些空目录将被视为孤立文件。为了防止 mtree(8) 提取,添加以下行:
通过在 pre-install , do-install 和 post-install 目标中使用路径之前添加 STAGEDIR 来启用分段(请参阅本书中的示例)。通常,这包括 PREFIX , ETCDIR , DATADIR , EXAMPLESDIR , DOCSDIR 等。目录应作为 post-install 目标的一部分创建。尽量避免使用绝对路径。
当创建符号链接时,强烈建议使用相对路径。使用 ${RLN} 来创建相对符号链接。它在幕后使用 install(1)自动计算要创建的相对链接。
例子 1. 自动创建相对符号链接
${RLN} 使用 install(1)的相对符号功能,使得端口的计算相对路径得到释放。
将生成:
本节解释为什么捆绑依赖项被视为不好,并介绍如何处理它们。
有些软件要求制作者找到第三方库并将所需的依赖项添加到定制中。其他软件将所有必要的库捆绑到分发文件中。起初,第二种方法似乎更容易,但存在一些严重的缺点:
这个列表基本上是基于 Fedora 和 Gentoo 维基百科,两者都在 CC-BY-SA 3.0 许可下授权。
如果在上游库中发现漏洞并进行修复,可能不会在与 port 捆绑的库中修复。一个原因可能是作者不知道这个问题。这意味着移植者必须修复它们,或者升级到一个非易受攻击的版本,并将补丁发送给作者。所有这些都需要时间,这导致软件比必要的时间更容易受到攻击。这反过来使得更难协调修复,而不必要地泄露有关漏洞的信息。
Bug 这个问题类似于上一段中安全性问题,但一般来说不那么严重。
分叉对于作者来说更容易在捆绑后分叉上游库。虽然乍一看很方便,但这意味着代码与上游不同,使得更难解决软件的安全或其他问题。这样做的原因之一是补丁变得更加困难。
另一个分叉的问题是,由于代码与上游分歧,错误会一遍又一遍地被解决,而不是在一个中心位置解决一次。这背离了开源软件的初衷。
符号冲突当一个库被安装在系统上时,它可能与捆绑版本冲突。这可能导致在编译或链接时立即出现错误。它还会导致运行程序时出现错误,这可能更难追踪。后一问题可能是由于两个库的版本不兼容造成的。
许可证问题当从不同来源捆绑项目时,许可证问题可能更容易出现,特别是当许可证不兼容时。
资源浪费打包的库会在多个层面上浪费资源。构建实际应用程序需要更长的时间,特别是如果这些库已经存在于系统上。在运行时,当系统范围的库已被一个程序加载,而打包的库被另一个程序加载时,它们可能占用不必要的内存。
努力的浪费当一个库需要为 FreeBSD 打补丁时,这些补丁必须在打包的库中再次复制。这会浪费开发人员的时间,因为这些补丁可能无法干净地应用。很难注意到这些补丁是必需的。
尽可能使用库的非捆绑版本,通过向 LIB_DEPENDS 添加port来实现。如果尚未存在这样的port,请考虑创建它。
仅当上游在安全方面有良好记录且使用非捆绑版本会导致过于复杂的补丁时才使用捆绑库。
如果port安装了一个或多个共享库,请定义一个 USE_LDCONFIG 的 make 变量,这将指导 bsd.port.mk 在安装新库的目录(通常为 PREFIX/lib)上运行 ${LDCONFIG} -m ,以便在 post-install 目标期间将其注册到共享库缓存中。当定义了这个变量时,还将有助于在 pkg-plist 中添加适当的 @exec /sbin/ldconfig -m 和 @unexec /sbin/ldconfig -R 对,以便安装了该软件包的用户可以立即开始使用共享库,卸载不会导致系统仍然认为库仍然存在。
默认目录可以通过将 USE_LDCONFIG 设置为要安装共享库的目录列表来覆盖。例如,如果port将共享库安装到 PREFIX/lib/foo 和 PREFIX/lib/bar,请在 Makefile 中使用此命令:
请仔细检查,通常这根本不必要,或者可以通过 -rpath 或在链接过程中设置 LD_RUN_PATH 来避免(请参阅 lang/mosml 中的示例),或者通过一个在调用二进制文件之前设置 LD_LIBRARY_PATH 的shell包装器,就像 www/seamonkey 一样。
在 64 位系统上安装 32 位库时,请使用 USE_LDCONFIG32 。
如果软件使用 autotools,并且特别是 libtool ,请添加 USES=libtool 。
当主要库版本号在更新到新版时递增时,所有其他链接到受影响库的ports必须递增,以强制使用新库版本重新编译。
许可证各不相同,其中一些对应用程序的打包方式、是否可出售以获取利润等方面设置了限制。
在这种情况下,可以设置下一节中描述的变量。
NO_PACKAGE
此变量表示我们可能不会生成应用程序的二进制软件包。例如,许可证可能禁止二进制重新分发,或者可能禁止从打补丁的源代码创建的软件包的分发。
但是,port的 DISTFILES 可以在 FTP/HTTP 上自由镜像。除非 NO_CDROM 也被设置,否则它们也可以在 CD-ROM(或类似媒体)上分发。
如果二进制软件包没有普遍用途,并且应用程序必须始终从源代码编译,请使用 NO_PACKAGE 。例如,如果应用程序在编译时将站点特定的配置信息硬编码到其中,请设置 NO_PACKAGE 。
将 NO_PACKAGE 设置为描述软件包无法生成原因的字符串。
NO_CDROM
单独这个变量表明,尽管我们可以生成二进制软件包,但我们既不能将这些软件包也不能将port的 DISTFILES 放入光盘(或类似媒体)进行转售。然而,二进制软件包和port的 DISTFILES 仍然可以通过 FTP/HTTP 获得。
如果设置了这个变量以及 NO_PACKAGE ,那么只有port的 DISTFILES 将可用,并且只能通过 FTP/HTTP 获得。
将 NO_CDROM 设置为描述port无法在光盘上重新分发的原因的字符串。例如,如果port的许可证仅限于“非商业”使用,请使用此选项。
NOFETCHFILES
在 NOFETCHFILES 中定义的文件不能从任何 MASTER_SITES 获取。此类文件的一个示例是供应商通过 CD-ROM 提供的文件。
检查这些文件在 MASTER_SITES 上的可用性的工具必须忽略这些文件并且不报告它们。
RESTRICTED
如果应用程序的许可证既不允许镜像应用程序的 DISTFILES 也不允许以任何方式分发二进制包,则单独设置此变量。
不要设置 NO_CDROM 或 NO_PACKAGE 以及 RESTRICTED ,因为后一个变量意味着前面的变量。
将 RESTRICTED 设置为描述为什么port 不能重新分发的字符串。通常,这表示port 包含专有软件,用户需要手动下载 DISTFILES ,可能需要在注册软件或同意接受 EULA 条款后进行。
RESTRICTED_FILES
当设置 RESTRICTED 或 NO_CDROM 时,此变量默认为 ${DISTFILES} ${PATCHFILES} ,否则为空。如果仅限制一些发布文件,则将此变量设置为列出它们。
LEGAL_TEXT
如果port存在未在上述变量中解决的法律问题,请将 LEGAL_TEXT 设置为解释该问题的字符串。例如,如果为了 FreeBSD 重新分发二进制文件而获得了特殊许可,则此变量必须指示如此。
设置任何上述变量的port也必须添加到/usr/ports/LEGAL。第一列是匹配受限制的分发文件的通配符。第二列是port的来源。第三列是 make -VLEGAL 的输出。
陈述“此 port 的 distfiles 必须手动获取”的首选方式如下:
这既通知用户,又为自动化程序在用户机器上设置正确的元数据。
请注意,此段必须由 bsd.port.pre.mk 的包含形式先导。
FreeBSD ports 框架支持使用多个 make 子进程进行并行构建,这允许 SMP 系统利用所有可用的 CPU 力量,从而使 port 构建更快更有效。
通过在运行供应商代码的 make(1) 上添加 -jX 标志来实现这一目标。这是 ports 的默认构建行为。不幸的是,并非所有 ports 都能很好地处理并行构建,可能需要通过添加 MAKE_JOBS_UNSAFE=yes 变量来显式禁用此功能。当已知某个 port 由于竞争条件导致间歇性构建失败时,就会使用它。
存在几种不同的 make 实现。移植软件通常需要特定的实现,如 GNU make ,在 FreeBSD 中称为 gmake 。
如果port使用 GNU make,请将 gmake 添加到 USES 。
MAKE_CMD 可以用来引用在 port 的 Makefile 中配置的特定命令。 只在应用程序 Makefiles 中使用 MAKE_CMD ,以调用在移植软件中期望的 make 实现。
如果 port 是一个使用 imake 从 Imakefiles 创建 Makefiles 的 X 应用程序,请设置 USES= imake 。 查看《使用 USES 宏》一节以获取更多详细信息。
如果 port 的源 Makefile 中除了 all 以外还有其他主要构建目标,请相应设置 ALL_TARGET 。 对于 install 和 INSTALL_TARGET 也是如此。
如果 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 传递额外环境变量。
表 1. 使用 configure 的 Ports 变量
对于使用 CMake 的 ports,定义 USES= cmake 。
Ports使用的 cmake 变量表 2 变量
cmake 建造的用户可定义的变量表 3
CMake 支持这些构建配置文件: Debug , Release , RelWithDebInfo 和 MinSizeRel 。 Debug 和 Release 配置文件遵循系统 FLAGS , RelWithDebInfo 和 MinSizeRel 将分别设置 CFLAGS 为 -O2 -g 和 -Os -DNDEBUG 。 CMAKE_BUILD_TYPE 的小写值被导出到 PLIST_SUB ,如果port根据构建类型安装.cmake(请参阅 devel/kf5-kcrash 的示例)。请注意,一些项目可能定义自己的构建配置文件和/或通过在 CMakeLists.txt 中设置 CMAKE_BUILD_TYPE 来强制特定的构建类型。为了使这样一个项目的port遵循 CFLAGS 和 WITH_DEBUG ,这些文件中的 CMAKE_BUILD_TYPE 定义必须被移除。
大多数基于 CMake 的项目支持一种离源代码构建的方法。对于port,离源代码构建是默认设置。可以通过使用 :insource 后缀来请求源代码内构建。使用离源代码构建时, CONFIGURE_WRKSRC , BUILD_WRKSRC 和 INSTALL_WRKSRC 将被设置为 ${WRKDIR}/.build ,并且该目录将用于保存在配置和构建阶段生成的所有文件,保持源代码目录不变。
示例 2. USES= cmake 示例
此片段演示了使用 CMake 构建 port 的方法。通常情况下不需要 CMAKE_SOURCE_PATH ,但当源代码不位于顶级目录中,或者只打算构建项目的子集时,可以设置 port。
示例 3. CMAKE_ON 和 CMAKE_OFF
当向 CMAKE_ARGS 添加布尔值时,最好使用 CMAKE_ON 和 CMAKE_OFF 变量。这样做会更容易:
等同于:
如果 port 使用 SCons,请定义 USES=scons 。
要使第三方 SConstruct 尊重通过环境传递给 SCons 的所有内容(即,最重要的是 CC/CXX/CFLAGS/CXXFLAGS ),请修补 SConstruct,以便构建 Environment 如下所示:
它可以然后通过 env.Append 和 env.Replace 进行修改。
对于使用 Cargo 的ports,定义 USES=cargo 。
用户可以为 cargo 构建定义的变量表 4
创建一个简单的 Rust 应用程序Port的示例 4。
创建基于 Cargo 的port是一个三阶段的过程。首先,我们需要提供一个ports模板,用于获取应用程序分发文件:
生成初始的 distinfo:
现在分发文件已准备就绪,我们可以继续从捆绑的 Cargo.lock 中提取箱依赖项:
此命令的输出需要直接粘贴到 Makefile 中:
需要重新生成 distinfo 以包含所有箱分发文件:
port现在已准备好进行测试构建和进一步调整,如创建 plist,撰写描述,添加许可信息,选项等等,一切如常。
如果您没有在像 poudriere 这样的干净环境中测试您的port,请记得在任何测试之前运行 make clean 。
示例 5. 启用额外的应用程序功能
一些应用程序在其 Cargo.toml 中定义了额外的功能。可以通过在 port 中设置 CARGO_FEATURES 来进行编译。
在这里,我们启用 Tokei 的 json 和 yaml 功能:
示例 6. 将应用程序功能编码为 Port 选项。
Cargo.toml 中的一个示例 [features] 部分可能如下所示:
pulseaudio_backend 是一个默认功能。除非我们通过向 CARGO_FEATURES 添加 --no-default-features 来明确关闭默认功能,否则它始终启用。在这里,我们将 portaudio_backend 和 pulseaudio_backend 功能转换为 port 选项:
示例 7. 列出 Crate 许可证
包有它们自己的许可证。在向 LICENSE 块添加到 port 时,了解它们是很重要的(请参阅许可证)。助手目标 cargo-crates-licenses 将尝试列出在 CARGO_CRATES 中定义的所有包的所有许可证。
对于使用 Meson 的 ports,定义 USES=meson 。
表 5. 使用 meson 的 Ports 的变量
示例 8. USES=meson 示例
此片段演示了使用 Meson 进行 port 的用法。
对于使用 Go 的ports,定义 USES=go 。有关可以设置以控制构建过程的变量列表,请参阅 go 。
示例 9. 为基于 Go 模块的应用程序创建Port。
在大多数情况下,将 GO_MODULE 变量设置为 go.mod 中 module 指令指定的值就足够了。
如果“简单”方法不够或需要更多对依赖项的控制,则下面描述了完整的移植过程。
创建基于 Go 的 port 是一个五阶段的过程。首先,我们需要提供一个 ports 模板,用于获取应用程序分发文件:
生成初始的 distinfo:
现在分发文件已准备就绪,我们可以提取所需的 Go 模块依赖项。此步骤需要安装ports-mgmt/modules2tuple:
此命令的输出需要直接粘贴到 Makefile 中:
需要重新生成 distinfo 以包含所有分发文件:
port现在已准备好进行测试构建和进一步调整,如创建 plist,编写描述,添加许可信息,选项等等,与正常操作一样。
如果您没有在像 poudriere 这样的干净环境中测试您的port,请记得在任何测试之前运行 make clean 。
示例 10. 设置输出二进制名称或安装路径
一些 ports 需要将结果二进制文件安装到不同名称或默认路径以外的路径。这可以通过使用 GO_TARGET 元组语法来实现,例如:
将 ipfs 二进制文件安装为 ${PREFIX}/bin/ipfs-go
将 dnscrypt-proxy 安装到 ${PREFIX}/sbin
对于使用 Cabal 的ports,构建系统定义了 USES=cabal 。请参考 cabal 以查看可设置以控制构建过程的变量列表。
示例 11. 为一个 Hackage 托管的 Haskell 应用程序创建Port
在准备 Haskell Cabal port 时,需要安装 devel/hs-cabal-install 和 ports-mgmt/hs-cabal2tuple 程序,因此请确保事先安装它们。首先,我们需要定义通用的 ports 变量,以便 cabal-install 可以获取软件包分发文件:
这个最小的 Makefile 使用 cabal-extract 辅助目标来获取分发文件:
现在我们在 ${WRKSRC} 下有 ShellCheck.cabal 软件包描述文件,我们可以使用 cabal-configure 来生成构建计划:
一旦完成,可以生成所需依赖项列表:
Haskell 软件包可能包含修订版本,就像 FreeBSD ports 一样。修订版本只会影响 .cabal 文件。请注意 _ 符号后面的附加版本号。请将新生成的 USE_CABAL 列表放在旧列表的位置。
最后,需要重新生成 distinfo 以包含所有分发文件:
port现在已准备好进行测试构建和进一步调整,如创建 plist,编写描述,添加许可信息,选项等等,一切如常。
如果您没有在像 poudriere 这样的干净环境中测试您的port,请记得在任何测试之前运行 make clean 。
一些 Haskell ports 在 share/${PORTNAME} 下安装各种数据文件。对于这种情况,需要在port端进行特殊处理。port应定义 CABAL_WRAPPER_SCRIPTS 旋钮,列出每个将使用数据文件的可执行文件。此外,在罕见情况下,被移植程序使用其他 Haskell 软件包的数据文件,这时 FOO_DATADIR_VARS 就派上用场了。
示例 12. 在 Haskell 中处理数据文件 Port
devel/hs-profiteur 是一个 Haskell 应用程序,用于生成带有一些内容的单页面 HTML。
它在 share/profiteur 下安装 HTML 模板,因此我们需要添加 CABAL_WRAPPER_SCRIPTS 旋钮:
该程序还尝试访问 jquery.js 文件,该文件是 js-jquery-3.3.1 Haskell 软件包的一部分。为了找到该文件,我们需要使包装脚本也查找 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:
Haskell ports 与 VCS 依赖项还需要暂时使用以下技巧:
如果 port 需要任何 GNU Autotools 软件,请添加 USES=autoreconf 。查看 autoreconf 获取更多信息。
如果 port 需要 gettext ,设置 USES= gettext ,port 将从 devel/gettext 继承对 libintl.so 的依赖。 gettext 的其他值在 USES=gettext 中列出。
一个相当常见的情况是 port 使用 gettext 和 configure 。通常,GNU configure 应该能够自动定位 gettext 。
如果它无法成功,可以通过以下方式传递 gettext 的位置提示:在 CPPFLAGS 和 LDFLAGS 中使用 localbase 。
一些软件产品允许禁用 NLS。例如,通过将 --disable-nls 传递给 configure 。在这种情况下,port必须有条件地使用 gettext ,具体取决于 NLS 选项的状态。对于低到中等复杂度的ports,请使用这种习惯用语:
或者使用使用选项的较旧方法:
待办事项清单上的下一项是要安排消息目录文件在打包清单中有条件地包含。 此任务的 Makefile 部分已由该习惯提供。 在高级 pkg-plist 实践部分有解释。 简而言之,pkg-plist 中的每个 %%NLS%% 出现将在 pkg-plist 中消息目录文件的每个路径之前用" @comment " if NLS is disabled, or by a null string if NLS is enabled. Consequently, the lines prefixed by %%NLS%%will become mere comments in the final packing list if NLS is off; otherwise the prefix will be just left out. Then insert%%NLS%% 替换。 例如:
在复杂情况下,可能需要更先进的技术,如动态打包清单生成。
安装消息目录文件有一个需要注意的地方。它们的目标目录,位于 LOCALBASE/share/locale 下,不得由port创建和移除。最流行的语言有它们各自的目录列在 PORTSDIR/Templates/BSD.local.dist 中。许多其他语言的目录受 devel/gettext port管理。查看其 pkg-plist,并查看port是否将为某种独特语言安装消息目录文件。
如果 MASTER_SITES 设置为 CPAN ,通常会自动选择正确的子目录。如果默认子目录错误,可以使用 CPAN/Module 进行更改。 MASTER_SITES 也可以设置为旧的 MASTER_SITE_PERL_CPAN ,然后 MASTER_SITE_SUBDIR 的首选值是顶层层次结构名称。例如, p5-Module-Name 的推荐值是 Module 。可以在 cpan.org 上查看顶层层次结构。这样可以在模块作者更改时保持 port 的正常工作。
例外情况是相关目录不存在或者在该目录中不存在 distfile 时。在这种情况下,允许使用作者的 id 作为 MASTER_SITE_SUBDIR 。可以使用 CPAN:AUTHOR 宏,它将被转换为散列作者目录。例如, CPAN:AUTHOR 将被转换为 authors/id/A/AU/AUTHOR 。
当 port 需要 Perl 支持时,必须使用 perl5 USES 描述中描述的可选 USE_PERL5 设置 USES=perl5 。
表 6. 使用 Perl 的 Ports 只读变量
示例 14. Perl 依赖示例
对于安装手册页的 Perl ports,在 pkg-plist 中可以使用宏 PERL5_MAN3 和 PERL5_MAN1 。例如,
可以替换为
例 15. 一个 Port 只需要 Perl 来构建
由于默认的 USE_PERL5 值是构建和运行,将其设置为:
例 16. 一个 Port 也需要 Perl 来修补
有时候,仅仅使用 sed(1)进行补丁不够。当使用 perl(1)更容易时,请使用:
例子 17. 一个需要 ExtUtils::MakeMaker 构建的 Perl 模块
大多数 Perl 模块附带 Makefile.PL 配置脚本。在这种情况下,请设置:
示例 18. 一个需要 Module::Build 构建的 Perl 模块
当一个 Perl 模块带有一个 Build.PL 配置脚本时,它可能需要 Module::Build,在这种情况下,设置
如果它需要 Module::Build::Tiny,设置
The X11 实现在 The Ports Collection 中提供的是 X.Org。如果应用程序依赖于 X 组件,请添加 USES= xorg 并将 USE_XORG 设置为所需组件列表中的一部分。完整列表可以在 xorg 中找到。
Mesa 项目是提供免费的 OpenGL 实现的努力。要指定对该项目各组件的依赖关系,请使用 USES= gl 和 USE_GL 。请查看 gl 以获取可用组件的完整列表。为了向后兼容, yes 的值映射到 glu 。
例 19. USE_XORG 示例
表 7. 使用 X 的 Ports 变量
示例 20. 使用 X11 相关变量
如果 port 需要 Motif 库,请在 Makefile 中定义 USES= motif 。默认的 Motif 实现是 x11-toolkits/open-motif。用户可以通过在他们的 make.conf 中设置 WANT_LESSTIF 来选择 x11-toolkits/lesstif。类似地,x11-toolkits/open-motif-devel 可以通过在 make.conf 中设置 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 系统的字体,请将它们放在 LOCALBASE/lib/X11/fonts/local 中。
一些应用程序需要一个正常工作的 X11 显示来确保编译成功。这对于无头操作的机器构成了问题。当使用这个变量时,构建基础设施将启动虚拟帧缓冲 X 服务器。然后将工作的 DISPLAY 传递给构建。查看 USES=display 以获取可能的参数。
桌面条目(Freedesktop 标准)提供一种在安装新程序时自动调整桌面功能的方式,无需用户干预。例如,新安装的程序会自动出现在兼容桌面环境的应用程序菜单中。桌面条目起源于 GNOME 桌面环境,但现在是一个标准,并且也适用于 KDE 和 Xfce。这种自动化提供了真正的用户福利,鼓励将桌面条目用于可以在桌面环境中使用的应用程序。
Ports 包括预定义的 *.desktop 文件的软件包必须在 pkg-plist 中包含这些文件,并将它们安装在 $LOCALBASE/share/applications 目录中。 INSTALL_DATA 宏对于安装这些文件很有用。
如果port在其 portname.desktop 中有 MimeType 条目,则在安装和卸载后必须更新桌面数据库。要做到这一点,请定义 USES = desktop-file-utils。
使用 DESKTOP_ENTRIES 可以轻松地为应用程序创建桌面条目。将创建一个名为 name.desktop 的文件,该文件将自动安装并添加到 pkg-plist 中。语法为:
可在 Freedesktop 网站上找到可能的类别列表。 StartupNotify 指示应用程序是否与启动通知兼容。这些通常是图形指示器,比如一个在鼠标指针、菜单或面板上出现的时钟,用于向用户指示程序何时正在启动。与启动通知兼容的程序在启动后会清除指示器。不兼容启动通知的程序永远不会清除指示器(可能会使用户感到困惑和愤怒),必须将 StartupNotify 设为 false 以便根本不显示指示器。
示例:
DESKTOP_ENTRIES 被安装在变量指向的目录中。 DESKTOPDIR 默认为${PREFIX}/share/applications
本章节解释了 ports 使用的 GNOME 框架。该框架可以大致分为基本组件、GNOME 桌面组件以及一些简化 port 维护者工作的特殊宏。
将此变量添加到 port 允许使用在 bsd.gnome.mk 中定义的宏和组件。bsd.gnome.mk 中的代码添加了所需的构建时、运行时或库依赖项,或者处理特殊文件。FreeBSD 下的 GNOME 应用程序使用 USE_GNOME 基础设施。将所有所需组件作为以空格分隔的列表包含。这些 USE_GNOME 组件被分为基本组件、GNOME 3 组件和遗留组件这些虚拟列表。如果 port 只需要 GTK3 库,这是定义的最简单方式:
USE_GNOME 组件会自动添加它们所需的依赖关系。请查看 GNOME 组件,了解所有 USE_GNOME 组件及它们隐含的其他组件以及它们的依赖关系的详尽列表。
这是一个示例 Makefile,用于一个使用了本文档中概述的许多技术的 GNOME port。请将其用作创建新 ports 的指南。
本节解释了可用的宏及其如何使用。就像它们在上面的例子中使用的那样。 GNOME 组件有更深入的解释。 必须为这些宏设置 USE_GNOME 才能发挥作用。
GLIB_SCHEMAS 所有 glib 模式文件的列表port 安装。该宏将添加这些文件到{{1002} plist,并处理这些文件在安装和卸载中的注册。
glib 模式文件是用 XML 编写的,并以 gschema.xml 扩展名结尾。它们安装在 share/glib-2.0/schemas/目录中。这些模式文件包含所有应用程序配置值及其默认设置。应用程序实际使用的数据库是由 glib-compile-schema 构建的,该程序由 GLIB_SCHEMAS 宏运行。
GCONF_SCHEMAS 列出所有 gconf 模式文件。该宏将向port plist 添加模式文件,并在安装和卸载时处理其注册。
GConf 是基于 XML 的数据库,几乎所有的 GNOME 应用程序都用它来存储它们的设置。这些文件被安装到 etc/gconf/schemas 目录中。这个数据库是由安装的模式文件定义的,这些文件用于生成%gconf.xml 关键文件。对于port安装的每个模式文件,Makefile 中必须有一个条目:
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 的帮助,请查看一些现有的 ports 以获取示例。如果需要更多帮助,FreeBSD GNOME 页面上有联系信息。这些组件分为当前正在使用的 GNOME 组件和旧版组件。如果组件支持参数,则在描述中将它们列在括号内。第一个是默认设置。“Both” 是指组件默认添加到构建和运行依赖项中。
GNOME 组件表 8
GNOME 宏组件表 9
桌面 10. GNOME 传统组件
弃用组件表 11:请勿使用
The Ports 集合为 Qt 5 和 Qt 6 提供支持,分别使用 USES+=qt:5 和 USES+=qt:6 。将 USE_QT 设置为所需的 Qt 组件列表(库、工具、插件)。
Qt 框架导出了一些变量,ports可以使用其中一些,以下是其中一些列出的变量:
表 12. 提供给Ports使用 Qt 的变量
每个 Qt 工具和库依赖项必须在 USE_QT 中指定。每个组件都可以加上 _build 或 _run 后缀,后缀表示对组件的依赖是在构建时还是运行时。如果没有后缀,该组件将在构建时和运行时都有依赖。通常,库组件被指定为无后缀,工具组件大多使用 _build 后缀,插件组件使用 _run 后缀。下面列出了最常用的组件(所有可用组件都列在 _USE_QT_ALL 中,该列表是从 _USE_QT_COMMON 和 _USE_QT[56]_ONLY 生成的,位于/usr/ports/Mk/Uses/qt.mk 中):
表 13. 可用的 Qt 库组件
要确定应用程序依赖的库,请在成功编译后的主可执行文件上运行 ldd 。
可用的 Qt 工具组件表 14。
可用的 Qt 插件组件表 15
示例 21. 选择 Qt 5 组件
在这个例子中,移植的应用程序使用了 Qt 5 图形用户界面库、Qt 5 核心库、所有 Qt 5 代码生成工具和 Qt 5 的 Makefile 生成器。由于 gui 库意味着对核心库的依赖,因此不需要指定 core 。Qt 5 代码生成工具 moc 、 uic 和 rcc ,以及 Makefile 生成器 qmake 仅在构建时需要,因此它们带有 _build 后缀指定:
如果应用程序提供一个 qmake 项目文件 (*.pro),则应同时定义 USES= qmake 和 USE_QT 。 USES= qmake 已经暗示了对 qmake 的构建依赖,因此可以省略 qmake 组件。类似于 CMake,qmake 支持在源码目录之外进行构建,可以通过指定 outsource 参数来启用 (请参见 USES= qmake 示例)。还请参阅 USES= qmake 的可能参数。
表 16. USES= qmake 的可能参数
表格 17. Ports 使用的变量
在使用 USES= qmake 时,这些设置会被部署:
一些配置脚本不支持上述参数。要抑制 CONFIGURE_ENV 和 CONFIGURE_ARGS 的修改,设置 USES= qmake:no_env 。
示例 22. USES= qmake 示例
这段代码演示了如何在 Qt 5 中使用 qmake port:
Qt 应用程序通常是跨平台编写的,通常不是在 X11/Unix 平台上开发,这导致某些问题,比如:
缺少额外的包含路径。许多应用程序支持系统托盘图标,但忽略在 X11 目录中查找包含和/或库。要通过命令行将目录添加到qmake
的包含和库搜索路径中,请使用:
虚假的安装路径。有时,诸如图标或 .desktop 文件之类的数据默认安装到 XDG 兼容应用程序未扫描的目录中。editors/texmaker 就是一个例子 - 查看 port 的文件目录中的 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,这是 KDE 项目广泛使用的配置工具(有关详细使用说明,请参阅《使用 cmake 》)。 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™)来构建、运行甚至提取分发文件,则定义 USE_JAVA 。
在ports集合中有几个来自不同供应商、多个版本的 JDK。如果port必须使用特定版本,请使用 JAVA_VERSION 变量指定。最新版本为 java/openjdk18,还提供 java/openjdk17、java/openjdk16、java/openjdk15、java/openjdk14、java/openjdk13、java/openjdk12、java/openjdk11、java/openjdk8 和 java/openjdk7。
表 20。由Ports使用 Java 的可以设置的变量
以下是设置 USE_JAVA 后 port 将收到的所有设置列表:
表 21. 使用 Java 的 Ports 提供的变量
使用 java-debug make 目标获取用于调试 port 的信息。它将显示许多先前列出的变量的值。
另外,这些常量被定义为所有 Java ports 可以以一致的方式安装:
表 22. 为使用 Java 的 Ports 定义的常量
相关条目在 PLIST_SUB (在更改 pkg-plist 基于 Make 变量中记录)和 SUB_LIST 中定义。
当使用 Apache Ant 构建port时,必须定义 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 依赖项安装在此目录下,或者使用已安装的依赖项(来自${JAVAJARDIR})。
在移植需要应用服务器(如 www/tomcat7)来运行服务的 Java™应用程序时,供应商通常会分发一个 .war 文件。.war 是 Web 应用程序归档文件,当应用程序调用时会被解压缩。避免将 .war 添加到 pkg-plist 中。这不被视为最佳实践。应用服务器将展开 war 归档文件,但如果移除 port,则不会正确清理它。处理此文件的更理想方式是先解压缩归档文件,然后安装文件,最后将这些文件添加到 pkg-plist 中。
无论port的类型是库还是应用程序,附加文档都安装在与任何其他port相同的位置。Javadoc 工具据说会根据所使用的 JDK 版本生成不同的文件集。对于不强制使用特定 JDK 的ports,因此指定打包清单(pkg-plist)是一项复杂的任务。这也是为什么强烈建议移植者使用 PORTDOCS 的原因之一。此外,即使可以预测 javadoc 将生成的文件集,生成的 pkg-plist 的大小也倡导使用 PORTDOCS 。
DATADIR 的默认值为${PREFIX}/share/${PORTNAME}。将 DATADIR 覆盖为${JAVASHAREDIR}/${PORTNAME}是一个好主意,特别是对于 Java ports。实际上, DATADIR 会自动添加到 PLIST_SUB 中(在根据 Make 变量更改 pkg-plist 中有记录),因此在 pkg-plist 中直接使用 %%DATADIR%% 。
至于是从源代码构建 Java ports还是直接从二进制发行版安装它们的选择,在撰写本文时尚无明确定的政策。然而,FreeBSD Java 项目的成员鼓励端口维护者在任务简单时从源代码构建他们的ports。
本节中介绍的所有功能都在 bsd.java.mk 中实现。如果port需要更复杂的 Java 支持,请首先查看 bsd.java.mk Git 日志,因为通常需要一些时间来记录最新功能。然后,如果缺少的所需支持对许多其他 Java ports有益,请随时在 freebsd-java 上讨论。
尽管有一个 java 类别适用于 PRs,但它是指来自 FreeBSD Java 项目的 JDK 移植工作。因此,像其他port一样,将 Javaport提交到 ports 类别中,除非问题与 JDK 实现或 bsd.java.mk 有关。
同样,关于 Javaport的 CATEGORIES 有一个明确定义的政策,详细内容请参阅分类。
表 23. 变量为使用 Apache 的Ports
将 Apache 模块移植的有用变量表 24
Web 应用程序必须安装到 PREFIX/www/appname。此路径在 Makefile 和 pkg-plist 中都可用,分别表示为 WWWDIR ,在 Makefile 中相对于 PREFIX 的路径表示为 WWWDIR_REL 。
Web 服务器进程的用户和组分别表示为 WWWOWN 和 WWWGRP ,如果需要更改某些文件的所有权,则默认值分别为 www 。如果port需要不同的值,请使用 WWWOWN?= myuser 和 WWWGRP?= mygroup 。这使用户可以轻松覆盖它们。
不要依赖 Apache,除非 Web 应用明确需要 Apache。尊重用户可能希望在除 Apache 之外的 Web 服务器上运行 Web 应用程序。
PHP Web 应用程序使用 USES=php 声明它们对它的依赖。有关更多信息,请参阅 php 。
移植 PEAR 模块是一个非常简单的过程。
将 USES=pear 添加到 port 的 Makefile。框架将在正确的位置安装相关文件,并在安装时自动生成 plist。
示例 25. PEAR 类的示例 Makefile
同样,移植 Horde 模块是一个简单的过程。
将 USES=horde 添加到port的 Makefile 中。该框架将把相关文件安装在正确的位置,并在安装时自动生成 plist。
USE_HORDE_BUILD 和 USE_HORDE_RUN 变量可用于在其他 Horde 模块上添加构建时间和运行时依赖关系。请查看 Mk/Uses/horde.mk,了解所有可用模块的完整列表。
Horde 模块的示例 26. Horde 模块的示例 Makefile。
Ports 集合支持多个 Python 版本的并行安装。Ports 必须使用正确的 python 解释器,根据用户可设置的 PYTHON_VERSION 。最重要的是,这意味着在脚本中用 PYTHON_CMD 的值替换 python 可执行文件的路径。
安装文件在 PYTHON_SITELIBDIR 下的Ports必须使用 pyXY- 软件包名称前缀,以便其软件包名称嵌入安装的 Python 版本。
表 25. 使用 Python 的Ports最有用的变量
Python 模块依赖辅助程序表 26。
可在 /usr/ports/Mk/Uses/python.mk 中找到所有可用变量的完整列表。
示例 27. 一个简单的 Python 模块的 Makefile。
一些 Python 应用程序声称具有 DESTDIR 支持(这对于分阶段是必需的),但是它是有问题的(例如,Mailman 版本为 2.1.16)。可以通过重新编译脚本来解决这个问题。例如,可以在 post-build 目标中完成这个操作。假设 Python 脚本应该在安装后驻留在 PYTHONPREFIX_SITELIBDIR 中,可以应用这个解决方案:
这将使用相对于阶段目录的路径重新编译源代码,并通过 -d 将值添加到字节编译输出文件中记录的文件名之前。需要 -f 强制重新编译,并且 :S;${PREFIX}/;; 会从 PYTHONPREFIX_SITELIBDIR 的值中剥离前缀,使其相对于 PREFIX 。
Ports 集合支持多个 Tcl/Tk 版本的并行安装。 Ports 应该尝试至少支持默认的 Tcl/Tk 版本及更高版本,使用 USES=tcl 。可以通过附加 :xx 来指定所需的 tcl 版本,例如, USES=tcl:85 。
表 27. 使用 Tcl/Tk 的 Ports 最有用的只读变量
请参阅使用 USES=tcl 和 USES=tk 宏 的完整描述。这些变量的完整列表位于 /usr/ports/Mk/Uses/tcl.mk 中。
USE_SDL 用于自动配置依赖项以支持使用像 devel/sdl12 和 graphics/sdl_image 这样的 SDL 库的 ports。
这些 SDL 1.2 版本的库已被识别:
控制台: devel/sdl_console
图形: graphics/sdl_gfx
图像: graphics/sdl_image
混音器:音频/ sdl_mixer
mm:devel / sdlmm
网络:net / sdl_net
pango:x11-toolkits/sdl_pango
声音:audio/sdl_sound
ttf:graphics/sdl_ttf
这些版本为 2.0 的 SDL 库被认可:
图像: 图形/SDL2 图像
混音器: 音频/SDL2 混音器
网络: 网络/SDL2 网络
ttf:图形/ sdl2_ttf
因此,如果port依赖于 net/sdl_net 和 audio/sdl_mixer,则语法将是:
所需的依赖项 devel/sdl12,也会自动添加到 net/sdl_net 和 audio/sdl_mixer。
使用 USE_SDL 与 SDL 1.2 条目,它将自动:
为 BUILD_DEPENDS 添加对 sdl12-config 的依赖项
将变量 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,有两个可用于定义的变量(如果只定义一个,另一个将设置为默认值):
选择 wxWidgets 版本的变量|变量
树中可用的 wxWidgets 版本及相应的 ports 如下:
表 29. 可用的 wxWidgets 版本
变量在选择 wxWidgets 版本时可以设置为这些组合之一或多个,用空格分隔:
表 30. wxWidgets 版本规格
还有一些变量可用于从可用版本中选择首选版本。它们可以设置为版本列表,前面的版本优先级更高。
表 31. 选择首选 wxWidgets 版本的变量
有其他应用程序,虽然不是 wxWidgets 库,但与它们相关。这些应用程序可以在 WX_COMPS 中指定。这些组件可用:
表 32. 可用的 wxWidgets 组件
通过添加以分号分隔的后缀来为每个组件选择依赖类型。如果不存在,则将使用默认类型(请参阅默认的 wxWidgets 依赖类型)。这些类型可用:
表 33.可用的 wxWidgets 依赖类型
组件的默认值详见本表:
默认 wxWidgets 依赖类型表 34
例 28. 选择 wxWidgets 组件
该片段对应于使用 wxWidgets 版本 0 及其贡献库的port。
要检测已安装的版本,请定义 WANT_WX 。如果未设置为特定版本,则组件将具有版本后缀。 HAVE_WX 将在检测后填充。
示例 29. 检测已安装的 wxWidgets 版本和组件
此片段可用于使用已安装的 wxWidgets 的port,或者选择了一个选项。
如果已安装 wxPython 支持,或选择了某个选项,在启用 wxPython 支持的port中,将同时安装版本 2.8 的 wxWidgets。
在从变量中选择 wxWidgets 版本后,这些变量将在port中可用。
对于使用 wxWidgets 的 Ports 定义的变量表 35
定义 WX_PREMK 以便在包含 bsd.port.pre.mk 后立即使用变量
例 30。在命令中使用 wxWidgets 变量
该片段通过运行 wx-config 脚本来演示 WX_PREMK 的使用,以获取完整的版本字符串,将其分配给一个变量并将其传递给程序。
一些 GNU configure 脚本仅通过设置 WX_CONFIG 环境变量无法找到 wxWidgets,需要额外的参数。可以使用 WX_CONF_ARGS 来提供它们。
表 36. WX_CONF_ARGS 的合法值
这一节描述了 Lua 库在ports树中的状态以及它与ports系统的集成。
Lua 库和相应解释器有许多版本,它们之间存在冲突(在相同名称下安装文件)。在ports树中,通过使用版本号后缀将每个版本安装在不同的名称下来解决了这个问题。
这样做的明显缺点是,每个应用程序都必须进行修改以找到预期的版本。但可以通过向编译器和链接器添加一些额外的标志来解决这个问题。
使用 Lua 的应用程序通常应为一个版本构建。然而,为 Lua 构建的可加载模块是针对它们支持的每个 Lua 版本单独构建的,对这些模块的依赖关系应该使用port原点上的 @${LUA_FLAVOR} 后缀指定这种风味。
一个使用 Lua 的 port 应该具有以下形式的行:
如果需要特定版本的 Lua,或者需要范围内的版本,可以将其指定为 XY (可以多次使用), XY+ , -XY 或 XY-ZA 的形式作为参数。如果所需范围内的 Lua 的默认版本通过 DEFAULT_VERSIONS 设置,那么将使用它;否则将使用最接近默认版本的请求版本。例如:
请注意,不会根据已安装的 Lua 版本的存在来调整版本选择。
使用 Lua 的软件可能已经编写成自动检测正在使用的 Lua 版本。通常情况下ports应该覆盖这种假设,并强制使用如上所述选择的特定 Lua 版本。根据正在移植的软件,这可能需要以下任何或所有操作:
使用 LUA_VER 作为软件配置脚本的参数之一,通过 CONFIGURE_ARGS 或 CONFIGURE_ENV (或其他构建系统的等效方式);
分别将 -I${LUA_INCDIR} , -L${LUA_LIBDIR} 和 -llua-${LUA_VER} 添加到 CFLAGS , LDFLAGS , LIBS 中,视情况而定;
对软件的配置或构建文件进行补丁,以选择正确的版本。
对于安装 Lua 模块(而不仅仅是使用 Lua 的应用程序)的 Custom,应为每个支持的 Lua 版本构建单独的风味。这是通过添加 Custom 参数来实现的:
也可以指定版本号或版本范围;使用逗号分隔参数。
由于每种版本必须具有不同的软件包名称,提供了变量 LUA_PKGNAMEPREFIX ,该变量将设置为适当的值;预期的用法是:
模块ports通常只应安装文件到 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 。
与模块ports一样,一种带有风味的port应避免安装可能在版本之间产生冲突的文件。通常通过向程序名称添加 LUA_VER_STR 作为后缀来完成此操作(例如,使用 uniquefiles ),以及在 LUA_MODLIBDIR 和 LUA_MODSHAREDIR 之外使用的任何其他文件或子目录中使用 LUA_VER 或 LUA_VER_STR 。
这些变量在port中可用。
表 37。定义了使用 Lua 的Ports变量。
为ports指定 module 参数可用的其他变量
Lua 模块Ports定义的变量表 38
例子 31。使用 Lua 的应用程序 Makefile
此示例显示如何引用运行时所需的 Lua 模块。请注意,引用必须指定一个特定的风味。
例 32。一个简单 Lua 模块的 Makefile
本节描述了ports树中 Guile 的状态及其与ports系统的集成。
Guile 库和相应的解释器有多个版本,它们之间存在冲突(在相同名称下安装文件)。在 ports 树中,通过使用版本号后缀将每个版本安装在不同的名称下来解决了这个问题。在大多数情况下,应用程序应该从提供的配置变量中检测正确的版本,并使用 pkg-config 来确定名称和相关路径。然而,一些应用程序(特别是那些使用自己的配置规则的应用程序 cmake 或 meson )将始终尝试使用最新可用的版本。在这种情况下,要么修补 port,要么声明一个构建冲突(参见下面的 conflicts 选项),以确保在 poudriere 外部构建时生成正确的依赖关系。
使用 Guile 的应用程序通常应该只为一个版本构建,最好是在 DEFAULT_VERSIONS 中指定的版本,或者是它们支持的最新版本。然而,为每个支持的 Guile 版本构建 Guile 或 Scheme 库,或者为 Guile 构建扩展模块的应用程序,应该为每个 Guile 版本构建一个单独的 flavor,并且对这样的 ports 的依赖关系应该使用 @${GUILE_FLAVOR} 后缀在 port 源上指定 flavor。
使用 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 机制来获取编译器和链接器标志。一些较旧或者特殊的 ports 可能正在使用 guile-config 或直接从 guile 获取值,这也应该能够工作(在其中一些情况下, alias 参数可能会有用)。
框架尝试使用以下方法通知所需的 Guile 版本的 port:
GUILE_EFFECTIVE_VERSION 被添加到 CONFIGURE_ENV ;
Guile 二进制文件的完整路径在 GUILE 变量中指定为 CONFIGURE_ENV 和 MAKE_ENV ;
如果使用 alias 选项,则所需的 Guile 版本的二进制文件将被别名为;
如果不使用 alias 选项,则将所需的 Guile 版本工具的路径( guild , guile-config 等)添加到 CONFIGURE_ENV 和 MAKE_ENV 作为变量 GUILD , GUILE_CONFIG 等。
对于某些ports,可能需要以其他方式指定版本,例如通过 CONFIGURE_ARGS 或 MESON_ARGS ,具体取决于port。
如果这些方法都无法在其他版本存在的情况下使 port 选择指定的 Guile 版本,那么最好修补它以这样做。如果不可行,指定 conflicts 选项以防止在检测到错误版本的情况下构建 port。
安装 Guile 扩展或库的 port,或为 Guile 预编译的 Scheme 库,应为每个支持的 Guile 版本构建单独的类型。这是通过添加 flavors 选项来完成的。
由于每种定制必须具有不同的软件包名称,因此必须设置 PKGNAMESUFFIX ,通常为:
即使文件不是特定于版本的,此类ports必须将 Scheme 文件安装到 GUILE_SITE_DIR 而不是 GUILE_GLOBAL_SITE_DIR 。这通常需要修补port。
另外,如果这样的port安装了一个 .pc 文件,则必须将其放置在 GUILE_PKGCONFIG_PATH 而不是全局 pkgconfig 目录中。这样可以使依赖的ports找到用于正在使用的特定 Guile 版本的正确配置。
如果一个 Guile 扩展 port 安装了一个 .so 文件,则通常应该放在特定于 Guile 版本的 extensions 目录中。通常不应该使用 USE_LDCONFIG 。
由有风味的 port 安装的任何其他文件也必须放在特定版本的目录中,或者使用特定版本的文件名。对于文档和示例, GUILE_DOCS_DIR 和 GUILE_EXAMPLES_DIR 指定了适合的位置,port 应该在其中创建一个子目录,见下文。
这些变量在port中可用。
表 40。使用 Guile 的Ports定义的变量
下列内容被定义为变量和 PLIST_SUB 条目。 变量形式后缀为 _DIR ,并且是一个完整路径(前缀为 GUILE_PREFIX )。
为使用 Guile 定义的 Ports 路径替换表 41
示例 33. 使用 Guile 的应用程序的 Makefile
此示例显示如何引用构建和运行时所需的 Guile 库。请注意,引用必须指定一个 flavor。此示例假定应用程序正在使用 pkg-config 来定位依赖项。
FreeBSD 在操作系统中有一个本地 iconv 。
对于需要 iconv 的软件,定义 USES=iconv 。
当port定义 USES=iconv 时,这些变量将可用:
这两个示例会自动为使用转换器/ libiconv 或本机 iconv 的系统填写正确的变量。
示例 34。简单的 iconv 使用
示例 35。 iconv 与 configure 的使用
如上所示,当存在本地 iconv 时, ICONV_LIB 为空。这可以用于检测本地 iconv 并做出相应的反应。
有时程序中的一个 ld 参数或搜索路径在 Makefile 或配置脚本中是硬编码的。可以使用这种方法来解决这个问题:
示例 36. 修复硬编码 -liconv
在某些情况下,有必要设置替代值或根据是否存在本机 iconv 执行操作。在测试 ICONV_LIB 的值之前,必须包含 bsd.port.pre.mk:
示例 37. 检查本机 iconv 的可用性
需要 Xfce 库或应用程序设置 USES=xfce
特定的 Xfce 库和应用程序依赖项使用分配给 USE_XFCE 的值进行设置。它们在 /usr/ports/Mk/Uses/xfce.mk 中定义。可能的值有:
USE_XFCE 的值
面板 x11-wm/xfce4-panel
文件管理器 x11-fm/thunar
配置管理器 x11/xfce4-conf
示例 38。 USES=xfce 示例
示例 39。使用 Xfce 自己的 GTK2 小部件
在这个例子中,移植的应用程序使用了 GTK2 特定的小部件 x11/libxfce4menu 和 x11/xfce4-conf。
需要列出 x11-wm/xfce4-panel 需要的组件本身,就像这样:
但是,必须明确包含 port 的 Xfce 组件和非 Xfce 依赖项。不要指望 Xfce 组件为主 port 提供除本身以外的子依赖项。
应用程序或依赖于 Budgie 桌面的库应将 USES= budgie 设置为所需组件的列表,并将 USE_BUDGIE 设置为所需组件的列表。
例 40。 USE_BUDGIE 例
使用 Database USES 宏之一来添加对数据库的依赖关系。
表 42. 数据库 USES 宏
示例 41。使用 Berkeley DB 6
查看 bdb 了解更多信息。
例子 42。使用 MySQL
当port需要 MySQL 客户端库添加
查看 mysql 以获取更多信息。
示例 43。使用 PostgreSQL
当 port 需要 PostgreSQL 服务器版本 9.6 或更高版本时添加
查看 pgsql 以获取更多信息。
示例 44。使用 SQLite 3
查看 sqlite 以获取更多信息。
rc.d 脚本用于在系统启动时启动服务,并为管理员提供一种标准的停止、启动和重新启动服务的方法。 Ports 集成到系统 rc.d 框架中。有关其使用的详细信息可以在 rc.d 手册章节中找到。有关可用命令的详细说明,请参阅 rc(8) 和 rc.subr(8)。最后,还有一篇关于 rc.d 脚本的实际方面的文章。
带有一个名为门卫(doorman)的神话故事,需要启动一个 doormand 守护程序。将以下内容添加到 Makefile 中:
可以列出多个脚本并进行安装。脚本必须放置在 files 子目录中,并在文件名后添加 .in 后缀。将针对该文件运行标准 SUB_LIST 扩展。强烈建议使用 %%PREFIX%% 和 %%LOCALBASE%% 扩展。有关 SUB_LIST 的更多信息,请参见相关部分。
从 FreeBSD 6.1-RELEASE 开始,本地 rc.d 脚本(包括由ports安装的脚本)包含在基础系统的整体 rcorder(8)中。
一个简单的 rc.d 脚本示例,用于启动 doormand 守护进程:
除非有非常好的理由提前启动服务,或者它以特定用户身份(而不是 root)运行,所有ports脚本必须使用:
如果启动脚本启动必须关闭的守护进程,在系统关闭时将触发服务停止:
如果脚本未启动持久服务,则无需执行此操作。
对于可选配置元素,此处更喜欢使用“=”风格的默认变量赋值,而不是“:=”风格,因为前者仅在变量未设置时设置默认值,而后者在变量未设置或为空时设置默认值。用户很可能会在其 rc.conf.local 中包含类似以下内容:
并且使用“:=”的变量替换会不当地覆盖用户的意图。 _enable 变量是非可选的,并且必须使用“:”进行默认设置。
在贡献带有 rc.d 脚本的 port 之前,更重要的是,在提交之前,请查阅此清单以确保准备就绪。
devel/rclint port 可以检查大部分内容,但它不能替代适当的审查。
如果这是一个新文件,它是否具有 .sh 扩展名?如果是,那么必须将其更改为只是 file.in ,因为 rc.d 文件不得以该扩展名结尾。
文件的名称(减去 .in), PROVIDE 行和 $ 名称是否都匹配?文件名匹配 PROVIDE 有助于更容易调试,特别是对于 rcorder(8) 问题。匹配文件名和 $ 名称有助于更容易地确定 rc.conf[.local] 中哪些变量是相关的。对于所有新脚本,包括基本系统中的脚本,这也是一个政策。
REQUIRE 行是否设置为 LOGIN ?这对于作为非根用户运行的脚本是强制的。如果它以 root 运行,那么必须有一个良好的理由使其在 LOGIN 之前运行吗?如果没有,它必须在之后运行,以便将本地脚本松散地分组到 rcorder(8) 中的某个点,在这个点之后,基本系统中的大多数内容已经在运行。
脚本是否启动了持久服务?如果是,必须有 KEYWORD: shutdown 。
确保没有 KEYWORD: FreeBSD 存在。多年来这已经不再必要也不希望存在。这也表明新脚本是从旧脚本复制/粘贴而来,因此在审查时必须格外小心。
如果脚本使用解释性语言如 perl 、 python 或 ruby ,请确保设置适当,例如对于 Perl,通过添加 PERL=${PERL} 到 SUB_LIST 并使用 %%PERL%% 来设置 command_interpreter 。否则,
可能不会正常工作。有关更多信息,请参阅 service(8)。
所有的/usr/local 出现都被替换为 %%PREFIX%% 了吗?
默认变量赋值是在 load_rc_config 之后吗?
默认情况下,空字符串会分配到哪里?它们应该被移除,但务必检查文件顶部的注释中是否记录了该选项。
变量中设置的内容是否真正被脚本使用?
默认名称列表中列出的选项是否都是必需的?如果是,它们必须在 command_args 中。这里 -d 是一个警示信号(请原谅双关语),因为它通常是"daemonize"进程的选项,因此实际上是必需的。
_name__flags 绝不能包含在 command_args 中(反之亦然,尽管这种错误较少见)。
脚本是否无条件执行任何代码?这是不被赞同的。通常这些事情必须通过 start_precmd 来处理。
所有布尔测试必须使用 checkyesno 函数。不能手工编写 [Yy][Ee][Ss] 等测试。
如果有循环(例如,等待某物启动),是否有计数器来终止循环?如果出现错误,我们不希望引导永远停在那里。
脚本是否创建需要特定权限的文件或目录,例如,需要由运行进程的用户拥有的 pid?与传统的 touch(1)/ chown(8)/ chmod(1)例程不同,请考虑使用 install(1)并使用适当的命令行参数来一步完成整个过程。
有些 ports 需要存在特定的用户帐户,通常是为了作为该用户运行的守护进程。对于这些 ports,请选择一个从 50 到 999 的唯一 UID,并在 ports/UIDs(用于用户)和 ports/GIDs(用于组)中注册该 UID。用户和组的唯一标识应该是相同的。
当需要为 port 创建新用户或组时,请在这两个文件中包含补丁。
然后在 Makefile 中使用 USERS 和 GROUPS ,在安装 port 时用户将被自动创建。
当前保留的 UIDs 和 GIDs 列表可以在ports/UIDs 和ports/GIDs 中找到。
一些ports(如内核可加载模块)需要内核源文件,以便port进行编译。以下是确定用户是否已安装它们的正确方法:
除了这个检查之外, kmod 功能会处理大多数这些ports需要考虑的项目。
Ports不得打包或安装 Go 库或源代码。Goports必须在正常获取时间获取所需的依赖项,并且只应安装用户需要的程序和内容,而不是 Go 开发人员需要的内容。
Ports应该(按优先顺序):
使用包源代码中包含的 vendored 依赖项。
获取上游指定的依赖项版本(在 go.mod、vendor.json 或类似情况下)。
作为最后的手段(依赖项不包括,版本也没有明确指定),获取上游开发/发布时可用的依赖项版本。
就像 Go 语言一样,Ports 不得打包或安装 Haskell 库。Haskellports 必须与其依赖项静态链接,并在提取阶段获取所有分发文件。
许多现代 shells (包括 bash、fish、tcsh 和 zsh)支持参数和/或选项的制表完成。这种支持通常来自完成文件,其中包含了特定命令的制表完成工作定义。Ports 有时会随附其自己的完成文件,或者移植者可能已经自己创建了它们。
可用时,应始终安装完成文件。没有必要对此进行选项。不过,如果使用选项,在 OPTIONS_DEFAULT 中始终启用它。
表 43. 完整shell完成文件名
不要在 shell 本身上注册任何依赖项。
相反,使用具有 filename.sample 扩展名的示例文件进行安装。 @sample 宏会自动完成此操作,请参阅** 以了解确切操作。对于每个示例文件,请在 pkg-plist 添加一行:
sdl:
sdl:
gfx:
garcon
libexo
libgui
libmenu
libutil
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依赖的箱子列表。每个条目都需要像 cratename-semver 这样的格式,例如, libc-0.2.40 。Port的维护者可以使用 make cargo-crates 从 Cargo.lock 生成此列表。手动提升箱子版本是可能的,但要注意传递依赖关系。如果 make cargo-crates 生成的列表很大,可能将其放在顶层port目录中的 Makefile.crates 文件中更方便。如果存在,ports框架会自动源自该文件。这有助于保持主port Makefile 处于可管理的大小范围内。
CARGO_FEATURES
要构建的应用功能列表(以空格分隔)。要禁用所有默认功能,请向 CARGO_FEATURES 添加特殊令牌 --no-default-features 。手动传递给 CARGO_BUILD_ARGS , CARGO_INSTALL_ARGS 和 CARGO_TEST_ARGS 不是必需的。
CARGO_CARGOTOML
${WRKSRC}/Cargo.toml
使用的 Cargo.toml 路径。
CARGO_CARGOLOCK
${WRKSRC}/Cargo.lock
用于 make cargo-crates 的 Cargo.lock 路径。必要时可以指定多个锁定文件。
CARGO_ENV
要传递给 Cargo 类似 MAKE_ENV 的环境变量列表。
RUSTFLAGS
传递给 Rust 编译器的标志。
CARGO_CONFIGURE
yes
使用默认的 do-configure 。
CARGO_UPDATE_ARGS
在配置阶段传递给 Cargo 的额外参数。可以使用 cargo update --help 查找有效参数。
CARGO_BUILDDEP
yes
在 lang/rust 上添加构建依赖。
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
.
安装木筏的路径。 这通过它的 --path 参数传递给 cargo install 。 当指定多个路径时, cargo install 会多次运行。
CARGO_TEST
yes
使用默认的 do-test 。
CARGO_TEST_ARGS
在测试阶段传递给货物的额外参数。 可以使用 cargo test --help 查找有效参数。
CARGO_TARGET_DIR
${WRKDIR}/target
货物输出目录的位置。
CARGO_DIST_SUBDIR
rust/crates
相对于 DISTDIR 的目录,将存储板块分发文件。
CARGO_VENDOR_DIR
${WRKSRC}/cargo-crates
存放供应商目录的位置,所有的板条箱都将被提取到这里。尽量保持在 PATCH_WRKSRC 以下,这样可以更容易地应用补丁。
CARGO_USE_GITHUB
no
通过 GH_TUPLE 启用对 GitHub 上特定 Git 提交锁定的板条箱的提取。这将尝试对所有 Cargo.toml 进行修补,使其指向离线源而不是在构建过程中从 Git 存储库获取它们。
CARGO_USE_GITLAB
no
与 CARGO_USE_GITHUB 相同,但适用于 GitLab 实例和 GL_TUPLE 。
MESON_ARGS
要传递给 meson 二进制文件的 Port 特定 Meson 标志。
MESON_BUILD_DIR
相对于 WRKSRC 的构建目录路径。默认为 _build 。
PERL
Perl 5 解释器的完整路径,可以是系统中的或者从软件包中安装的,但不包括版本号。当软件需要 Perl 解释器的路径时使用此路径。要替换脚本中的 " #! "行,请使用 shebangfix 。
PERL_VERSION
已安装的 Perl 完整版本(例如, 5.8.9 )。
PERL_LEVEL
已安装的 Perl 版本为形式为 MNNNPP 的整数(例如, 500809 )。
PERL_ARCH
存储架构相关库的位置。默认为 ${ARCH}-freebsd .
PERL_PORT
安装的 Perl port的名称(例如, perl5 )。
SITE_PERL
站点特定 Perl 软件包所在的目录名。此值将添加到 PLIST_SUB 中。
USES= imake
port 使用 imake 。
XMKMF
如果不在 PATH 中,则设置为 xmkmf 的路径。默认为 xmkmf -a 。
atk
accessibility/atk
无障碍工具包 (ATK)
atkmm
辅助功能/atkmm
atk 的 C++绑定
cairo
图形/cairo
具有跨设备输出支持的矢量图形库
cairomm
graphics/cairomm
用于 cairo 的 C++绑定
dconf
开发/dconf
配置数据库系统(构建、运行)
evolutiondataserver3
数据库/evolution-data-server
用于 Evolution 集成邮件/PIM 套件的数据后端
gdkpixbuf2
图形/gdk-pixbuf2
用于 GTK+ 的图形库
glib20
开发/glib20
GNOME 核心库 glib20
glibmm
开发/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
图形/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
c++ 为 gtk20 工具包提供的绑定 2.0
gtkmm24
x11-toolkits/gtkmm24
为 gtk20 工具包提供的 c++绑定 2.4
gtkmm30
x11-toolkits/gtkmm30
C++绑定 3.0 用于 gtk30 工具包
gtksourceview2
x11 工具包/gtksourceview2
向 GtkTextView 添加语法高亮显示的小部件
gtksourceview3
GtkTextView 小部件,为 GtkTextView 小部件添加语法高亮
在 GtkTextView 小部件添加语法高亮的文本小部件
gtksourceviewmm3
GtkTextView 小部件,为 GtkTextView 小部件添加语法高亮
C++绑定用于 gtksourceview3 库
gvfs
devel/gvfs
GNOME 虚拟文件系统
intltool
国际化工具(另请参阅 intlhack)
国际化工具(另请参阅 intlhack)
introspection
gobject-introspection 的开发
基本的内省绑定和生成内省绑定工具。大多数情况下:构建足够了,:both/:run 只需要用于使用内省绑定的应用程序。(both, build, run)
libgda5
数据库/libgda5
提供对不同类型数据源的统一访问
libgda5-ui
数据库/libgda5-ui
来自 libgda5 库的 UI 库
libgdamm5
数据库/libgdamm5
用于 libgda5 库的 c++ 绑定
libgsf
devel/libgsf
用于处理结构化文件格式的可扩展 I/O 抽象
librsvg2
图形/ librsvg2
用于解析和渲染 SVG 矢量图形文件的库
libsigc++20
devel/libsigc++20
C++的回调框架
libxml++26
textproc/libxml++26
libxml2 库的 C++绑定
libxml2
XML 解析器库(构建和运行)
XML 解析器库(构建和运行)
libxslt
文本处理/libxslt
XSLT C 库(构建、运行)
metacity
x11-wm/metacity
来自 GNOME 的窗口管理器
nautilus3
文件管理器
GNOME 文件管理器
pango
Pango 工具包
用于布局和呈现 i18n 文本的开源框架
pangomm
x11 工具包/pangomm
pango 库的 c++绑定
py3gobject3
Python 3,GObject 3.0 绑定
Python 3,GObject 3.0 绑定
pygobject3
Python 3,GObject 3.0 绑定
Python 2,GObject 3.0 绑定
vte3
x11-toolkits/vte3
具有改进的辅助功能和 I18N 支持的终端部件
gnomeprefix
为 configure 提供一些默认位置。
intlhack
与 intltool 相同,但补丁确保使用 share/locale/。请仅在 intltool 单独不足时使用。
referencehack
此宏用于帮助将 API 或参考文档拆分为其自己的 port。
atspi
辅助功能/at-spi
辅助技术服务提供者接口
esound
音频/esound
启蒙音效包
gal2
x11 工具包/gal2
从 GNOME 2 gnumeric 中提取的小部件集合
gconf2
devel/gconf2
用于 GNOME 2 的配置数据库系统
gconfmm26
开发/gconfmm26
用于 gconf2 的 C++绑定
gdkpixbuf
图形/gdk-pixbuf
GTK+的图形库
glib12
devel/glib12
glib 1.2 核心库
gnomedocutils
文本处理/ GNOME 文档实用程序
GNOME 文档实用程序
gnomemimedata
杂项/ GNOME MIME 数据
GNOME 2 的 MIME 和应用程序数据库
gnomesharp20
x11-toolkits/gnome-sharp20
用于.NET 运行时的 GNOME 2 界面
gnomespeech
辅助功能/ GNOME 语音
GNOME 2 文字转语音 API
gnomevfs2
devel/gnome-vfs
GNOME 2 虚拟文件系统
gtk12
x11-toolkits/gtk12
Gtk+ 1.2 工具包
gtkhtml3
轻量级 HTML 渲染/打印/编辑引擎
轻量级 HTML 渲染/打印/编辑引擎
gtkhtml4
www/gtkhtml4
輕巧型 HTML 渲染/打印/編輯引擎
gtksharp20
x11-toolkits/gtk-sharp20
.NET 執行階段的 GTK+ 和 GNOME 2 介面
gtksourceview
包含语法高亮显示的小部件
在 GtkTextView 中添加语法高亮显示的小部件
libartgpl2
图形库 art_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
打印/libgnomeprint
Gnome 2 打印支持库
libgnomeprintui
x11 工具包/libgnomeprintui
Gnome 2 打印支持库
libgnomeui
x11-toolkits/libgnomeui
用于 GNOME 2 GUI 的库,一个 GNU 桌面环境
libgtkhtml
轻量级 HTML 渲染/打印/编辑引擎
轻量级 HTML 渲染/打印/编辑引擎
libgtksourceviewmm
x11-toolkits/libgtksourceviewmm
GtkSourceView 的 C++绑定
libidl
devel/libIDL
用于创建 CORBA IDL 文件树的库
libsigc++12
C++回调框架
C++回调框架
libwnck
x11-toolkits/libwnck
用于编写分页和任务列表的库
libwnck3
x11 工具包/libwnck3
用于编写分页和任务列表的库
orbit2
高级性能的 CORBA ORB,支持 C 语言
高性能 CORBA ORB,支持 C 语言
pygnome2
x11 工具包/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
Python 绑定用于 GtkSourceView 2
vte
x11 工具包/vte
具有改进辅助功能和 I18N 支持的终端部件
pangox-compat
pangox-compat 已被弃用并从 pango 软件包中拆分出来。
QMAKE
qmake 二进制文件的完整路径。
LRELEASE
lrelease 工具的完整路径。
MOC
完整路径到 moc 。
RCC
完整路径到 rcc 。
UIC
完整路径到 uic 。
QT_INCDIR
Qt 包含目录。
QT_LIBDIR
Qt 库路径。
QT_PLUGINDIR
Qt 插件路径。
3d
Qt3D 模块
5compat
Qt 6 的 Qt 5 兼容模块
assistant
Qt 5 文档浏览器
base
Qt 6 基础模块
canvas3d
Qt 画布 3D 模块
charts
Qt 5 图表模块
concurrent
Qt 多线程模块
connectivity
Qt 连接性(蓝牙/NFC)模块
core
Qt 核心非图形模块
datavis3d
Qt 5 3D 数据可视化模块
dbus
Qt D-Bus 进程间通信模块
declarative
Qt 声明性框架用于动态用户界面
designer
Qt 5 图形用户界面设计师
diag
用于报告有关 Qt 及其环境的诊断信息的工具
doc
Qt 5 文档
examples
Qt 5 示例源代码
gamepad
Qt 5 游戏手柄模块
graphicaleffects
Qt Quick 图形效果
gui
Qt 图形用户界面模块
help
Qt 在线帮助集成模块
l10n
Qt 本地化消息
languageserver
Qt 6 语言服务器协议实现
linguist
Qt 5 翻译工具
location
Qt 位置模块
lottie
Qt 6 QML API 用于渲染图形和动画
multimedia
Qt 音频、视频、收音机和相机支持模块
network
Qt 网络模块
networkauth
Qt 网络认证模块
opengl
Qt 5 兼容的 OpenGL 支持模块
paths
QStandardPaths 的命令行客户端
phonon4
KDE 多媒体框架
pixeltool
Qt 5 屏幕放大镜
plugininfo
Qt 5 插件元数据转储程序
positioning
从卫星、wifi 或文本文件等来源获取的 Qt 6 定位 API。
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
用于访问串行ports的 Qt 函数
shadertools
用于跨平台 Qt 着色器流水线的 Qt 6 工具
speech
Qt5 的无障碍功能
sql
Qt SQL 数据库集成模块
sql-ibase
Qt InterBase/Firebird 数据库插件
sql-mysql
Qt MySQL 数据库插件
sql-odbc
Qt 开放数据库连接插件
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 小部件插件接口用于 Qt Designer
uitools
Qt Designer UI 表单支持模块
virtualkeyboard
Qt 5 虚拟键盘模块
wayland
用于 Wayland 的 Qt 5 封装器
webchannel
用于将 C++/QML 与 HTML/js 客户端集成的 Qt 5 库
webengine
用于渲染网页内容的 Qt 5 库
webkit
具有更现代的 WebKit 代码库的 QtWebKit
websockets
WebSocket 协议的 Qt 实现
websockets-qml
WebSocket 协议的 Qt 实现(QML 绑定)
webview
用于显示网络内容的 Qt 组件
widgets
Qt C++小部件模块
x11extras
面向基于 X11 系统的 Qt 平台特定功能
xml
Qt SAX 和 DOM 实现
xmlpatterns
Qt 对 XPath、XQuery、XSLT 和 XML Schema 的支持
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
不要将 -recursive 参数传递给 qmake 。
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 管理和调试控制台
akonadicontacts
用于在 Akonadi 中实现联系人管理的库和守护程序
akonadiimportwizard
从其他邮件客户端导入数据到 KMail
akonadimime
实现基本电子邮件处理的库和守护程序
akonadinotes
用于访问 MBox 格式邮件存储的 KDE 库
akonadisearch
在 Akonadi 中实现搜索的库和守护程序
akregator
由 KDE 提供的订阅阅读器
alarmcalendar
用于 KAlarm 闹钟的 KDE API
apidox
KF5 API 文档工具
archive
处理存档格式的类的 KF5 库
attica
开放协作服务 API 库 KDE5 版本
attica5
开放协作服务 API 库 KDE5 版本
auth
KF5 抽象到系统策略和认证功能
baloo
KF5 框架用于搜索和管理用户元数据
baloo-widgets
BalooWidgets 库
baloo5
用于搜索和管理用户元数据的 KF5 框架
blog
用于网络日志访问的 KDE API
bookmarks
用于书签和 XBEL 格式的 KF5 库
breeze
Breeze 可视样式的 Plasma5 艺术品、风格和素材
breeze-gtk
Gtk 的 Plasma5 Breeze 可视样式
breeze-icons
用于 KDE 的 Breeze 图标主题
calendarcore
KDE 日历访问库
calendarsupport
用于 KDEPim 的日历支持库
calendarutils
用于访问日历的 KDE 实用程序和用户界面函数
codecs
用于字符串操作的 KF5 库
completion
KF5 文本完成助手和小部件
config
用于配置对话框的 KF5 小部件
configwidgets
配置对话框的 KF5 小部件
contacts
管理联系信息的 KDE API
coreaddons
用于 QtCore 的 KF5 附加组件
crash
KF5 库用于处理应用程序崩溃分析和错误报告
dbusaddons
KF5 附加组件到 QtDBus
decoration
Plasma5 库用于创建窗口装饰
designerplugin
在 Qt Designer/Creator 中集成 Frameworks 小部件的 KF5
discover
Plasma5 软件包管理工具
dnssd
KF5 对系统 DNSSD 功能的抽象
doctools
从 docbook 生成 KF5 文档
drkonqi
Plasma5 崩溃处理程序
ecm
用于 CMake 的额外模块和脚本
emoticons
用于转换表情符号的 KF5 库
eventviews
用于 KDEPim 的事件视图库
filemetadata
用于提取文件元数据的 KF5 库
frameworkintegration
KF5 工作区和跨框架集成插件
gapi
基于 KDE 的库,用于访问谷歌服务
globalaccel
KF5 库,用于增加全局工作区快捷键支持
grantlee-editor
Grantlee 主题编辑器
grantleetheme
KDE PIM grantleetheme
gravatar
为 gravatar 支持提供库
guiaddons
QtGui 的 KF5 插件
holidays
日历节假日的 KDE 库
hotkeys
热键的 Plasma5 库
i18n
KF5 高级国际化框架
iconthemes
用于处理应用程序中图标的 KF5 库
identitymanagement
KDE pim 身份
idletime
用于监控用户活动的 KF5 库
imap
用于 IMAP 支持的 KDE API
incidenceeditor
用于 KDEPim 的事件编辑库
infocenter
提供系统信息的 Plasma5 实用程序
init
用于加速启动 KDE 应用程序的 KF5 进程启动器
itemmodels
用于 Qt Model/View 系统的 KF5 模型
itemviews
为 Qt Model/View 提供的 KF5 小部件附加组件
jobwidgets
用于跟踪 KJob 实例的 KF5 小部件
js
提供 ECMAScript 解释器的 KF5 库
jsembed
用于将 JavaScript 对象绑定到 QObjects 的 KF5 库
kaddressbook
KDE 联系人管理器
kalarm
个人闹钟调度程序
kalarm
个人报警计划程序
kate
KDE 系统的基础编辑器框架
kcmutils
用于处理 KCModules 的 KF5 工具
kde-cli-tools
Plasma5 非交互式系统工具
kde-gtk-config
Plasma5 GTK2 和 GTK3 配置器
kdeclarative
KF5 库,提供 QML 和 KDE 框架集成
kded
为提供系统级服务的 KF5 可扩展守护程序
kdelibs4support
从 KDELibs4 移植辅助工具的 KF5 版本
kdepim-addons
KDE PIM 插件
kdepim-apps-libs
KDE PIM 邮件相关库
kdepim-runtime5
KDE PIM 工具和服务
kdeplasma-addons
用于改善 Plasma 体验的 Plasma5 附加组件
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
嵌入到 Kontact 中的 KParts 的 KDE 粘合剂
korganizer
日历和日程安排程序
kpimdav
带有 KJobs 的 DAV 协议实现
kpkpass
处理苹果钱包通行文件的库
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 小部件
mime
处理 MIME 数据的库
newstuff
用于从网络下载应用程序资产的 KF5 库
notifications
用于系统通知的 KF5 抽象
notifyconfig
用于 KNotify 的 KF5 配置系统
okular
KDE 通用文档查看器
oxygen
气浪 5 氧气风格
oxygen-icons5
用于 KDE 的氧气图标主题
package
KF5 库加载和安装软件包
parts
KF5 文档中心插件系统
people
KF5 库提供访问联系人的功能
pim-data-exporter
导入和导出 KDE PIM 设置
pimcommon
用于 KDEPim 的常见库
pimtextedit
用于 PIM 特定文本编辑实用程序的 KDE 库
plasma-browser-integration
将浏览器集成到桌面中的 Plasma5 组件
plasma-desktop
Plasma5 桌面
plasma-framework
KF5 基于插件的 UI 运行时用于编写用户界面
plasma-integration
用于 Plasma 工作空间的 Qt 平台主题集成插件
plasma-pa
Plasma5 Plasma 脉冲音频混音器
plasma-sdk
Plasma5 应用程序,有助于 Plasma 开发
plasma-workspace
Plasma5 Plasma 工作空间
plasma-workspace-wallpapers
Plasma5 壁纸
plotting
KF5 轻量级绘图框架
polkit-kde-agent-1
Plasma5 守护程序,提供 polkit 认证界面
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 feed 处理库
syntaxhighlighting
用于结构化文本和代码的 KF5 语法高亮引擎
systemsettings
Plasma5 系统设置
texteditor
KF5 高级可嵌入文本编辑器
textwidgets
KF5 高级文本编辑窗口小部件
threadweaver
KF5 对 QtDBus 的附加组件
tnef
处理 TNEF 数据的 KDE API
unitconversion
用于单位转换的 KF5 库
user-manager
Plasma5 用户管理器
wallet
为用户密码提供 KF5 安全且统一的容器
wayland
用于 Wayland 库的 KF5 客户端和服务器库包装器
widgetsaddons
KF5 附加组件到 QtWidgets
windowsystem
访问窗口系统的 KF5 库
xmlgui
KF5 用户可配置的主窗口
xmlrpcclient
与 XMLRPC 服务交互的 KF5
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 port 操作系统的以空格分隔的列表(允许值: native linux )。
JAVA_VENDOR
适用于 port 的一系列适当的 JDK port 供应商的以空格分隔的列表(允许值: openjdk oracle )。
JAVA_BUILD
当设置时,将所选的 JDK port 添加到构建依赖项中。
JAVA_RUN
当设置时,将所选的 JDK port 添加到运行依赖项中。
JAVA_EXTRACT
当设置时,将所选的 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' (例如,'native')。
JAVA_PORT_VENDOR
JDK port 的供应商 (例如, 'openjdk' )。
JAVA_PORT_OS_DESCRIPTION
JDK port 使用的操作系统描述 (例如, 'Native' )。
JAVA_PORT_VENDOR_DESCRIPTION
JDK 供应商的描述port(例如, 'OpenJDK BSD Porting Team' )。
JAVA_HOME
JDK 安装目录的路径(例如,'/usr/local/openjdk6')。
JAVAC
要使用的 Java 编译器路径(例如,'/usr/local/openjdk6/bin/javac')。
JAR
使用 jar 工具的路径(例如,'/usr/local/openjdk6/bin/jar'或'/usr/local/bin/fastjar')。
APPLETVIEWER
使用 appletviewer 实用程序的路径(例如,'/usr/local/openjdk6/bin/appletviewer')。
JAVA
使用 java 可执行文件的路径。用于执行 Java 程序(例如,'/usr/local/openjdk6/bin/java')。
JAVADOC
javadoc 实用程序的路径。
JAVAH
javah 程序的路径。
JAVAP
javap 程序的路径。
JAVA_KEYTOOL
到 keytool 实用程序的路径。
JAVA_N2A
到 native2ascii 工具的路径。
JAVA_POLICYTOOL
到 policytool 程序的路径。
JAVA_SERIALVER
到 serialver 实用程序的路径。
RMIC
到 RMI 存根/骨架生成器的路径, rmic 。
RMIREGISTRY
到 RMI 注册表程序的路径, rmiregistry 。
RMID
到 RMI 守护程序的路径 rmid 。
JAVA_CLASSES
包含 JDK 类文件的存档路径,${JAVA_HOME}/jre/lib/rt.jar。
JAVASHAREDIR
与 Java 相关的所有内容的基本目录。默认值:${PREFIX}/share/java。
JAVAJARDIR
安装 JAR 文件的目录。默认值:${JAVASHAREDIR}/classes.
JAVALIBDIR
由其他ports安装的 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 中展开。
APACHEETCDIR
Apache 配置文件的目录。此变量将自动在 pkg-plist 中展开。
MODULENAME
模块的名称。默认值为 PORTNAME 。示例: mod_hello
SHORTMODNAME
模块的简称。自动从 MODULENAME 派生,但可以被覆盖。示例: hello
AP_FAST_BUILD
使用 apxs 来编译和安装模块。
AP_GENPLIST
还会自动创建 pkg-plist。
AP_INC
在编译过程中将一个目录添加到头文件搜索路径中。
AP_LIB
在编译过程中将目录添加到库搜索路径。
AP_EXTRAS
传递给 apxs 的附加标志。
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 版本安装ports,否则会安装冲突的文件。
USE_PYTHON=flavors
port 不使用 distutils,但仍支持多个 Python 版本。 FLAVORS 将设置为支持的 Python 版本。有关更多信息,请参阅 =python 和 Flavors。
USE_PYTHON=optsuffix
如果当前 Python 版本不是默认版本,则port 将获得 PKGNAMESUFFIX=${PYTHON_PKGNAMESUFFIX} 。仅在使用 flavors 时有用。
PYTHON_PKGNAMEPREFIX
用作区分不同 Python 版本包的 PKGNAMEPREFIX 。示例: py27-
PYTHON_SITELIBDIR
站点包树的位置,包含 Python 的安装路径(通常为 LOCALBASE )。在安装 Python 模块时, PYTHON_SITELIBDIR 非常有用。
PYTHONPREFIX_SITELIBDIR
PYTHON_SITELIBDIR 的 PREFIX-clean 变体。尽可能在 pkg-plist 中使用 %%PYTHON_SITELIBDIR%% 。 %%PYTHON_SITELIBDIR%% 的默认值为 lib/python%%PYTHON_VERSION%%/site-packages
PYTHON_CMD
Python 解释器命令行,包括版本号。
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 进行条件依赖。
PY_FUTURES
根据 Python 版本对 devel/py-futures 进行条件依赖。
TCL_VER
选择了 Tcl 的主要.次要版本
TCLSH
Tcl 解释器的完整路径
TCL_LIBDIR
Tcl 库的路径
TCL_INCLUDEDIR
Tcl C 头文件的路径
TK_VER
选择了 Tk 的主要次要版本
WISH
Tk 解释器的完整路径
TK_LIBDIR
Tk 库的路径
TK_INCLUDEDIR
Tk C 头文件的路径
USE_WX
port 可以使用的版本列表
所有可用版本
USE_WX_NOT
port 不能使用的版本列表
无
单个版本
2.8
升序范围
2.8+
降序范围
3.0-
全范围(必须是升序)
2.8-3.0
WANT_WX_VER
port的
WITH_WX_VER
用户
wx
主要图书馆
无
contrib
贡献的图书馆
none
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 版本的 flavor 名称,用于指定依赖关系
LUA_BASE
应该用来定位已经安装的 Lua(和组件)的前缀
LUA_PREFIX
此 port 安装 Lua(和组件)的前缀
LUA_INCDIR
Lua 头文件安装目录
LUA_LIBDIR
Lua 库安装目录
LUA_REFMODLIBDIR
已安装 Lua 模块库(.so)的目录
LUA_REFMODSHAREDIR
已安装 Lua 模块(.lua 文件)的目录
LUA_MODLIBDIR
Lua 模块库(.so 文件)将被安装到的目录
LUA_MODSHAREDIR
将要安装 Lua 模块(.lua 文件)的目录
LUA_PKGNAMEPREFIX
Lua 模块使用的包名前缀
LUA_CMD
Lua 解释器的名称(例如 lua54 )
LUAC_CMD
Lua 编译器的名称(例如 luac54 )
LUA_DOCSDIR
模块文档应安装到的目录。
LUA_EXAMPLESDIR
模块示例文件应安装到的目录。
<em>X.Y</em>
聲明與 Guile 版本 X.Y 兼容。目前可用的版本包括 1.8 (已過時)、 2.2 和 3.0 。可以指定多個版本。
flavors
为每个指定的 Guile 版本创建一个口味。由 DEFAULT_VERSIONS 指定的版本将成为默认的口味。口味名称的形式为 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
与所选版本对应的口味名称。
GUILE_PORT
lang/guile3
Port 指定 Guile 版本的来源。
GUILE_PREFIX
${PREFIX}
用于安装的目录前缀。
GUILE_CMD
guile-3.0
Guile 解释器的名称,带版本后缀。
GUILE_CMDPATH
${LOCALBASE}/bin/guile-3.0
Guile 解释器的完整路径。
GUILD_CMD
guild-3.0
工会工具的名称,带版本后缀。
GUILD_CMDPATH
${LOCALBASE}/bin/guild-3.0
工会工具的完整路径。
GUILE_*_CMD
GUILE_*_CMDPATH
像 GUILE_CMD 和 GUILE_CMDPATH 一样,但用于其他工具二进制文件。
GUILE_PKGCONFIG_PATH
${LOCALBASE}/libdata/pkgconfig/guile/3.0
在安装文件时应该使用 flavors 的软件包安装 .pc 文件。
GUILE_INFO_PATH
share/info/guile3
使用 flavors 选项为ports提供合适的 INFO_PATH 值。
GUILE_GLOBAL_SITE
share/guile/site
所有 guile 版本共享的站点目录;通常不应该使用此目录。
GUILE_SITE
share/guile/3.0/site
所选 Guile 版本的站点目录。
GUILE_SITE_CCACHE
lib/guile/3.0/site-ccache
编译字节码文件的目录。
GUILE_DOCS
share/doc/guile30
版本特定文档的父目录。
GUILE_EXAMPLES
share/examples/guile30
版本特定示例的父目录。
ICONV_CMD
存放二进制文件 iconv 的目录
${LOCALBASE}/bin/iconv
/usr/bin/iconv
ICONV_LIB
ld 参数用于链接到 libiconv(如果需要)
-liconv
(空)
ICONV_PREFIX
iconv 实现所在的目录(对于配置脚本很有用)
${LOCALBASE}
/usr
ICONV_CONFIGURE_ARG
配置脚本的预先构建配置参数
--with-libiconv-prefix=${LOCALBASE}
(empty)
ICONV_CONFIGURE_BASE
配置脚本的预先构建配置参数
--with-libiconv=${LOCALBASE}
(空白)
libbudgie
桌面核心 (库)
libmagpie
Budgie 的 X11 窗口管理器和合成器库
raven
面板中的全功能中心,用于访问不同的应用小部件
screensaver
桌面专用屏保程序
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}
当包被移除时,这些脚本会被执行。
pkg-deinstall 脚本在 pkg delete 中运行两次。第一次是在 port 被卸载之前作为 ${SH} pkg-deinstall ${PKGNAME} DEINSTALL 运行,第二次是在 port 被卸载后作为 ${SH} pkg-deinstall ${PKGNAME} POST-DEINSTALL 运行。可以测试 $2 以确定脚本正在哪种模式下运行。 PKG_PREFIX 环境变量设置为软件包安装目录。
如果使用 pkg-pre-deinstall 或 pkg-post-deinstall,脚本只运行一次(在软件包卸载之前或之后),带有单个参数 ${PKGNAME} 。使用 pkg-pre-deinstall.lua 或 pkg-post-deinstall.lua 将运行 lua 脚本而不是 shell 脚本。由 pkg 运行的 Lua 脚本提供一些扩展和一些限制,两者在 pkg-lua-script(5) 中有解释。
这些脚本会自动添加到打包清单中。
所有 pkg-* 的名称都是使用变量定义的,如果需要,可以在 Makefile 中更改这些变量。当在多个ports之间共享相同的 pkg-* 文件或需要写入其中一个文件时,这一点尤为有用。请参阅除 WRKDIR 之外的其他位置进行写入,了解直接写入包含 pkg-*文件的目录为什么是一个不好的主意。
这是一个变量名及其默认值列表。( PKGDIR 的默认值为 ${MASTERDIR} 。)
DESCR
${PKGDIR}/pkg-descr
PLIST
${PKGDIR}/pkg-plist
PKGINSTALL
${PKGDIR}/pkg-install
PKGPREINSTALL
${PKGDIR}/pkg-pre-install
PKGPOSTINSTALL
${PKGDIR}/pkg-post-install
PKGDEINSTALL
${PKGDIR}/pkg-deinstall
PKGPREDEINSTALL
${PKGDIR}/pkg-pre-deinstall
PKGPOSTDEINSTALL
${PKGDIR}/pkg-post-deinstall
PKGMESSAGE
${PKGDIR}/pkg-message
如果port需要在二进制包使用 pkg add 或 pkg install 安装时执行命令,则使用 pkg-install。它会被 pkg 执行两次,第一次作为 ${SH} pkg-install ${PKGNAME} PRE-INSTALL 在安装包之前,第二次作为 ${SH} pkg-install ${PKGNAME} POST-INSTALL 在安装后。 $2 可以被测试以确定脚本正在运行的模式。 PKG_PREFIX 环境变量被设置为包安装目录。
如果使用 pkg-pre-install 或 pkg-post-install 替代,脚本仅运行一次(在安装软件包之前或之后),带有单个参数 ${PKGNAME} 。使用 pkg-pre-install.lua 或 pkg-post-install.lua 将运行 lua 脚本而不是shell脚本。由 pkg 运行的 Lua 脚本提供一些扩展和一些限制,这两者都在 pkg-lua-script(5)中有解释。
这些脚本会自动添加到打包清单中。
FreeBSD 的几个维护工具,如 portupgrade(1),依赖于一个名为/usr/ports/INDEX 的数据库,该数据库跟踪诸如port依赖关系之类的项目。INDEX 是由顶层ports/Makefile 通过 make index 创建的,该文件会进入每个port子目录并在那里执行 make describe 。因此,如果 make describe 在任何port中失败,就无法生成 INDEX,许多人会很快变得不高兴。
如果 make describe 产生字符串而不是错误消息,则一切可能是安全的。请参阅 bsd.port.mk 以了解生成的字符串的含义。
还要注意,运行最新版本的 portlint (如下一节中指定的版本)将自动运行 make describe 。
SUB_FILES 和 SUB_LIST 在port文件中对动态值非常有用,比如在 pkg-message 中的安装 PREFIX 。
SUB_FILES 指定要自动修改的文件列表。 SUB_FILES 列表中的每个文件必须在 FILESDIR 中有一个对应的 file.in 文件。修改后的版本将被创建为 ${WRKDIR}/file。作为 USE_RC_SUBR 值定义的文件将自动添加到 SUB_FILES 中。对于文件 pkg-message、pkg-install 和 pkg-deinstall,相应的 Makefile 变量将自动设置为指向处理后的版本。
SUB_LIST 是一个 VAR=VALUE 对列表。对于每个对, %%VAR%% 将在 SUB_FILES 中列出的每个文件中被替换为 VALUE 。几个常见对将被自动定义: PREFIX 、 LOCALBASE 、 DATADIR 、 DOCSDIR 、 EXAMPLESDIR 、 WWWDIR 和 ETCDIR 。任何以 @comment 开头并跟有一个空格的行,在变量替换后将从结果文件中删除。
此示例将 %%ARCH%% 替换为包含在 pkg-message 中的系统架构。
请注意,对于此示例,pkg-message.in 必须存在于 FILESDIR 中。
良好 pkg-message.in 的一个例子:
即使 port 构建良好,确保软件按预期正常运行是一个好主意。如果原始上游项目连同软件提供测试,建议运行这些测试并检查是否一切按预期运行。
使用 port 可以通过使用 TEST_TARGET 变量自动启用测试。设置后,此变量包含 port 的测试目标的名称。这通常只是 test ,但其他名称包括 tests , check 或对特定情况的类似 run_tests.py 。
除了 TEST_TARGET 变量外,框架还提供以下变量来控制测试执行:
TEST_WRKSRC 是进行测试的目录。
TEST_ENV 包含要传递到测试阶段的附加变量。
TEST_ARGS 包含传递到测试阶段的任何额外参数。
这些变量的使用示例可以在 cad/xyce、www/libjwt 等中找到。
在提交或承诺之前,请使用 portlint 检查port。 portlint 警告了许多常见错误,包括功能和风格上的。对于新port, portlint -A 是最彻底的;对于现有port, portlint -C 就足够了。
由于 portlint 使用启发式方法来尝试找出错误,它可能会产生错误的积极警告。此外,偶尔被标记为问题的东西真的无法以其他方式完成,因为受限于ports框架。如果有疑问,最好的做法是在 FreeBSDports邮件列表上提问。
这些工具来自ports-mgmt/portfmt。
Portclippy 是一个检查 Makefile 中变量是否按照 Port Makefile 的变量顺序正确排列的检查工具。
Portfmt 是一个用于自动格式化 Makefile 的工具。
2.8
3.0
Berkeley DB
MariaDB,MySQL,Percona
PostgreSQL 的
SQLite 的
有一些关于 pkg-*文件的技巧我们还没有提到,有时候会很方便。
在安装软件包时显示消息,请将消息放在 pkg-message 中。这种功能通常用于显示安装后需要执行的额外步骤 pkg install 或 pkg upgrade 。
* pkg-message 必须仅包含对 FreeBSD 设置和操作至关重要且特定于相关port的信息。* 设置信息应仅在初始安装时显示。升级说明应仅在从相关版本升级时显示。* 不要用空格或符号行(如 ---------- , 或 ========== )包围消息。将格式留给 pkg(8)。* 提交者可以使用 UCL 格式规范来限制现有消息的安装或升级范围。* 请确保参考适当的工具来处理服务。 使用 service name start 来启动服务,而不是使用 /usr/local/etc/rc.d/name start * 使用 sysrc name_enable=YES 在 rc.conf 中更改选项
pkg-message 支持两种格式:
原始
一个常规的纯文本文件。它的消息只在安装时显示。
UCL
如果文件以“[”开头,则被视为 UCL 文件。UCL 格式在 libucl 的 GitHub 页面上有描述。
格式如下。它应该是对象数组。这些对象本身可以具有这些关键字。
message
要显示的实际消息。此关键字是强制性的。
type
消息应该何时显示。
maximum_version
仅当 type 为 upgrade 时。如果从严格低于指定版本升级,则显示。
minimum_version
只有当 type 是 upgrade 时。如果从严格大于指定版本升级,则显示。
可以组合使用 maximum_version 和 minimum_version 关键字。
type 关键字可以有三个值:
install
只有在软件包安装时才显示消息。
remove
只有在卸载软件包时才显示消息。
upgrade
只有在升级软件包时才显示消息。
示例 1. UCL 短字符串
消息由双引号 " 分隔,用于简单的单行字符串:
Example 2. UCL Multiline Strings
Example 3. Display a Message on Install/Deinstall
当消息只需要在安装或卸载时显示时,请设置类型:
例 4. 在升级时显示消息
当port升级时,显示的消息可以更加贴合port的需求。
在升级时显示消息时,重要的是限制向用户显示消息的时间。大多数情况下,通过使用 maximum_version 来限制其使用,以便在需要执行特定操作时将其升级到特定版本之前的升级中显示。
程序 ports-mgmt/porttools 是 Ports 的一部分。
port 是前端脚本,可以帮助简化测试工作。每当需要测试新的port或更新现有port时,请使用 port test 来测试port,包括 portlint 检查。该命令还会检测并列出任何未在 pkg-plist 中列出的文件。例如:
PREFIX 决定了port将安装在哪里。默认为/usr/local,但用户可以将其设置为自定义路径,如/opt。port必须遵守这个变量的值。
DESTDIR ,如果由用户设置,则确定完整的替代环境,通常是一个jail或者安装在除 / 之外的某个地方的系统。port实际上会安装到 DESTDIR/PREFIX,并在 DESTDIR/var/db/pkg 中注册到软件包数据库中。 DESTDIR 由ports基础设施自动处理,使用 chroot(8)。不需要修改或额外注意编写 DESTDIR 兼容的ports。
PREFIX 的值将设置为 LOCALBASE (默认为 /usr/local)。如果设置了 USE_LINUX_PREFIX , PREFIX 将会是 LINUXBASE (默认为/compat/linux)。
在源代码中避免硬编码的 /usr/local 路径会使port更加灵活,能够满足其他站点的需求。通常,这可以通过将port各种 Makefile 中的 /usr/local 替换为 ${PREFIX} 来实现。此变量会自动传递到构建和安装过程的每个阶段。
确保应用程序没有在 /usr/local 而不是 PREFIX 安装东西。对这种硬编码路径的快速测试是:
如果有任何东西安装在 PREFIX 之外,软件包创建过程将抱怨找不到文件。
另外,值得检查是否支持阶段目录(请参阅分段):
check-plist 检查 plist 中缺失的文件,以及 plist 中未被 port 安装的文件。
stage-qa 检查常见问题,如错误的 shebang、符号链接指向阶段目录之外、setuid 文件和未剥离的库文件…
这些测试不会发现 port 文件中的硬编码路径,也不会验证 LOCALBASE 是否被正确用于引用其他 ports 的文件。必须测试 /var/tmp/ 中临时安装的 port,以确保路径没有问题。
PREFIX 不得在 port 的 Makefile 中明确设置。安装 port 的用户可能已将 PREFIX 设置为定制位置,port 必须尊重该设置。
使用上述提到的变量,而不是显式路径名,从其他 ports 引用程序和文件。例如,如果 port 需要一个宏 PAGER 具有 less 的完整路径名,则不要使用文字路径 /usr/local/bin/less。而是使用 ${LOCALBASE} :
具有 LOCALBASE 的路径更有可能在系统管理员将整个 /usr/local 树移动到其他位置时仍然有效。
对于ports贡献者来说,poudriere 是最重要和有帮助的测试和构建工具之一。其主要特点包括:
整个ports树、特定子集的ports树或单个port的批量构建,包括其依赖项
构建结果的自动打包
按port生成构建日志文件
提供已签名的 pkg(8) 软件包库
在提交到 FreeBSD bug 追踪器或提交到 BSD 树之前测试 port 构建
使用不同选项测试成功的 ports 构建
因为 poudriere 在一个干净的 jail(8) 环境中进行构建,并使用 zfs(8) 功能,因此它比在主机系统上进行传统测试具有几个优点:
不会污染主机环境:没有残留文件,没有意外删除,不会更改现有配置文件。
验证 pkg-plist 中是否存在缺失或多余条目
Ports committers 有时候会要求在补丁提交时附带一个 poudriere 日志,以评估这个补丁是否准备好合并到 ports 树中。
设置和使用它也相当简单,没有依赖性,并且将在任何受支持的 FreeBSD 发行版上运行。本节展示了如何在 ports 贡献者的正常工作流程中安装、配置和运行 poudriere。
本节中的示例展示了 FreeBSD 中的默认文件布局。请根据需要替换任何本地更改。ports 树 由 ${PORTSDIR} 表示,位于 /usr/ports 中。 ${LOCALBASE} 和 ${PREFIX} 默认情况下都在 /usr/local 中。
poudriere 可在ports树中的ports-mgmt/poudriere 中找到。可使用 pkg(8)或从ports安装。
或
FreeBSD 还有一个正在进行中的 poudriere 版本,最终将成为下一个发布版本。它可以在ports-mgmt/poudriere-devel 中找到。这个开发版本用于官方 FreeBSD 软件包构建,因此经过了充分测试。它通常具有更新的有趣功能。一个ports提交者会想要使用开发版本,因为它是在生产中使用的,并且具有所有新功能,可以确保一切完全正确。贡献者不一定需要这些功能,因为最重要的修复已经被反向移植到发布版本。使用开发版本构建官方软件包的主要原因是它更快,可以将完整构建时间从 18 小时缩短到 17 小时,当使用具有 128GB RAM 的高端 32 CPU 服务器时。这些优化在桌面机器上构建ports时并不重要。
port安装了一个默认配置文件,/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
在 jails 中使用主机的 /etc/resolv.conf 用于 DNS。这是为了当下载时 jails 可以解析 distfiles 的 URL。在使用代理时不需要。有关代理配置,请参考默认配置文件。
创建基础 jails,poudriere 将用于构建:
从 poudriere.conf 中给出的 FTP 服务器获取 13.1-RELEASE 用于 amd64 ,创建 zfs 文件系统 tank/poudriere/jails/131Ramd64 ,将其挂载在 /poudriere/jails/131Ramd64 上,并将 13.1-RELEASE 压缩包解压到该文件系统中。
创建 tank/poudriere/jails/12i386 ,将其挂载在 /poudriere/jails/12i386 上,然后从 poudriere.conf 或默认 git.freebsd.org 中的 GIT_HOST 的 Git 分支顶端检出到 /poudriere/jails/12i386/usr/src,然后完成 buildworld 并将其安装到 /poudriere/jails/12i386。
为了运行 14.0-CURRENT poudriere jail,主机必须运行 14.0-CURRENT 。一般来说,更新的内核可以构建和运行旧的jails。例如, 14.0-CURRENT 内核可以构建和运行 12.4-STABLE ,如果 COMPAT_FREEBSD12 内核选项被编译进去(在 14.0-CURRENT GENERIC 内核配置中默认开启)。
poudriere 当前已知的jails列表可以通过 poudriere jail -l 显示:
管理更新非常简单。命令:
更新指定的 jail 至可用的最新版本。对于 FreeBSD 发行版,请使用 freebsd-update(8) 更新至最新的补丁级别。对于从源代码构建的 FreeBSD 版本,请更新至分支中最新的 git 修订版。
在 poudriere 中使用 ports 树有多种方式。最直接的方法是让 poudriere 使用 Git 创建一个默认 ports 树:
这些命令创建 tank/poudriere/ports/default ,将其挂载到 /poudriere/ports/default,并使用 Git 进行填充。之后它被包含在已知 ports 树的列表中:
处理本地修改的 ports 贡献者最好的方法是使用 Git。与 jails 的创建类似,可以使用其他方法创建 ports 树。为了为测试本地修改和 ports 开发添加额外的 ports 树,最好通过 git 检出树(如上所述)。
根据工作流程的不同,手动维护的ports树可能非常有帮助。例如,如果在/work/ports中有ports树的本地副本,请将 poudriere 指向该位置:
这将列在已知树的表中:
和之前描述的一样简单:
将更新给定的 PORTSTREE,由 poudriere -l 的输出给出的一个树,到官方服务器上最新的版本。
在设置了jails和ports树木之后,贡献者对ports树的修改结果可以得到测试。
例如,可测试/work/ports/www/firefox 目录中位于/www/firefox port 上的本地修改,这可以在先前创建的 13.1-RELEASE jail中进行测试。
这将构建 Firefox 的所有依赖项。如果某个依赖项以前已构建并且仍然是最新状态,则将安装预构建的软件包。如果某个依赖项没有最新软件包,将使用默认选项在jail中构建一个。然后构建 Firefox 本身。
每个port的完整构建都记录在/poudriere/data/logs/bulk/131Ri386-development/build-time/logs 中。
The directory name 131Ri386-development
is derived from the arguments to -j
and -p
, respectively. For convenience, a symbolic link /poudriere/data/logs/bulk/131Ri386-development/latest is also maintained. The link points to the latest build-time directory. Also in this directory is an index.html for observing the build process with a web browser.
By default, poudriere cleans up the jails and leaves log files in the directories mentioned above. To ease investigation, jails can be kept running after the build by adding -i
to testport
:
FreeBSD ports 构建基础设施的一个重要部分是能够根据个人喜好调整 ports 的能力。这些可以使用 poudriere 进行测试。添加 -c :
在构建 port 之前显示 port 配置对话框。在 -o 之后给出的格式 category/portname 将使用指定的选项,所有依赖项将使用默认选项。使用 sets 可以使用非默认选项来测试依赖 ports。
对于涉及构建的所有操作,可以使用所谓的集合,使用 -z setname 指定。集合指的是完全独立的构建。例如,可以使用 testport 与依赖项ports的非标准选项。
要使用集合,poudriere 期望存在类似 PORT_DBDIR 的现有目录结构,默认为配置目录中的/var/db/ports。然后将此目录通过 nullfs(5)挂载到jails中,构建ports及其依赖项。通常,可以通过递归复制现有 PORT_DBDIR 到/usr/local/etc/poudriere.d/jailname-portname-setname-options 来获得合适的起点。这在 poudriere(8)中有详细描述。例如,测试特定集合 devset 中的 www/firefox,向 testport 命令添加 -z devset 参数:
这将按照这个顺序查找这些目录的存在:
/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
/usr/local/etc/poudriere.d/development-options
/usr/local/etc/poudriere.d/131Ramd64-options
/usr/local/etc/poudriere.d/options
从此列表中,poudriere 将第一个现有目录树 nullfs(5)-挂载到构建jails的/var/db/ports目录中。因此,在此运行 testport 期间,所有定制选项都将用于所有ports。
在提供一组的目录结构后,可以修改特定port的选项。例如:
显示了 www/firefox 的配置对话框,可以编辑选项。所选选项将保存到 devset 集。
Similar to using sets, poudriere will also use a custom make.conf if it is provided. No special command line argument is necessary. Instead, poudriere looks for existing files matching a name scheme derived from the command line. For instance:
causes poudriere to check for the existence of these files in this order:
/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
/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
与集合不同,所有找到的文件将按顺序追加到一个 make.conf 文件中,构建jails内。因此,可以在/usr/local/etc/poudriere.d/make.conf 中设置通用 make 变量,以影响所有构建。特殊变量,仅影响特定jails或集合的文件可以在专门的 make.conf 文件中设置,例如/usr/local/etc/poudriere.d/131Ramd64-development-devset-make.conf。
示例 1。使用 make.conf 更改默认 Perl
要构建一个使用名为 perl5-20 的集合构建非默认 Perl 版本,例如 5.20 ,请创建一个名为 perl5-20-make.conf 的文件,并添加以下内容:
请注意 += 的使用,这样,如果默认 make.conf 中已经设置了该变量,其内容就不会被覆盖。
poudriere 配备了一个内置机制,可删除不再被给定树的任何port使用的过时 distfiles。命令
将扫描 distfiles 文件夹,在 poudriere.conf 中 DISTFILES_CACHE ,与由 -p portstree 参数给出的ports树进行比对,并提示删除这些 distfiles。要跳过提示并无条件删除所有未使用的文件,可以添加 -y 参数:
Multiline strings use the standard here document notation. The multiline delimiter must start just after <<
symbols without any whitespace and it must consist of capital letters only. To finish a multiline string, add the delimiter string on a line of its own without any whitespace. The message from can be written as:
After the build completes, and regardless of whether it was successful, a shell is provided within the jail. The shell is used to investigate further. poudriere can be told to leave the jail running after the build finishes with -I
. poudriere will show the command to run when the jail is no longer needed. It is then possible to into it:
注意,"default" ports 树是特殊的。稍后解释的每个构建命令都将隐式使用此 ports 树,除非另有特别指定。要使用另一个树,请向命令中添加 -p treename 。
有时候事情会出错,并且port在运行时失败。该框架提供了一些工具来帮助调试ports。这些辅助工具有一定的限制,因为调试port的方式在很大程度上取决于所使用的技术。以下变量有助于调试ports:
WITH_DEBUG . 如果设置,ports 将使用调试符号构建。
WITH_DEBUG_PORTS . 指定要使用 WITH_DEBUG 设置构建的 ports 列表。
DEBUG_FLAGS . 用于指定要传递给 CFLAGS 的附加标志。默认为 -g 。
当设置 WITH_DEBUG 时,无论是全局设置还是为ports列表设置,生成的二进制文件均未被剥离。
这些变量可以在 make.conf 中或者命令行中指定:
请参考开发者手册中关于可用调试工具的更多调试信息。
如果升级 port 需要特殊步骤,比如更改配置文件或运行特定程序,则必须在此文件中记录。此文件中条目的格式如下:
如所示,该命令仅适用于 Bourne shells。而使用下面显示的形式,将适用于 Bourne shell 和 C-shell:
该文件用于列出已移动或删除的ports。文件中的每一行都由port的名称组成,port何时以及为什么被移动。如果port已被移除,则可以将详细信息部分留空。每个部分必须用 | (管道)字符分隔,如下所示:
日期必须按照 YYYY-MM-DD 的形式输入。新条目将被添加到列表的末尾,以保持按时间顺序排列,最古老的条目在列表顶部。
如果port被删除但已经恢复,请删除此文件中声明其已被删除的行。
如果port被重命名,然后又重命名回原始名称,请添加一个新条目,将中间名称添加到旧名称中,并删除旧条目,以免创建循环。
偶尔会有漏洞引入到软件中。可以说,其中最危险的是那些会导致安全漏洞的漏洞。从技术角度来看,应该通过消灭引起漏洞的漏洞来关闭这些漏洞。然而,处理普通漏洞和安全漏洞的政策是非常不同的。
典型的小 bug 只影响那些启用了触发该 bug 的某种组合选项的用户。开发人员最终会发布一个补丁,然后是一个不再存在 bug 的新版本软件,但大多数用户不会立即升级,因为这个 bug 从未困扰过他们。可能导致数据丢失的关键 bug 代表了一个更严重的问题。然而,审慎的用户知道,除了软件 bug 外,许多可能的意外事件都可能导致数据丢失,因此他们会备份重要数据;此外,关键 bug 将很快被发现。
安全漏洞则完全不同。首先,它可能在多年内未被注意到,因为通常不会导致软件故障。其次,恶意方可能利用它来未经授权地访问易受攻击的系统,破坏或更改敏感数据;在最坏的情况下,用户甚至不会注意到造成的危害。第三,暴露易受攻击的系统通常会帮助攻击者侵入其他无法被攻破的系统。因此,仅仅关闭漏洞是不够的:以最清晰和全面的方式通知受众,这将使他们评估危险并采取适当的行动。
发现安全漏洞后,尽快通知port用户社区是非常重要和紧急的步骤。这样的通知有两个目的。首先,如果危险确实很严重,立即采取应急措施是明智的。例如,停止受影响的网络服务,甚至完全卸载port,直到漏洞得到修复。其次,许多用户只偶尔升级安装的软件包。他们会从通知中得知,一旦修正版本可用,必须立即更新软件包。
鉴于树中ports的数量庞大,每次事件都发布安全通告会造成信息泛滥,当涉及真正严重的事项时,会失去受众的注意。因此,在 FreeBSD VuXML 数据库中记录ports中发现的安全漏洞。安全官员团队成员也监视这些需要他们干预的问题。
提交者可以自行更新 VuXML 数据库,协助安全官员团队,并更快地向社区传递关键信息。那些不是提交者或发现了异常严重漏洞的人不应该犹豫,应该直接联系安全官员团队,如 FreeBSD 安全信息页面所述。
VuXML 数据库是一个 XML 文档。其源文件 vuln.xml 位于port security/vuxml 中。因此,文件的完整路径名将是 PORTSDIR/security/vuxml/vuln.xml。每当在port中发现安全漏洞时,请在该文件中添加一个条目。在熟悉 VuXML 之前,最好的做法是找到一个适合当前情况的现有条目,然后复制并将其用作模板。
完整的 XML 格式很复杂,远远超出了本书的范围。然而,为了对 VuXML 条目的结构有基本了解,只需要了解标签的概念。XML 标签名被尖括号括起来。每个开放标签必须有一个匹配的闭合标签。标签可以嵌套。如果嵌套,内部标签必须在外部标签之前关闭。标签有一个层次结构,即更复杂的嵌套规则。这类似于 HTML。主要区别在于 XML 是可扩展的,即基于定义自定义标签。由于其固有结构,XML 将其他无定形的数据整理成形。VuXML 特别适用于标记安全漏洞描述。
现在考虑一个现实的 VuXML 条目:
标记名称应该是不言自明的,因此我们只会更仔细地查看需要填写的字段:
这是发现的问题的一行描述。
受影响的软件包名称列在那里。可以给出多个名称,因为几个软件包可能基于单个主 port 或软件产品。这可能包括稳定和开发分支,本地化版本和包含不同重要构建时间配置选项选择的从属 ports。
软件包的受影响版本在那里指定为使用 , , , 和 元素的一个或多个范围的组合。检查给定的版本范围是否不重叠。 在范围规范中, * (星号)表示最小版本号。特别地, 2.* 小于 2.a 。因此,星号可用于匹配所有可能的 alpha 、 beta 和 RC 版本。例如, 2.3. 将选择性地匹配每个 2.x 版本,而 2.03.0 不会,因为后者缺少 2.r3 并匹配 3.b 。 上述示例指定受影响的版本为 1.6 及 1.9 之前的版本, 2.x 在 2.4_1 之前的版本,以及版本 3.0b1 。
几个相关的软件包组(基本上,ports)可以在 部分中列出。如果几个软件产品(比如 FooBar、FreeBar 和 OpenBar)是从同一代码库发展而来,并且仍然共享其错误和漏洞,则可以使用此功能。请注意,这与在单个 部分中列出多个名称的区别。
版本范围必须允许 PORTEPOCH 和 PORTREVISION (如果适用)。请记住,根据排序规则,具有非零 PORTEPOCH 的版本大于任何不含 PORTEPOCH 的版本,例如, 3.0,1 大于 3.1 ,甚至大于 8.9 。
这是问题摘要。XHTML 用于此字段。至少必须出现
和
。可以使用更复杂的标记,但仅用于准确性和清晰度:请勿添加花哨的内容。
此部分包含对相关文档的引用。鼓励提供尽可能多的参考文献。
这是一个 FreeBSD 安全公告。
这是一个 FreeBSD 问题报告。
这是一个 MITRE CVE 标识符。
这是一个 US-CERT 漏洞通告。
这是一个 US-CERT 技术网络安全警报。
这是一个存档在邮件列表中的帖子的网址。属性 msgid 是可选的,可以指定帖子的消息 ID。
这是一个通用的网址。只有当其他参考类别都不适用时才使用。
这是问题披露的日期(YYYY-MM-DD)。
这是条目添加的日期(YYYY-MM-DD)。
这是条目中的任何信息上次修改的日期(YYYY-MM-DD)。新条目不得包括此字段。在编辑现有条目时添加它。
此示例描述了软件包 dropbear 中的一个漏洞的新条目,该漏洞已在版本 dropbear-2013.59 中修复。
作为先决条件,安装一个新版本的安全/vuxml port。
首先,检查是否已经有关于这个漏洞的条目。如果有这样的条目,它将匹配先前版本的软件包, 2013.58 :
如果找不到任何条目,请为这个漏洞添加一个新条目。
如果漏洞具有 MITRE CVE 标识符,则可以改用以下命令:
其中 CVE-YYYYY-XXXX 是有效的 CVE 标识符。
如果漏洞是 FreeBSD 安全公告,则可以改用以下命令:
其中 FreeBSD-SA-YY-XXXXXX.asc 是一个已发布的 FreeBSD 安全公告。
验证其语法和格式:
前一个命令会生成 vuln-flat.xml 文件。也可以使用以下命令生成:
验证该条目的 部分是否匹配正确的软件包:
确保该条目在输出中不产生错误匹配。
现在检查是否匹配正确的软件包版本:
前者版本匹配,而后者版本不匹配。
FreeBSD Ports 收藏品在不断变化。以下是一些关于如何跟上的信息。
一个了解已经提交更新的最简单方法是订阅 FreshPorts。可以监视多个ports。强烈建议维护人员订阅,因为他们将收到不仅是自己更改的通知,还有任何其他 FreeBSD 提交者进行的更改通知。(通常必须跟踪底层ports框架的更改 - 虽然最好收到提交这些更改的人提前通知,但有时会被忽略或不切实际。此外,在某些情况下,更改的性质非常微小。我们期望每个人在这些情况下都能做出最好的判断。)
使用 FreshPorts 需要一个帐户。在 @FreeBSD.org 注册电子邮件地址的人将在网页右侧看到选择加入的链接。那些已经拥有 FreshPorts 帐户但未使用 @FreeBSD.org 电子邮件地址的人可以更改电子邮件地址为 @FreeBSD.org ,订阅,然后再次更改回来。
FreshPorts 亦具备一个健全性测试功能,该功能会自动测试提交至 FreeBSD 1001 树的每个提交。如果订阅了此服务,提交者将会收到 FreshPorts 在测试其提交的健全性测试过程中检测到的任何错误的通知。
可以通过 web 接口浏览源代码库中的文件。影响整个 1001 系统的更改现在在 CHANGES 文件中有所记录。影响个别 1002 的更改现在在 UPDATING 文件中有所记录。然而,对于任何问题的明确答案无疑是阅读 bsd.1003.mk 和相关文件的源代码。
作为ports维护者,请考虑订阅 FreeBSD ports 邮件列表。重要更改将在那里宣布,然后提交到 CHANGES。
如果这个邮件列表的信息量太大,请考虑关注只包含公告的 FreeBSD ports 公告邮件列表。
FreeBSD 最少为之一的优势是专门为持续构建 Ports 集合的整个机群,为每个主要的操作系统发布版本和每个 Tier-1 架构。
除非明确标有 IGNORE ,否则将构建单独的 ports。仍将尝试标记为 BROKEN 的 Ports,以查看是否已解决潜在问题。(这通过向 port 的 Makefile 传递 TRYBROKEN 来完成。)
构建集群专门用于构建每个port的最新版本,已经获取了 distfiles。然而,由于互联网不断变化,distfiles 可能很快就会丢失。Portscout,FreeBSD Ports distfile 扫描器,尝试查询每个下载站点上每个port,以查看每个 distfile 是否仍然可用。Portscout 可以生成 HTML 报告,并向请求的人发送有关新可用ports的电子邮件。除非另有要求,维护者被要求定期检查更改,无论是手动还是使用 RSS 提要。
Portscout 的第一页提供了port维护者的电子邮件地址,维护者负责的ports数量,具有新 distfiles 的ports数量,以及那些ports中过时的百分比。搜索功能允许按电子邮件地址搜索特定维护者,并选择是否仅显示过时的ports。
单击维护者的电子邮件地址后,将显示他们的所有 ports 列表,以及 port 类别、当前版本号、是否有新版本、最后更新时间以及最后检查时间。此页面上的搜索功能允许用户搜索特定的 port。
单击列表中的 port 名称会显示 FreshPorts port 信息。
在 Portscout 存储库中提供了额外的文档。
在谈到 ports 和软件包时,安全漏洞可能首先出现在原始分发版或 port 文件中。在前一种情况下,原始软件开发人员很可能会立即发布补丁或新版本。立即更新 port,以符合作者的修复要求。如果由于某种原因修复延迟,要么将 port 标记为 FORBIDDEN ,要么向 port 引入一个补丁文件。对于一个有漏洞的 port,尽快修复 port。无论哪种情况,提交更改时请遵循标准流程,除非有权直接提交到 ports 树中。
请确保在漏洞关闭后尽快提升port的修订版。这样,定期升级已安装软件包的用户将看到他们需要运行更新。此外,将构建一个新软件包,并通过 FTP 和 WWW 镜像进行分发,以取代有漏洞的软件包。除非在纠正漏洞过程中 DISTVERSION 已更改,否则提升 PORTREVISION 。也就是说,如果向port添加补丁文件,则提升 PORTREVISION ,但如果将port更新到最新软件版本并已触及 DISTVERSION ,则不要提升它。请参考相应部分以获取更多信息。
当port不是作者提供的最新版本时,请更新/usr/ports的本地工作副本。port可能已经更新到新版本。
当处理超过几个ports时,使用 Git 来保持整个ports集合的最新状态可能更容易,如《使用Ports集合》中所述。这将额外带来跟踪所有port依赖项的好处。
下一步是查看是否已经有待处理的更新。为此,有两个选项。有一个可搜索的界面可访问 FreeBSD 问题报告(PR)或错误数据库。在 Product 多选菜单中选择 Ports & Packages ,并在 Summary 字段中输入port的名称。
如果没有待处理的 PR,下一步是给port的维护者发送电子邮件,如 make maintainer 所示。该人可能已经在进行升级,或者由于某种原因目前不需要升级port(例如,由于新版本的稳定性问题),因此没有必要重复他们的工作。请注意,未维护的ports将列出维护者为 ports@FreeBSD.org ,这只是一般ports邮件列表,因此在这种情况下发送邮件可能不会有所帮助。
如果维护者要求您升级,或者没有维护者,请通过使用基本系统中的 diff(1) 命令来帮助 FreeBSD 准备更新!
要为单个补丁创建一个合适的 diff ,请将需要打补丁的文件复制到 something.orig,将更改保存到 something,然后创建补丁:
否则,要么使用 git diff 方法(使用 Git 制作补丁),要么将 port 的内容复制到一个完全不同的目录,并使用新旧 ports 目录的递归 diff(1) 输出的结果(例如,如果修改后的 port 目录称为 superedit,原始目录在我们的树中称为 superedit.bak,则保存 diff -ruN superedit.bak superedit 的结果)。 统一或上下文差异都可以,但 port 提交者通常更喜欢统一差异。 注意使用 -N 选项-这是强制 diff 正确处理添加新文件或删除旧文件的情况的接受方式。 在发送给我们 diff 之前,请检查输出以确保所有更改都是合理的(特别是,请确保首先使用 make clean 清理工作目录)。
为了简化使用补丁文件的常见操作,请使用 make makepatch ,如 Patching 中所述。还存在其他工具,如/usr/ports/Tools/scripts/patchtool.py。在使用之前,请阅读/usr/ports/Tools/scripts/README.patchtool。
如果port未得到维护,并且您正在积极使用它,请考虑自愿成为其维护者。FreeBSD 有超过 4000 个ports没有维护者,这是一个始终需要更多志愿者的领域。(有关维护者责任的详细描述,请参阅开发者手册中的章节。)
要提交差异,请使用 bug 提交表单(产品 Ports & Packages ,组件 Individual Port(s) )。始终在问题的类别名称后面加上冒号和简要描述。示例: category/portname: add FOO option ; category/portname: Update to X.Y 。请在消息中提及任何添加或删除的文件,因为在提交时必须明确指定给 git(1)。不要压缩或编码差异。
在提交 bug 之前,请查看《编写问题报告》部分。其中包含有关如何编写有用问题报告的更多信息。
现在所有这些都完成了,请阅读有关如何保持最新的内容在《保持更新》中。
在可能的情况下,请提交一个 git(1) 补丁或差异。它们比 "新旧" 目录之间的差异更容易处理。更容易看到发生了什么变化,并在Ports集合自工作开始以来有所修改,或者提交者要求修复某些内容时更新差异。此外,使用 git-format-patch(1) 或 git-diff(1) 生成的补丁可以轻松地使用 git-am(1) 或 git-apply(1) 应用,并将为提交者节省一些时间。最后,使用 git-format-patch(1) 生成的 git 补丁包括您的作者信息和提交消息。这些将记录在存储库的日志中,这是提交更改的推荐方式。
在 port 目录中,进行必要的更改。如果添加、移动或删除文件,请使用 git 来跟踪这些更改:
确保使用测试 Port 和检查 Port 的清单来检查 port 。
同时,在 distinfo 中更新校验和参考 make makesum 。
在制作补丁之前,获取最新的存储库并在其之上重新应用更改。仔细观察并遵循输出。如果任何文件未能重新应用,则意味着在您编辑相同文件时上游文件发生了更改,需要手动解决冲突。
检查为补丁暂存的更改:
最后一步是制作更改的统一差异或补丁:
使用 git-format-patch(1) 生成补丁:
这将生成一个名为 0001-foo.patch 的补丁。这是首选方式,因为它会包含作者身份信息,而且在进行一系列不打算合并在一起的更改时也更容易。
或者,使用 git-diff(1) 生成统一 diff:
这将生成一个名为 foo-1.2.3.diff 的差异。其中 foo 将被替换为提交消息的第一行,即提交消息的主题。
创建补丁后,您可以切换到主分支开始其他开发。
一旦补丁被接受并合并,如果您愿意,可以删除本地开发分支:
按照问题报告提交指南发送修补程序。
Makefile 的第一个部分必须按相同顺序进行。这个标准使得每个人都可以很容易地阅读任何port,而不必按随机顺序搜索变量。
这个区块是最重要的。它定义了port名称、版本、分发文件位置和类别。变量必须按照这个顺序:
MASTER_SITE_SUBDIR (弃用)
这个区块是可选的。变量有:
此块是强制性的。变量包括:
此块是可选的,尽管强烈推荐。变量包括:
LICENSE_GROUPS 或 LICENSE_GROUPS_NAME
LICENSE_NAME 或 LICENSE_NAME_NAME
LICENSE_TEXT 或 LICENSE_TEXT_NAME
LICENSE_FILE 或 LICENSE_FILE_NAME
LICENSE_PERMS 或 LICENSE_PERMS_NAME_
LICENSE_DISTFILES 或 LICENSE_DISTFILES_NAME
If there are multiple licenses, sort the different LICENSE_VAR_NAME variables by license name.
BROKEN
/IGNORE
/DEPRECATED
MessagesThis block is optional. The variables are:
这个区块是可选的。变量为:
TEST_DEPENDS
这个区块是可选的。
从定义 FLAVORS 开始这一部分。继续使用可能的 Flavors 助手。查看更多信息,请参阅 FLAVORS 。
构造设置变量,不能使用 .if ${FLAVOR:U} == foo 作为助手的应放在各自的下面部分。
从定义 USES 开始,然后可能是 USE_x
将相关变量放在一起。例如,如果使用 USE_GITHUB ,请紧接着放 GH_* 变量。
此部分块是 bsd.port.mk 中可以定义的变量,这些变量不属于任何先前的部分块。
顺序并不重要,但尽量将类似的变量放在一起。例如,uid 和 gid 变量 USERS 和 GROUPS 。配置变量 CONFIGURE_* 和 *_CONFIGURE 。文件和目录列表 PORTDOCS 和 PORTEXAMPLES 。
如果port使用选项框架,请先定义 OPTIONS_DEFINE 和 OPTIONS_DEFAULT ,然后先定义其他 OPTIONS_* 变量,然后是 *_DESC 描述,最后是选项助手。尝试按字母顺序对所有这些进行排序。
示例 1。选项变量顺序示例
FOO 和 BAR 选项没有标准描述,因此需要编写一个。其他选项已在 Mk/bsd.options.desc.mk 中有描述,因此不需要编写。 DOCS 和 EXAMPLES 使用目标助手安装它们的文件,尽管它们属于目标,但为了完整起见,这里显示它们,因此其他变量和目标可以在它们之前插入。
然后是前面未提及的其余变量。
在定义所有变量之后,可以定义可选的 make(1) 目标。在不同阶段运行时,保持 pre- ** 在 post- ** 之前,并按照相同顺序。
fetch
extract
patch
configure
build
install
test
这里是一个示例 Makefile,可用于创建一个新port。确保删除所有额外的注释(在括号之间的注释)。
所示格式是用于订购变量、部分之间的空行等的推荐格式。该格式旨在使最重要的信息易于查找。我们建议使用 portlint 来检查 Makefile。
[]
[]
git.FreeBSD.org 是 FreeBSD 公共 Git 服务器。有关更多信息,请参阅 FreeBSD Git 存储库 URL 表。
每个后续区块必须与前一个区块用一个空行分隔。 在下面的区块中,只设置port所需的变量。按照这里显示的顺序定义这些变量。
BROKEN_* 和 IGNORE_* 可以是任意通用变量,例如, IGNORE_amd64 , BROKEN_FreeBSD_10 等。除了依赖于 USES 的变量,将其放在 USES 和 USE_x 中。例如,只有当设置 php 时, IGNORE_WITH_PHP 才有效,只有当设置 ssl 时, BROKEN_SSL 才有效。 如果port在满足某些条件时标记为 BROKEN,并且只能在包含 bsd.port.options.mk 或 bsd.port.pre.mk 后才能测试这些条件,则应稍后设置这些变量,即其余变量。
这里列出了一些常见的注意事项和禁忌,这些在移植过程中经常遇到。将port与此列表进行对比,但也请检查 PR 数据库中他人提交的ports。按照“Bug Reports and General Commentary”中的描述提交任何关于ports的评论。检查 PR 数据库中的ports,这将使我们更快地提交它们,并证明你知道自己在做什么。
WRKDIR
不要向 WRKDIR 外的文件写入任何内容。 WRKDIR 是port构建过程中唯一保证可写的地方(参见从 CDROM 安装ports来了解从只读树构建ports的示例)。pkg-*文件可以通过重新定义变量而不是覆盖文件来修改。
WRKDIRPREFIX
确保port遵循 WRKDIRPREFIX 。大多数ports不必担心这一点。特别是,当引用另一个port的 WRKDIR 时,注意正确的位置是${WRKDIRPREFIX}${PORTSDIR}/subdir/name/work,而不是${PORTSDIR}/subdir/name/work 或${.CURDIR}/../../subdir/name/work 或其他类似的地方。
一些代码需要根据运行在哪个版本的 FreeBSD Unix 进行修改或条件编译。 区分 FreeBSD 版本的首选方法是在 sys/param.h 中定义的 __FreeBSD_version 和 FreeBSD 宏。如果没有包含此文件,请在.c 文件的适当位置添加代码,
到适当位置在.c 文件中。
FreeBSD 定义在所有版本的 FreeBSD 中作为它们的主要版本号。例如,在 FreeBSD 9.x 中, FreeBSD 被定义为 9 。
__FreeBSD_version 值的完整列表可在 _ _FreeBSD_version Values 中获得。
不要在 .include <bsd.port.mk> 行之后写任何内容。通常可以通过在 Makefile 的中间某处包含 bsd.port.pre.mk 来避免这种情况,然后在最后加上 bsd.port.post.mk。
bsd.port.pre.mk 只定义了一些变量,可以在 Makefile 中的测试中使用,bsd.port.post.mk 定义了其余部分。
这里是在 bsd.port.pre.mk 中定义的一些重要变量(这不是完整列表,请阅读 bsd.port.mk 获取完整列表)。
ARCH
由 uname -m 返回的架构(例如, i386 )
OPSYS
操作系统类型,由 uname -s 返回(例如, FreeBSD )
OSREL
操作系统的发行版本(例如, 2.1.5 或 2.2.7 )
OSVERSION
操作系统的数字版本;与 __FreeBSD_version 相同。
LOCALBASE
“本地”树的基础(例如, /usr/local )
PREFIX
port 安装自身的位置(请参阅更多关于 PREFIX 的信息)。
这里是一些可以在 bsd.port.pre.mk 之后添加的示例:
在 BROKEN= 之后始终使用制表符而不是空格。
如果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 已经提供了一个简便的解决方案。
port必须尊重 CC 和 CXX 。我们的意思是port不能绝对设置这些变量的值,覆盖现有的值;相反,它可以向现有值添加所需的值。这样可以全局设置影响所有ports的构建选项。
如果port不尊重这些变量,请将 NO_PACKAGE=ignores either cc or cxx 添加到 Makefile 中。
这是一个尊重 CC 和 CXX 的 Makefile 示例。请注意 ?= :
这是一个既不尊重 CC 也不尊重 CXX 的示例:
在 FreeBSD 系统上,可以在 /etc/make.conf 中定义 CC 和 CXX 。第一个示例在未在 /etc/make.conf 中先前设置值时定义一个值,保留任何系统范围的定义。第二个示例会覆盖之前定义的任何内容。
必须尊重 CFLAGS 。我们的意思是,port 不得绝对设置此变量的值,覆盖现有值。相反,它可以向现有值追加所需的任何值。这样可以全局设置影响所有 ports 的构建选项。
如果没有,请将 NO_PACKAGE=ignores cflags 添加到 Makefile。
这里是尊重 CFLAGS 的一个示例的 Makefile。请注意 += :
这是一个不尊重 CFLAGS 的示例:
CFLAGS 在 FreeBSD 系统中在 /etc/make.conf 中被定义。第一个示例将附加额外的标志到 CFLAGS ,保留任何系统范围的定义。第二个示例将覆盖先前定义的任何内容。
从第三方 Makefile 中删除优化标志。该系统 CFLAGS 包含全局系统优化标志。未修改的 Makefile 示例:
使用系统优化标志,Makefile 将类似于此示例:
使 port 构建系统在构建阶段显示所有执行的命令。完整的构建日志对调试 port 问题至关重要。
非信息性构建日志示例(不好):
冗长的构建日志示例(好):
一些构建系统,如 CMake、ninja 和 GNU configure,已经为ports框架设置了详细日志记录。在其他情况下,ports可能需要单独的调整。
请向上游维护者发送适用的更改和补丁,以便包含在下一个版本的代码发布中。这样做将使更新到下一个版本变得更加容易。
README.html 不属于port的一部分,而是由 make readme 生成的。在补丁或提交中不要包括此文件。
在某些情况下,必须阻止用户安装port。 可以在port的 Makefile 中使用几个变量,告诉用户port无法安装。 这些 make 变量的值将是向用户显示port拒绝安装自身的原因。 请使用正确的 make 变量。 每个变量都传达着截然不同的含义,既对用户,也对依赖于 Makefiles 的自动化系统,如ports构建集群和 FreshPorts。
BROKEN 保留给目前无法正确编译、安装、卸载或运行的 ports。用于被认为是暂时性问题的 ports。如果指示,构建集群仍将尝试构建它们,以查看潜在问题是否已解决。(但是,通常情况下,集群运行时不会这样做。) 例如,当 port:
无法编译时使用 {{0}}
在配置或安装过程中失败
在${PREFIX}之外安装文件
在卸载时未完全清理所有文件(但是,允许且希望port保留用户修改的文件)
在应该正常运行的系统上存在运行时问题。
FORBIDDEN 用于包含安全漏洞或引起对 FreeBSD 系统安全性产生严重关注的ports(例如,一个声誉不佳的不安全程序或提供易受攻击服务的程序)。一旦某个软件存在漏洞且没有发布升级版本,立即将ports 标记为 FORBIDDEN 。理想情况下,在发现安全漏洞时尽快升级ports,以减少易受攻击的 FreeBSD 主机数量(我们希望以安全著称),但有时漏洞披露和受影响软件更新发布之间会有明显的时间差。不要因其他原因而将port 标记为 FORBIDDEN ,只能基于安全性原因标记。
IGNORE 保留给因某些其他原因而不得构建的ports。在认为问题是结构性的ports中使用它。构建集群绝对不会构建标记为 IGNORE 的ports。例如,当port时使用 IGNORE :
定制安装版本的 FreeBSD 上不起作用
由于许可限制,可能无法自动获取 distfile
与当前安装的某些其他port不兼容(例如,port依赖于 www/drupal7,但安装了 www/drupal8)||如果port与当前安装的port发生冲突(例如,如果它们在执行不同功能的相同位置安装文件),请改用 CONFLICTS 。 CONFLICTS 将自行设置 IGNORE 。| | --| ----------------------------------------------------------------------------------------------------------------------------------------------|
不要引用 BROKEN , IGNORE 和相关变量的值。由于向用户显示信息的方式,每个变量的消息措辞不同:
从 make describe 导致此输出:
FreeBSD 运行在许多不仅仅是众所周知的基于 x86 的处理架构上。某些ports有特定于其中一个或多个这些架构的约束条件。
要查看支持的架构列表,请运行:
值显示为 TARGET / TARGET_ARCH 。ports只读的 Makevar ARCH 是基于 TARGET_ARCH 的值设定的。Port的 Makefile 应该测试这个 Makevar 的值。
没有任何架构相关文件或要求的 Ports 通过设置 NO_ARCH=yes 进行识别。
从这类 ports 构建的软件包,其架构字符串以 :* 结尾(通配符架构),而不是例如 freebsd:13:x86:64 (amd64 架构)。
要将 port 标记为仅在某些架构上被 IGNORE ,有两个其他方便的变量将自动设置 IGNORE : ONLY_FOR_ARCHS 和 NOT_FOR_ARCHS 。示例:
自定义 IGNORE 消息可使用 ONLY_FOR_ARCHS_REASON 和 NOT_FOR_ARCHS_REASON 进行设置。使用 ONLY_FOR_ARCHS_REASON_ARCH 和 NOT_FOR_ARCHS_REASON_ARCH 可以实现按体系结构的条目。
如果port获取 i386 二进制文件并安装它们,则设置 IA32_BINARY_PORT 。如果设置了此变量,则 IA32 版本的库必须存在/usr/lib32,并且内核必须支持 IA32 兼容性。如果这两个依赖关系中的一个未满足,则 IGNORE 将被自动设置。
有些ports会尝试通过向编译器指定 -march=native 来调整到正在构建的准确机器。这应该避免:要么将其列在关闭默认选项下,要么完全删除它。否则,构建集群生成的默认软件包可能无法在该 ARCH 的每台机器上运行。
请记住, BROKEN 和 FORBIDDEN 应作为暂时的资源,如果一个port无法正常工作。永久损坏的ports将被完全从树中移除。
当有必要时,可以使用 DEPRECATED 和 EXPIRATION_DATE 提醒用户即将port。前者是一个字符串,解释为什么计划移除port;后者是一个符合 ISO 8601 格式(YYYY-MM-DD)的字符串。这两者将展示给用户。
可以设置 DEPRECATED 而不必有 EXPIRATION_DATE (例如,推荐port的更新版本),但反过来却毫无意义。
没有关于给予多少通知的固定政策。 目前的做法似乎是对与安全相关问题给予一个月的通知期,对于构建问题则为两个月。 这也给任何感兴趣的贡献者一些时间来修复问题。
Makefile 向用户表明由于某些外部因素(例如,用户已经指定了一组非法的构建选项组合)无法安装 port 的正确方式是将一个非空值设置为 IGNORE 。 这个值将由 make install 格式化并显示给用户。
使用 .error 于此目的是一个常见错误。这样做的问题在于许多与 ports 树相关的自动化工具在这种情况下将失败。最常见的情况是在尝试构建 /usr/ports/INDEX 时发生(请查看运行 make describe )。然而,即使是更琐碎的命令例如 make maintainer 在这种情况下也会失败。这是不可接受的。
示例 1. 如何避免使用 .error
下面两个 Makefile 片段中的第一个将导致 make index 失败,而第二个将不会:
除了在目标中使用外,不推荐使用 sysctl。这是因为像在 make index 中使用时,任何 makevar 命令的评估都必须运行该命令,进一步减慢该过程。
只能通过 SYSCTL 使用 sysctl(8) ,因为它包含完全合格的路径,并且可以被覆盖,如果有特殊需要的话。
有时软件作者会更改已发布的 distfiles 的内容,而不更改文件的名称。验证更改是否是官方的,并已由作者执行。过去曾经发生过,在下载服务器上悄悄更改了 distfile,意图是造成损害或 comprom 动最终用户的安全性。
将旧的 distfile 放在一边,下载新的 distfile,解压它们并使用 diff(1) 比较内容。如果没有可疑之处,就更新 distinfo。
联系软件的作者,并与他们确认更改。
FreeBSD ports 通常期望符合 POSIX。一些软件和构建系统基于特定操作系统或环境做出假设,可能在 port 中使用时会导致问题。
如果有其他获取信息的方式,请不要使用 /proc。例如,在 main() 中使用 setprogname(argv[0]) ,然后使用 getprogname(3) 来获取可执行文件名。
不要依赖 POSIX 未记录的行为。
不记录应用程序关键路径中的时间戳,如果应用程序没有时间戳也能正常工作。获取时间戳可能会很慢,这取决于操作系统中时间戳的准确性。如果确实需要时间戳,确定它们必须精确到什么程度,并使用一个文档记录为提供所需精度的 API。
在 Linux® 上,许多简单的系统调用(例如 gettimeofday(2),getpid(2))比其他任何操作系统都快得多,这是由于缓存和 vsyscall 性能优化。在性能关键的应用程序中,不要指望它们的性能低廉。一般来说,尽量避免系统调用,如果可能的话。
不要依赖于 Linux® 特定的套接字行为。特别是,默认的套接字缓冲区大小是不同的(使用 setsockopt(2)调用 SO_SNDBUF 和 SO_RCVBUF ),并且当套接字缓冲区已满时,Linux® 的 send(2) 会阻塞,而 FreeBSD 的则会失败并在 errno 中设置 ENOBUFS 。
如果需要依赖非标准行为,请将其正确封装到一个通用的 API 中,在配置阶段检查该行为,如果缺失则停止。
检查 man 手册,查看使用的函数是否是 POSIX 接口(在 man 手册的 "STANDARDS" 部分)。
不要假设 /bin/sh 就是 bash。确保传递给 system(3) 的命令行与 POSIX 兼容。
一个常见的 bashism 列表在这里。
检查头部是否以 POSIX 或 man 页推荐的方式包含。例如,sys/types.h 经常被遗忘,这对 Linux®来说不是那么大的问题,但对 FreeBSD 来说是一个问题。
要始终仔细检查 pkg-descr 和 pkg-plist。如果正在审核一个port并且可以达到更好的措辞,请这样做。
请注意任何法律问题!不要让我们非法分发软件!
USES 宏使得为 port 声明需求和设置变得容易。它们可以添加依赖关系,改变构建行为,为软件包添加元数据等等,所有这些都通过选择简单的预设值来实现。
本章的每个部分描述了 USES 的一个可能值,以及它可能的参数。参数会在值后面加上冒号 ( : ),多个参数之间用逗号分隔 ( , )。
示例 1. 使用多个值
示例 2. 添加一个参数
示例 3. 添加多个参数
示例 4. 混合所有内容
7z
可能的参数: (无), p7zip , partial
使用 7z(1) 提取而非 bsdtar(1),并设置 EXTRACT_SUFX=.7z 。使用 p7zip 选项会强制依赖于来自 archivers/p7zip 的 7z ,如果基本系统的工具无法提取文件。如果使用了 partial 选项, EXTRACT_SUFX 不会改变,这在主分发文件没有 .7z 扩展名时可以使用。
ada
可能的参数: (无), 6 , 12 , (run)
依赖于支持 Ada 的编译器,并相应地设置 CC 。默认使用 gcc6-aux 来自 ports。
autoreconf
可能的参数: (无), build
运行 autoreconf 。它封装了 aclocal 、 autoconf 、 autoheader 、 automake 、 autopoint 和 libtoolize 命令。每个命令应用于 ${AUTORECONF_WRKSRC}/configure.ac 或其旧名称 ${AUTORECONF_WRKSRC}/configure.in。如果 configure.ac 定义了具有自己 configure.ac 的子目录,使用 AC_CONFIG_SUBDIRS , autoreconf 将递归更新这些目录。 :build 参数仅在这些工具上添加构建时依赖关系,但不运行 autoreconf 。如果 WRKSRC 不包含 configure.ac 的路径,则 port 可以设置 AUTORECONF_WRKSRC 。
blaslapack
可能的参数:(无), atlas , netlib (默认), gotoblas , openblas
添加对 Blas / Lapack 库的依赖。
bdb
可能的参数:(无), 48 , 5 (默认), 6
添加对伯克利数据库库的依赖。默认为 databases/db5。当使用 :48 参数时也可以依赖 databases/db48,或者使用 :6 依赖 databases/db6。可以声明可接受的版本范围, :48+ 可以找到已安装的最高版本,并在未安装其他版本时回退到 4.8。 INVALID_BDB_VER 可用于指定与此 port 不兼容的版本。框架向 port 暴露以下变量:
BDB_LIB_NAME 伯克利数据库库的名称。例如,使用 databases/db5 时,它包含 db-5.3 。
BDB_LIB_CXX_NAME 伯克利 DBC++ 库的名称。例如,使用 databases/db5 时,它包含 db_cxx-5.3 。
BDB_INCLUDE_DIR Berkeley DB 包含目录的位置。例如,当使用 databases/db5 时,它将包含 ${LOCALBASE}/include/db5 。
BDB_LIB_DIR Berkeley DB 库目录的位置。例如,当使用 databases/db5 时,它包含 ${LOCALBASE}/lib 。
BDB_VER 检测到的 Berkeley DB 版本。例如,如果使用 USES=bdb:48+ 并安装了 Berkeley DB 5,它包含 5 。
bison
可能的参数:(无), build , run , both
默认使用 devel/bison。不带参数或使用 build 参数时,意味着 bison 是构建时依赖, run 意味着运行时依赖,而 both 则既是运行时依赖也是构建时依赖。
budgie
可能的参数:(无)
为 Budgie 桌面环境提供支持。 使用 USE_BUDGIE 来选择所需的组件。 有关更多信息,请参阅使用 Budgie。
cabal
可能的参数:(无), hpack , nodefault
设置用于使用 Cabal 构建 Haskell 软件的默认值和目标。添加对 Haskell 编译器 port ( lang/ghc) 的构建依赖。如果已在 BUILD_DEPENDS 变量中列出了其他版本的 GHC(例如,lang/ghc810),则将使用它。如果给出 hpack 参数,则添加对 devel/hs-hpack 的构建依赖,并在配置步骤中调用 hpack 以生成 .cabal 文件。如果给出 nodefault 参数,该框架将不尝试从 Hackage 获取主要发布文件。如果存在 USE_GITHUB 或 USE_GITLAB ,则隐含添加此参数。
该框架提供以下变量:
CABAL_REVISION 存储在 Hackage 上的 Haskell 软件包可能有修订版本。将此旋钮设置为整数以拉取已修订的软件包描述。
USE_CABAL 如果软件使用 Haskell 依赖项,请在此变量中列出它们。每个项目应该在 Hackage 上并且列在 packagename-0.1.2 形式中。依赖项也可以有修订版本,修订版本在 _ 符号之后指定。支持依赖项列表的自动生成,请参阅使用 cabal 构建 Haskell 应用程序。
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 根据 ${CABAL_EXECUTABLES} 选项将项目添加到 opt 中。
opt_CABAL_FLAGS 如果 opt 启用,则将值附加到 ${CABAL_FLAGS} 。否则,将 -value 附加以禁用标志。请注意,这种行为与普通的 CABAL_FLAGS 略有不同,因为它不接受以 - 开头的值。
CABAL_WRAPPER_SCRIPTS 一个包含 Haskell 程序的 ${CABAL_EXECUTABLES} 子集,这些程序将被包装成 shell 脚本,在运行程序之前设置 *_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 将:
在 extract 阶段期间将原始文件移动到 cabal.project.${PORTNAME} 。
将原始 cabal.project.${PORTNAME} 和生成的 cabal.project 在 patch 阶段之后合并到单个文件中。使用 append 可以在合并之前对原始文件进行修补。
cargo
可能的参数:(无)
使用 Cargo 进行配置、构建和测试。它可以用于 port 使用 Cargo 构建系统的 Rust 应用程序。有关更多信息,请参阅 使用 cargo 构建 Rust 应用程序。
charsetfix
可能的参数:(无)
阻止 port 安装 charset.alias。这必须仅由 converters/libiconv 安装。如果 charset.alias 未由 ${WRKSRC}/Makefile.in 安装, CHARSETFIX_MAKEFILEIN 可设置为相对于 WRKSRC 的路径。
cmake
可能的参数:(无), insource , noninja , run , testing
使用 CMake 配置port并生成一个构建系统。
默认情况下,执行无源代码构建,使源码 WRKSRC 中免受构建工件影响。使用 insource 参数,将执行源代码构建。这个参数应该是一种例外,仅在常规的无源代码构建无法工作时使用。
默认情况下,使用 Ninja (devel/ninja)进行构建。在某些情况下,这种方法不起作用。使用 noninja 参数,构建将使用常规 make 进行构建。该参数仅在 Ninja 构建不起作用时使用。
使用 run 参数时,除了构建依赖外,还注册了运行依赖。
使用 testing 参数时,将添加一个使用 CTest 的测试目标。在运行测试时,port 将被重新配置以进行测试和重新构建。
欲了解更多信息,请参阅使用 cmake 。
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 ;如果 port 需要支持 C++14 的编译器,请使用 C++14-lang ;如果 port 需要支持 C++11 的编译器,请使用 C++11-lang ;如果 port 需要带有 C++11 库的 g++ 编译器,请使用 gcc-C++11-lib ;如果 port 需要准备好支持 C++11 标准库的编译器,请使用 C++11-lib 。如果 port 需要理解 C++0X、C11 或嵌套函数的编译器,则应使用相应的参数。
使用 features 请求由默认编译器支持的功能列表。在包含 bsd.port.pre.mk 后,port 可以使用这些变量检查结果。
COMPILER_TYPE :系统上的默认编译器,可以是 gcc 或 clang
ALT_COMPILER_TYPE :系统上的备用编译器,可以是 gcc 或 clang。仅在基本系统中存在两个编译器时设置。
COMPILER_VERSION :默认编译器版本的前两位数字。
ALT_COMPILER_VERSION : 替代编译器版本的前两个数字(如果存在的话)。
CHOSEN_COMPILER_TYPE : 选择的编译器,可能是 gcc 或 clang
COMPILER_FEATURES : 默认编译器支持的功能。目前列出了 C++ 库。
cpe
可能的参数: (无)
在软件包清单中包含公共平台枚举(CPE)信息,作为一个 CPE 2.3 格式的字符串。查看 CPE 规范获取详细信息。要向 port 添加 CPE 信息,请按照以下步骤进行:
通过使用 NVD 的 CPE 搜索引擎或在官方 CPE 词典中搜索软件产品的官方 CPE 条目。永远不要虚构 CPE 数据。
将 cpe 添加到 USES 并将 make -V CPE_STR 的结果与 CPE 字典条目进行比较。一步一步进行,直到 make -V CPE_STR 正确为止。
如果产品名称(第二字段,默认为 PORTNAME )不正确,请定义 CPE_PRODUCT 。
如果供应商名称(第一个字段,默认为 CPE_PRODUCT )不正确,请定义 CPE_VENDOR 。
如果版本字段(第三字段,默认为 PORTVERSION )不正确,请定义 CPE_VERSION 。
如果更新字段(第四字段,默认为空)不正确,请定义 CPE_UPDATE 。
尽量从现有变量(如 PORTNAME 和 PORTVERSION )中汲取 CPE 名称的大部分内容。使用变量修饰符从这些变量中提取相关部分,而不是硬编码名称。
在提交任何更改 PORTNAME 或 PORTVERSION 或用于派生 CPE_STR 的任何其他变量之前,始终运行 make -V CPE_STR 并检查输出。
cran
可能的参数:(无), auto-plist , compiles
使用综合 R 存档网络。 指定 auto-plist 以自动生成 pkg-plist。 如果 port 有需要编译的代码,则指定 compiles 。
desktop-file-utils
可能的参数:(无)
使用 devel/desktop-file-utils 中的 update-desktop-database。 将运行额外的安装后步骤,而不会干扰已在 port Makefile 中的任何安装后步骤。 将在 plist 中添加一个包含 @desktop-file-utils 的行。 只有在 port 提供包含 MimeType 条目的 .desktop 文件时才使用此宏。
desthack
可能的参数:(无)
更改 GNU 配置的行为,以正确支持 DESTDIR ,以防原始软件不支持。
display
可能的参数:(无),ARGS
设置虚拟显示环境。如果环境变量 DISPLAY 未设置,则将 Xvfb 添加为构建依赖项,并将 CONFIGURE_ENV 扩展到当前运行的 Xvfb 实例的 port 号。ARGS 参数默认为 install ,控制启动和停止虚拟显示的阶段。
dos2unix
可能的参数:(无)
port 有带 DOS 格式换行符的文件需要转换。可以设置多个变量来控制要转换的文件。默认是转换所有文件,包括二进制文件。请参见简单自动替换的示例。
DOS2UNIX_REGEX :根据正则表达式匹配文件名。
DOS2UNIX_FILES :匹配字面文件名。
DOS2UNIX_GLOB :根据通配符模式匹配文件名。
DOS2UNIX_WRKSRC :开始转换的目录。默认为 ${WRKSRC} 。
drupal
可能的参数: 7 , module , theme
自动安装适用于 Drupal 主题或模块的port。与port期望的 Drupal 版本一起使用。例如, USES=drupal:7,module 表示此port创建一个 Drupal 7 模块。Drupal 7 主题可以用 USES=drupal:7,theme 指定。
ebur128
可能的参数: (无), build , lib , run , test
添加对 audio/ebur128 的依赖。通过在 make.conf 中使用 DEFAULT_VERSIONS ,可以透明地依赖于 rust 或 legacy 变体。例如,要使用旧版,请使用 DEFAULT_VERSIONS+=ebur128=legacy
当不使用任何参数时,行为与提供 lib 参数相同。其余的参数提供相应的依赖类别。
eigen
可能的参数:2, 3, 构建(默认),运行
添加依赖于 math/eigen。
elfctl
可能的参数:(无)
通过设置 ELF_FEATURES 更改 ELF 二进制文件的特征控制注释。
示例 5。使用 elfctl
featurelist 的格式在 elfctl(1) 中描述。文件路径相对于 ${BUILD_WRKSRC}。
erlang
可能的参数: (无), enc , rebar , rebar3
添加了对 lang/erlang 的构建和运行时依赖。根据参数不同,可能会增加额外的构建依赖。 enc 添加了对 devel/erlang-native-compiler 的依赖, rebar 添加了对 devel/rebar 的依赖, rebar3 添加了对 devel/rebar3 的依赖。
此外,以下变量对 port 可用:
ERL_APP_NAME :Erlang 应用程序名称,安装在 Erlang 的 lib 目录中(减去版本)
ERL_APP_ROOT :此 Erlang 应用程序的根目录
REBAR_CMD :"rebar"命令的路径
REBAR3_CMD :到 "rebar3" 命令的路径
REBAR_PROFILE :Rebar 配置文件
REBAR_TARGETS :Rebar 目标列表(通常是编译,也可能是生成可执行文件)
ERL_BUILD_NAME :rebar3 构建名称
ERL_BUILD_DEPS :按类别/端口名称格式列出的 BUILD_DEPENDS 列表
ERL_RUN_DEPS :按类别/端口名称格式列出的 RUN_DEPENDS 列表
ERL_DOCS :文档文件和目录列表
fakeroot
可能的参数:(无)
更改一些构建系统的默认行为,以允许以用户身份安装。有关 fakeroot 的更多信息,请参见 https://wiki.debian.org/FakeRoot。
fam
可能的参数:(无), fam , gamin
使用文件更改监视器作为库依赖项,可以是 devel/fam 或 devel/gamin。最终用户可以设置 WITH_FAM_SYSTEM 以指定他们的首选项。
firebird
可能的参数:(无), 25
添加到 Firebird 数据库客户端库的依赖项。
fonts
可能的参数:(无), fc , fontsdir (默认), none
fortran
可能的参数: gcc (默认)
使用 GNU Fortran 编译器。
fuse
可能的参数: 2 (默认), 3
根据 FreeBSD 的版本,port 将取决于 FUSE 库并处理内核模块的依赖项。
gem
可能的参数:(无), noautoplist
处理使用 RubyGems 构建。如果使用 noautoplist ,则不会自动生成包装清单。
这意味着 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 表示需要port的 -nox11 版本。 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
可能的参数: (无)
使用 devel/gmake 作为构建时依赖,并设置环境以使用 gmake 作为构建的默认 make 。
gnome
可能的参数:(无)
提供一种依赖于 GNOME 组件的简单方式。组件应列在 USE_GNOME 中。可用的组件包括:
atk
atkmm
cairo
cairomm
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
默认的依赖性是构建和运行时的,可以使用 :build 或 :run 进行更改。例如:
查看有关使用 GNOME 的更多信息。
go
可能的参数: (none), 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 应用程序模块的名称,由 module 指令在 go.mod 中指定。在大多数情况下,这是ports使用 Go 模块的唯一必需变量。
GO_PKGNAME 构建时在 GOPATH 模式下的 Go 包名称。这是在 ${GOPATH}/src 中创建的目录。如果未显式设置且存在 GH_SUBDIR 或 GL_SUBDIR ,将从中推断出 GO_PKGNAME 。在模块感知模式下构建时不需要它。
GO_TARGET 要构建的软件包。默认值为 ${GO_PKGNAME} 。 GO_TARGET 也可以是形如 package:path 的元组,其中路径可以是简单的文件名,也可以是以 ${PREFIX} 开头的完整路径。
GO_TESTTARGET 要测试的软件包。默认值为 ./… (当前包及所有子包)。
CGO_CFLAGS 附加 CFLAGS 值,通过 go 传递给 C 编译器。
CGO_LDFLAGS 附加 LDFLAGS 值,通过 go 传递给 C 编译器。
GO_BUILDFLAGS 附加构建参数,传递给 go build 。
GO_TESTFLAGS 要传递给 go test 的附加构建参数。
查看构建 Go 应用程序以获取使用示例。
gperf
可能的参数:(无)
如果基础系统中不存在 gperf ,则在构建时增加对 devel/gperf 的依赖。
grantlee
可能的参数: 5 , selfbuild
处理对 Grantlee 的依赖。指定 5 来依赖基于 Qt5 的版本 devel/grantlee5。 selfbuild 在 devel/grantlee5 内部用于获取它们的版本号。
groff
可能的参数: build , run , both
如果基础系统中不存在,注册对 textproc/groff 的依赖。
gssapi
可能的参数:(无), base (默认), heimdal , mit , flags , bootstrap
为 GSS-API 的使用者处理所需的依赖关系。仅提供提供 Kerberos 机制的库。默认情况下,或设置为 base ,使用基本系统中的 GSS-API 库。也可以设置为 heimdal 使用 security/heimdal,或 mit 使用 security/krb5。
当本地 Kerberos 安装不在 LOCALBASE 时,请设置 HEIMDAL_HOME (对于 heimdal )或 KRB5_HOME (对于 krb5 )为 Kerberos 安装的位置。
这些变量被导出供 ports 使用:
GSSAPIBASEDIR
GSSAPICPPFLAGS
GSSAPIINCDIR
GSSAPILDFLAGS
GSSAPILIBDIR
GSSAPILIBS
GSSAPI_CONFIGURE_ARGS
可以将 flags 选项与 base 、 heimdal 或 mit 一起使用,以自动将 GSSAPICPPFLAGS 、 GSSAPILDFLAGS 和 GSSAPILIBS 分别添加到 CFLAGS 、 LDFLAGS 和 LDADD 。例如,使用 base,flags 。
bootstrap 选项是一个特殊前缀,仅供 security/krb5 和 security/heimdal 使用。例如,使用 bootstrap,mit 。
示例 6. 典型用法
gstreamer
可能的参数:(无)
提供一种依赖于 GStreamer 组件的简单方式。组件应列在 USE_GSTREAMER 中。可用的组件包括:
a52dec
aalib
amrnb
amrwbdec
aom
assrender
bad
bs2b
cairo
cdio
cdparanoia
chromaprint
curl
dash
dtls
dts
dv
dvd
dvdread
editing-services
faac
faad
flac
flite
gdkpixbuf
gl
gme
gnonlin
good
gsm
gtk4
gtk
hal
hls
jack
jpeg
kate
kms
ladspa
lame
libav
libcaca
libde265
libmms
libvisual
lv2
mm
modplug
mpeg2dec
mpeg2enc
mpg123
mplex
musepack
neon
ogg
opencv
openexr
openh264
openjpeg
openmpt
opus
pango
png
pulse
qt
resindvd
rsvg
rtmp
shout2
sidplay
smoothstreaming
sndfile
sndio
soundtouch
soup
spandsp
speex
srtp
taglib
theora
ttml
twolame
ugly
v4l2
vorbis
vpx
vulkan
wavpack
webp
webrtcdsp
x264
x265
x
ximagesrc
zbar
guile
可能的参数:(无), X.Y , flavors , build , run , alias , conflicts
增加对 Guile 的依赖。默认情况下,这是对适当 libguile*.so 的库依赖,除非被 build 和/或 run 选项覆盖。 alias 选项适当地配置 BINARY_ALIAS (请参阅使用 BINARY_ALIAS )。
默认版本由通常 DEFAULT_VERSIONS 机制设置;如果默认版本不是所列版本之一,则使用最新可用的所列版本。
使用 Guile 的应用程序通常仅构建为单个 Guile 版本。但是,扩展或库模块应使用 flavors 选项以与多个 flavors 构建。
获取更多信息,请参阅使用 Guile。
horde
可能的参数:(无)
添加构建时间和运行时依赖项至 devel/pear-channel-horde。其他 Horde 依赖项可以通过 USE_HORDE_BUILD 和 USE_HORDE_RUN 添加。有关更多信息,请参阅 Horde 模块。
iconv
可能的参数:(无), lib , build , patch , translit , wchar_t
使用 iconv 函数,要么来自port转换器/libiconv 作为构建时和运行时依赖,要么来自基本系统。默认情况下,没有参数或使用 lib 参数,意味着使用构建时和运行时依赖的 iconv 。 build 意味着构建时依赖, patch 意味着补丁时间依赖。如果port 使用 WCHAR_T 或 //TRANSLIT 的 iconv 扩展,添加相关参数以使用正确的 iconv。有关更多信息,请参阅 使用 iconv 。
imake
可能的参数:(无), env , notall , noman
将 devel/imake 添加为构建时依赖项,并在 configure 阶段运行 xmkmf -a 。如果给定了 env 参数,则不设置 configure 目标。如果 -a 标志对port造成问题,请添加 notall 参数。如果 xmkmf 未生成 install.man 目标,请添加 noman 参数。
kde
可能的参数: 5
添加对 KDE 组件的依赖。有关更多信息,请参阅使用 KDE。
kmod
可能的参数:(无), debug
填充内核模块ports的样板,目前:
将 kld 添加到 CATEGORIES 。
設置 SSP_UNSAFE 。
如果在 SRC_BASE 中找不到內核源碼,則設置 IGNORE 。
默認將 KMODDIR 定義為 /boot/modules,將其添加到 PLIST_SUB 和 MAKE_ENV 中,並在安裝時創建它。 如果 KMODDIR 設置為 /boot/kernel,則將其重寫為 /boot/modules。 這可以防止在升級內核過程中由於 /boot/kernel 被重命名為 /boot/kernel.old 而破壞包。
使用 @kld 处理内核模块在安装和卸载时的交叉引用。
如果提供了 debug 参数,port 可以将模块的调试版本安装到 KERN_DEBUGDIR/KMODDIR 中。默认情况下, KERN_DEBUGDIR 从 DEBUGDIR 复制并设置为 /usr/lib/debug。框架将负责创建和删除任何所需的目录。
ldap
可能的参数:(无),,客户端,服务器
注册对 net/openldap 的依赖。如果设置了特定的 (不使用点符号),则使用该版本。否则,尝试查找当前安装的版本。如有必要,将回退到 bsd.default-versions.mk 中找到的默认版本。 client 指定对客户端库的运行时依赖。这也是默认设置。 server 指定对服务器的运行时依赖。
可以由 port 访问以下变量:
IGNORE_WITH_OPENLDAP
如果 ports 不支持一个或多个版本的 OpenLDAP,则可以定义此变量。
WITH_OPENLDAP_VER
用户定义的变量以设置 OpenLDAP 版本。
OPENLDAP_VER
检测到的 OpenLDAP 版本。
lha
可能的参数:(无)
将 EXTRACT_SUFX 设置为 .lzh
libarchive
可能的参数:(无)
注册对 archivers/libarchive 的依赖。任何依赖于 libarchive 的 ports 都必须包含 USES=libarchive 。
libedit
可能的参数:(无)
注册对 devel/libedit 的依赖。任何依赖于 libedit 的 ports 必须包含 USES=libedit 。
libtool
可能的参数:(无), keepla , build
补丁 libtool 脚本。这必须添加到所有使用 libtool 的 ports 中。可以使用 keepla 参数保留 .la 文件。一些 ports 不包含自己的 libtool 副本,需要在构建时依赖 devel/libtool,请使用 :build 参数添加此类依赖关系。
linux
可能的参数: c6 , c7
Ports Linux 兼容框架。指定 c6 以依赖于 CentOS 6 包。指定 c7 以依赖于 CentOS 7 包。可用的软件包有:
allegro
alsa-plugins-oss
alsa-plugins-pulseaudio
alsalib
atk
avahi-libs
base
cairo
cups-libs
curl
cyrus-sasl2
dbusglib
dbuslibs
devtools
dri
expat
flac
fontconfig
gdkpixbuf2
gnutls
graphite2
gtk2
harfbuzz
jasper
jbigkit
jpeg
libasyncns
libaudiofile
libelf
libgcrypt
libgfortran
libgpg-error
libmng
libogg
libpciaccess
libsndfile
libsoup
libssh2
libtasn1
libthai
libtheora
libv4l
libvorbis
libxml2
mikmod
naslibs
ncurses-base
nspr
nss
openal
openal-soft
openldap
openmotif
openssl
pango
pixman
png
pulseaudio-libs
qt
qt-x11
qtwebkit
scimlibs
sdl12
sdlimage
sdlmixer
sqlite3
tcl85
tcp_wrappers-libs
tiff
tk85
ucl
xorglibs
llvm
可能的参数:(无), XY ,最小值= XY ,最大值= XY ,构建,运行,库
添加对 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 选项构建多个 flavors。
更多信息请参阅 Lua 使用。
luajit
可能的参数:(无), X
添加对 luajit 运行时的依赖。可以使用特定版本 X。可能的版本是 luajit , luajit-devel , luajit-openresty
在包含 bsd.port.options.mk 或 bsd.port.pre.mk 之后,port可以检查这些变量:
LUAJIT_VER 所选的 luajit 版本
LUAJIT_INCDIR 查找 luajit 的头文件路径
LUAJIT_LUAVER 选择的 luajit 规范版本(luajit 为 2.0,否则为 2.1)
查看更多信息,请参阅 Lua 使用。
lxqt
可能的参数:(无)
处理 LXQt 桌面环境的依赖关系。使用 USE_LXQT 选择所需的组件port。更多信息,请参阅使用 LXQt。
magick
可能的参数:(无), X , build , nox11 , run , test
添加对 ImageMagick 的库依赖。可以使用特定版本 X。可能的版本为 6 和 7 (默认)。 nox11 表示需要 port 的 -nox11 版本。 build 、 run 和 test 添加到 ImageMagick 的构建、运行时和测试依赖。
makeinfo
可能的参数:(无)
如果基础系统中不存在 makeinfo ,则添加到构建时依赖。
makeself
可能的参数:(无)
表示分发文件为 makeself 存档,并设置适当的依赖关系。
mate
可能的参数:(无)
提供一种依赖于 MATE 组件的简单方法。组件应列在 USE_MATE 中。可用的组件是:
autogen
caja
common
controlcenter
desktop
dialogs
docutils
icontheme
intlhack
intltool
libmatekbd
libmateweather
marco
menus
notificationdaemon
panel
pluma
polkit
session
settingsdaemon
默认依赖是构建和运行时的,可以通过 :build 或 :run 更改。例如:
meson
可能的参数:(无)
支持基于 Meson 的项目。有关更多信息,请参见使用 meson 。
metaport
可能的参数:(无)
设置以下变量,以便更轻松地创建元端口: MASTER_SITES , DISTFILES , EXTRACT_ONLY , NO_BUILD , NO_INSTALL , NO_MTREE , NO_ARCH 。
minizip
可能的参数:(无), ng
添加对 archivers/minizip 或 archivers/minizip-ng 的库依赖。
mysql
可能的参数:(无), version , client (默认), server , embedded
如果没有给出版本号,则尝试查找当前安装的版本。回退到默认版本,MySQL-5.6。可能的版本是 55 , 55m , 55p , 56 , 56p , 56w , 57 , 57p , 80 , 100m , 101m 和 102m 。 m 和 p 后缀用于 MySQL 的 MariaDB 和 Percona 变体。 server 和 embedded 添加了对 MySQL 服务器的构建和运行时依赖。使用 server 或 embedded 时,还添加 client 以添加对 libmysqlclient.so 的依赖。port可以设置 IGNORE_WITH_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
可能的参数: (无)
使用 x11-toolkits/open-motif 作为库依赖。最终用户可以在 make.conf 中设置 WANT_LESSTIF 使用 x11-toolkits/lesstif 作为依赖,而不是 x11-toolkits/open-motif。类似地,设置 WANT_OPEN_MOTIF_DEVEL 在 make.conf 中将添加依赖 x11-toolkits/open-motif-devel。
ncurses
可能的参数: (无), base , port
使用 ncurses,并设置一些有用的变量。
nextcloud
可能的参数:(无)
通过在运行时依赖于 www/nextcloud 来增加对 Nextcloud 应用程序的支持。
ninja
可能的参数:(无), build , make (默认), run
如果指定了 build 或 run 参数,则分别添加构建或运行时依赖于 devel/ninja。如果提供了 make 或没有参数,则使用 ninja 来构建port而不是 make。 make 意味着 build 。如果变量 NINJA_DEFAULT 设置为 samurai ,则依赖项设置为 devel/samurai。
nodejs
可能的参数:(无), build , run , current , lts , 10 , 14 , 16 , 17 。
使用 nodejs。 在 www/node* 上添加依赖项。如果指定了受支持的版本,则还必须指定 run 和/或 build 。
objc
可能的参数:(无)
如果基础系统不支持,添加 Objective C 依赖项(编译器,运行时库)。
octave
可能的参数:(无), env
使用 math/octave。 env 仅加载一个 OCTAVE_VERSION 环境变量。
openal
可能的参数: al , soft (默认), si , alut
使用 OpenAL 。 可以指定后端,软件实现为默认设置。 用户可以使用 WANT_OPENAL 指定首选后端。 此旋钮的有效值为 soft (默认)和 si 。
pathfix
可能的参数:(无)
查找 Makefile.in 和 configure 在 PATHFIX_WRKSRC (默认为 WRKSRC ) 中,并修复常见路径,以确保它们符合 FreeBSD 层次结构。 例如,它自动修复 pkgconfig’s .pc files to ${PREFIX}/libdata/pkgconfig. If the port uses USES=autoreconf , Makefile.am will be added to PATHFIX_MAKEFILEIN`的安装目录。
如果port USES=cmake ,它会查找 PATHFIX_WRKSRC 中的 CMakeLists.txt。如有需要,可以使用 PATHFIX_CMAKELISTSTXT 来更改默认文件名。
pear
可能的参数: env
添加对 devel/pear 的依赖。它将为使用 PHP 扩展和应用程序存储库的软件设置默认行为。仅仅使用 env 参数设置 PEAR 环境变量。有关更多信息,请参见 PEAR 模块。
perl5
可能的参数:(无)
依赖于 Perl。配置使用 USE_PERL5 完成。
USE_PERL5 可以包含使用 Perl 的阶段,可以是 extract , patch , build , run 或 test 。
USE_PERL5 在需要 Makefile.PL、Build.PL 或 Module::Build::Tiny 的 Build.PL 的时候,也可以包含 configure 、 modbuild 或 modbuildtiny 。
USE_PERL5 默认为 build run 。在使用 configure 、 modbuild 或 modbuildtiny 时,意味着 build 和 run 。
查看有关更多信息,请参阅《使用 Perl》。
pgsql
可能的参数:(无), X.Y , X.Y+ , X.Y- , X.Y-Z.A
提供对 PostgreSQL 的支持。Port 维护者可以设置所需的版本。可以指定最小和最大版本或范围;例如, 9.0- , 8.4+ , 8.4-9.2.
默认情况下,添加的依赖将是客户端,但如果 port 需要额外的组件,则可以使用 WANT_PGSQL=component[:target] ;例如, WANT_PGSQL=server:configure pltcl plperl 。可用的组件包括:
client
contrib
docs
pgtcl
plperl
plpython
pltcl
server
php
可能的参数:(无), phpize , ext , zend , build , cli , cgi , mod , web , embed , pecl , flavors , noflavors
支持 PHP。添加对默认 PHP 版本 lang/php81 的运行时依赖。
phpize
用于构建 PHP 扩展。启用 flavors。
ext
用于构建、安装和注册 PHP 扩展。启用 flavors。
zend
用于构建、安装和注册 Zend 扩展。启用 flavors。
build
将 PHP 也设置为构建时依赖项。
cli
需要 PHP 的 CLI 版本。
cgi
需要 PHP 的 CGI 版本。
mod
需要 PHP 的 Apache 模块。
web
需要 Apache 模块或 PHP 的 CGI 版本。
embed
需要 PHP 的嵌入式库版本。
pecl
为从 PECL 存储库获取 PHP 扩展提供默认值。启用flavors。
flavors
启用自动生成 PHP flavors。将为除了 IGNORE_WITH_PHP 中已有的所有 PHP 版本生成 Flavors 。
noflavors
禁用自动生成 PHP flavors。仅适用于 PHP 自身提供的扩展。
变量用于指定所需的 PHP 模块以及支持的 PHP 版本。
USE_PHP
在运行时所需的 PHP 扩展列表。将 :build 添加到扩展名中以添加构建时依赖项。例如: pcre xml:build gettext
IGNORE_WITH_PHP
port与给定版本的 PHP 不兼容。有关可能的值,请查看 Mk/Uses/php.mk 中 _ALL_PHP_VERSIONS 的内容。
使用 :ext 或 :zend 构建 PHP 或 Zend 扩展时,可以设置这些变量:
PHP_MODNAME
PHP 或 Zend 扩展的名称。默认值是 ${PORTNAME} 。
PHP_HEADER_DIRS
从中安装头文件的子目录列表。框架将始终安装与扩展位于同一目录中的头文件。
PHP_MOD_PRIO
加载扩展的优先级。它是 00 和 99 之间的一个数字。
对于不依赖任何扩展的扩展,优先级会自动设置为 20 ,对于依赖另一个扩展的扩展,优先级会自动设置为 30 。有些扩展可能需要在所有其他扩展之前加载,例如 www/php56-opcache。有些可能需要在具有 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 模块一起使用。
pkgconfig
可能的参数: (无), build (默认), run , both
使用 devel/pkgconf。没有参数或使用 build 参数,意味着 pkg-config 作为构建时依赖。 run 意味着运行时依赖, both 意味着同时是运行时和构建时依赖。
pure
可能的参数: (无), ffi
使用 lang/pure。主要用于构建相关的纯 ports。使用 ffi 参数时,意味着 devel/pure-ffi 作为运行时依赖。
pyqt
可能的参数: (无), 4 , 5
使用 PyQt。如果 port 是 PyQt 本身的一部分,请设置 PYQT_DIST 。使用 USE_PYQT 选择 port 需要的组件。可用的组件有:
core
dbus
dbussupport
demo
designer
designerplugin
doc
gui
multimedia
network
opengl
qscintilla2
sip
sql
svg
test
webkit
xml
xmlpatterns
这些组件只能在 PyQT4 中使用:
assistant
declarative
help
phonon
script
scripttools
这些组件只能在 PyQT5 中使用:
multimediawidgets
printsupport
qml
serialport
webkitwidgets
widgets
每个组件的默认依赖是构建时和运行时的,要只选择构建或运行时,请在组件名称后添加 _build 或 _run 。例如:
pytest
可能的参数:(无),4
引入了新的依赖关系 devel/pytest。它定义了一个 do-test 目标,将正确运行测试。使用参数依赖于特定的 devel/pytest 版本。对于ports使用 devel/pytest 的人考虑使用这个而不是特定的 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 。有关详细信息,请参阅使用 Python。
当需要框架导出的变量但不需要依赖 Python 时,可以使用 USES=python:env 。这可能发生在使用 USES=shebangfix 时,目标只是修复 shebangs 而不添加对 Python 的依赖。
qmail
可能的参数:(无), build , run , both , vars
使用 mail/qmail。使用 build 参数时,意味着 qmail 是一个构建时依赖。 run 意味着是运行时依赖。不使用参数或使用 both 参数意味着同时是运行时和构建时依赖。 vars 只会设置 QMAIL 变量供 port 使用。
qmake
可能的参数:(无), norecursive , outsource , no_env , no_configure
使用 QMake 进行配置。有关详细信息,请参阅 使用 qmake 。
qt
可能的参数: 5 , 6 , no_env
添加依赖于 Qt 组件。 no_env 直接传递给 USES= qmake 。有关详细信息,请参阅 使用 Qt。
qt-dist
可能的参数:(无)或 5 和(无)或 6 和(无)或其中之一 3d , 5compat , base , charts , connectivity , datavis3d , declarative , doc languageserver , gamepad , graphicaleffects , imageformats , locat ion , lottie , multimedia , networkauth , positioning , quick3d , quickcontrols2 , quickcontrols , quicktimeline , remoteobjects , script , scxml , sensors , serialbus , serialport , shadertools , speech , svg , tools , translations , virtualkeyboard , wayland , webchannel , webengine , webglplugin , websockets , webview , x11extras , xmlpatterns 。
提供构建 Qt 5 和 Qt 6 组件的支持。 它会处理配置适当环境的设置port构建。
示例 7. 构建 Qt 5 组件
port是 Qt 5 的 networkauth 组件,是 networkauth 分发文件的一部分。
示例 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,则添加一个 devel/readline 的依赖项。
ruby
可能的参数:(无), build , extconf , run , setup
提供对与 Ruby 相关的 ports 的支持。 (none) 没有参数会在运行时依赖于 lang/ruby。 build 在构建时会依赖于 lang/ruby。 extconf 表示 port 使用 extconf.rb 进行配置。 run 在运行时会依赖于 lang/ruby,这也是默认设置。 setup 表示 port 使用 setup.rb 进行配置和构建。
用户可以定义以下变量:
RUBY_VER 表示 ruby 的替代短版本,格式为 `x.y'。
RUBY_DEFAULT_VER 设置为 (例如) 2.7 以使用 ruby27 作为默认版本。
RUBY_ARCH 设置架构名称 (例如 i386-freebsd7)。
导出以下变量供 port 使用:
RUBY 设为 Ruby 的完整路径。如果设置,以下变量的值将自动从 Ruby 可执行文件中获取: RUBY_ARCH , RUBY_ARCHLIBDIR , RUBY_LIBDIR , RUBY_SITEARCHLIBDIR , RUBY_SITELIBDIR , RUBY_VER and 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 的依赖。被导出的变量是:
SAMBAPORT 默认 Samba port 的来源。
SAMBAINCLUDES Samba 头文件的位置。
SAMBALIBS Samba 共享库所在的目录。
scons
可能的参数:(无)
为 devel/scons 的使用提供支持。有关更多信息,请参阅 使用 scons 。
shared-mime-info
可能的参数:(无)
使用 misc/shared-mime-info 中的 update-mime-database。这将自动添加一个 post-install 步骤,使 port 本身仍然可以根据需要指定自己的 post-install 步骤。它还会在 plist 中添加一个 @shared-mime-info 条目。
shebangfix
可能的参数:(无)
许多软件在脚本解释器的位置上使用不正确,最明显的是 /usr/bin/perl 和 /bin/bash。shebangfix 宏修复列在 SHEBANG_REGEX 、 SHEBANG_GLOB 或 SHEBANG_FILES 中的脚本的 shebang 行。
SHEBANG_REGEX
包含一个扩展正则表达式,并与 find(1) 的 -iregex 参数一起使用。参见 USES=shebangfix 与 SHEBANG_REGEX 。
SHEBANG_GLOB
包含与 find(1) 的 -name 参数一起使用的模式列表。参见 USES=shebangfix 与 SHEBANG_GLOB 。
SHEBANG_FILES
包含文件列表或 sh(1)通配符。 shebangfix 宏从 ${WRKSRC} 执行,因此 SHEBANG_FILES 可以包含相对于 ${WRKSRC} 的路径。如果 ${WRKSRC} 外的文件需要打补丁,它也可以处理绝对路径。参见 USES=shebangfix 与 SHEBANG_FILES 。
目前默认支持 Bash、Java、Ksh、Lua、Perl、PHP、Python、Ruby、Tcl 和 Tk。
有三个配置变量:
SHEBANG_LANG
受支持的解释器列表。
_interp__CMD
FreeBSD 上命令解释器的路径。默认值为 ${LOCALBASE}/bin/interp 。
_interp__OLD_CMD
解释器的错误调用列表。这些通常是过时的路径,或者是在其他操作系统上使用的在 FreeBSD 上不正确的路径。它们将在 _interp__CMD 中被正确的路径替换。
这些将永远是 interp__OLD_CMD 的一部分 "/usr/bin/env _interp " /bin/interp /usr/bin/interp /usr/local/bin/interp 。
修复 shebang 是在 patch 阶段完成的。如果在 build 阶段创建带有不正确 shebang 的脚本,则必须修补构建过程(例如,配置脚本或 Makefiles)或给予正确的路径(例如 CONFIGURE_ENV 、 CONFIGURE_ARGS 、 MAKE_ENV 、 或 MAKE_ARGS )以生成正确的 shebang。 在 _interp__CMD 中,支持的解释器的正确路径可用。
示例 10. 添加另一个解释器到 USES=shebangfix
要添加另一个解释器,请设置 SHEBANG_LANG 。例如:
示例 11. 在添加解释器到 USES=shebangfix 时指定所有路径
如果它尚未定义,并且对于 _interpOLD_CMD 和 _interp 没有默认值,Ksh 条目可以定义为:
示例 12. 为解释器添加一个奇怪的位置
一些软件使用奇怪的位置来放置解释器。例如,一个应用程序可能期望 Python 位于 /opt/bin/python2.7。可以在 port Makefile 中声明要替换的奇怪路径:
示例 13. USES=shebangfix 与 SHEBANG_REGEX
为了修复所有以 .pl、.sh 或 .cgi 结尾的文件,请执行:
示例 14。 USES=shebangfix 和 SHEBANG_GLOB
修复所有以 .pl 或 .sh 结尾的文件 ${WRKSRC} ,请执行:
示例 15. USES=shebangfix 和 SHEBANG_FILES
要修复 ${WRKSRC} 中的文件 script/foobar.pl 和 script/*.sh,请执行:
sqlite
可能的参数:(无), 2 , 3
添加对 SQLite 的依赖。默认使用的版本是 3,但也可以使用 :2 修改器来使用版本 2。
ssl
可能的参数:(无), build , run
提供对 OpenSSL 的支持。可以使用 build 或 run 来指定仅限构建或运行时的依赖关系。这些变量供port使用,也添加到 MAKE_ENV 中:
OPENSSLBASE
OpenSSL 安装基础路径。
OPENSSLDIR
OpenSSL 配置文件路径。
OPENSSLLIB
OpenSSL 库的路径。
OPENSSLINC
OpenSSL 包含文件的路径。
OPENSSLRPATH
如果定义了,链接器需要使用的 OpenSSL 库的路径。
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
可能的参数: 版本, wrapper , build , run , tea
添加对 Tcl 的依赖。可以使用版本号进行特定版本的请求。版本号可以为空,一个或多个精确的版本号(当前 84 , 85 或 86 ),或一个最低版本号(当前 84+ , 85+ 或 86+ )。若只需请求一个非特定版本的 Wrapper,请使用 wrapper 。可以使用 build 或 run 指定构建时或运行时的依赖项。要使用 Tcl 扩展架构构建 port,请使用 tea 。在包含 bsd.port.pre.mk 后,port 可以使用这些变量检查结果:
TCL_VER :所选的 Tcl 主版本.次版本号
TCLSH :Tcl 解释器的完整路径
TCL_LIBDIR :Tcl 库的路径
TCL_INCLUDEDIR :Tcl C 头文件的路径
TK_VER :选择的 Tk 主版本号.次版本号
WISH :Tk 解释器的完整路径
TK_LIBDIR :Tk 库的路径
TK_INCLUDEDIR :Tk C 头文件的路径
terminfo
可能的参数:(无)
将 @terminfo 添加到 plist 中。在 ${PREFIX}/share/misc 中安装 *.terminfo 文件时使用。
tex
可能的参数:(无)
提供对 tex 的支持。加载所有与 TEX 相关的默认变量 ports,并且不增加任何 ports 的依赖。
变量用于指定所需的 TEX 模块。
USE_TEX 运行时所需的 TEX 扩展列表。添加 :build 到扩展名以添加构建时依赖项,添加 :run 以添加运行时依赖项,添加 :test 以添加测试时依赖项,添加 :extract 以添加提取时依赖项。例如: base texmf:build source:run
目前可能的参数如下:
base
texmf
source
docs
web2c
kpathsea
ptexenc
basic
tlmgr
texlua
texluajit
synctex
xpdfopen
dvipsk
dvipdfmx
xdvik
gbklatex
formats
tex
latex
pdftex
jadetex
luatex
ptex
xetex
xmltex
texhash
updmap
fmtutil
tk
与 tcl 的参数相同
当同时使用 Tcl 和 Tk 时的小包装。当使用 Tcl 时,返回的变量与之相同。
uidfix
可能的参数:(无)
更改构建系统的某些默认行为(主要是变量),以允许将此作为普通用户安装。在使用 USES=fakeroot 或打补丁之前,请在 port 中尝试这种方法。
uniquefiles
可能的参数:(无), dirs
通过添加前缀或后缀使文件或目录 'unique'。如果使用 dirs 参数,则基于 UNIQUE_PREFIX 对标准目录 DOCSDIR 、 EXAMPLESDIR 、 DATADIR 、 WWWDIR 、 ETCDIR 进行前缀添加(仅前缀)。这些变量适用于 ports:
UNIQUE_PREFIX :要用于目录和文件的前缀。默认: ${PKGNAMEPREFIX} 。
UNIQUE_PREFIX_FILES :需要添加前缀的文件列表。默认:空。
UNIQUE_SUFFIX :用于文件的后缀。默认: ${PKGNAMESUFFIX} 。
UNIQUE_SUFFIX_FILES :需要添加后缀的文件列表。默认:空。
vala
可能的参数: build , lib , no_depend
添加构建或库依赖于 lang/vala。 no_depend 参数保留给 lang/vala 本身。
varnish
可能的参数: 4 (默认), 6 , 7
处理对 Varnish Cache 的依赖。添加对 www/varnish*的依赖。
webplugin
可能的参数: (无), ARGS
自动为支持 webplugin 框架的每个应用程序创建和删除符号链接。 ARGS 可以是以下之一:
gecko :支持基于 Gecko 的插件
native :支持 Gecko、Opera 和 WebKit-GTK 插件
linux :支持 Linux 插件
all (默认,隐式):支持所有插件类型
(个体条目): 仅支持所列的浏览器
这些变量可以调整:
WEBPLUGIN_FILES :无默认值,必须手动设置。安装插件文件。
WEBPLUGIN_DIR :安装插件文件的目录,默认为 PREFIX/lib/browser_plugins/WEBPLUGIN_NAME。如果 port 将插件文件安装在默认目录之外,请设置此项以防止损坏的符号链接。
WEBPLUGIN_NAME :安装插件文件的最终目录,默认为 PKGBASE 。
xfce
可能的参数:(无), gtk2
提供对与 Xfce 相关的 ports 的支持。详见使用 Xfce 以获取详情。
gtk2 参数指定 port 需要 GTK2 支持。它添加了一些核心组件提供的额外功能,例如 x11/libxfce4menu 和 x11-wm/xfce4-panel。
xorg
可能的参数:(无)
提供了依赖于 X.org 组件的简便方法。这些组件应该在 USE_XORG 中列出。可用的组件为:
表 1. 可用的 X.Org 组件
dmx
DMX 扩展库
fontenc
fontenc 库
fontutil
在目录中创建 X 字体文件的索引
ice
X11 的 Inter Client Exchange 库
libfs
FS 库
pciaccess
通用 PCI 访问库
pixman
低级像素操作库
sm
X11 会话管理库
x11
X11 库
xau
X11 的认证协议库
xaw
X Athena 小部件库
xaw6
X 雅典娜小部件库
xaw7
X 雅典娜小部件库
xbitmaps
X.Org 位图数据
xcb
X 协议 C 语言绑定 (XCB) 库
xcomposite
X Composite 扩展库
xcursor
X 客户端光标加载库
xdamage
X 损坏扩展库
xdmcp
X 显示管理器控制协议库
xext
X11 扩展库
xfixes
X 修复扩展库
xfont
X 字体库
xfont2
X 字体库
xft
X 应用程序的客户端字体 API
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 镜像库
xpresent
X 现在扩展库
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 扩展
xorg-cat
可能的参数: app , data , doc , driver , font , lib , proto , util , xserver 和(无)或一个关闭 autotools (默认), meson
提供支持构建 Xorg 组件。它负责设置所需的常见依赖项和适当的配置环境。此功能仅用于 Xorg 组件。
类别必须与上游类别匹配。
第二个参数是要使用的构建系统。autotools 是默认选项,但也支持 meson。
zip
可能的参数: (无), infozip
表示分发文件使用 ZIP 压缩算法。对于使用 InfoZip 算法的文件,必须传递 infozip 参数以设置适当的依赖项。
如果仍然不正确,请查看 Mk/Uses/cpe.mk 以获取更多详细信息,或联系Ports安全团队 。
添加到需要注册字体的工具的运行时依赖项。根据参数添加 ${FONTSDIR} 行、 ${FONTSDIR} 行,如果参数为 none 则不添加行到 plist。 FONTSDIR 默认为 ${PREFIX}/share/fonts/${FONTNAME}, FONTNAME 为 ${PORTNAME} 。添加 FONTSDIR 到 PLIST_SUB 和 SUB_LIST 。
这里是 sys/param.h 中定义的 __FreeBSD_version 值的方便列表:
表 53. FreeBSD 15 __FreeBSD_version 值
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。
表格 54. FreeBSD 14 __FreeBSD_version 值
1400000
2021 年 1 月 22 日
14.0-CURRENT.
1400001
2021 年 1 月 23 日
在添加符号链接支持后的 14.0-CURRENT 进行无锁查找。
1400002
2021 年 1 月 26 日
在修复构建 devel/onetbb 时修复了一个 clang 断言的 14.0-CURRENT port。
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 版本。
FreeBSD 13 表 __FreeBSD_version 值
1300000
2018 年 10 月 19 日
13.0-CURRENT.
1300001
2018 年 10 月 25 日
在提升 OpenSSL 共享库版本号后的 13.0-CURRENT
1300002
2018 年 10 月 25 日
恢复 sys/joystick.h 后的 13.0-CURRENT。
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 版本。
第 56 表。FreeBSD 12 __FreeBSD_version 值
1200000
2016 年 7 月 7 日
12.0-CURRENT.
1200001
2016 年 7 月 12 日
从 [a-z] -type 范围中删除协同比较后的 12.0-CURRENT。
1200002
2016 年 8 月 18 日
删除未使用和过时的 openbsd_poll 系统调用后的 12.0-CURRENT。
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。
第 57 表 自由 BSD 11 __FreeBSD_version 值
1100000
2013 年 10 月 10 日
11.0-CURRENT.
1100001
2013 年 10 月 19 日
添加对"首次启动"rc.d 脚本支持后的 11.0-CURRENT,因此ports可以利用此功能。
1100002
2013 年 11 月 5 日
在放弃对历史 ioctl 的支持后的 11.0-CURRENT。
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。
表 58. FreeBSD 10 __FreeBSD_version 值
1000000
2011 年 9 月 26 日
10.0-CURRENT.
1000001
2011 年 11 月 4 日
添加 posix_fadvise(2)系统调用后的 10-CURRENT。
1000002
2011 年 12 月 12 日
在定义布尔值 true/false 在 sys/types.h 之后,sizeof(bool) 的大小可能已经更改(版本 228444)。在引入 xlocale.h 之后的 10-CURRENT(版本 227753)。
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。
表 59. FreeBSD 9 __FreeBSD_version 值
900000
2009 年 8 月 22 日
9.0-CURRENT.
900001
2009 年 9 月 8 日
导入 x86emu 后的 9.0-CURRENT,这是一个用于模拟实模式 x86 CPU 的软件仿真器,来自 OpenBSD。
900002
2009 年 9 月 23 日
在实现 EVFILT_USER kevent 过滤功能后的 9.0-CURRENT。
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。
表 60. FreeBSD 8 __FreeBSD_version 值
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 日
8.0-CURRENT 在将 kthread_create(9) 等重命名为 kproc_create(9) 之后。
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。
表 61. FreeBSD 7 __FreeBSD_version 值
700000
2005 年 7 月 11 日
7.0-CURRENT.
700001
2005 年 7 月 23 日
在所有自 RELENG_5 以来未更改的共享库版本提升后的 7.0-CURRENT。
700002
2005 年 8 月 13 日
在添加凭据参数到 dev_clone 事件处理程序后的 7.0-CURRENT。
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。
表 62. FreeBSD 6 __FreeBSD_version 值
600000
2004 年 8 月 18 日
6.0-CURRENT
600001
2004 年 8 月 27 日
在内核中永久启用 PFIL_HOOKS 后的 6.0-CURRENT 。
600002
2004 年 8 月 30 日
在 struct if_data 中初次添加 ifi_epoch 后的 6.0-CURRENT。 几天后撤回。 请勿使用此值。
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)端口 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。
表 63. FreeBSD 5 __FreeBSD_version 值
500000
2000 年 3 月 13 日
5.0-CURRENT
500001
2000 年 4 月 18 日
添加额外的 ELF 头字段,并更改 ELF 二进制品牌方法后的 5.0-CURRENT。
500002
2000 年 5 月 2 日
kld 元数据更改后的 5.0-CURRENT。
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
表 64. FreeBSD 4 __FreeBSD_version 值
400000
1999 年 1 月 22 日
4.0-CURRENT 在 3.4 分支之后
400001
1999 年 2 月 20 日
在动态链接处理更改后的 4.0-CURRENT
400002
1999 年 3 月 13 日
C++构造函数/析构函数顺序更改后的 4.0-CURRENT
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。
表 65. FreeBSD 3 __FreeBSD_version 值
300000
1996 年 2 月 19 日
3.0-CURRENT 在 mount(2)更改之前
300001
1997 年 9 月 24 日
挂载(2)更改后的 3.0-CURRENT
300002
1998 年 6 月 2 日
semctl(2)更改后的 3.0-CURRENT
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
表 66. FreeBSD 2.2 __FreeBSD_version 值
220000
1997 年 2 月 19 日
2.2-RELEASE
(not changed)
2.2.1-RELEASE
(not changed)
2.2-STABLE 在 2.2.1-RELEASE 之后
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 之后
表 67. FreeBSD 2 在 2.2-RELEASE 之前的 __FreeBSD_version 值
119411
2.0-RELEASE
199501
1995 年 3 月 19 日
2.1-CURRENT
199503
1995 年 3 月 24 日
2.1-CURRENT
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