--- title: 第 12 章 该做什么和不该做什么 prev: books/porters-handbook/security next: books/porters-handbook/porting-samplem showBookMenu: true weight: 12 params: path: "/books/porters-handbook/porting-dads/" --- [[porting-dads]] = 该做什么和不该做什么 :doctype: book :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :sectnumoffset: 12 :partnums: :source-highlighter: rouge :experimental: :images-path: books/porters-handbook/ ifdef::env-beastie[] ifdef::backend-html5[] :imagesdir: ../../../../images/{images-path} endif::[] ifndef::book[] include::shared/authors.adoc[] include::shared/mirrors.adoc[] include::shared/releases.adoc[] include::shared/attributes/attributes-{{% lang %}}.adoc[] include::shared/{{% lang %}}/teams.adoc[] include::shared/{{% lang %}}/mailing-lists.adoc[] include::shared/{{% lang %}}/urls.adoc[] toc::[] endif::[] ifdef::backend-pdf,backend-epub3[] include::../../../../../shared/asciidoctor.adoc[] endif::[] endif::[] ifndef::env-beastie[] toc::[] include::../../../../../shared/asciidoctor.adoc[] endif::[] [[dads-intro]] == 介绍 这里是一些在移植软件时可能会遇到的常见问题。 您应按照这个列表检查自己的 port, 同样地, 您也可以帮助检查 http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query[PR 数据库] 中由其它人提交的 port。 请按照在 extref:{contributing}[问题报告和一般性注释, CONTRIB-GENERAL] 中介绍的方法提交您的看法。 帮助检查 PR 数据库中的 ports 即能够帮助我们更快地 commit 它们, 也能证明您清楚地了解如何完成这些工作。 [[porting-wrkdir]] == `WRKDIR` (联编时使用的临时目录) 任何时候都不要在 `WRKDIR` 以外的位置写文件。 `WRKDIR` 是在 port 联编过程中唯一的一处一定可写的地方 (参见 extref:{handbook}ports[如何从 CDROM 安装 port, PORTS-CD] 以了解从只读的目录中联编和安装 port 的例子)。 如果您需要改变 [.filename]##pkg-*## 文件, 请按照 <> 介绍的方法, 而不是覆盖它们来实现。 [[porting-wrkdirprefix]] == `WRKDIRPREFIX` (用于联编的临时目录的父目录名) 一定要确保您的 port 尊重 `WRKDIRPREFIX` 的设置。 绝大多数 port 并不需要担心这个。 具体说来, 当引用其它 port 的 `WRKDIR` 时, 需要注意正确的位置应该是 [.filename]#WRKDIRPREFIXPORTSDIR/subdir/name/work# 而不是 [.filename]#PORTSDIR/subdir/name/work# 或 [.filename]#.CURDIR/../../subdir/name/work#, 或别的什么。 另外, 如果您自行定义了 `WRKDIR`, 也要把 `${WRKDIRPREFIX}${.CURDIR}` 放到前面。 [[porting-versions]] == 区分不同的操作系统, 以及 OS 的版本 在不同版本的 Unix 下可能需要对代码进行一些修改或增加少许编译选项, 才能够正确地编译和运行。 如果您需要根据一些条件来对代码进行修改, 请尽可能让这些修改通用, 这样, 我们就能够将这些代码移植回更早的 FreeBSD 系统, 并交叉移植到其它 BSD 系统, 例如来自 CSRG 的 4.4BSD, BSD/386, 386BSD, NetBSD 和 OpenBSD。 推荐的获得 4.3BSD/Reno (1990) 以及更新版本 BSD 代码版本号的方式, 是使用 http://cvsweb.freebsd.org/src/sys/sys/param.h[sys/param.h] 中所定义的 `BSD` 宏的值。 一般来说这个文件已经被引用了; 如果没有的话, 增加下述代码: [.programlisting] .... #if (defined(__unix__) || defined(unix)) && !defined(USG) #include #endif .... 到 [.filename]#.c# 文件中合适的地方。 我们相信所有定义了这两个符号的系统中, 都提供了 [.filename]#sys/param.h#。 如果您发现有不这样做的系统, 请通过致信 {freebsd-ports} 让我们了解这一情况。 另一种方法是使用 GNU Autoconf 风格的方式: [.programlisting] .... #ifdef HAVE_SYS_PARAM_H #include #endif .... 采用这种方法时, 不要忘了把 `-DHAVE_SYS_PARAM_H` 加到 [.filename]#Makefile# 中的 `CFLAGS` 里。 一旦引用了 [.filename]#sys/param.h#, 您就可以使用: [.programlisting] .... #if (defined(BSD) && (BSD >= 199103)) .... 来检测代码是否正在 4.3 Net2 代码基础, 或更新的系统上编译 (例如 FreeBSD 1.x, 4.3/Reno, NetBSD 0.9, 386BSD, BSD/386 1.1 以及更高版本)。 使用: [.programlisting] .... #if (defined(BSD) && (BSD >= 199306)) .... 来检测代码是否正在 4.4 或更新的系统 (例如 FreeBSD 2.x, 4.4, NetBSD 1.0、 BSD/386 2.0 或更高版本)。 对于 4.4BSD-Lite2 代码系来说, `BSD` 宏的值应该是 `199506`。 这里只是作为信息提供, 您不应使用它来区分基于 4.4-Lite 的 FreeBSD 和基于 4.4-Lite2 的版本。 这些情况下, 您应使用 {freebsd} 宏。 保守地使用: * {freebsd} 在所有版本的 FreeBSD 中皆有定义。 如果您正进行的修改 _只_ 影响 FreeBSD, 则应使用这个宏。 类似 `sys_errlist[]` 之于 `strerror()` 这样的移植问题是伯克利代码系公用的, 而并非 FreeBSD 所专有。 * 在 FreeBSD 2.x 中, {freebsd} 定义为 `2`。 更早版本中, 它曾经是 `1`。 新的版本都会在主要的版本号变化时变更它。 * 如果您需要区分 FreeBSD 1.x 系统和 FreeBSD 2.x 及更高版本的区别, 通常应使用前述的 `BSD` 宏来进行。 如果事实上需要一个 FreeBSD 专有的修改 (例如, 在使用 `ld` 时需要特殊的共享库选项), 则可以用 {freebsd} 和 #if {freebsd} > 1 来检测 FreeBSD 2.x 和新系统上的变化。 如果需要更细粒度地检测 FreeBSD 2.0-RELEASE 之后版本的变化, 则可以使用: + [.programlisting] .... #if __FreeBSD__ >= 2 #include # if __FreeBSD_version >= 199504 /* 适用于 2.0.5+ 版本的代码 */ # endif #endif .... 在已有的数百个 port 中, 只有一两个应该使用 {freebsd}。 早期的 port 在不适当的地方使用了它并引发问题, 并不意味着您也必定如此。 [[freebsd-versions]] == __FreeBSD_version 值 下面是在 http://cvsweb.freebsd.org/src/sys/sys/param.h[sys/param.h]`__FreeBSD_version` 中定义的值及其意义的列表, 这里给出以方便您查阅: .__FreeBSD_version 值 [cols="1,1,1", frame="none", options="header"] |=== | 值 | 日期 | 版本 |119411 | |2.0-RELEASE |199501, 199503 |March 19, 1995 |2.1-CURRENT |199504 |April 9, 1995 |2.0.5-RELEASE |199508 |August 26, 1995 |2.1 之前的 2.2-CURRENT |199511 |November 10, 1995 |2.1.0-RELEASE |199512 |November 10, 1995 |2.1.5 之前的 2.2-CURRENT |199607 |July 10, 1996 |2.1.5-RELEASE |199608 |July 12, 1996 |2.1.6 之前的 2.2-CURRENT |199612 |November 15, 1996 |2.1.6-RELEASE |199612 | |2.1.7-RELEASE |220000 |February 19, 1997 |2.2-RELEASE |(not changed) | |2.2.1-RELEASE |(无变化) | |在 2.2.1-RELEASE 之后的 2.2-STABLE |221001 |April 15, 1997 |texinfo-3.9 之后的 2.2-STABLE |221002 |April 30, 1997 |top 之后的 2.2-STABLE |222000 |May 16, 1997 |2.2.2-RELEASE |222001 |May 19, 1997 |2.2.2-RELEASE 之后的 2.2-STABLE |225000 |October 2, 1997 |2.2.5-RELEASE |225001 |November 20, 1997 |2.2.5-RELEASE 之后的 2.2-STABLE |225002 |December 27, 1997 |合并 ldconfig -R 之后的 2.2-STABLE |226000 |March 24, 1998 |2.2.6-RELEASE |227000 |July 21, 1998 |2.2.7-RELEASE |227001 |July 21, 1998 |2.2.7-RELEASE 之后的 2.2-STABLE |227002 |September 19, 1998 |man:semctl[2] 修改之后的 2.2-STABLE |228000 |November 29, 1998 |2.2.8-RELEASE |228001 |November 29, 1998 |2.2.8-RELEASE 之后的 2.2-STABLE |300000 |February 19, 1996 |man:mount[2] 修改之前的 3.0-CURRENT |300001 |September 24, 1997 |man:mount[2] 修改之后的 3.0-CURRENT |300002 |June 2, 1998 |man:semctl[2] 修改之后的 3.0-CURRENT |300003 |June 7, 1998 |ioctl 参数变化之后的 3.0-CURRENT |300004 |September 3, 1998 |ELF 变换之后的 3.0-CURRENT |300005 |October 16, 1998 |3.0-RELEASE |300006 |October 16, 1998 |3.0-RELEASE 之后的 3.0-CURRENT |300007 |January 22, 1999 |3/4切分之后的 3.0-STABLE |310000 |February 9, 1999 |3.1-RELEASE |310001 |March 27, 1999 |3.1-RELEASE 之后的 3.1-STABLE |310002 |April 14, 1999 |C++ 构建/析构函数顺序变化之后的 3.1-STABLE |320000 | |3.2-RELEASE |320001 |May 8, 1999 |3.2-STABLE |320002 |August 29, 1999 |二进制不兼容的 IPFW 和 socket 变化之后的 3.2-STABLE |330000 |September 2, 1999 |3.3-RELEASE |330001 |September 16, 1999 |3.3-STABLE |330002 |November 24, 1999 |libc 中加入 man:mkstemp[3] 之后的 3.3-STABLE |340000 |December 5, 1999 |3.4-RELEASE |340001 |December 17, 1999 |3.4-STABLE |350000 |June 20, 2000 |3.5-RELEASE |350001 |July 12, 2000 |3.5-STABLE |400000 |January 22, 1999 |3/4切分之后的 4.0-CURRENT |400001 |February 20, 1999 |修改动态连接器处理方式之后的 4.0-CURRENT |400002 |March 13, 1999 |C++ 构建/析构函数顺序变化之后的 |400003 |March 27, 1999 |提供 man:dladdr[3] 之后的 4.0-CURRENT |400004 |April 5, 1999 |修正了 __deregister_frame_info 的 4.0-CURRENT (也表示在 EGCS 1.1.2 集成之后的 4.0-CURRENT) |400005 |April 27, 1999 |man:suser[9] API 变化之后的 4.0-CURRENT (也表示 newbus 之后的 4.0-CURRENT) |400006 |May 31, 1999 |cdevsw 注册机制改变之后的 4.0-CURRENT |400007 |June 17, 1999 |加入了 socket 级凭据的 so_cred 之后的 4.0-CURRENT |400008 |June 20, 1999 |在 libc_r 中加入 poll 系统调用接口之后的 4.0-CURRENT |400009 |July 20, 1999 |将内核中 `dev_t` 类型改为 `struct specinfo` 指针之后的 4.0-CURRENT |400010 |September 25, 1999 |修正了一处 man:jail[2] 漏洞之后的 4.0-CURRENT |400011 |September 29, 1999 |`sigset_t` 数据类型改变之后的 4.0-CURRENT |400012 |November 15, 1999 |切换到 GCC 2.95.2 编译器之后的 4.0-CURRENT |400013 |December 4, 1999 |加入了可插的 linux模式 ioctl 处理程序后的 4.0-CURRENT |400014 |January 18, 2000 |引入 OpenSSL 之后的 4.0-CURRENT |400015 |January 27, 2000 |GCC 2.95.2 中 ABI 默认值从 -fvtable-thunks 改为 -fno-vtable-thunks 之后的 4.0-CURRENT |400016 |February 27, 2000 |引入 OpenSSH 之后的 4.0-CURRENT |400017 |March 13, 2000 |4.0-RELEASE |400018 |March 17, 2000 |4.0-RELEASE 之后的 4.0-STABLE |400019 |May 5, 2000 |引入延迟校验和之后的 4.0-STABLE |400020 |June 4, 2000 |将 libxpg4 的代码并入 libc 之后的 4.0-STABLE |400021 |July 8, 2000 |Binutils 升级到 2.10.0 之后的 4.0-STABLE, ELF 标志变化, 以及将 tcsh 引入基本系统 |410000 |July 14, 2000 |4.1-RELEASE |410001 |July 29, 2000 |4.1-RELEASE 之后的 4.1-STABLE |410002 |September 16, 2000 |man:setproctitle[3] 从 libutil 移入 libc 之后的 4.1-STABLE |411000 |September 25, 2000 |4.1.1-RELEASE |411001 | |4.1.1-RELEASE 之后的 4.1.1-STABLE |420000 |October 31, 2000 |4.2-RELEASE |420001 |January 10, 2001 |合并 libgcc.a 和 libgcc_r.a, 并修改了相关的 GCC 连接方式之后的 4.2-STABLE |430000 |March 6, 2001 |4.3-RELEASE |430001 |May 18, 2001 |引入 wint_t 之后的 4.3-STABLE |430002 |July 22, 2001 |PCI 电源状态 API 合并之后的 4.3-STABLE |440000 |August 1, 2001 |4.4-RELEASE |440001 |October 23, 2001 |引入 d_thread_t 之后的 4.4-STABLE |440002 |November 4, 2001 |mount 结构改变之后的 4.4-STABLE (影响文件系统 kld) |440003 |December 18, 2001 |用户态部分的 smbfs 被引入之后的 4.4-STABLE |450000 |December 20, 2001 |4.5-RELEASE |450001 |February 24, 2002 |usb 结构元素改名之后的 4.5-STABLE |450004 |April 16, 2002 |在 man:rc.conf[5] 变量 `sendmail_enable` 默认值改为 `NONE` 之后的 4.5-STABLE |450005 |April 27, 2002 |默认将 XFree86 4 用于预编译包联编之后的 4.5-STABLE |450006 |May 1, 2002 |accept 过滤器修正了安全问题并且不再会轻易被 DoS 之后的 4.5-STABLE |460000 |June 21, 2002 |4.6-RELEASE |460001 |June 21, 2002 |修正了 man:sendfile[2] 以吻合文档, 而不再根据发出的头计算发出数据量之后的 4.6-STABLE |460002 |July 19, 2002 |4.6.2-RELEASE |460100 |June 26, 2002 |4.6-STABLE |460101 |June 26, 2002 |MFC `sed -i` 之后的 4.6-STABLE |460102 |September 1, 2002 |MFC 许多 pkg_install 新特性之后的 4.6-STABLE |470000 |October 8, 2002 |4.7-RELEASE |470100 |October 9, 2002 |4.7-STABLE |470101 |November 10, 2002 |开始生成 __std{in,out,err}p 引用, 而不是 __sF。 这将 std{in,out,err} 从编译时表达式变成了运行时值。 |470102 |January 23, 2003 |MFC mbuf 相关的将 m_aux mbuf 改为 m_tag 的修改之后的 4.7-STABLE |470103 |February 14, 2003 |OpenSSL 升级到 0.9.7 之后的 4.7-STABLE |480000 |March 30, 2003 |4.8-RELEASE |480100 |April 5, 2003 |4.8-STABLE |480101 |May 22, 2003 |man:realpath[3] 变为线程安全的之后的 4.8-STABLE |480102 |August 10, 2003 |对 twe 的 3ware API 修改之后的 4.8-STABLE |490000 |October 27, 2003 |4.9-RELEASE |490100 |October 27, 2003 |4.9-STABLE |490101 |January 8, 2004 |kinfo_eproc 中加入 e_sid 之后的 4.9-STABLE |490102 |February 4, 2004 |MFC rtld 的 libmap 功能之后的 4.9-STABLE |491000 |May 25, 2004 |4.10-RELEASE |491100 |June 1, 2004 |4.10-STABLE |491101 |August 11, 2004 |MFC 20040629 版本的包维护工具之后的 4.10-STABLE |491102 |November 16, 2004 |修正了 VM 当解除 wire 不存在页面时的问题之后的 4.10-STABLE |492000 |December 17, 2004 |4.11-RELEASE |492100 |December 17, 2004 |4.11-STABLE |492101 |April 18, 2006 |将 libdata/ldconfig 目录加入 mtree 文件之后的 4.11-STABLE。 |500000 |March 13, 2000 |5.0-CURRENT |500001 |April 18, 2000 |加入 ELF 头字段, 并改变我们的 ELF 执行文件标记方式之后的 5.0-CURRENT |500002 |May 2, 2000 |kld 元数据修改之后的 5.0-CURRENT |500003 |May 18, 2000 |buf/bio 修改之后的 5.0-CURRENT |500004 |May 26, 2000 |binutils 升级后的 5.0-CURRENT |500005 |June 3, 2000 |将 libxpg4 并入 libc, 以及引入 TASKQ 之后的 5.0-CURRENT |500006 |June 10, 2000 |加入 AGP 接口之后的 5.0-CURRENT |500007 |June 29, 2000 |Perl 升级到 5.6.0 之后的 5.0-CURRENT |500008 |July 7, 2000 |KAME 代码升级到 2000/07 之后的 5.0-CURRENT |500009 |July 14, 2000 |ether_ifattach() 和 ether_detach() 修改之后的 5.0-CURRENT |500010 |July 16, 2000 |将 mtree 改为原先的默认值, 并使用 -L 来跟随符号连接之后的 5.0-CURRENT |500011 |July 18, 2000 |kqueue API 修改之后的 5.0-CURRENT |500012 |September 2, 2000 |man:setproctitle[3] 从 libutil 挪到 libc 之后的 5.0-CURRENT |500013 |September 10, 2000 |首个 SMPng commit 之后的 5.0-CURRENT |500014 |January 4, 2001 | 改为 之后的 5.0-CURRENT |500015 |January 10, 2001 |libgcc.a 和 libgcc_r.a 以及 GCC 连接方式变动之后的 5.0-CURRENT |500016 |January 24, 2001 |修改以允许 libc 和 libc_r 连接到一起, 不再鼓励使用 -pthread 之后的 5.0-CURRENT |500017 |February 18, 2001 |从 struct ucred 切换到 struct xucred 以便使内核为 mountd 等程序导出的 API 稳定下来之后的 5.0-CURRENT |500018 |February 24, 2001 |加入 CPUTYPE 用于 CPU 专用的优化的 make 变量之后的 5.0-CURRENT |500019 |June 9, 2001 |machine/ioctl_fd.h 改为 sys/fdcio.h 之后的 5.0-CURRENT |500020 |June 15, 2001 |locale 名称改变之后的 5.0-CURRENT |500021 |June 22, 2001 |引入 bzip2 之后的 5.0-CURRENT, 同时也代表删去了 S/Key |500022 |July 12, 2001 |加入 SSE 支持之后的 5.0-CURRENT |500023 |September 14, 2001 |KSE 第2个里程碑之后的 5.0-CURRENT |500024 |October 1, 2001 |d_thread_t 之后的 5.0-CURRENT, 同时 UUCP 被移入 ports |500025 |October 4, 2001 |64-位平台上的描述符和 creds API 变化之后的 5.0-CURRENT |500026 |October 9, 2001 |采用 XFree86 4 作为默认的预编译包, 以及加入 strnstr() libc 函数之后的 5.0-CURRENT |500027 |October 10, 2001 |加入 strcasestr() libc 函数之后的 5.0-CURRENT |500028 |December 14, 2001 |引入了用户态的 smbfs 组件之后的 5.0-CURRENT |(未予增加) | |加入了新的 C99 指定位宽整形变量之后的 5.0-CURRENT |500029 |January 29, 2002 |修改了 man:sendfile[2] 的返回值之后的 5.0-CURRENT |500030 |February 15, 2002 |引入适合表达文件标志的 `fflags_t` 类型之后的 5.0- |500031 |February 24, 2002 |usb 结构元素改名之后的 5.0-CURRENT |500032 |March 16, 2002 |引入 Perl 5.6.1 之后的 5.0-CURRENT |500033 |April 3, 2002 |man:rc.conf[5] 变量 `sendmail_enable` 默认值改为 `NONE` 之后的 5.0-CURRENT |500034 |April 30, 2002 |mtx_init() 增加了第三个参数之后的 5.0-CURRENT |500035 |May 13, 2002 |包含 Gcc 3.1 的 5.0-CURRENT |500036 |May 17, 2002 |在 /usr/src 中删去了 Perl 的 5.0-CURRENT |500037 |May 29, 2002 |加入 man:dlfunc[3] 之后的 5.0-CURRENT |500038 |July 24, 2002 |一些 struct sockbuf 的成员变为结构, 并重新排列顺序之后的 5.0-CURRENT |500039 |September 1, 2002 |引入 GCC 3.2.1 之后的 5.0-CURRENT。 头文件也不再使用 _BSD_FOO_T_ 而开始使用 _FOO_T_DECLARED。 这个值还可以用于作为一个包含使用 man:bzip2[1] 的预编译包支持的预期点。 |500040 |September 20, 2002 |以去掉对 disklabel 结构内容的依赖的名义, 对磁盘相关的函数进行了许多修改之后的 5.0-CURRENT |500041 |October 1, 2002 |libc 中加入 man:getopt_long[3] 之后的 5.0-CURRENT |500042 |October 15, 2002 |Binutils 2.13 升级, 包含了新的 FreeBSD 模拟, vec 以及输出格式之后的 5.0-CURRENT |500043 |November 1, 2002 |libc 中加入了弱 pthread_XXX 符号之后的 5.0-CURRENT, 从而淘汰了 libXThrStub.so。 5.0-RELEASE。 |500100 |January 17, 2003 |创建 RELENG_5_0 分支之后的 5.0-CURRENT |500101 |February 19, 2003 | 变成了一个空文件, 不应再被引用 |500102 |February 25, 2003 |修改 d_mmap_t 接口之后的 5.0-CURRENT |500103 |February 26, 2003 |taskqueue_swi 以无全局锁的方式运行之后的 5.0-CURRENT, 同时还加入了使用全局锁的 taskqueue_swi_giant |500104 |February 27, 2003 |去掉了 cdevsw_add() 和 cdevsw_remove() 出现 MAJOR_AUTO 分配机制 |500105 |March 4, 2003 |采用新的 cdevsw 初始化方法之后的 5.0-CURRENT |500106 |March 8, 2003 |devstat_add_entry() 被 devstat_new_entry() 取代 |500107 |March 15, 2003 |修改 devstat 接口; 请参见 sys/sys/param.h 1.149 |500108 |March 15, 2003 |改变了 Token-Ring 接口 |500109 |March 25, 2003 |加入 vm_paddr_t |500110 |March 28, 2003 |将 man:realpath[3] 改为线程安全之后的 5.0-CURRENT |500111 |April 9, 2003 |man:usbhid[3] 与 NetBSD 同步之后的 5.0-CURRENT |500112 |April 17, 2003 |加入新的 NSS 实现, 以及 POSIX.1 getpw*_r, getgr*_r 函数之后的 5.0-CURRENT |500113 |May 2, 2003 |删去旧式 rc 系统之后的 5.0-CURRENT |501000 |June 4, 2003 |5.1-RELEASE. |501100 |June 2, 2003 |创建 RELENG_5_1 分支之后的 5.1-CURRENT |501101 |June 29, 2003 |改正 sigtimedwait(2) 和 sigwaitinfo(2) 语义之后的 5.1-CURRENT |501102 |July 3, 2003 |在 man:bus_dma_tag_create[9] 中加入了 lockfunc 和 lockfuncarg 字段之后的 5.1-CURRENT |501103 |July 31, 2003 |集成了 GCC 3.3.1-pre 20030711 之后的 5.1-CURRENT |501104 |August 5, 2003 |twe 中 3ware API 变化之后的 5.1-CURRENT |501105 |August 17, 2003 |允许动态连接 /bin 和 /sbin, 以及将某些库移动到 /lib 之后的 5.1-CURRENT |501106 |September 8, 2003 |增加内核级 Coda 6.x 支持之后的 5.1-CURRENT |501107 |September 17, 2003 |将 16550 UART 常量从 [.filename]## 挪到 [.filename]## 之后的 5.1-CURRENT。 此外, rtld 也从此无条件支持 libmap 功能 |501108 |September 23, 2003 |更新 PFIL_HOOKS API 之后的 5.1-CURRENT |501109 |September 27, 2003 |增加 kiconv(3) 之后的 5.1-CURRENT |501110 |September 28, 2003 |默认的 cdevsw open 和 close 操作变化之后的 5.1-CURRENT |501111 |October 16, 2003 |cdevsw 的布局变化之后的 5.1-CURRENT |501112 |October 16, 2003 |增加 kobj 多继承之后的 5.1-CURRENT |501113 |October 31, 2003 |修改 struct ifnet 中的 if_xname 之后的 5.1-CURRENT |501114 |November 16, 2003 |将 /bin 和 /sbin 改为动态连接之后的 5.1-CURRENT |502000 |December 7, 2003 |5.2-RELEASE |502010 |February 23, 2004 |5.2.1-RELEASE |502100 |December 7, 2003 |创建 RELENG_5_2 分支之后的 5.2-CURRENT |502101 |December 19, 2003 |libc 中加入了 __cxa_atexit/__cxa_finalize 两个函数之后的 5.2-CURRENT |502102 |January 30, 2004 |默认线程库从 libc_r 改为 libpthread 之后的 5.2-CURRENT |502103 |February 21, 2004 |设备驱动 API 大规模翻修之后的 5.2-CURRENT |502104 |February 25, 2004 |增加 getopt_long_only() 之后的 5.2-CURRENT |502105 |March 5, 2004 |C 的 NULL 定义改为 ((void *)0) 之后的 5.2-CURRENT, 这会产生更多的编译警告 |502106 |March 8, 2004 |pf 连入联编和安装过程之后的 5.2-CURRENT |502107 |March 10, 2004 |在 sparc64 上将 time_t 改为 64-位 值之后的 5.2-CURRENT |502108 |March 12, 2004 |在一些头文件修改以支持 Intel C/C++ 编译器, 以及让 execve(2) 更严格地符合 POSIX 之后的 5.2-CURRENT |502109 |March 22, 2004 |引入 bus_alloc_resource_any API 之后的 5.2-CURRENT |502110 |March 27, 2004 |加入 UTF-8 locale 之后的 5.2-CURRENT |502111 |April 11, 2004 |删去 getvfsent(3) API 之后的 5.2-CURRENT |502112 |April 13, 2004 |为 make(1) 增加 .warning 语句之后的 5.2-CURRENT |502113 |June 4, 2004 |所有串口设备都强制使用 ttyioctl() 之后的 5.2-CURRENT |502114 |June 13, 2004 |引入 ALTQ 框架之后的 5.2-CURRENT |502115 |June 14, 2004 |修改 sema_timedwait(9) 使其成功时返回 0, 失败时返回非 0 的错误代码之后的 5.2-CURRENT |502116 |June 16, 2004 |将内核 dev_t 改为指向 struct cdev * 的指针之后的 5.2-CURRENT |502117 |June 17, 2004 |将内核 udev_t 改为 dev_t 之后的 5.2-CURRENT |502118 |June 17, 2004 |为 clock_gettime(2) 和 clock_getres(2) 增加 CLOCK_VIRTUAL 和 CLOCK_PROF 支持之后的 5.2-CURRENT |502119 |June 22, 2004 |对网络接口复制进行全面修改之后的 5.2-CURRENT |502120 |July 2, 2004 |package 工具升级为 20040629 之后的 5.2-CURRENT |502121 |July 9, 2004 |不再将蓝牙代码标记为 i386 专用之后的 5.2-CURRENT |502122 |July 11, 2004 |引入 KDB 调试器框架之后的 5.2-CURRENT。 同时还引入了 DDB 作为后台, 以及 GDB 后台。 |502123 |July 12, 2004 |修改 VFS_ROOT 和 vflush 使其使用一个 struct thread 参数之后的 5.2-CURRENT。 struct kinfo_proc 增加了一个用户数据指针。 同时, 默认的 X 实现切换为 `xorg` |502124 |July 24, 2004 |将使用 rc.d 和传统脚本的 port 分别启动之后的 5.2-CURRENT |502125 |July 28, 2004 |取消前一修改之后的 5.2-CURRENT |502126 |July 31, 2004 |删除 kmem_alloc_pageable() 并引入 gcc 3.4.2 的 5.2-CURRENT |502127 |August 2, 2004 |修改 UMA 内核 API 允许构建函数和初始化失败之后的 5.2-CURRENT |502128 |August 8, 2004 |vfs_mount 签名和全局替换 suser(9) API 的 PRISON_ROOT 为 SUSER_ALLOWJAIL 之后的 5.2-CURRENT |503000 |August 23, 2004 |pfil API 修改之前的 5.3-BETA/RC |503001 |September 22, 2004 |5.3-RELEASE |503100 |October 16, 2004 |创建 RELENG_5_3 分支之后的 5.3-STABLE |503101 |December 3, 2004 |加入了 glibc 风格的 man:strftime[3] 填充选项的 5.3-STABLE |503102 |February 13, 2005 |MFC OpenBSD 的 nc(1) 之后的 5.3-STABLE |503103 |February 27, 2005 |在 MFC 了 [.filename]## 和 [.filename]## 用于兼容 GCC 和 Intel C/C++ 编译器的修正之后的 5.4-PRERELEASE |503104 |February 28, 2005 |MFC 了将 ifi_epoch 由 wall 时钟时间改为 uptime 之后的 5.4-PRERELEASE |503105 |March 2, 2005 |MFC 了 vswprintf(3) 中的 EOVERFLOW 检查的 5.4-PRERELEASE |504000 |April 3, 2005 |5.4-RELEASE. |504100 |April 3, 2005 |创建 RELENG_5_4 分支之后的 5.4-STABLE |504101 |May 11, 2005 |加大默认线程堆栈尺寸之后的 5.4-STABLE |504102 |June 24, 2005 |加入 sha256 之后的 5.4-STABLE |504103 |October 3, 2005 |MFC if_bridge 之后的 5.4-STABLE |504104 |November 13, 2005 |bsdiff 和 portsnap MFC 之后的 5.4-STABLE |504105 |January 17, 2006 |在 MFC 了 ldconfig_local_dirs 修改之后的 5.4-STABLE。 |505000 |May 12, 2006 |5.5-RELEASE. |505100 |May 12, 2006 |在创建 RELENG_5_5 分支之后的 5.5-STABLE |600000 |August 18, 2004 |6.0-CURRENT |600001 |August 27, 2004 |内核中永久性启用 PFIL_HOOKS 之后的 6.0-CURRENT |600002 |August 30, 2004 |最初将 ifi_epoch 加入 if_data 结构之后的 6.0-CURRENT。 此后不久即被撤销。 请不要使用这个值。 |600003 |September 8, 2004 |if_data 中再次加入 ifi_epoch 成员之后的 6.0-CURRENT |600004 |September 29, 2004 |将 struct inpcb 参数加入 pfil API 之后的 6.0-CURRENT |600005 |October 5, 2004 |newsyslog 加入了 "-d DESTDIR" 参数之后的 6.0-CURRENT |600006 |November 4, 2004 |加入了 glibc 风格的 man:strftime[3] 填充选项之后的 6.0-CURRENT |600007 |December 12, 2004 |加入了 802.11 框架更新之后的 6.0-CURRENT |600008 |January 25, 2005 |修改 VOP_*VOBJECT() 并为无全局锁的文件系统引入 MNTK_MPSAFE 标志之后的 6.0-CURRENT |600009 |February 4, 2005 |加入 cpufreq 框架和驱动之后的 6.0-CURRENT |600010 |February 6, 2005 |引入 OpenBSD 的 nc(1) 之后的 6.0-CURRENT |600011 |February 12, 2005 |删去并不存在的 SVID2 `matherr()` 支持之后的 6.0-CURRENT |600012 |February 15, 2005 |增大默认线程堆栈尺寸之后的 6.0-CURRENT |600013 |February 19, 2005 |增加了针对 [.filename]## 和 [.filename]## 的用于 Intel C/C++ 编译器的 GCC-兼容性修正。 |600014 |February 21, 2005 |修正了 vswprintf(3) 的 EOVERFLOW 检查之后的 6.0-CURRENT |600015 |February 25, 2005 |将 struct if_data 成员 ifi_epoch 从 wall 时钟时间改为 uptime 之后的 6.0-CURRENT |600016 |February 26, 2005 |修改 LC_CTYPE 磁盘格式之后的 6.0-CURRENT |600017 |February 27, 2005 |修改 NLS 编录磁盘格式之后的 6.0-CURRENT |600018 |February 27, 2005 |修改 LC_COLLATE 磁盘格式之后的 6.0-CURRENT |600019 |February 28, 2005 |将 acpica 头文件安装到 /usr/include |600020 |March 9, 2005 |为 send(2) API 加入了 MSG_NOSIGNAL |600021 |March 17, 2005 |在 cdevsw 上增加了一些字段 |600022 |March 21, 2005 |基本系统中删去了 gtar |600023 |April 13, 2005 |unix(4) 中加入了 LOCAL_CREDS, LOCAL_CONNWAIT 两个 socket 选项 |600024 |April 19, 2005 |加入了 man:hwpmc[4] 及其相关工具之后的 6.0-CURRENT |600025 |April 26, 2005 |加入 struct icmphdr 之后的 6.0-CURRENT |600026 |May 3, 2005 |pf 更新到了 3.7 |600027 |May 6, 2005 |引入了内核 libalias 和 ng_nat |600028 |May 13, 2005 |将 ttyname_r(3) 接口改为符合 POSIX 标准, 并通过 unistd.h 和 libc |600029 |May 29, 2005 |将 libpcap 升级为 v0.9.1 alpha 096 之后的 6.0-CURRENT |600030 |June 5, 2005 |引入 NetBSD 的 if_bridge(4) 之后的 6.0-CURRENT |600031 |June 10, 2005 |将 struct ifnet 从驱动的 softc 中拆出之后的 6.0-CURRENT。 |600032 |July 11, 2005 |引入了 libpcap v0.9.1 之后的 6.0-CURRENT。 |600033 |July 25, 2005 |所有自 RELENG_5 以来没有修改过的共享库的版本递增之后的 6.0-STABLE。 |600034 |August 13, 2005 |为 dev_clone 事件处理函数增加身份信息参数之后的 6.0-STABLE。 6.0-RELEASE。 |600100 |November 1, 2005 |6.0-RELEASE 之后的 6.0-STABLE |600101 |December 21, 2005 |将 local_startup 目录中的脚本集成到基本系统的 man:rcorder[8] 之后的 6.0-STABLE。 |600102 |December 30, 2005 |更新 ELF 类型和常量之后的 6.0-STABLE。 |600103 |January 15, 2006 |MFC 了 pidfile(3) API 之后的 6.0-STABLE。 |600104 |January 17, 2006 |在 MFC 了 ldconfig_local_dirs 修改之后的 6.0-STABLE。 |600105 |February 26, 2006 |在 csh(1) 中加入了 NLS 目录支持之后的 6.0-STABLE。 |601000 |May 6, 2006 |6.1-RELEASE |601100 |May 6, 2006 |6.1-RELEASE 之后的 6.1-STABLE。 |601101 |June 22, 2006 |引入 csup 之后的 6.1-STABLE。 |601102 |July 11, 2006 |更新了 iwi(4) 之后的 6.1-STABLE。 |601103 |July 17, 2006 |将域名解析函数更新至 BIND9, 并导出了可重入版本的 netdb 函数之后的 6.1-STABLE。 |601104 |August 8, 2006 |在 OpenSSL 中启用了 DSO (动态共享库) 支持之后的 6.1-STABLE。 |601105 |September 2, 2006 |由于 802.11 修正变动了 IEEE80211_IOC_STA_INFO ioctl API 之后的 6.1-STABLE。 |602000 |November 15, 2006 |6.2-RELEASE |602100 |September 15, 2006 |6.2-RELEASE 之后的 6.2-STABLE。 |602101 |December 12, 2006 |加入 Wi-Spy quirk 之后的 6.2-STABLE。 |602102 |December 28, 2006 |增加 pci_find_extcap() 之后的 6.2-STABLE。 |602103 |January 16, 2007 |MFC 了对 dlsym 进行修改, 使其在指定 dso 及其暗指的依赖中查找符号之后的 6.2-STABLE。 |602104 |January 28, 2007 |MFC 了 netgraph 节点 ng_deflate(4) 和 ng_pred1(4) 以及用于 ng_ppp(4) 节点的新压缩及加密模式之后的 6.2-STABLE。 |602105 |February 20, 2007 |MFC 了从 NetBSD 移植的 BSD 授权的 man:gzip[1] 之后的 6.2-STABLE。 |602106 |March 31, 2007 |MFC 了 PCI MSI 和 MSI-X 支持之后的 6.2-STABLE。 |602107 |April 6, 2007 |MFC 了包含宽字符支持的 ncurses 5.6 之后的 6.2-STABLE。 |602108 |April 11, 2007 |MFC 了实现 Linux SCSI SG 直通设备 API 子集的 CAM 'SG' 设备之后的 6.2-STABLE。 |602109 |April 17, 2007 |MFC 了 readline 5.2 patchset 002 之后的 6.2-STABLE。 |602110 |May 2, 2007 |MFC 了用于 amd64 和 i386 的 pmap_invalidate_cache()、 pmap_change_attr()、 pmap_mapbios()、 pmap_mapdev_attr()、 and pmap_unmapbios() 之后的 6.2-STABLE。 |602111 |June 11, 2007 |由于 MFC 了 BOP_BDFLUSH 导致文件系统模块 KBI 变化之后的 6.2-STABLE。 |602112 |September 21, 2007 |一系列 libutil(3) MFC 之后的 6.2-STABLE。 |602113 |October 25, 2007 |MFC 了宽字符和单字节 ctype 函数分拆之后的 6.2-STABLE。 新编译的引用了 ctype.h 的可执行文件, 可能会需要一个在旧系统上不存在的新增符号 __mb_sb_limit。 |602114 |October 30, 2007 |恢复了 ctype ABI 向前兼容性之后的 6.2-STABLE。 |602115 |November 21, 2007 |回退了宽字符和单字节 ctype 分拆之后的 6.2-STABLE。 |603000 |November 25, 2007 |6.3-RELEASE |603100 |November 25, 2007 |在 6.3-RELEASE 之后的 6.3-STABLE。 |603101 |December 7, 2007 |修正了 bit macro 的多字节支持之后的 6.3-STABLE。 |603102 |April 24, 2008 |为 flock 结构加入 l_sysid 之后的 6.3-STABLE。 |603103 |May 27, 2008 |MFC 了 `memrchr` 函数之后的 6.3-STABLE。 |603104 |June 15, 2008 |为 make(1) MFC `:u` 变量修饰符之后的 6.3-STABLE。 |604000 |October 4, 2008 |6.4-RELEASE |604100 |October 4, 2008 |6.4-RELEASE 之后的 6.4-STABLE。 |700000 |July 11, 2005 |7.0-CURRENT。 |700001 |July 23, 2005 |所有自 RELENG_5 以来没有修改过的共享库的版本递增之后的 7.0-CURRENT。 |700002 |August 13, 2005 |为 dev_clone 事件处理函数中增加身份信息参数之后的 7.0-CURRENT。 |700003 |August 25, 2005 |将 memmem(3) 加入 libc 之后的 7.0-CURRENT。 |700004 |October 30, 2005 |将 solisten(9) 改为接受一 backlog 参数之后的 7.0-CURRENT。 |700005 |November 11, 2005 |将 IFP2ENADDR() 改为返回一 IF_LLADDR() 指针之后的 7.0-CURRENT。 |700006 |November 11, 2005 |在 `struct ifnet` 中增加 `if_addr` 成员, 并删除 IFP2ENADDR() 之后的 7.0-CURRENT。 |700007 |December 2, 2005 |将 local_startup 目录中的脚本集成到基本系统的 man:rcorder[8] 之后的 7.0-CURRENT。 |700008 |December 5, 2005 |去掉 MNT_NODEV 挂接选项之后的 7.0-CURRENT。 |700009 |December 19, 2005 |对 ELF-64 类型和符号版本进行变更之后的 7.0-CURRENT。 |700010 |December 20, 2005 |增加 hostb 和 vgapci 驱动、 pci_find_extcap(), 并将 AGP 驱动改为不再影射 aperature 之后的 7.0-CURRENT。 |700011 |December 31, 2005 |除 Alpha 之外的所有平台上 tv_sec 改为 time_t 之后的 7.0-CURRENT。 |700012 |January 8, 2006 |修改 ldconfig_local_dirs 之后的 7.0-CURRENT。 |700013 |January 12, 2006 |在修改了 [.filename]#/etc/rc.d/abi# 以支持 [.filename]#/compat/linux/etc/ld.so.cache# 以某只读文件系统上的符号连接形式存在之后的 7.0-CURRENT。 |700014 |January 26, 2006 |引入 pts 之后的 7.0-CURRENT。 |700015 |March 26, 2006 |在引入 man:hwpmc[4] 的第 2 版 ABI 之后的 7.0-CURRENT。 |700016 |April 22, 2006 |在 libc 中加入了 man:fcloseall[3] 之后的 7.0-CURRENT。 |700017 |May 13, 2006 |删去 ip6fw 之后的 7.0-CURRENT。 |700018 |July 15, 2006 |引入了 snd_emu10kx 之后的 7.0-CURRENT。 |700019 |July 29, 2006 |引入了 OpenSSL 0.9.8b 之后的 7.0-CURRENT。 |700020 |September 3, 2006 |增加了 bus_dma_get_tag 函数之后的 7.0-CURRENT。 |700021 |September 4, 2006 |在引入了 libpcap 0.9.4 和 tcpdump 3.9.4 之后的 7.0-CURRENT。 |700022 |September 9, 2006 |在对 dlsym 进行修改, 使其在指定 dso 及其暗指的依赖中查找符号之后的 7.0-CURRENT。 |700023 |September 23, 2006 |为 OSSv4 混音器 API 加入新的声音 IOCTL 之后的 7.0-CURRENT。 |700024 |September 28, 2006 |汇入 OpenSSL 0.9.8d 之后的 7.0-CURRENT。 |700025 |November 11, 2006 |加入了 libelf 之后的 7.0-CURRENT。 |700026 |November 26, 2006 |对音效相关的 sysctl 进行大幅调整之后的 7.0-CURRENT。 |700027 |November 30, 2006 |加入 Wi-Spy quirk 之后的 7.0-CURRENT。 |700028 |December 15, 2006 |在 libc 中加入 sctp 调用之后的 7.0-CURRENT。 |700029 |January 26, 2007 |将 GNU man:gzip[1] 实现替换为从 NetBSD 移植的采用 BSD 授权版本之后的 7.0-CURRENT。 |700030 |February 7, 2007 |在 IPv4 多播转发代码中删去了 IPIP 隧道封装 (VIFF_TUNNEL) 之后的 7.0-CURRENT。 |700031 |February 23, 2007 |修改了 bus_setup_intr() (newbus) 之后的 7.0-CURRENT。 |700032 |March 2, 2007 |引入了 ipw(4) 和 iwi(4) 固件之后的 7.0-CURRENT。 |700033 |March 9, 2007 |在 ncurses 中引入了宽字符支持之后的 7.0-CURRENT。 |700034 |March 19, 2007 |修改了 insmntque()、 getnewvnode() 以及 vfs_hash_insert() 工作方式之后的 7.0-CURRENT。 |700035 |March 26, 2007 |增加 CPU 频率变动通知机制之后的 7.0-CURRENT。 |700036 |April 6, 2007 |引入了 ZFS 文件系统之后的 7.0-CURRENT。 |700037 |April 8, 2007 |新增了实现 Linux SCSI SG 直通设备 API 子集的 CAM 'SG' 设备之后的 7.0-CURRENT。 |700038 |April 30, 2007 |将 man:getenv[3]、 man:putenv[3]、 man:setenv[3] 和 man:unsetenv[3] 改为符合 POSIX 之后的 7.0-CURRENT。 |700039 |May 1, 2007 |回退了 700038 中的变动之后的 7.0-CURRENT。 |700040 |May 10, 2007 |在 libutil 中增加了 man:flopen[3] 之后的 7.0-CURRENT。 |700041 |May 13, 2007 |启用了符号版本, 并将 libthr 改为默认线程库之后的 7.0-CURRENT。 |700042 |May 19, 2007 |引入了 gcc 4.2.0 之后的 7.0-CURRENT。 |700043 |May 21, 2007 |将 RELENG_6 之后未修改过版本的共享库版本增加之后的 7.0-CURRENT。 |700044 |June 7, 2007 |将 vn_open()/VOP_OPEN() 的参数由文件描述符数组下标改为 struct file * 之后的 7.0-CURRENT。 |700045 |June 10, 2007 |修改 man:pam_nologin[8] 使其向 PAM 框架提供帐号管理功能而非身份验证功能之后的 7.0-CURRENT。 |700046 |June 11, 2007 |更新 802.11 无线支持之后的 7.0-CURRENT。 |700047 |June 11, 2007 |增加 TCP LRO 网络接口能力之后的 7.0-CURRENT。 |700048 |June 12, 2007 |在 IPv4 协议栈中加入了 RFC 3678 API 支持之后的 7.0-CURRENT。 先前 IP_MULTICAST_IF ioctl 的 RFC 1724 行为被删去; 0.0.0.0/8 不再能够用于指定接口索引下标, 而应使用 struct ipmreqn 代替。 |700049 |July 3, 2007 |引入 OpenBSD 4.1 的 pf 之后的 7.0-CURRENT。 |(not changed) | |为 FAST_IPSEC 增加 IPv6 支持, 删去 KAME IPSEC, 并将 FAST_IPSEC 更名为 IPSEC 之后的 7.0-CURRENT。 (未变动) |700050 |July 4, 2007 |将 setenv/putenv/等等调用, 从传统 BSD 改为 POSIX 标准之后的 7.0-CURRENT。 |700051 |July 4, 2007 |增加新的 mmap/lseek/等等这些系统调用之后的 7.0-CURRENT。 |700052 |July 6, 2007 |将 I4B 头文件移动到 include/i4b 之后的 7.0-CURRENT。 |700053 |September 30, 2007 |增加了 PCI domain 支持之后的 7.0-CURRENT。 |700054 |October 25, 2007 |MFC 了宽字符和单字节字符 ctype 分拆之后的 7.0-CURRENT。 |700055 |October 28, 2007 |7.0-RELEASE, 以及 MFC 了恢复对 FreeBSD 4/5/6 版本的 PCIOCGETCONF、 PCIOCREAD 和 PCIOCWRITE IOCTL ABI 向下兼容之后的 7.0-CURRENT, 这一变动导致 PCIOCGETCONF IOCTL 的 ABI 再次发生变化。 |700100 |December 22, 2007 |7.0-RELEASE 之后的 7.0-STABLE |700101 |February 8, 2008 |MFC m_collapse() 之后的 7.0-STABLE。 |700102 |March 30, 2008 |MFC kdb_enter_why() 之后的 7.0-STABLE。 |700103 |April 10, 2008 |为 flock 结构加入 l_sysid 之后的 7.0-STABLE。 |700104 |April 11, 2008 |在 procstat(1) MFC 之后的 7.0-STABLE。 |700105 |April 11, 2008 |在 MFC umtx 特性之后的 7.0-STABLE。 |700106 |April 15, 2008 |为 man:psm[4] MFC man:write[2] 支持之后的 7.0-STABLE。 |700107 |April 20, 2008 |为 man:fcntl[2] MFC F_DUP2FD 之后的 7.0-STABLE。 |700108 |May 5, 2008 |对 man:lockmgr[9] 做了一些修改之后的 7.0-STABLE, 在使用 man:lockmgr[9] 时必需包含 [.filename]#sys/lock.h#。 |700109 |May 27, 2008 |MFC 了 `memrchr` 函数之后的 7.0-STABLE。 |700110 |August 5, 2008 |MFC 了内核 NFS locked 客户端之后的 7.0-STABLE。 |700111 |August 20, 2008 |加入了对物理连续巨帧支持之后的 7.0-STABLE。 |700112 |August 27, 2008 |在 MFC 内核 DTrace 支持之后的 7.0-STABLE。 |701000 |November 25, 2008 |7.1-RELEASE |701100 |November 25, 2008 |7.1-RELEASE 之后的 7.1-STABLE。 |701101 |January 10, 2009 |合并了 `strndup` 之后的 7.1-STABLE。 |701102 |January 17, 2009 |加入了 cpuctl(4) 支持之后的 7.1-STABLE。 |701103 |February 7, 2009 |合并了 多/无-IPv4/v6 jail 之后的 7.1-STABLE。 |701104 |February 14, 2009 |在 struct mount 中保存了挂起属主, 以及在 struct vfsops 中引入了 vfs_susp_clean 方法之后的 7.1-STABLE。 |701105 |March 12, 2009 |对 kern.ipc.shmsegs sysctl 变量不兼容的修改, 以允许在 64bit 构架上分配更多的 SysV 共享内存段之后的 7.1-STABLE。 |701106 |March 14, 2009 |合并了一个对 POSIX semaphore 等待操作修正之后的 7.1-STABLE。 |702000 |April 15, 2009 |7.2-RELEASE |702100 |April 15, 2009 |7.2-RELEASE 之后的 7.2-STABLE。 |702101 |May 15, 2009 |ichsmb(4) 改为使用左邻接辅编址来保持与其它 SMBus 控制器驱动一致性之后的 7.2-STABLE。 |702102 |May 28, 2009 |MFC 了 `fdopendir` 函数之后的 7.2-STABLE。 |702103 |June 06, 2009 |MFC 了 PmcTools 之后的 7.2-STABLE。 |702104 |July 14, 2009 |MFC 了 `closefrom` 系统调用之后的 7.2-STABLE。 |702105 |July 31, 2009 |MFC 了 SYSVIPC ABI 改动之后的 7.2-STABLE。 |702106 |September 14, 2009 |MFC 了 x86 PAT 增强, 并新增了 d_mmap_single() 以及 scatter/gather 型 VM 对象类型之后的 7.2-STABLE。 |703000 |February 9, 2010 |7.3-RELEASE |703100 |February 9, 2010 |7.3-RELEASE 之后的 7.3-STABLE。 |704000 |December 22, 2010 |7.4-RELEASE |704100 |December 22, 2010 |7.4-RELEASE 之后的 7.4-STABLE。 |800000 |October 11, 2007 |8.0-CURRENT。 分拆了宽字符和单字节字符 ctype。 |800001 |October 16, 2007 |引入了 libpcap 0.9.8 和 tcpdump 3.9.8 之后的 8.0-CURRENT。 |800002 |October 21, 2007 |将 kthread_create() 系列函数改名为 kproc_create() 之后的 8.0-CURRENT。 |800003 |October 24, 2007 |恢复了对 FreeBSD 4/5/6 版本的 PCIOCGETCONF、 PCIOCREAD 和 PCIOCWRITE IOCTL ABI 向下兼容之后的 8.0-CURRENT, 这一变动导致 PCIOCGETCONF IOCTL 的 ABI 再次发生变化。 |800004 |November 12, 2007 |将 agp(4) 驱动从 src/sys/pci 挪到 src/sys/dev/agp 之后的 8.0-CURRENT。 |800005 |December 4, 2007 |http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/kern/kern_mbuf.c#rev1.35[修改了 jumbo frame 分配器之后的] 8.0-CURRENT。 |800006 |December 7, 2007 |在给 man:hwpmc[4] 加入了 callgraph 捕捉功能后的 8.0-CURRENT |800007 |December 25, 2007 |kdb_enter() 增加 "why" 参数之后的 8.0-CURRENT。 |800008 |December 28, 2007 |在去除 LK_EXCLUPGRADE 选项后的 8.0-CURRENT。 |800009 |January 9, 2008 |引入 man:lockmgr_disown[9] 之后的 8.0-CURRENT。 |800010 |January 10, 2008 |修改 man:vn_lock[9] 原型之后的 8.0-CURRENT。 |800011 |January 13, 2008 |修改 man:VOP_LOCK[9] 和 man:VOP_UNLOCK[9] 原型之后的 8.0-CURRENT。 |800012 |January 19, 2008 |引入 man:lockmgr_recursed[9]、 man:BUF_RECURSED[9] 和 man:BUF_ISLOCKED[9] 并删除了 `BUF_REFCNT()` 之后的 8.0-CURRENT。 |800013 |January 23, 2008 |引入 "ASCII" 编码之后的 8.0-CURRENT。 |800014 |January 24, 2008 |修改 man:lockmgr[9] 并删除了 `lockcount()` 和 `LOCKMGR_ASSERT()` 之后的 8.0-CURRENT。 |800015 |January 26, 2008 |扩展了 man:fts[3] 数据结构之后的 8.0-CURRENT。 |800016 |February 1, 2008 |为 MEXTADD(9) 增加了一个参数之后的 8.0-CURRENT。 |800017 |February 6, 2008 |为 man:lockmgr[9] 引入 LK_NODUP 和 LK_NOWITNESS 选项后的 8.0-CURRENT。 |800018 |February 8, 2008 |引入 m_collapse 之后的 8.0-CURRENT。 |800019 |February 9, 2008 |为 sysctl 变量 kern.proc.filedesc 加入 当前工作目录,root 目录和 jail 目录支持之后的 8.0-CURRENT。 |800020 |February 13, 2008 |引入 man:lockmgr_assert[9] 之后的 8.0-CURRENT。 |800021 |February 15, 2008 |引入 man:lockmgr_args[9] 和移除 LK_INTERNAL 标志之后的 8.0-CURRENT。 |800022 |(backed out) |把 BSD man:ar[1] 作为系统默认的 ar 之后的 8.0-CURRENT。 |800023 |February 25, 2008 |修改了 man:lockstatus[9] 和 man:VOP_ISLOCKED[9]; 原型,特别时去掉 `struct thread` 参数之后的 8.0-CURRENT。 |800024 |March 1, 2008 |砍掉了 `lockwaiters` 和 `BUF_LOCKWAITERS` 函数, `brelvp` 的返回值从 void 修改成 int,并引入 man:lockinit[9] 新标志之后的 8.0-CURRENT。 |800025 |March 8, 2008 |为 man:fcntl[2] 引入 F_DUP2FD 之后的 8.0-CURRENT。 |800026 |March 12, 2008 |修改了 cv_broadcastpri 优先权参数之后的 8.0-CURRENT,比如 0 表示无优先权。 |800027 |March 24, 2008 |修改了 bpf 监测 ABI, 加入了 zerocopy bpf buffer 之后的 8.0-CURRENT。 |800028 |March 26, 2008 |为 flock 结构增加了 l_sysid 之后的 8.0-CURRENT。 |800029 |March 28, 2008 |重新整合了 `BUF_LOCKWAITERS` 函数并加入 man:lockmgr_waiters[9] 之后的 8.0-CURRENT。 |800030 |April 1, 2008 |引入 man:rw_try_rlock[9] 和 man:rw_try_wlock[9] 之后的 8.0-CURRENT。 |800031 |April 6, 2008 |引入 `lockmgr_rw` 和 `lockmgr_args_rw` 函数之后的 8.0-CURRENT。 |800032 |April 8, 2008 |实现了 openat 和相关的系统调用,为 man:open[2] 引入了 O_EXEC 标志,和提供了相应的 linux 兼容的系统调用之后的 8.0-CURRENT。 |800033 |April 8, 2008 |为 man:psm[4] 增加了原生的 man:write[2] 支持之后的 8.0-CURRENT。 现在任意命令可写入 [.filename]#/dev/psm%d# 并读出状态。 |800034 |April 10, 2008 |引入 `memrchr` 函数之后的 8.0-CURRENT。 |800035 |April 16, 2008 |引入 `fdopendir` 函数之后的 8.0-CURRENT |800036 |April 20, 2008 |无线部分转向 multi-bss (也叫做 vaps) 支持之后的 8.0-CURRENT。 |800037 |May 9, 2008 |加入多路由表支持 (也就是 setfib(1)、 stfib(2)) 后的 8.0-CURRENT。 |800038 |May 26, 2008 |删去了 netatm 和 ISDN4BSD 后的 8.0-CURRENT。 这个版本也表示增加了 Compact C Type (CTF) 工具。 |800039 |June 14, 2008 |移除 sgtty 之后的 8.0-CURRENT。 |800040 |June 26, 2008 |增加了内核级 NFS lockd 客户端的 8.0-CURRENT。 |800041 |July 22, 2008 |增加了 arc4random_buf(3) 和 arc4random_uniform(3) 之后的 8.0-CURRENT。 |800042 |August 8, 2008 |增加了 cpuctl(4) 之后的 8.0-CURRENT。 |800043 |August 13, 2008 |修改 bpf(4) 使用单一的设备节点而不是克隆之后的 8.0-CURRENT。 |800044 |August 17, 2008 |在提交了 vimage 项目第一步之后的 8.0-CURRENT。把全局变量重命名为虚拟化带 V_ 前缀并用宏映射到原来的全局名称。 |800045 |August 20, 2008 |引入 MPSAFE TTY 层之后的 8.0-CURRENT, 包括对相关驱动和工具的修改。 |800046 |September 8, 2008 |将 amd64 架构上 GDT 拆分到不同 CPU 之后的 8.0-CURRENT。 |800047 |September 10, 2008 |删去了 VSVTX、 VSGID 和 VSUID 之后的 8.0-CURRENT。 |800048 |September 16, 2008 |将内核中 NFS 挂接部分的代码改为能够通过 nmount() iovec, 而不再是大的 nfs_args 结构体作为参数之后的 8.0-CURRENT。 |800049 |September 17, 2008 |删去了 man:suser[9] 和 man:suser_cred[9] 之后的 8.0-CURRENT。 |800050 |October 20, 2008 |修改了缓冲存储器 API 之后的 8.0-CURRENT。 |800051 |October 23, 2008 |删去了 man:MALLOC[9] 和 man:FREE[9] 宏之后的 8.0-CURRENT。 |800052 |October 28, 2008 |引入了 accmode_t 和重新命名 VOP_ACCES 'a_mode' 为 a_accmode 之后的 8.0-CURRENT。 |800053 |November 2, 2008 |修改了 man:vfs_busy[9] 原型并引入了 MBF_NOWAIT 和 MBF_MNTLSTLOCK 标志之后的 8.0-CURRENT。 |800054 |November 22, 2008 |增加了 buf_ring、 内存栅以及 ifnet 函数, 以方便撰写支持多硬件传输队列的驱动, 以及无锁环形缓冲实现的驱动程序, 并更高效地管理包队列功能之后的 8.0-CURRENT。 |800055 |November 27, 2008 |引入了 man:hwpmc[4] 对于 Intel(TM) Core,Core2 和 Atom 的支持之后的 8.0-CURRENT。 |800056 |November 29, 2008 |引入了 multi-/no-IPv4/v6 jail 之后的 8.0-CURRENT。 |800057 |December 1, 2008 |将 ath hal 改为使用源代码之后的 8.0-CURRENT。 |800058 |December 12, 2008 |引入了 VOP_VPTOCNP 操作之后的 8.0-CURRENT。 |800059 |December 15, 2008 |引入了新的 arp-v2 重写之后的 8.0-CURRENT。 |800060 |December 19, 2008 |引入了 makefs 之后的 8.0-CURRENT。 |800061 |January 15, 2009 |引入了 TCP Appropriate Byte Counting 之后的 8.0-CURRENT。 |800062 |January 28, 2009 |删去了 minor()、 minor2unit()、 unit2minor() 等之后的 8.0-CURRENT。 |800063 |February 18, 2009 |在 GENERIC 配置中改为使用 USB2 栈之后的 8.0-CURRENT; 这个数值同时也标志新增了 fdevname(3)。 |800064 |February 23, 2009 |将 USB2 栈移动并替换 dev/usb 之后的 8.0-CURRENT。 |800065 |February 26, 2009 |在对 libmp(3) 中所有函数更名之后的 8.0-CURRENT。 |800066 |February 27, 2009 |更改了 USB devfs 管理和布局之后的 8.0-CURRENT。 |800067 |February 28, 2009 |加入了 getdelim(), getline(), stpncpy(), strnlen(), wcsnlen(), wcscasecmp(), 和 wcsncasecmp() 之后的 8.0-CURRENT。 |800068 |March 2, 2009 |在 usbhub devclass 更名为 uhub 之后的 8.0-CURRENT。 |800069 |March 9, 2009 |重命名 libusb20.so.1 为 libusb.so.1 之后的 8.0-CURRENT。 |800070 |March 9, 2009 |合并 IGMPv3 和 Source-Specific Multicast (SSM) 入 IPv4 栈之后的 8.0-CURRENT。 |800071 |March 14, 2009 |为 gcc 打上了在 c99 和 gnu99 模式中使用 C99 inline 语义补丁之后的 8.0-CURRENT。 |800072 |March 15, 2009 |移除了 IFF_NEEDSGIANT 标志; 不再支持非线程安全的网络设备驱动之后的 8.0-CURRENT。 |800073 |March 18, 2009 |实现了 rpath 动态字符替换之后的 8.0-CURRENT. |800074 |March 24, 2009 |引入了 tcpdump 4.0.0 和 libpcap 1.0.0 之后的 8.0-CURRENT。 |800075 |April 6, 2009 |修改了 structs vnet_net、 vnet_inet 和 vnet_ipfw 结构布局之后的 8.0-CURRENT。 |800076 |April 9, 2009 |为 dummynet 新增了延迟评估工具之后的 8.0-CURRENT。 |800077 |April 14, 2009 |删去了 VOP_LEASE() 和 vop_vector.vop_lease 之后的 8.0-CURRENT |800078 |April 15, 2009 |在 struct rt_metrics 和 struct rt_metrics_lite 中添加了 rt_weight 字段, 导致其结构发生变化之后的 8.0-CURRENT。 此后 RTM_VERSION 增加, 但又回退了。 |800079 |April 15, 2009 |在 struct route 和 struct_in6 中添加了 struct llentry 指针之后的 8.0-CURRENT。 |800080 |April 15, 2009 |改变了 struct inpcb 布局之后的 8.0-CURRENT。 |800081 |April 19, 2009 |改变了 malloc_type 布局之后的 8.0-CURRENT。 |800082 |April 21, 2009 |改变了 struct ifnet 布局, 并增加了 if_ref() 和 if_rele() 引用计数维护功能之后的 8.0-CURRENT。 |800083 |April 22, 2009 |实现了底层蓝牙 HCI API 之后的 8.0-CURRENT。 |800084 |April 29, 2009 |修改了 IPv6 SSM 和 MLDv2 之后的 8.0-CURRENT。 |800085 |April 30, 2009 |启用了包括一个活跃映像的 VIMAGE 内核支持之后的 8.0-CURRENT。 |800086 |May 8, 2009 |为 patch(1) 增加任意长输入行支持之后的 8.0-CURRENT。 |800087 |May 11, 2009 |修改了一些 VFS KPI 之后的 8.0-CURRENT。 VFS 的 FSD 部分中删去了线程参数。 `VFS_*` 函数并不需要这些上下文信息, 因为它总是与 `curthread` 相关。 在某些特殊情况中, 则保留了原先的行为。 |800088 |May 20, 2009 |对 net80211 监视模式进行调整之后的 8.0-CURRENT。 |800089 |May 23, 2009 |增加了 UDP 控制块支持之后的 8.0-CURRENT。 |800090 |May 23, 2009 |将网络接口克隆虚拟化之后的 8.0-CURRENT。 |800091 |May 27, 2009 |增加了层次式 jail 并取消全局 securelevel 之后的 8.0-CURRENT。 |800092 |May 29, 2009 |修改了 `sx_init_flags()` KPI 之后的 8.0-CURRENT。 [constant]#SX_ADAPTIVESPIN# 退役, 而新增的 [constant]#SX_NOADAPTIVE# 标志则表达相反语义。 |800093 |May 29, 2009 |为 struct mount 增加 mnt_xflag 之后的 8.0-CURRENT。 |800094 |May 30, 2009 |新增了 man:VOP_ACCESSX[9] 之后的 8.0-CURRENT。 |800095 |May 30, 2009 |调整轮询 KPI (polling KPI) 之后的 8.0-CURRENT。 轮询处理程序会返回处理过的包的数量。 新增的 [constant]#IFCAP_POLLING_NOCOUNT# 则表示返回值不重要, 并跳过计数。 |800096 |June 1, 2009 |对新的 netisr 进行了改进, 并调整了保存和存取 FIB 方式之后的 8.0-CURRENT。 |800097 |June 8, 2009 |引入了 vnet 析构挂钩和相关基础设施之后的 8.0-CURRENT。 |800097 |June 11, 2009 |引入了 netgraph 输出到输入路径调用检测和排队机制, 并调整了 struct thread 布局之后的 8.0-CURRENT。 |800098 |June 14, 2009 |引入了 OpenSSL 0.9.8k 之后的 8.0-CURRENT。 |800099 |June 22, 2009 |更新了 NGROUPS 并将路由虚拟化挪到它自己的 VImage 模块之后的 8.0-CURRENT。 |800100 |June 24, 2009 |修改了 SYSVIPC ABI 之后的 8.0-CURRENT。 |800101 |June 29, 2009 |删去了与网络接口一一对应的 /dev/net/* 字符设备之后的 8.0-CURRENT。 |800102 |July 12, 2009 |在 struct sackhint、 struct tcpcb 以及 struct tcpstat 上增加占位元素之后的 8.0-CURRENT。 |800103 |July 13, 2009 |将 TOE 驱动接口中的 struct tcpopt 替换为 TCP syncache 中的 struct toeopt 之后的 8.0-CURRENT。 |800104 |July 14, 2009 |新增了基于 linker-set 的 per-vnet 分配器之后的 8.0-CURRENT。 |800105 |July 19, 2009 |递增了所有未使用符号版本的动态连接库版本之后的 8.0-CURRENT。 |800106 |July 24, 2009 |引入 VM 对象类型 OBJT_SG 之后的 8.0-CURRENT。 |800107 |August 2, 2009 |通过加入 newbus sxlock 使 newbus 子系统不再使用 Giant, 以及 8.0-RELEASE。 |800108 |November 21, 2009 |实现了 EVFILT_USER kevent 过滤器之后的 8.0-STABLE。 |800500 |January 7, 2010 |令 `pkg_add -r` 使用 packages-8-stable 的 `__FreeBSD_version` 版本变化的 8.0-STABLE。 |800501 |January 24, 2010 |调整了 `scandir(3)` 和 `alphasort(3)` 函数原型, 使其符合 SUSv4 之后的 8.0-STABLE。 |800502 |January 31, 2010 |新增了 `sigpause(3)` 之后的 8.0-STABLE。 |800503 |February 25, 2010 |新增了用于管理网络接口说明的 SIOCGIFDESCR 和 SIOCSIFDESCR ioctl 之后的 8.0-STABLE。 这组接口受到了 OpenBSD 的启发。 |800504 |March 1, 2010 |MFC 了 x86emu, 来自 OpenBSD 的 x86 CPU 实模式模拟器之后的 8.0-STABLE。 |800505 |May 18, 2010 |MFC 了添加 liblzma, xz, xzdec 以及 lzmainfo 之后的 8.0-STABLE。 |801000 |June 14, 2010 |8.1-RELEASE |801500 |June 14, 2010 |8.1-RELEASE 之后的 8.1-STABLE。 |801501 |November 3, 2010 |用于 PL_FLAG_SCE/SCX/EXEC/SI 的 struct sysentvec 的 KBI 以及 用于 ptrace(PT_LWPINFO) 的 pl_siginfo 的 KBI 改变之后的 8.1-STABLE。 |802000 |December 22, 2010 |8.2-RELEASE |802500 |December 22, 2010 |8.2-RELEASE 之后的 8.2-STABLE。 |802501 |February 28, 2011 |合并了 DTrace 变动, 包含用户态跟踪支持之后的 8.2-STABLE。 |802502 |March 6, 2011 |在 libm 中合并了 log2 和 log2f 之后的 8.2-STABLE。 |802503 |May 1, 2011 |将 gcc 升级至 FSF gcc-4_2-branch 最后一个 GPLv2 版本之后的 8.2-STABLE。 |802504 |May 28, 2011 |引入模块化拥塞控制支持基础设施和 KPI 之后的 8.2-STABLE。 |802505 |May 28, 2011 |引入了 Hhook 和 Khelp KPI 之后的 8.2-STABLE。 |802506 |May 28, 2011 |在 tcpcb 结构中增加 OSD 之后的 8.2-STABLE。 |802507 |June 6, 2011 |引入 ZFS v28 之后的 8.2-STABLE。 |802508 |June 8, 2011 |删去了 sv_schedtail struct sysvec 方法之后的 8.2-STABLE。 |802509 |July 14, 2011 |在 binutils 中合并了 SSE3 支持之后的 8.2-STABLE。 |802510 |July 19, 2011 |为 `rfork(2)` 添加了 RFTSIGZMB 标志之后的 8.2-STABLE。 |900000 |August 22, 2009 |9.0-CURRENT。 |900001 |September 8, 2009 |引入了 x86emu, 来自 OpenBSD 的 x86 CPU 实模式模拟器之后的 9.0-CURRENT。 |900002 |September 23, 2009 |实现了 EVFILT_USER kevent 过滤器之后的 9.0-CURRENT。 |900003 |December 2, 2009 |新增了 `sigpause(3)` 以及 csu 的 PIE 支持之后的 9.0-CURRENT。 |900004 |December 6, 2009 |新增了 libulog 及其 libutempter 兼容接口之后的 9.0-CURRENT。 |900005 |December 12, 2009 |新增了用于查询指定休眠队列上等待者数量的 `sleepq_sleepcnt()` 函数之后的 9.0-CURRENT。 |900006 |January 4, 2010 |调整了 `scandir(3)` 和 `alphasort(3)` 函数原型, 使其符合 SUSv4 之后的 9.0-CURRENT。 |900007 |January 13, 2010 |删去了 utmp(5) 并增加了 utmpx (参阅 `getutxent(3)`) 以改善用户登录日志和系统事件支持之后的 9.0-CURRENT。 |900008 |January 20, 2010 |9.0-CURRENT 引入了 BSD 授权的 bc/dc 并将 GNU bc/dc 标注为过时之后的 9.0-CURRENT。 |900009 |January 26, 2010 |新增了用于管理网络接口说明的 SIOCGIFDESCR 和 SIOCSIFDESCR ioctl 之后的 9.0-CURRENT。 这组接口受到了 OpenBSD 的启发。 |900010 |March 22, 2010 |引入了 zlib 1.2.4 之后的 9.0-CURRENT。 |900011 |April 24, 2010 |添加了 soft-updates 日志功能之后的 9.0-CURRENT。 |900012 |May 10, 2010 |添加了 liblzma, xz, xzdec 以及 lzmainfo 之后的 9.0-CURRENT。 |900013 |May 24, 2010 |添加了针对 linux(4) 的 USB 修正之后的 9.0-CURRENT。 |900014 |Jun 10, 2010 |添加了 Clang 之后的 9.0-CURRENT。 |900015 |July 22, 2010 |引入了 BSD grep 之后的 9.0-CURRENT。 |900016 |July 28, 2010 |在 struct malloc_type_internal 中加入了 mti_zone 之后的 9.0-CURRENT。 |900017 |August 23, 2010 |默认 grep 改回使用 GNU grep 并增加 WITH_BSD_GREP 开关之后的 9.0-CURRENT。 |900018 |August 24, 2010 |将 `pthread_kill(3)` 产生的信号在 si_code 中改为使用 SI_LWP 标记之后的 9.0-CURRENT。 之前, si_code 对应的标志为 SI_USER。 |900019 |August 28, 2010 |为 `mmap(2)` 新增了 MAP_PREFAULT_READ 标志之后的 9.0-CURRENT。 |900020 |September 9, 2010 |为 sbuf 增加了 drain 功能并改变了 struct sbuf 布局之后的 9.0-CURRENT。 |900021 |September 13, 2010 |DTrace 增加用户态跟踪支持之后的 9.0-CURRENT。 |900022 |October 2, 2010 |新增了 BSDL man 工具, 并淘汰 GNU/GPL man 工具之后的 9.0-CURRENT。 |900023 |October 11, 2010 |引入 20101010 git 快照版本 xz 之后的 9.0-CURRENT。 |900024 |November 11, 2010 |将 libgcc.a 替换为 libcompiler_rt.a 之后的 9.0-CURRENT。 |900025 |November 12, 2010 |引入了模块化拥塞控制之后的 9.0-CURRENT。 |900026 |November 30, 2010 |引入串行管理协议 (SMP) 直通, 以及与之对应的 CAM CCB XPT_SMP_IO 和 XPT_GDEV_ADVINFO 之后的 9.0-CURRENT。 |900027 |December 5, 2010 |在 libm 中增加 log2 之后的 9.0-CURRENT。 |900028 |December 21, 2010 |添加了 Hhook (Helper Hook)、 Khelp (Kernel Helpers) 和 Object Specific Data (OSD) KPI 之后的 9.0-CURRENT。 |900029 |December 28, 2010 |修改 TCP 协议栈使其允许 Khelp 模块通过 helper hook 指针, 与 TCP 控制块交互并保存连接数据之后的 9.0-CURRENT。 |900030 |January 12, 2011 |将 libdialog 更新至版本 20100428 之后的 9.0-CURRENT。 |900031 |February 7, 2011 |添加了 `pthread_getthreadid_np(3)` 之后的 9.0-CURRENT。 |900032 |February 8, 2011 |删除了 uio_yield 函数原型和符号之后的 9.0-CURRENT。 |900033 |February 18, 2011 |将 binutils 更新至 2.17.50 之后的 9.0-CURRENT。 |900034 |March 8, 2011 |修改了 struct sysvec (sv_schedtail) 之后的 9.0-CURRENT。 |900035 |March 29, 2011 |将基本系统中 gcc 和 libstdc++ 升级至最后的 GPLv2 授权版本之后的 9.0-CURRENT。 |900036 |April 18, 2011 |在基本系统中删去了 libobjc 和 Objective-C 支持之后的 9.0-CURRENT。 |900037 |May 13, 2011 |在基本系统中引入了 libprocstat(3) 函数库以及 fuser(1) 工具之后的 9.0-CURRENT。 |900038 |May 22, 2011 |为 VFS_FHTOVP(9) 添加锁标志参数之后的 9.0-CURRENT。 |900039 |June 28, 2011 |引入了来自 OpenBSD 4.5 的 pf 之后的 9.0-CURRENT。 |900040 |July 19, 2011 |将 amd64 和 ia64 平台上的 MAXCPU 提高到 64, 并把 XLP (mips) 上的值提高到 128 之后的 9.0-CURRENT。 |900041 |August 13, 2011 |实现了 Capsicum capabilities 之后的 9.0-CURRENT。 fget(9) 新增了权限参数。 |900042 |August 28, 2011 |提高修改过 ABI 的动态连接库版本号之后的 9.0-CURRENT。 |900043 |September 2, 2011 |增加了对不支持 SCSI 快取缓存同步功能的 USB 大容量存储设备自动检测功能之后的 9.0-CURRENT。 |900044 |September 10, 2011 |重构了 auto-quirk 之后的 9.0-CURRENT。 |900045 |Oct 13, 2011 |将非兼容性系统调用入口点全部增加 sys_ 前缀之后的 9.0-CURRENT。 |=== [NOTE] ==== 请注意, 2.2.5-RELEASE 之后有一段时间的 2.2-STABLE 会声称自己是 "2.2.5-STABLE"。 这种模式的版本号表示的是年月。 但随后, 我们决定, 从 2.2 开始, 将它改为更为简洁的 主/次 版本号的形式来命名版本。 这是因为并行地在多个分支上进行开发, 使得通过实际的发布日期来区分不同的版本变得不再现实。 如果您正在做新的 port, 应该不需要担心较早的 -CURRENT; 在此列出仅供参考。 ==== [[dads-after-port-mk]] == 在 [.filename]#bsd.port.mk# 之后写一些内容 不要在 `.include ` 这行之后增加任何内容。 这通常可以通过在您的 [.filename]#Makefile# 中间的某处引用 [.filename]#bsd.port.pre.mk#, 并在结尾的地方引用 [.filename]#bsd.port.post.mk# 来避免。 [NOTE] ==== 只能够采用 [.filename]#bsd.port.pre.mk#/[.filename]#bsd.port.post.mk# 或 [.filename]#bsd.port.mk# 两种写法之一; 任何时候都不要同时使用两种写法。 ==== [.filename]#bsd.port.pre.mk# 只定义了很少的变量, 它们可以在 [.filename]#Makefile# 中用于进行一些测试, 而 [.filename]#bsd.port.post.mk# 则定义了所有其它的变量。 下面是一些由 [.filename]#bsd.port.pre.mk# 定义的比较重要的变量 (这并不是一份完整的列表, 您可以阅读 [.filename]#bsd.port.mk# 以获得全部变量的名字)。 [.informaltable] [cols="1,1", frame="none", options="header"] |=== | 变量 | 描述 |`ARCH` |由 `uname -m` 输出得到的硬件架构的名字 (例如, `i386`) |`OPSYS` |由 `uname -s` 返回的操作系统类型 (例如, `FreeBSD`) |`OSREL` |操作系统的版本号 (例如 `2.1.5` 或 `2.2.7`) |`OSVERSION` |操作系统的版本号的数值形式; 它等于 <>。 |`PORTOBJFORMAT` |系统默认的执行文件格式 (`elf` 或 `aout`; 请注意, "现代的" FreeBSD 版本中, `aout` 已在淘汰之列。) |`LOCALBASE` |"local" 目录的根 (例如, `/usr/local/`) |`PREFIX` |port 应被安装到哪里 (参见 <>)。 |=== [NOTE] ==== 如果您需要定义 `USE_IMAKE`, `USE_X_PREFIX`, 或 `MASTERDIR` 这些变量, 则应在引用 [.filename]#bsd.port.pre.mk# 之前完成。 ==== 下面是一些在引用 [.filename]#bsd.port.pre.mk# 之后可以进行的判断: [.programlisting] .... # 如果 perl5 已经在系统中提供, 则不必编译 lang/perl5 .if ${OSVERSION} > 300003 BROKEN= perl is in system .endif # ELF 只使用一个 shlib 版本 .if ${PORTOBJFORMAT} == "elf" TCL_LIB_FILE= ${TCL_LIB}.${SHLIB_MAJOR} .else TCL_LIB_FILE= ${TCL_LIB}.${SHLIB_MAJOR}.${SHLIB_MINOR} .endif # 软件会自动为 ELF 创建符号链接, 但 a.out 则需要另行创建 post-install: .if ${PORTOBJFORMAT} == "aout" ${LN} -sf liblinpack.so.1.0 ${PREFIX}/lib/liblinpack.so .endif .... 您还记得应该在 `BROKEN=` 和 `TCL_LIB_FILE=` 后面使用制表符, 而不是空格, 对吧? :-) [[dads-sh-exec]] == 在 wrapper 脚本中使用 `exec` 语句 如果 port 安装了用以启动其他程序的脚本, 并且运行其他程序是这些脚本的最后一项操作, 请务必使用 `exec` 语句来运行这些程序, 例如: [.programlisting] .... #!/bin/sh exec %%LOCALBASE%%/bin/java -jar %%DATADIR%%/foo.jar "$@" .... 使用 `exec` 语句表示执行指定的程序来取代 shell 进程。 如果省略了 `exec`, 则 shell 进程会一直在内存中, 从而不必要地消耗了额外的系统资源。 [[dads-rational]] == 理性行事 任何 [.filename]#Makefile# 都应该简单并理性地行事。 如果您能让其中的条目更为简单和易读, 一定要这样做。 例如, 使用 make 提供的 `.if` 结构, 而不要使用 shell 的 `if`, 只要能重定义 `EXTRACT*` 就不要重载 `do-extract`, 尽量使用 `GNU_CONFIGURE` 而不是 `CONFIGURE_ARGS += --prefix=${PREFIX}`。 如果您在尝试做什么事情的时候发现不得不写大量的代码, 请回过头来复审一下 [.filename]#bsd.port.mk#, 看看是否有您正打算做的事情的现成实现。 尽管读起来可能很费劲, 但有很多貌似很难的问题, 在 [.filename]#bsd.port.mk# 中都给出了十分简便的解决方案。 [[dads-cc]] == 遵循 `CC` 和 `CXX` 设置 port 应遵循 `CC` 和 `CXX` 变量的设置。 这也就是说, port 不应使用绝对的方式来设置这个变量的值, 而罔顾已经存在的设置; 与此相反, 它应该在其值后加入需要的其它值。 这样, 就可以设置全局的联编选项, 令其影响所有的 port 联编过程了。 如果实在无法这样做, 请在 [.filename]#Makefile# 中加入 `NO_PACKAGE=ignores cflags`。 下面的 [.filename]#Makefile# 实例给出了如何遵循 `CC` 和 `CXX` 变量的设置。 注意这里用到的 `?=`: [.programlisting] .... CC?= gcc .... [.programlisting] .... CXX?= g++ .... 下面则是没有遵循 `CC` 和 `CXX` 的例子: [.programlisting] .... CC= gcc .... [.programlisting] .... CXX= g++ .... 在 FreeBSD 系统中, `CC` 和 `CXX` 这两个变量都可以在 [.filename]#/etc/make.conf# 中自行定义。 第一个例子只有在 [.filename]#/etc/make.conf# 中没有定义时才对这两个变量进行定义, 从而保持了系统范围的配置。 而第二个例子则会覆盖任何现有的配置。 [[dads-cflags]] == 遵循 `CFLAGS` 您的 port 应遵循 `CFLAGS` 变量的设置。 这也就是说, port 不应使用绝对的方式来设置这个变量的值, 而罔顾已经存在的设置; 与此相反, 它应该在其值后加入需要的其它值, 这样, 就可以设置全局的联编选项, 令其影响所有的 port 联编过程了。 如果实在无法这样做, 请在 [.filename]#Makefile# 中加入 `NO_PACKAGE=ignores cflags`。 下面的 [.filename]#Makefile# 例子, 可以帮助我们理解如何遵循 `CFLAGS` 的设置。 注意所用的 `+=`: [.programlisting] .... CFLAGS+= -Wall -Werror .... 下面是一个未能遵循 `CFLAGS` 设置的例子: [.programlisting] .... CFLAGS= -Wall -Werror .... 一般来说, `CFLAGS` 在 FreeBSD 系统中是在 [.filename]#/etc/make.conf# 里配置的。 第一个例子在 `CFLAGS` 变量中增加了一些参数, 并保持了所有系统预定义的标志。 而第二个例子, 则会覆盖掉任何先前定义的参数。 您应从第三方软件的 [.filename]#Makefile# 中去掉特殊的优化设置。 系统的 `CFLAGS` 给出了全系统范围内的优化设置参数。 下面是一个未经修改的 [.filename]#Makefile# 实例: [.programlisting] .... CFLAGS= -O3 -funroll-loops -DHAVE_SOUND .... 如果使用系统的优化参数, 则 [.filename]#Makefile# 中的设置应该类似下面这样: [.programlisting] .... CFLAGS+= -DHAVE_SOUND .... [[dads-pthread]] == 线程库 在 FreeBSD 上, 线程库必须通过特殊的连接器参数 `-pthread` 连接到可执行文件。 如果 port 一定要直接连接 `-lpthread` 或 `-lc_r`, 则应将其改为使用由 ports 框架提供的 `PTHREAD_LIBS`。 这个变量的值通常是 `-pthread`, 但在某些特定平台上的 FreeBSD 版本中, 它可能是其它值, 因此, 不要将 `-pthread` 硬编码到您的补丁中, 而应使用 `PTHREAD_LIBS` 变量。 [NOTE] ==== 如果设置了 `PTHREAD_LIBS`, 而在联编时出现 `unrecognized option '-pthread'` 这样的错误, 可能需要通过将 `CONFIGURE_ENV` 设为 `LD=${CC}` 来使用 `gcc` 作为连接器。 `-pthread` 这一选项并不为 `ld` 所直接支持。 ==== [[dads-freedback]] == 反馈 如果进行了一些很好的修改和补丁, 一定要把它们发回给原作者, 或维护者, 以便在下一版本的代码中包含它们。 这会让您在软件发布新版本的时候变得轻松一些。 [[dads-readme]] == [.filename]#README.html# 不要包含 [.filename]#README.html# 文件。 这个文件并非 CVS 代码库中的一部分, 它是由 `make readme` 命令生成的。 [[dads-noinstall]] == 使用 `BROKEN`、 `FORBIDDEN` 或 `IGNORE` 阻止用户安装 port 某些时候会需要阻止用户安装某个 port。 想要告诉用户某个 port 不应被安装, 有许多可以在 port 的 [.filename]#Makefile# 中使用的 `make` 变量。 下列 `make` 的值, 将是在用户试图安装时得到的提示信息。 务请使用正确的 `make` 变量, 因为每一个都表达了截然不同的意义, 而且许多自动化系统, 例如 <>、 <>, 以及 <>, 都依赖于 [.filename]#Makefile# 的正确性。 [[dads-noinstall-variables]] === 变量 * `BROKEN` 专门用于表达目前无法正确编译、 安装或卸载这类问题。 如果是临时性的问题, 则可以使用它。 + 如果进行了相关的配置, 则联编集群仍将尝试联编它, 以确认导致问题的深层问题是否已被解决。 (不过, 一般情况下, 联编集群并不会这样做。) + 举例来说, 当 port 发生下述情况时, 应使用 `BROKEN`: ** 无法编译 (does not compile) ** 无法正确进行配置或安装操作 ** 在 [.filename]#${LOCALBASE}# 以外的地方安装文件 ** 卸载时无法删除所安装的全部文件 (不过, 留下用户改过的文件可接受的, 因为可能希望这样作) * `FORBIDDEN` 用于表示 ports 中包含安全漏洞, 或者可能会给安装了这个 port 的 FreeBSD 系统带来严重的安全隐患 (例如: 一个很不安全的程序, 或包含了能够被轻易攻陷的服务的软件)。 如果发现了安全漏洞, 而其作者没有发布升级版本, 则应立即把那个 port 标记为 `FORBIDDEN`。 理想情况下, 包含安全漏洞的 port 应被尽快升级, 以便减少包含漏洞的 FreeBSD 主机的数量 (我们希望保持良好的安全记录), 然而, 有时在安全漏洞的披露和软件更新之间可能会有一个间隔, 此时应予以说明。 除了安全之外, 请不要以任何其它理由将 port 标记为 `FORBIDDEN`。 * `IGNORE` 用来表示 port 由于某些其它原因不应予以联编。 如果认为发生了结构性的问题, 则应使用它。 任何情况下, 联编集群都不会联编标记为 `IGNORE` 的 port。 以下是使用 `IGNORE` 的一些例子: ** 能够编译但无法正常运行 ** 无法与运行的 FreeBSD 版本一同工作 ** 联编时需要 FreeBSD 内核的源代码, 但用户没有安装它们 ** 由于授权原因, 必须手工下载 distfile ** 无法与的某个已安装的 port 一同工作 (例如, port 依赖于 package:www/apache21[] 而安装的则是 package:www/apache13[]) + [NOTE] ==== 如果 port 与某个已经安装的 port 冲突 (例如, 它们在同一位置安装同名但功能不同的文件), 则应 <>。 `CONFLICTS` 将自动地设置 `IGNORE`。 ==== * 如果 port 只应在某些平台上标记为 `IGNORE`, 还有另外两个方便使用的 `IGNORE` 变量可供选择: `ONLY_FOR_ARCHS` 和 `NOT_FOR_ARCHS`。 例如: + [.programlisting] .... ONLY_FOR_ARCHS= i386 amd64 .... + [.programlisting] .... NOT_FOR_ARCHS= alpha ia64 sparc64 .... + 可以使用 `ONLY_FOR_ARCHS_REASON` 和 `NOT_FOR_ARCHS_REASON` 来配置定制的 `IGNORE` 消息。 此外, 还可以使用 `ONLY_FOR_ARCHS_REASON__ARCH_` 和 `NOT_FOR_ARCHS_REASON__ARCH_` 来分别指定与具体平台有关的信息。 * 如果 port 会下载并安装用于 i386 的预编译二进制文件, 则应设置 `IA32_BINARY_PORT`。 如果设置了这个变量, 则系统会检查是否已经在 [.filename]#/usr/lib32# 目录中安装了 IA32 版本的函数库, 以及内核是否提供了 IA32 兼容支持。 如果这些依赖条件不满足, 则会自动设置 `IGNORE`。 [[dads-noinstall-notes]] === 实现说明 这些字串不应使用引号括起来。 此外, 由于显示给用户的方式不同, 这些字串的措辞也应有所不同。 例如: [.programlisting] .... BROKEN= this port is unsupported on FreeBSD 5.x .... [.programlisting] .... IGNORE= is unsupported on FreeBSD 5.x .... 它们分别会在 `make describe` 时产生下面的输出: [.programlisting] .... ===> foobar-0.1 is marked as broken: this port is unsupported on FreeBSD 5.x. .... [.programlisting] .... ===> foobar-0.1 is unsupported on FreeBSD 5.x. .... [[dads-deprecated]] == 使用 `DEPRECATED` 或 `EXPIRATION_DATE` 表示某个 port 将被删除 一定要记得 `BROKEN` 和 `FORBIDDEN` 只应作为当某个 port 无法正常工作时的临时解决方案。 永久性地坏掉了的 port 应被从 ports tree 中完全删除。 需要时还可以使用 `DEPRECATED` 和 `EXPIRATION_DATE` 来通知用户某个 port 不应被使用, 并即将被删除。 前一个变量用来表达为什么计划删除 port; 而后一个是则是一个 ISO 8601 格式的日期 (YYYY-MM-DD)。 两者都会向用户呈现。 也可以设置 `DEPRECATED` 而不给出 `EXPIRATION_DATE` (例如, 建议使用某个新版本的 port), 但反之则没有意义。 目前还没有确切的关于需要给出多少通知的政策。 当前的实践是, 对于与安全有关的问题为一个月, 而与联编有关的问题则为两个月。 这也让有兴趣的 committer 能够有一点时间来修正问题。 [[dads-dot-error]] == 避免使用 `.error` 结构 在 [.filename]#Makefile# 中给出信号, 表示由于某种外界因素 (例如, 用户指定了无效的联编选项) 而无法安装的方法是将变量 `IGNORE` 设为一非空值。 这个值将被格式化, 并在用户执行 `make install` 是给出提示。 用 `.error` 实现这一目的是一种常见的误用。 这样做的问题是, 许多在 ports 树上运行的自动化工具会因此而失败。 最常见的情况见于联编 [.filename]#/usr/ports/INDEX# 的过程 (参见 crossref:testing[make-describe, 运行 make describe])。 然而, 即使十分普通的命令, 例如 `make maintainer`, 在这种情况下也会失败。 这是不可接受的。 [[dot-error-breaks-index]] .怎样避免使用 `.error` [example] ==== 考虑有人在 [.filename]#make.conf# 中设置了 [.programlisting] .... USE_POINTYHAT=yes .... 的情形。 接下来的例子中, 第一个 [.filename]#Makefile# 中的问题将导致 `make index` 失败, 而第二个则不会: [.programlisting] .... .if USE_POINTYHAT .error "POINTYHAT is not supported" .endif .... [.programlisting] .... .if USE_POINTYHAT IGNORE=POINTYHAT is not supported .endif .... ==== [[dads-sysctl]] == 对于 [.filename]#sysctl# 的使用 除了在 target 中之外, 是不鼓励使用 [.filename]#sysctl# 的。 这是因为计算 `makevar`, 例如在 `make index` 中所进行的那种, 都不得不运行一条命令, 这会使这一操作变得更慢。 在使用 man:sysctl[8] 时, 务必通过 `SYSCTL` 变量来进行, 因为此变量将展开成命令的完整路径, 并且用户可以根据需要另行指定。 [[dads-rerolling-distfiles]] == 重新发布的 distfiles 有时, 一些软件的作者会修改业已发布的 distfile 的内容, 而并不修改文件名。 这种情况下, 您需要验证这些变动是来自软件作者的官方改动。 在过去, 曾经发生过下载服务器上的 distfile 被悄悄换成注入过恶意代码的版本, 并给用户安全造成威胁或损害的事情。 您应保留一份旧的 distfile, 并下载一份新的, 分别展开, 用 man:diff[1] 来对比其内容。 如果没有发现可疑的变动, 就可以更新 [.filename]#distinfo# 了。 请务必在您的 PR 或 commit log 中对这些差异进行描述, 以便让别人了解您已经仔细对比过差异, 并确认没有问题了。 除此之外, 也可以联系软件的作者, 以确认这些修改是否是他们做的。 [[dads-misc]] == 杂记 需要仔细地反复检查 [.filename]#pkg-descr# 和 [.filename]#pkg-plist# 这两个文件。 如果您正在复审一个 port, 并认为这两个文件应该改进, 请一定要这样做。 请不要在系统中复制多份 GNU General Public License。 一定要非常小心地处理法律问题! 不要让我们发布没有得到合法授权的软件!