当前位置: 首页 > 文档资料 > FreeBSD Porter 手册 >

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

优质
小牛编辑
130浏览
2023-12-01

12.1. 介绍

这里是一些在移植软件时可能会遇到的常见问题。 您应按照这个列表检查自己的 port, 同样地, 您也可以帮助检查 PR 数据库 中由其它人提交的 port。 请按照在 问题报告和一般性注释 中介绍的方法提交您的看法。 帮助检查 PR 数据库中的 ports 即能够帮助我们更快地 commit 它们, 也能证明您清楚地了解如何完成这些工作。

12.2. WRKDIR (联编时使用的临时目录)

任何时候都不要在 WRKDIR 以外的位置写文件。 WRKDIR 是在 port 联编过程中唯一的一处一定可写的地方 (参见如何从 CDROM 安装 port 以了解从只读的目录中联编和安装 port 的例子)。 如果您需要改变 pkg-* 文件, 请按照 重新定义某个变量 介绍的方法, 而不是覆盖它们来实现。

12.3. WRKDIRPREFIX (用于联编的临时目录的父目录名)

一定要确保您的 port 尊重 WRKDIRPREFIX 的设置。 绝大多数 port 并不需要担心这个。 具体说来, 当引用其它 port 的 WRKDIR 时, 需要注意正确的位置应该是 WRKDIRPREFIXPORTSDIR/subdir/name/work 而不是 PORTSDIR/subdir/name/work.CURDIR/../../subdir/name/work, 或别的什么。

另外, 如果您自行定义了 WRKDIR, 也要把 ${WRKDIRPREFIX}${.CURDIR} 放到前面。

12.4. 区分不同的操作系统, 以及 OS 的版本

在不同版本的 Unix 下可能需要对代码进行一些修改或增加少许编译选项, 才能够正确地编译和运行。 如果您需要根据一些条件来对代码进行修改, 请尽可能让这些修改通用, 这样, 我们就能够将这些代码移植回更早的 FreeBSD 系统, 并交叉移植到其它 BSD 系统, 例如来自 CSRG 的 4.4BSD, BSD/386, 386BSD, NetBSD 和 OpenBSD。

推荐的获得 4.3BSD/Reno (1990) 以及更新版本 BSD 代码版本号的方式, 是使用 sys/param.h 中所定义的 BSD 宏的值。 一般来说这个文件已经被引用了; 如果没有的话, 增加下述代码:

#if (defined(__unix__) || defined(unix)) && !defined(USG)
#include <sys/param.h>
#endif

.c 文件中合适的地方。 我们相信所有定义了这两个符号的系统中, 都提供了 sys/param.h。 如果您发现有不这样做的系统, 请通过致信 FreeBSD ports 邮件列表 让我们了解这一情况。

另一种方法是使用 GNU Autoconf 风格的方式:

#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif

采用这种方法时, 不要忘了把 -DHAVE_SYS_PARAM_H 加到 Makefile 中的 CFLAGS 里。

一旦引用了 sys/param.h, 您就可以使用:

#if (defined(BSD) && (BSD >= 199103))

来检测代码是否正在 4.3 Net2 代码基础, 或更新的系统上编译 (例如 FreeBSD 1.x, 4.3/Reno, NetBSD 0.9, 386BSD, BSD/386 1.1 以及更高版本)。

使用:

#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 之后版本的变化, 则可以使用:

    #if __FreeBSD__ >= 2
    #include <osreldate.h>
    #    if __FreeBSD_version >= 199504
    	 /* 适用于 2.0.5+ 版本的代码 */
    #    endif
    #endif

在已有的数百个 port 中, 只有一两个应该使用 __FreeBSD__。 早期的 port 在不适当的地方使用了它并引发问题, 并不意味着您也必定如此。

12.5. __FreeBSD_version 值

下面是在 sys/param.h __FreeBSD_version 中定义的值及其意义的列表, 这里给出以方便您查阅:

表 12.1. __FreeBSD_version 值
日期版本
119411 2.0-RELEASE
199501, 199503March 19, 19952.1-CURRENT
199504April 9, 19952.0.5-RELEASE
199508August 26, 19952.1 之前的 2.2-CURRENT
199511November 10, 19952.1.0-RELEASE
199512November 10, 19952.1.5 之前的 2.2-CURRENT
199607July 10, 19962.1.5-RELEASE
199608July 12, 19962.1.6 之前的 2.2-CURRENT
199612November 15, 19962.1.6-RELEASE
199612 2.1.7-RELEASE
220000February 19, 19972.2-RELEASE
(not changed) 2.2.1-RELEASE
(无变化) 在 2.2.1-RELEASE 之后的 2.2-STABLE
221001April 15, 1997texinfo-3.9 之后的 2.2-STABLE
221002April 30, 1997top 之后的 2.2-STABLE
222000May 16, 19972.2.2-RELEASE
222001May 19, 19972.2.2-RELEASE 之后的 2.2-STABLE
225000October 2, 19972.2.5-RELEASE
225001November 20, 19972.2.5-RELEASE 之后的 2.2-STABLE
225002December 27, 1997合并 ldconfig -R 之后的 2.2-STABLE
226000March 24, 19982.2.6-RELEASE
227000July 21, 19982.2.7-RELEASE
227001July 21, 19982.2.7-RELEASE 之后的 2.2-STABLE
227002September 19, 1998semctl(2) 修改之后的 2.2-STABLE
228000November 29, 19982.2.8-RELEASE
228001November 29, 19982.2.8-RELEASE 之后的 2.2-STABLE
300000February 19, 1996mount(2) 修改之前的 3.0-CURRENT
300001September 24, 1997mount(2) 修改之后的 3.0-CURRENT
300002June 2, 1998semctl(2) 修改之后的 3.0-CURRENT
300003June 7, 1998ioctl 参数变化之后的 3.0-CURRENT
300004September 3, 1998ELF 变换之后的 3.0-CURRENT
300005October 16, 19983.0-RELEASE
300006October 16, 19983.0-RELEASE 之后的 3.0-CURRENT
300007January 22, 19993/4切分之后的 3.0-STABLE
310000February 9, 19993.1-RELEASE
310001March 27, 19993.1-RELEASE 之后的 3.1-STABLE
310002April 14, 1999C++ 构建/析构函数顺序变化之后的 3.1-STABLE
320000 3.2-RELEASE
320001May 8, 19993.2-STABLE
320002August 29, 1999二进制不兼容的 IPFW 和 socket 变化之后的 3.2-STABLE
330000September 2, 19993.3-RELEASE
330001September 16, 19993.3-STABLE
330002November 24, 1999libc 中加入 mkstemp(3) 之后的 3.3-STABLE
340000December 5, 19993.4-RELEASE
340001December 17, 19993.4-STABLE
350000June 20, 20003.5-RELEASE
350001July 12, 20003.5-STABLE
400000January 22, 19993/4切分之后的 4.0-CURRENT
400001February 20, 1999修改动态连接器处理方式之后的 4.0-CURRENT
400002March 13, 1999C++ 构建/析构函数顺序变化之后的
400003March 27, 1999提供 dladdr(3) 之后的 4.0-CURRENT
400004April 5, 1999修正了 __deregister_frame_info 的 4.0-CURRENT (也表示在 EGCS 1.1.2 集成之后的 4.0-CURRENT)
400005April 27, 1999suser(9) API 变化之后的 4.0-CURRENT (也表示 newbus 之后的 4.0-CURRENT)
400006May 31, 1999cdevsw 注册机制改变之后的 4.0-CURRENT
400007June 17, 1999加入了 socket 级凭据的 so_cred 之后的 4.0-CURRENT
400008June 20, 1999在 libc_r 中加入 poll 系统调用接口之后的 4.0-CURRENT
400009July 20, 1999将内核中 dev_t 类型改为 struct specinfo 指针之后的 4.0-CURRENT
400010September 25, 1999修正了一处 jail(2) 漏洞之后的 4.0-CURRENT
400011September 29, 1999sigset_t 数据类型改变之后的 4.0-CURRENT
400012November 15, 1999切换到 GCC 2.95.2 编译器之后的 4.0-CURRENT
400013December 4, 1999加入了可插的 linux模式 ioctl 处理程序后的 4.0-CURRENT
400014January 18, 2000引入 OpenSSL 之后的 4.0-CURRENT
400015January 27, 2000GCC 2.95.2 中 ABI 默认值从 -fvtable-thunks 改为 -fno-vtable-thunks 之后的 4.0-CURRENT
400016February 27, 2000引入 OpenSSH 之后的 4.0-CURRENT
400017March 13, 20004.0-RELEASE
400018March 17, 20004.0-RELEASE 之后的 4.0-STABLE
400019May 5, 2000引入延迟校验和之后的 4.0-STABLE
400020June 4, 2000将 libxpg4 的代码并入 libc 之后的 4.0-STABLE
400021July 8, 2000Binutils 升级到 2.10.0 之后的 4.0-STABLE, ELF 标志变化, 以及将 tcsh 引入基本系统
410000July 14, 20004.1-RELEASE
410001July 29, 20004.1-RELEASE 之后的 4.1-STABLE
410002September 16, 2000setproctitle(3) 从 libutil 移入 libc 之后的 4.1-STABLE
411000September 25, 20004.1.1-RELEASE
411001 4.1.1-RELEASE 之后的 4.1.1-STABLE
420000October 31, 20004.2-RELEASE
420001January 10, 2001合并 libgcc.a 和 libgcc_r.a, 并修改了相关的 GCC 连接方式之后的 4.2-STABLE
430000March 6, 20014.3-RELEASE
430001May 18, 2001引入 wint_t 之后的 4.3-STABLE
430002July 22, 2001PCI 电源状态 API 合并之后的 4.3-STABLE
440000August 1, 20014.4-RELEASE
440001October 23, 2001引入 d_thread_t 之后的 4.4-STABLE
440002November 4, 2001mount 结构改变之后的 4.4-STABLE (影响文件系统 kld)
440003December 18, 2001用户态部分的 smbfs 被引入之后的 4.4-STABLE
450000December 20, 20014.5-RELEASE
450001February 24, 2002usb 结构元素改名之后的 4.5-STABLE
450004April 16, 2002rc.conf(5) 变量 sendmail_enable 默认值改为 NONE 之后的 4.5-STABLE
450005April 27, 2002默认将 XFree86 4 用于预编译包联编之后的 4.5-STABLE
450006May 1, 2002accept 过滤器修正了安全问题并且不再会轻易被 DoS 之后的 4.5-STABLE
460000June 21, 20024.6-RELEASE
460001June 21, 2002修正了 sendfile(2) 以吻合文档, 而不再根据发出的头计算发出数据量之后的 4.6-STABLE
460002July 19, 20024.6.2-RELEASE
460100June 26, 20024.6-STABLE
460101June 26, 2002MFC `sed -i' 之后的 4.6-STABLE
460102September 1, 2002MFC 许多 pkg_install 新特性之后的 4.6-STABLE
470000October 8, 20024.7-RELEASE
470100October 9, 20024.7-STABLE
470101November 10, 2002开始生成 __std{in,out,err}p 引用, 而不是 __sF。 这将 std{in,out,err} 从编译时表达式变成了运行时值。
470102January 23, 2003MFC mbuf 相关的将 m_aux mbuf 改为 m_tag 的修改之后的 4.7-STABLE
470103February 14, 2003OpenSSL 升级到 0.9.7 之后的 4.7-STABLE
480000March 30, 20034.8-RELEASE
480100April 5, 20034.8-STABLE
480101May 22, 2003realpath(3) 变为线程安全的之后的 4.8-STABLE
480102August 10, 2003对 twe 的 3ware API 修改之后的 4.8-STABLE
490000October 27, 20034.9-RELEASE
490100October 27, 20034.9-STABLE
490101January 8, 2004kinfo_eproc 中加入 e_sid 之后的 4.9-STABLE
490102February 4, 2004MFC rtld 的 libmap 功能之后的 4.9-STABLE
491000May 25, 20044.10-RELEASE
491100June 1, 20044.10-STABLE
491101August 11, 2004MFC 20040629 版本的包维护工具之后的 4.10-STABLE
491102November 16, 2004修正了 VM 当解除 wire 不存在页面时的问题之后的 4.10-STABLE
492000December 17, 20044.11-RELEASE
492100December 17, 20044.11-STABLE
492101April 18, 2006将 libdata/ldconfig 目录加入 mtree 文件之后的 4.11-STABLE。
500000March 13, 20005.0-CURRENT
500001April 18, 2000加入 ELF 头字段, 并改变我们的 ELF 执行文件标记方式之后的 5.0-CURRENT
500002May 2, 2000kld 元数据修改之后的 5.0-CURRENT
500003May 18, 2000buf/bio 修改之后的 5.0-CURRENT
500004May 26, 2000binutils 升级后的 5.0-CURRENT
500005June 3, 2000将 libxpg4 并入 libc, 以及引入 TASKQ 之后的 5.0-CURRENT
500006June 10, 2000加入 AGP 接口之后的 5.0-CURRENT
500007June 29, 2000Perl 升级到 5.6.0 之后的 5.0-CURRENT
500008July 7, 2000KAME 代码升级到 2000/07 之后的 5.0-CURRENT
500009July 14, 2000ether_ifattach() 和 ether_detach() 修改之后的 5.0-CURRENT
500010July 16, 2000将 mtree 改为原先的默认值, 并使用 -L 来跟随符号连接之后的 5.0-CURRENT
500011July 18, 2000kqueue API 修改之后的 5.0-CURRENT
500012September 2, 2000setproctitle(3) 从 libutil 挪到 libc 之后的 5.0-CURRENT
500013September 10, 2000首个 SMPng commit 之后的 5.0-CURRENT
500014January 4, 2001<sys/select.h> 改为 <sys/selinfo.h> 之后的 5.0-CURRENT
500015January 10, 2001libgcc.a 和 libgcc_r.a 以及 GCC 连接方式变动之后的 5.0-CURRENT
500016January 24, 2001修改以允许 libc 和 libc_r 连接到一起, 不再鼓励使用 -pthread 之后的 5.0-CURRENT
500017February 18, 2001从 struct ucred 切换到 struct xucred 以便使内核为 mountd 等程序导出的 API 稳定下来之后的 5.0-CURRENT
500018February 24, 2001加入 CPUTYPE 用于 CPU 专用的优化的 make 变量之后的 5.0-CURRENT
500019June 9, 2001machine/ioctl_fd.h 改为 sys/fdcio.h 之后的 5.0-CURRENT
500020June 15, 2001locale 名称改变之后的 5.0-CURRENT
500021June 22, 2001引入 bzip2 之后的 5.0-CURRENT, 同时也代表删去了 S/Key
500022July 12, 2001加入 SSE 支持之后的 5.0-CURRENT
500023September 14, 2001KSE 第2个里程碑之后的 5.0-CURRENT
500024October 1, 2001d_thread_t 之后的 5.0-CURRENT, 同时 UUCP 被移入 ports
500025October 4, 200164-位平台上的描述符和 creds API 变化之后的 5.0-CURRENT
500026October 9, 2001采用 XFree86 4 作为默认的预编译包, 以及加入 strnstr() libc 函数之后的 5.0-CURRENT
500027October 10, 2001加入 strcasestr() libc 函数之后的 5.0-CURRENT
500028December 14, 2001引入了用户态的 smbfs 组件之后的 5.0-CURRENT
(未予增加) 加入了新的 C99 指定位宽整形变量之后的 5.0-CURRENT
500029January 29, 2002修改了 sendfile(2) 的返回值之后的 5.0-CURRENT
500030February 15, 2002引入适合表达文件标志的 fflags_t 类型之后的 5.0-
500031February 24, 2002usb 结构元素改名之后的 5.0-CURRENT
500032March 16, 2002引入 Perl 5.6.1 之后的 5.0-CURRENT
500033April 3, 2002rc.conf(5) 变量 sendmail_enable 默认值改为 NONE 之后的 5.0-CURRENT
500034April 30, 2002mtx_init() 增加了第三个参数之后的 5.0-CURRENT
500035May 13, 2002包含 Gcc 3.1 的 5.0-CURRENT
500036May 17, 2002在 /usr/src 中删去了 Perl 的 5.0-CURRENT
500037May 29, 2002加入 dlfunc(3) 之后的 5.0-CURRENT
500038July 24, 2002一些 struct sockbuf 的成员变为结构, 并重新排列顺序之后的 5.0-CURRENT
500039September 1, 2002引入 GCC 3.2.1 之后的 5.0-CURRENT。 头文件也不再使用 _BSD_FOO_T_ 而开始使用 _FOO_T_DECLARED。 这个值还可以用于作为一个包含使用 bzip2(1) 的预编译包支持的预期点。
500040September 20, 2002以去掉对 disklabel 结构内容的依赖的名义, 对磁盘相关的函数进行了许多修改之后的 5.0-CURRENT
500041October 1, 2002libc 中加入 getopt_long(3) 之后的 5.0-CURRENT
500042October 15, 2002Binutils 2.13 升级, 包含了新的 FreeBSD 模拟, vec 以及输出格式之后的 5.0-CURRENT
500043November 1, 2002libc 中加入了弱 pthread_XXX 符号之后的 5.0-CURRENT, 从而淘汰了 libXThrStub.so。 5.0-RELEASE。
500100January 17, 2003创建 RELENG_5_0 分支之后的 5.0-CURRENT
500101February 19, 2003<sys/dkstat.h> 变成了一个空文件, 不应再被引用
500102February 25, 2003修改 d_mmap_t 接口之后的 5.0-CURRENT
500103February 26, 2003taskqueue_swi 以无全局锁的方式运行之后的 5.0-CURRENT, 同时还加入了使用全局锁的 taskqueue_swi_giant
500104February 27, 2003去掉了 cdevsw_add() 和 cdevsw_remove() 出现 MAJOR_AUTO 分配机制
500105March 4, 2003采用新的 cdevsw 初始化方法之后的 5.0-CURRENT
500106March 8, 2003devstat_add_entry() 被 devstat_new_entry() 取代
500107March 15, 2003修改 devstat 接口; 请参见 sys/sys/param.h 1.149
500108March 15, 2003改变了 Token-Ring 接口
500109March 25, 2003加入 vm_paddr_t
500110March 28, 2003realpath(3) 改为线程安全之后的 5.0-CURRENT
500111April 9, 2003usbhid(3) 与 NetBSD 同步之后的 5.0-CURRENT
500112April 17, 2003加入新的 NSS 实现, 以及 POSIX.1 getpw*_r, getgr*_r 函数之后的 5.0-CURRENT
500113May 2, 2003删去旧式 rc 系统之后的 5.0-CURRENT
501000June 4, 20035.1-RELEASE.
501100June 2, 2003创建 RELENG_5_1 分支之后的 5.1-CURRENT
501101June 29, 2003改正 sigtimedwait(2) 和 sigwaitinfo(2) 语义之后的 5.1-CURRENT
501102July 3, 2003bus_dma_tag_create(9) 中加入了 lockfunc 和 lockfuncarg 字段之后的 5.1-CURRENT
501103July 31, 2003集成了 GCC 3.3.1-pre 20030711 之后的 5.1-CURRENT
501104August 5, 2003twe 中 3ware API 变化之后的 5.1-CURRENT
501105August 17, 2003允许动态连接 /bin 和 /sbin, 以及将某些库移动到 /lib 之后的 5.1-CURRENT
501106September 8, 2003增加内核级 Coda 6.x 支持之后的 5.1-CURRENT
501107September 17, 2003将 16550 UART 常量从 <dev/sio/sioreg.h> 挪到 <dev/ic/ns16550.h> 之后的 5.1-CURRENT。 此外, rtld 也从此无条件支持 libmap 功能
501108September 23, 2003更新 PFIL_HOOKS API 之后的 5.1-CURRENT
501109September 27, 2003增加 kiconv(3) 之后的 5.1-CURRENT
501110September 28, 2003默认的 cdevsw open 和 close 操作变化之后的 5.1-CURRENT
501111October 16, 2003cdevsw 的布局变化之后的 5.1-CURRENT
501112October 16, 2003增加 kobj 多继承之后的 5.1-CURRENT
501113October 31, 2003修改 struct ifnet 中的 if_xname 之后的 5.1-CURRENT
501114November 16, 2003将 /bin 和 /sbin 改为动态连接之后的 5.1-CURRENT
502000December 7, 20035.2-RELEASE
502010February 23, 20045.2.1-RELEASE
502100December 7, 2003创建 RELENG_5_2 分支之后的 5.2-CURRENT
502101December 19, 2003libc 中加入了 __cxa_atexit/__cxa_finalize 两个函数之后的 5.2-CURRENT
502102January 30, 2004默认线程库从 libc_r 改为 libpthread 之后的 5.2-CURRENT
502103February 21, 2004设备驱动 API 大规模翻修之后的 5.2-CURRENT
502104February 25, 2004增加 getopt_long_only() 之后的 5.2-CURRENT
502105March 5, 2004C 的 NULL 定义改为 ((void *)0) 之后的 5.2-CURRENT, 这会产生更多的编译警告
502106March 8, 2004pf 连入联编和安装过程之后的 5.2-CURRENT
502107March 10, 2004在 sparc64 上将 time_t 改为 64-位 值之后的 5.2-CURRENT
502108March 12, 2004在一些头文件修改以支持 Intel C/C++ 编译器, 以及让 execve(2) 更严格地符合 POSIX 之后的 5.2-CURRENT
502109March 22, 2004引入 bus_alloc_resource_any API 之后的 5.2-CURRENT
502110March 27, 2004加入 UTF-8 locale 之后的 5.2-CURRENT
502111April 11, 2004删去 getvfsent(3) API 之后的 5.2-CURRENT
502112April 13, 2004为 make(1) 增加 .warning 语句之后的 5.2-CURRENT
502113June 4, 2004所有串口设备都强制使用 ttyioctl() 之后的 5.2-CURRENT
502114June 13, 2004引入 ALTQ 框架之后的 5.2-CURRENT
502115June 14, 2004修改 sema_timedwait(9) 使其成功时返回 0, 失败时返回非 0 的错误代码之后的 5.2-CURRENT
502116June 16, 2004将内核 dev_t 改为指向 struct cdev * 的指针之后的 5.2-CURRENT
502117June 17, 2004将内核 udev_t 改为 dev_t 之后的 5.2-CURRENT
502118June 17, 2004为 clock_gettime(2) 和 clock_getres(2) 增加 CLOCK_VIRTUAL 和 CLOCK_PROF 支持之后的 5.2-CURRENT
502119June 22, 2004对网络接口复制进行全面修改之后的 5.2-CURRENT
502120July 2, 2004package 工具升级为 20040629 之后的 5.2-CURRENT
502121July 9, 2004不再将蓝牙代码标记为 i386 专用之后的 5.2-CURRENT
502122July 11, 2004引入 KDB 调试器框架之后的 5.2-CURRENT。 同时还引入了 DDB 作为后台, 以及 GDB 后台。
502123July 12, 2004修改 VFS_ROOT 和 vflush 使其使用一个 struct thread 参数之后的 5.2-CURRENT。 struct kinfo_proc 增加了一个用户数据指针。 同时, 默认的 X 实现切换为 xorg
502124July 24, 2004将使用 rc.d 和传统脚本的 port 分别启动之后的 5.2-CURRENT
502125July 28, 2004取消前一修改之后的 5.2-CURRENT
502126July 31, 2004删除 kmem_alloc_pageable() 并引入 gcc 3.4.2 的 5.2-CURRENT
502127August 2, 2004修改 UMA 内核 API 允许构建函数和初始化失败之后的 5.2-CURRENT
502128August 8, 2004vfs_mount 签名和全局替换 suser(9) API 的 PRISON_ROOT 为 SUSER_ALLOWJAIL 之后的 5.2-CURRENT
503000August 23, 2004pfil API 修改之前的 5.3-BETA/RC
503001September 22, 20045.3-RELEASE
503100October 16, 2004创建 RELENG_5_3 分支之后的 5.3-STABLE
503101December 3, 2004加入了 glibc 风格的 strftime(3) 填充选项的 5.3-STABLE
503102February 13, 2005MFC OpenBSD 的 nc(1) 之后的 5.3-STABLE
503103February 27, 2005在 MFC 了 <src/include/stdbool.h><src/sys/i386/include/_types.h> 用于兼容 GCC 和 Intel C/C++ 编译器的修正之后的 5.4-PRERELEASE
503104February 28, 2005MFC 了将 ifi_epoch 由 wall 时钟时间改为 uptime 之后的 5.4-PRERELEASE
503105March 2, 2005MFC 了 vswprintf(3) 中的 EOVERFLOW 检查的 5.4-PRERELEASE
504000April 3, 20055.4-RELEASE.
504100April 3, 2005创建 RELENG_5_4 分支之后的 5.4-STABLE
504101May 11, 2005加大默认线程堆栈尺寸之后的 5.4-STABLE
504102June 24, 2005加入 sha256 之后的 5.4-STABLE
504103October 3, 2005MFC if_bridge 之后的 5.4-STABLE
504104November 13, 2005bsdiff 和 portsnap MFC 之后的 5.4-STABLE
504105January 17, 2006在 MFC 了 ldconfig_local_dirs 修改之后的 5.4-STABLE。
505000May 12, 20065.5-RELEASE.
505100May 12, 2006在创建 RELENG_5_5 分支之后的 5.5-STABLE
600000August 18, 20046.0-CURRENT
600001August 27, 2004内核中永久性启用 PFIL_HOOKS 之后的 6.0-CURRENT
600002August 30, 2004最初将 ifi_epoch 加入 if_data 结构之后的 6.0-CURRENT。 此后不久即被撤销。 请不要使用这个值。
600003September 8, 2004if_data 中再次加入 ifi_epoch 成员之后的 6.0-CURRENT
600004September 29, 2004将 struct inpcb 参数加入 pfil API 之后的 6.0-CURRENT
600005October 5, 2004newsyslog 加入了 "-d DESTDIR" 参数之后的 6.0-CURRENT
600006November 4, 2004加入了 glibc 风格的 strftime(3) 填充选项之后的 6.0-CURRENT
600007December 12, 2004加入了 802.11 框架更新之后的 6.0-CURRENT
600008January 25, 2005修改 VOP_*VOBJECT() 并为无全局锁的文件系统引入 MNTK_MPSAFE 标志之后的 6.0-CURRENT
600009February 4, 2005加入 cpufreq 框架和驱动之后的 6.0-CURRENT
600010February 6, 2005引入 OpenBSD 的 nc(1) 之后的 6.0-CURRENT
600011February 12, 2005删去并不存在的 SVID2 matherr() 支持之后的 6.0-CURRENT
600012February 15, 2005增大默认线程堆栈尺寸之后的 6.0-CURRENT
600013February 19, 2005增加了针对 <src/include/stdbool.h><src/sys/i386/include/_types.h> 的用于 Intel C/C++ 编译器的 GCC-兼容性修正。
600014February 21, 2005修正了 vswprintf(3) 的 EOVERFLOW 检查之后的 6.0-CURRENT
600015February 25, 2005将 struct if_data 成员 ifi_epoch 从 wall 时钟时间改为 uptime 之后的 6.0-CURRENT
600016February 26, 2005修改 LC_CTYPE 磁盘格式之后的 6.0-CURRENT
600017February 27, 2005修改 NLS 编录磁盘格式之后的 6.0-CURRENT
600018February 27, 2005修改 LC_COLLATE 磁盘格式之后的 6.0-CURRENT
600019February 28, 2005将 acpica 头文件安装到 /usr/include
600020March 9, 2005为 send(2) API 加入了 MSG_NOSIGNAL
600021March 17, 2005在 cdevsw 上增加了一些字段
600022March 21, 2005基本系统中删去了 gtar
600023April 13, 2005unix(4) 中加入了 LOCAL_CREDS, LOCAL_CONNWAIT 两个 socket 选项
600024April 19, 2005加入了 hwpmc(4) 及其相关工具之后的 6.0-CURRENT
600025April 26, 2005加入 struct icmphdr 之后的 6.0-CURRENT
600026May 3, 2005pf 更新到了 3.7
600027May 6, 2005引入了内核 libalias 和 ng_nat
600028May 13, 2005将 ttyname_r(3) 接口改为符合 POSIX 标准, 并通过 unistd.h 和 libc
600029May 29, 2005将 libpcap 升级为 v0.9.1 alpha 096 之后的 6.0-CURRENT
600030June 5, 2005引入 NetBSD 的 if_bridge(4) 之后的 6.0-CURRENT
600031June 10, 2005将 struct ifnet 从驱动的 softc 中拆出之后的 6.0-CURRENT。
600032July 11, 2005引入了 libpcap v0.9.1 之后的 6.0-CURRENT。
600033July 25, 2005所有自 RELENG_5 以来没有修改过的共享库的版本递增之后的 6.0-STABLE。
600034August 13, 2005为 dev_clone 事件处理函数增加身份信息参数之后的 6.0-STABLE。 6.0-RELEASE。
600100November 1, 20056.0-RELEASE 之后的 6.0-STABLE
600101December 21, 2005将 local_startup 目录中的脚本集成到基本系统的 rcorder(8) 之后的 6.0-STABLE。
600102December 30, 2005更新 ELF 类型和常量之后的 6.0-STABLE。
600103January 15, 2006MFC 了 pidfile(3) API 之后的 6.0-STABLE。
600104January 17, 2006在 MFC 了 ldconfig_local_dirs 修改之后的 6.0-STABLE。
600105February 26, 2006在 csh(1) 中加入了 NLS 目录支持之后的 6.0-STABLE。
601000May 6, 20066.1-RELEASE
601100May 6, 20066.1-RELEASE 之后的 6.1-STABLE。
601101June 22, 2006引入 csup 之后的 6.1-STABLE。
601102July 11, 2006更新了 iwi(4) 之后的 6.1-STABLE。
601103July 17, 2006将域名解析函数更新至 BIND9, 并导出了可重入版本的 netdb 函数之后的 6.1-STABLE。
601104August 8, 2006在 OpenSSL 中启用了 DSO (动态共享库) 支持之后的 6.1-STABLE。
601105September 2, 2006由于 802.11 修正变动了 IEEE80211_IOC_STA_INFO ioctl API 之后的 6.1-STABLE。
602000November 15, 20066.2-RELEASE
602100September 15, 20066.2-RELEASE 之后的 6.2-STABLE。
602101December 12, 2006加入 Wi-Spy quirk 之后的 6.2-STABLE。
602102December 28, 2006增加 pci_find_extcap() 之后的 6.2-STABLE。
602103January 16, 2007MFC 了对 dlsym 进行修改, 使其在指定 dso 及其暗指的依赖中查找符号之后的 6.2-STABLE。
602104January 28, 2007MFC 了 netgraph 节点 ng_deflate(4) 和 ng_pred1(4) 以及用于 ng_ppp(4) 节点的新压缩及加密模式之后的 6.2-STABLE。
602105February 20, 2007MFC 了从 NetBSD 移植的 BSD 授权的 gzip(1) 之后的 6.2-STABLE。
602106March 31, 2007MFC 了 PCI MSI 和 MSI-X 支持之后的 6.2-STABLE。
602107April 6, 2007MFC 了包含宽字符支持的 ncurses 5.6 之后的 6.2-STABLE。
602108April 11, 2007MFC 了实现 Linux SCSI SG 直通设备 API 子集的 CAM 'SG' 设备之后的 6.2-STABLE。
602109April 17, 2007MFC 了 readline 5.2 patchset 002 之后的 6.2-STABLE。
602110May 2, 2007MFC 了用于 amd64 和 i386 的 pmap_invalidate_cache()、 pmap_change_attr()、 pmap_mapbios()、 pmap_mapdev_attr()、 and pmap_unmapbios() 之后的 6.2-STABLE。
602111June 11, 2007由于 MFC 了 BOP_BDFLUSH 导致文件系统模块 KBI 变化之后的 6.2-STABLE。
602112September 21, 2007一系列 libutil(3) MFC 之后的 6.2-STABLE。
602113October 25, 2007MFC 了宽字符和单字节 ctype 函数分拆之后的 6.2-STABLE。 新编译的引用了 ctype.h 的可执行文件, 可能会需要一个在旧系统上不存在的新增符号 __mb_sb_limit。
602114October 30, 2007恢复了 ctype ABI 向前兼容性之后的 6.2-STABLE。
602115November 21, 2007回退了宽字符和单字节 ctype 分拆之后的 6.2-STABLE。
603000November 25, 20076.3-RELEASE
603100November 25, 2007在 6.3-RELEASE 之后的 6.3-STABLE。
603101December 7, 2007修正了 bit macro 的多字节支持之后的 6.3-STABLE。
603102April 24, 2008为 flock 结构加入 l_sysid 之后的 6.3-STABLE。
603103May 27, 2008MFC 了 memrchr 函数之后的 6.3-STABLE。
603104June 15, 2008为 make(1) MFC :u 变量修饰符之后的 6.3-STABLE。
604000October 4, 20086.4-RELEASE
604100October 4, 20086.4-RELEASE 之后的 6.4-STABLE。
700000July 11, 20057.0-CURRENT。
700001July 23, 2005所有自 RELENG_5 以来没有修改过的共享库的版本递增之后的 7.0-CURRENT。
700002August 13, 2005为 dev_clone 事件处理函数中增加身份信息参数之后的 7.0-CURRENT。
700003August 25, 2005将 memmem(3) 加入 libc 之后的 7.0-CURRENT。
700004October 30, 2005将 solisten(9) 改为接受一 backlog 参数之后的 7.0-CURRENT。
700005November 11, 2005将 IFP2ENADDR() 改为返回一 IF_LLADDR() 指针之后的 7.0-CURRENT。
700006November 11, 2005struct ifnet 中增加 if_addr 成员, 并删除 IFP2ENADDR() 之后的 7.0-CURRENT。
700007December 2, 2005将 local_startup 目录中的脚本集成到基本系统的 rcorder(8) 之后的 7.0-CURRENT。
700008December 5, 2005去掉 MNT_NODEV 挂接选项之后的 7.0-CURRENT。
700009December 19, 2005对 ELF-64 类型和符号版本进行变更之后的 7.0-CURRENT。
700010December 20, 2005增加 hostb 和 vgapci 驱动、 pci_find_extcap(), 并将 AGP 驱动改为不再影射 aperature 之后的 7.0-CURRENT。
700011December 31, 2005除 Alpha 之外的所有平台上 tv_sec 改为 time_t 之后的 7.0-CURRENT。
700012January 8, 2006修改 ldconfig_local_dirs 之后的 7.0-CURRENT。
700013January 12, 2006在修改了 /etc/rc.d/abi 以支持 /compat/linux/etc/ld.so.cache 以某只读文件系统上的符号连接形式存在之后的 7.0-CURRENT。
700014January 26, 2006引入 pts 之后的 7.0-CURRENT。
700015March 26, 2006在引入 hwpmc(4) 的第 2 版 ABI 之后的 7.0-CURRENT。
700016April 22, 2006在 libc 中加入了 fcloseall(3) 之后的 7.0-CURRENT。
700017May 13, 2006删去 ip6fw 之后的 7.0-CURRENT。
700018July 15, 2006引入了 snd_emu10kx 之后的 7.0-CURRENT。
700019July 29, 2006引入了 OpenSSL 0.9.8b 之后的 7.0-CURRENT。
700020September 3, 2006增加了 bus_dma_get_tag 函数之后的 7.0-CURRENT。
700021September 4, 2006在引入了 libpcap 0.9.4 和 tcpdump 3.9.4 之后的 7.0-CURRENT。
700022September 9, 2006在对 dlsym 进行修改, 使其在指定 dso 及其暗指的依赖中查找符号之后的 7.0-CURRENT。
700023September 23, 2006为 OSSv4 混音器 API 加入新的声音 IOCTL 之后的 7.0-CURRENT。
700024September 28, 2006汇入 OpenSSL 0.9.8d 之后的 7.0-CURRENT。
700025November 11, 2006加入了 libelf 之后的 7.0-CURRENT。
700026November 26, 2006对音效相关的 sysctl 进行大幅调整之后的 7.0-CURRENT。
700027November 30, 2006加入 Wi-Spy quirk 之后的 7.0-CURRENT。
700028December 15, 2006在 libc 中加入 sctp 调用之后的 7.0-CURRENT。
700029January 26, 2007将 GNU gzip(1) 实现替换为从 NetBSD 移植的采用 BSD 授权版本之后的 7.0-CURRENT。
700030February 7, 2007在 IPv4 多播转发代码中删去了 IPIP 隧道封装 (VIFF_TUNNEL) 之后的 7.0-CURRENT。
700031February 23, 2007修改了 bus_setup_intr() (newbus) 之后的 7.0-CURRENT。
700032March 2, 2007引入了 ipw(4) 和 iwi(4) 固件之后的 7.0-CURRENT。
700033March 9, 2007在 ncurses 中引入了宽字符支持之后的 7.0-CURRENT。
700034March 19, 2007修改了 insmntque()、 getnewvnode() 以及 vfs_hash_insert() 工作方式之后的 7.0-CURRENT。
700035March 26, 2007增加 CPU 频率变动通知机制之后的 7.0-CURRENT。
700036April 6, 2007引入了 ZFS 文件系统之后的 7.0-CURRENT。
700037April 8, 2007新增了实现 Linux SCSI SG 直通设备 API 子集的 CAM 'SG' 设备之后的 7.0-CURRENT。
700038April 30, 2007getenv(3)putenv(3)setenv(3)unsetenv(3) 改为符合 POSIX 之后的 7.0-CURRENT。
700039May 1, 2007回退了 700038 中的变动之后的 7.0-CURRENT。
700040May 10, 2007在 libutil 中增加了 flopen(3) 之后的 7.0-CURRENT。
700041May 13, 2007启用了符号版本, 并将 libthr 改为默认线程库之后的 7.0-CURRENT。
700042May 19, 2007引入了 gcc 4.2.0 之后的 7.0-CURRENT。
700043May 21, 2007将 RELENG_6 之后未修改过版本的共享库版本增加之后的 7.0-CURRENT。
700044June 7, 2007将 vn_open()/VOP_OPEN() 的参数由文件描述符数组下标改为 struct file * 之后的 7.0-CURRENT。
700045June 10, 2007修改 pam_nologin(8) 使其向 PAM 框架提供帐号管理功能而非身份验证功能之后的 7.0-CURRENT。
700046June 11, 2007更新 802.11 无线支持之后的 7.0-CURRENT。
700047June 11, 2007增加 TCP LRO 网络接口能力之后的 7.0-CURRENT。
700048June 12, 2007在 IPv4 协议栈中加入了 RFC 3678 API 支持之后的 7.0-CURRENT。 先前 IP_MULTICAST_IF ioctl 的 RFC 1724 行为被删去; 0.0.0.0/8 不再能够用于指定接口索引下标, 而应使用 struct ipmreqn 代替。
700049July 3, 2007引入 OpenBSD 4.1 的 pf 之后的 7.0-CURRENT。
(not changed) 为 FAST_IPSEC 增加 IPv6 支持, 删去 KAME IPSEC, 并将 FAST_IPSEC 更名为 IPSEC 之后的 7.0-CURRENT。 (未变动)
700050July 4, 2007将 setenv/putenv/等等调用, 从传统 BSD 改为 POSIX 标准之后的 7.0-CURRENT。
700051July 4, 2007增加新的 mmap/lseek/等等这些系统调用之后的 7.0-CURRENT。
700052July 6, 2007将 I4B 头文件移动到 include/i4b 之后的 7.0-CURRENT。
700053September 30, 2007增加了 PCI domain 支持之后的 7.0-CURRENT。
700054October 25, 2007MFC 了宽字符和单字节字符 ctype 分拆之后的 7.0-CURRENT。
700055October 28, 20077.0-RELEASE, 以及 MFC 了恢复对 FreeBSD 4/5/6 版本的 PCIOCGETCONF、 PCIOCREAD 和 PCIOCWRITE IOCTL ABI 向下兼容之后的 7.0-CURRENT, 这一变动导致 PCIOCGETCONF IOCTL 的 ABI 再次发生变化。
700100December 22, 20077.0-RELEASE 之后的 7.0-STABLE
700101February 8, 2008MFC m_collapse() 之后的 7.0-STABLE。
700102March 30, 2008MFC kdb_enter_why() 之后的 7.0-STABLE。
700103April 10, 2008为 flock 结构加入 l_sysid 之后的 7.0-STABLE。
700104April 11, 2008在 procstat(1) MFC 之后的 7.0-STABLE。
700105April 11, 2008在 MFC umtx 特性之后的 7.0-STABLE。
700106April 15, 2008psm(4) MFC write(2) 支持之后的 7.0-STABLE。
700107April 20, 2008fcntl(2) MFC F_DUP2FD 之后的 7.0-STABLE。
700108May 5, 2008lockmgr(9) 做了一些修改之后的 7.0-STABLE, 在使用 lockmgr(9) 时必需包含 sys/lock.h
700109May 27, 2008MFC 了 memrchr 函数之后的 7.0-STABLE。
700110August 5, 2008MFC 了内核 NFS locked 客户端之后的 7.0-STABLE。
700111August 20, 2008加入了对物理连续巨帧支持之后的 7.0-STABLE。
700112August 27, 2008在 MFC 内核 DTrace 支持之后的 7.0-STABLE。
701000November 25, 20087.1-RELEASE
701100November 25, 20087.1-RELEASE 之后的 7.1-STABLE。
701101January 10, 2009合并了 strndup 之后的 7.1-STABLE。
701102January 17, 2009加入了 cpuctl(4) 支持之后的 7.1-STABLE。
701103February 7, 2009合并了 多/无-IPv4/v6 jail 之后的 7.1-STABLE。
701104February 14, 2009在 struct mount 中保存了挂起属主, 以及在 struct vfsops 中引入了 vfs_susp_clean 方法之后的 7.1-STABLE。
701105March 12, 2009对 kern.ipc.shmsegs sysctl 变量不兼容的修改, 以允许在 64bit 构架上分配更多的 SysV 共享内存段之后的 7.1-STABLE。
701106March 14, 2009合并了一个对 POSIX semaphore 等待操作修正之后的 7.1-STABLE。
702000April 15, 20097.2-RELEASE
702100April 15, 20097.2-RELEASE 之后的 7.2-STABLE。
702101May 15, 2009ichsmb(4) 改为使用左邻接辅编址来保持与其它 SMBus 控制器驱动一致性之后的 7.2-STABLE。
702102May 28, 2009MFC 了 fdopendir 函数之后的 7.2-STABLE。
702103June 06, 2009MFC 了 PmcTools 之后的 7.2-STABLE。
702104July 14, 2009MFC 了 closefrom 系统调用之后的 7.2-STABLE。
702105July 31, 2009MFC 了 SYSVIPC ABI 改动之后的 7.2-STABLE。
702106September 14, 2009MFC 了 x86 PAT 增强, 并新增了 d_mmap_single() 以及 scatter/gather 型 VM 对象类型之后的 7.2-STABLE。
703000February 9, 20107.3-RELEASE
703100February 9, 20107.3-RELEASE 之后的 7.3-STABLE。
704000December 22, 20107.4-RELEASE
704100December 22, 20107.4-RELEASE 之后的 7.4-STABLE。
800000October 11, 20078.0-CURRENT。 分拆了宽字符和单字节字符 ctype。
800001October 16, 2007引入了 libpcap 0.9.8 和 tcpdump 3.9.8 之后的 8.0-CURRENT。
800002October 21, 2007将 kthread_create() 系列函数改名为 kproc_create() 之后的 8.0-CURRENT。
800003October 24, 2007恢复了对 FreeBSD 4/5/6 版本的 PCIOCGETCONF、 PCIOCREAD 和 PCIOCWRITE IOCTL ABI 向下兼容之后的 8.0-CURRENT, 这一变动导致 PCIOCGETCONF IOCTL 的 ABI 再次发生变化。
800004November 12, 2007将 agp(4) 驱动从 src/sys/pci 挪到 src/sys/dev/agp 之后的 8.0-CURRENT。
800005December 4, 2007修改了 jumbo frame 分配器之后的 8.0-CURRENT。
800006December 7, 2007在给 hwpmc(4) 加入了 callgraph 捕捉功能后的 8.0-CURRENT
800007December 25, 2007kdb_enter() 增加 "why" 参数之后的 8.0-CURRENT。
800008December 28, 2007在去除 LK_EXCLUPGRADE 选项后的 8.0-CURRENT。
800009January 9, 2008引入 lockmgr_disown(9) 之后的 8.0-CURRENT。
800010January 10, 2008修改 vn_lock(9) 原型之后的 8.0-CURRENT。
800011January 13, 2008修改 VOP_LOCK(9)VOP_UNLOCK(9) 原型之后的 8.0-CURRENT。
800012January 19, 2008引入 lockmgr_recursed(9)BUF_RECURSED(9)BUF_ISLOCKED(9) 并删除了 BUF_REFCNT() 之后的 8.0-CURRENT。
800013January 23, 2008引入 “ASCII” 编码之后的 8.0-CURRENT。
800014January 24, 2008修改 lockmgr(9) 并删除了 lockcount()LOCKMGR_ASSERT() 之后的 8.0-CURRENT。
800015January 26, 2008扩展了 fts(3) 数据结构之后的 8.0-CURRENT。
800016February 1, 2008为 MEXTADD(9) 增加了一个参数之后的 8.0-CURRENT。
800017February 6, 2008lockmgr(9) 引入 LK_NODUP 和 LK_NOWITNESS 选项后的 8.0-CURRENT。
800018February 8, 2008引入 m_collapse 之后的 8.0-CURRENT。
800019February 9, 2008为 sysctl 变量 kern.proc.filedesc 加入 当前工作目录,root 目录和 jail 目录支持之后的 8.0-CURRENT。
800020February 13, 2008引入 lockmgr_assert(9) 之后的 8.0-CURRENT。
800021February 15, 2008引入 lockmgr_args(9) 和移除 LK_INTERNAL 标志之后的 8.0-CURRENT。
800022(backed out)把 BSD ar(1) 作为系统默认的 ar 之后的 8.0-CURRENT。
800023February 25, 2008修改了 lockstatus(9)VOP_ISLOCKED(9) 原型,特别时去掉 struct thread 参数之后的 8.0-CURRENT。
800024March 1, 2008砍掉了 lockwaitersBUF_LOCKWAITERS 函数, brelvp 的返回值从 void 修改成 int,并引入 lockinit(9) 新标志之后的 8.0-CURRENT。
800025March 8, 2008fcntl(2) 引入 F_DUP2FD 之后的 8.0-CURRENT。
800026March 12, 2008修改了 cv_broadcastpri 优先权参数之后的 8.0-CURRENT,比如 0 表示无优先权。
800027March 24, 2008修改了 bpf 监测 ABI, 加入了 zerocopy bpf buffer 之后的 8.0-CURRENT。
800028March 26, 2008为 flock 结构增加了 l_sysid 之后的 8.0-CURRENT。
800029March 28, 2008重新整合了 BUF_LOCKWAITERS 函数并加入 lockmgr_waiters(9) 之后的 8.0-CURRENT。
800030April 1, 2008引入 rw_try_rlock(9)rw_try_wlock(9) 之后的 8.0-CURRENT。
800031April 6, 2008引入 lockmgr_rwlockmgr_args_rw 函数之后的 8.0-CURRENT。
800032April 8, 2008实现了 openat 和相关的系统调用,为 open(2) 引入了 O_EXEC 标志,和提供了相应的 linux 兼容的系统调用之后的 8.0-CURRENT。
800033April 8, 2008psm(4) 增加了原生的 write(2) 支持之后的 8.0-CURRENT。 现在任意命令可写入 /dev/psm%d 并读出状态。
800034April 10, 2008引入 memrchr 函数之后的 8.0-CURRENT。
800035April 16, 2008引入 fdopendir 函数之后的 8.0-CURRENT
800036April 20, 2008无线部分转向 multi-bss (也叫做 vaps) 支持之后的 8.0-CURRENT。
800037May 9, 2008加入多路由表支持 (也就是 setfib(1)、 stfib(2)) 后的 8.0-CURRENT。
800038May 26, 2008删去了 netatm 和 ISDN4BSD 后的 8.0-CURRENT。 这个版本也表示增加了 Compact C Type (CTF) 工具。
800039June 14, 2008移除 sgtty 之后的 8.0-CURRENT。
800040June 26, 2008增加了内核级 NFS lockd 客户端的 8.0-CURRENT。
800041July 22, 2008增加了 arc4random_buf(3) 和 arc4random_uniform(3) 之后的 8.0-CURRENT。
800042August 8, 2008增加了 cpuctl(4) 之后的 8.0-CURRENT。
800043August 13, 2008修改 bpf(4) 使用单一的设备节点而不是克隆之后的 8.0-CURRENT。
800044August 17, 2008在提交了 vimage 项目第一步之后的 8.0-CURRENT。把全局变量重命名为虚拟化带 V_ 前缀并用宏映射到原来的全局名称。
800045August 20, 2008引入 MPSAFE TTY 层之后的 8.0-CURRENT, 包括对相关驱动和工具的修改。
800046September 8, 2008将 amd64 架构上 GDT 拆分到不同 CPU 之后的 8.0-CURRENT。
800047September 10, 2008删去了 VSVTX、 VSGID 和 VSUID 之后的 8.0-CURRENT。
800048September 16, 2008将内核中 NFS 挂接部分的代码改为能够通过 nmount() iovec, 而不再是大的 nfs_args 结构体作为参数之后的 8.0-CURRENT。
800049September 17, 2008删去了 suser(9)suser_cred(9) 之后的 8.0-CURRENT。
800050October 20, 2008修改了缓冲存储器 API 之后的 8.0-CURRENT。
800051October 23, 2008删去了 MALLOC(9)FREE(9) 宏之后的 8.0-CURRENT。
800052October 28, 2008引入了 accmode_t 和重新命名 VOP_ACCES 'a_mode' 为 a_accmode 之后的 8.0-CURRENT。
800053November 2, 2008修改了 vfs_busy(9) 原型并引入了 MBF_NOWAIT 和 MBF_MNTLSTLOCK 标志之后的 8.0-CURRENT。
800054November 22, 2008增加了 buf_ring、 内存栅以及 ifnet 函数, 以方便撰写支持多硬件传输队列的驱动, 以及无锁环形缓冲实现的驱动程序, 并更高效地管理包队列功能之后的 8.0-CURRENT。
800055November 27, 2008引入了 hwpmc(4) 对于 Intel™ Core,Core2 和 Atom 的支持之后的 8.0-CURRENT。
800056November 29, 2008引入了 multi-/no-IPv4/v6 jail 之后的 8.0-CURRENT。
800057December 1, 2008将 ath hal 改为使用源代码之后的 8.0-CURRENT。
800058December 12, 2008引入了 VOP_VPTOCNP 操作之后的 8.0-CURRENT。
800059December 15, 2008引入了新的 arp-v2 重写之后的 8.0-CURRENT。
800060December 19, 2008引入了 makefs 之后的 8.0-CURRENT。
800061January 15, 2009引入了 TCP Appropriate Byte Counting 之后的 8.0-CURRENT。
800062January 28, 2009删去了 minor()、 minor2unit()、 unit2minor() 等之后的 8.0-CURRENT。
800063February 18, 2009在 GENERIC 配置中改为使用 USB2 栈之后的 8.0-CURRENT; 这个数值同时也标志新增了 fdevname(3)。
800064February 23, 2009将 USB2 栈移动并替换 dev/usb 之后的 8.0-CURRENT。
800065February 26, 2009在对 libmp(3) 中所有函数更名之后的 8.0-CURRENT。
800066February 27, 2009更改了 USB devfs 管理和布局之后的 8.0-CURRENT。
800067February 28, 2009加入了 getdelim(), getline(), stpncpy(), strnlen(), wcsnlen(), wcscasecmp(), 和 wcsncasecmp() 之后的 8.0-CURRENT。
800068March 2, 2009在 usbhub devclass 更名为 uhub 之后的 8.0-CURRENT。
800069March 9, 2009重命名 libusb20.so.1 为 libusb.so.1 之后的 8.0-CURRENT。
800070March 9, 2009合并 IGMPv3 和 Source-Specific Multicast (SSM) 入 IPv4 栈之后的 8.0-CURRENT。
800071March 14, 2009为 gcc 打上了在 c99 和 gnu99 模式中使用 C99 inline 语义补丁之后的 8.0-CURRENT。
800072March 15, 2009移除了 IFF_NEEDSGIANT 标志; 不再支持非线程安全的网络设备驱动之后的 8.0-CURRENT。
800073March 18, 2009实现了 rpath 动态字符替换之后的 8.0-CURRENT.
800074March 24, 2009引入了 tcpdump 4.0.0 和 libpcap 1.0.0 之后的 8.0-CURRENT。
800075April 6, 2009修改了 structs vnet_net、 vnet_inet 和 vnet_ipfw 结构布局之后的 8.0-CURRENT。
800076April 9, 2009为 dummynet 新增了延迟评估工具之后的 8.0-CURRENT。
800077April 14, 2009删去了 VOP_LEASE() 和 vop_vector.vop_lease 之后的 8.0-CURRENT
800078April 15, 2009在 struct rt_metrics 和 struct rt_metrics_lite 中添加了 rt_weight 字段, 导致其结构发生变化之后的 8.0-CURRENT。 此后 RTM_VERSION 增加, 但又回退了。
800079April 15, 2009在 struct route 和 struct_in6 中添加了 struct llentry 指针之后的 8.0-CURRENT。
800080April 15, 2009改变了 struct inpcb 布局之后的 8.0-CURRENT。
800081April 19, 2009改变了 malloc_type 布局之后的 8.0-CURRENT。
800082April 21, 2009改变了 struct ifnet 布局, 并增加了 if_ref() 和 if_rele() 引用计数维护功能之后的 8.0-CURRENT。
800083April 22, 2009实现了底层蓝牙 HCI API 之后的 8.0-CURRENT。
800084April 29, 2009修改了 IPv6 SSM 和 MLDv2 之后的 8.0-CURRENT。
800085April 30, 2009启用了包括一个活跃映像的 VIMAGE 内核支持之后的 8.0-CURRENT。
800086May 8, 2009为 patch(1) 增加任意长输入行支持之后的 8.0-CURRENT。
800087May 11, 2009修改了一些 VFS KPI 之后的 8.0-CURRENT。 VFS 的 FSD 部分中删去了线程参数。 VFS_* 函数并不需要这些上下文信息, 因为它总是与 curthread 相关。 在某些特殊情况中, 则保留了原先的行为。
800088May 20, 2009对 net80211 监视模式进行调整之后的 8.0-CURRENT。
800089May 23, 2009增加了 UDP 控制块支持之后的 8.0-CURRENT。
800090May 23, 2009将网络接口克隆虚拟化之后的 8.0-CURRENT。
800091May 27, 2009增加了层次式 jail 并取消全局 securelevel 之后的 8.0-CURRENT。
800092May 29, 2009修改了 sx_init_flags() KPI 之后的 8.0-CURRENT。 SX_ADAPTIVESPIN 退役, 而新增的 SX_NOADAPTIVE 标志则表达相反语义。
800093May 29, 2009为 struct mount 增加 mnt_xflag 之后的 8.0-CURRENT。
800094May 30, 2009新增了 VOP_ACCESSX(9) 之后的 8.0-CURRENT。
800095May 30, 2009调整轮询 KPI (polling KPI) 之后的 8.0-CURRENT。 轮询处理程序会返回处理过的包的数量。 新增的 IFCAP_POLLING_NOCOUNT 则表示返回值不重要, 并跳过计数。
800096June 1, 2009对新的 netisr 进行了改进, 并调整了保存和存取 FIB 方式之后的 8.0-CURRENT。
800097June 8, 2009引入了 vnet 析构挂钩和相关基础设施之后的 8.0-CURRENT。
800097June 11, 2009引入了 netgraph 输出到输入路径调用检测和排队机制, 并调整了 struct thread 布局之后的 8.0-CURRENT。
800098June 14, 2009引入了 OpenSSL 0.9.8k 之后的 8.0-CURRENT。
800099June 22, 2009更新了 NGROUPS 并将路由虚拟化挪到它自己的 VImage 模块之后的 8.0-CURRENT。
800100June 24, 2009修改了 SYSVIPC ABI 之后的 8.0-CURRENT。
800101June 29, 2009删去了与网络接口一一对应的 /dev/net/* 字符设备之后的 8.0-CURRENT。
800102July 12, 2009在 struct sackhint、 struct tcpcb 以及 struct tcpstat 上增加占位元素之后的 8.0-CURRENT。
800103July 13, 2009将 TOE 驱动接口中的 struct tcpopt 替换为 TCP syncache 中的 struct toeopt 之后的 8.0-CURRENT。
800104July 14, 2009新增了基于 linker-set 的 per-vnet 分配器之后的 8.0-CURRENT。
800105July 19, 2009递增了所有未使用符号版本的动态连接库版本之后的 8.0-CURRENT。
800106July 24, 2009引入 VM 对象类型 OBJT_SG 之后的 8.0-CURRENT。
800107August 2, 2009通过加入 newbus sxlock 使 newbus 子系统不再使用 Giant, 以及 8.0-RELEASE。
800108November 21, 2009实现了 EVFILT_USER kevent 过滤器之后的 8.0-STABLE。
800500January 7, 2010pkg_add -r 使用 packages-8-stable 的 __FreeBSD_version 版本变化的 8.0-STABLE。
800501January 24, 2010调整了 scandir(3)alphasort(3) 函数原型, 使其符合 SUSv4 之后的 8.0-STABLE。
800502January 31, 2010新增了 sigpause(3) 之后的 8.0-STABLE。
800503February 25, 2010新增了用于管理网络接口说明的 SIOCGIFDESCR 和 SIOCSIFDESCR ioctl 之后的 8.0-STABLE。 这组接口受到了 OpenBSD 的启发。
800504March 1, 2010MFC 了 x86emu, 来自 OpenBSD 的 x86 CPU 实模式模拟器之后的 8.0-STABLE。
800505May 18, 2010MFC 了添加 liblzma, xz, xzdec 以及 lzmainfo 之后的 8.0-STABLE。
801000June 14, 20108.1-RELEASE
801500June 14, 20108.1-RELEASE 之后的 8.1-STABLE。
801501November 3, 2010用于 PL_FLAG_SCE/SCX/EXEC/SI 的 struct sysentvec 的 KBI 以及 用于 ptrace(PT_LWPINFO) 的 pl_siginfo 的 KBI 改变之后的 8.1-STABLE。
802000December 22, 20108.2-RELEASE
802500December 22, 20108.2-RELEASE 之后的 8.2-STABLE。
802501February 28, 2011合并了 DTrace 变动, 包含用户态跟踪支持之后的 8.2-STABLE。
802502March 6, 2011在 libm 中合并了 log2 和 log2f 之后的 8.2-STABLE。
802503May 1, 2011将 gcc 升级至 FSF gcc-4_2-branch 最后一个 GPLv2 版本之后的 8.2-STABLE。
802504May 28, 2011引入模块化拥塞控制支持基础设施和 KPI 之后的 8.2-STABLE。
802505May 28, 2011引入了 Hhook 和 Khelp KPI 之后的 8.2-STABLE。
802506May 28, 2011在 tcpcb 结构中增加 OSD 之后的 8.2-STABLE。
802507June 6, 2011引入 ZFS v28 之后的 8.2-STABLE。
802508June 8, 2011删去了 sv_schedtail struct sysvec 方法之后的 8.2-STABLE。
802509July 14, 2011在 binutils 中合并了 SSE3 支持之后的 8.2-STABLE。
802510July 19, 2011rfork(2) 添加了 RFTSIGZMB 标志之后的 8.2-STABLE。
900000August 22, 20099.0-CURRENT。
900001September 8, 2009引入了 x86emu, 来自 OpenBSD 的 x86 CPU 实模式模拟器之后的 9.0-CURRENT。
900002September 23, 2009实现了 EVFILT_USER kevent 过滤器之后的 9.0-CURRENT。
900003December 2, 2009新增了 sigpause(3) 以及 csu 的 PIE 支持之后的 9.0-CURRENT。
900004December 6, 2009新增了 libulog 及其 libutempter 兼容接口之后的 9.0-CURRENT。
900005December 12, 2009新增了用于查询指定休眠队列上等待者数量的 sleepq_sleepcnt() 函数之后的 9.0-CURRENT。
900006January 4, 2010调整了 scandir(3)alphasort(3) 函数原型, 使其符合 SUSv4 之后的 9.0-CURRENT。
900007January 13, 2010删去了 utmp(5) 并增加了 utmpx (参阅 getutxent(3)) 以改善用户登录日志和系统事件支持之后的 9.0-CURRENT。
900008January 20, 20109.0-CURRENT 引入了 BSD 授权的 bc/dc 并将 GNU bc/dc 标注为过时之后的 9.0-CURRENT。
900009January 26, 2010新增了用于管理网络接口说明的 SIOCGIFDESCR 和 SIOCSIFDESCR ioctl 之后的 9.0-CURRENT。 这组接口受到了 OpenBSD 的启发。
900010March 22, 2010引入了 zlib 1.2.4 之后的 9.0-CURRENT。
900011April 24, 2010添加了 soft-updates 日志功能之后的 9.0-CURRENT。
900012May 10, 2010添加了 liblzma, xz, xzdec 以及 lzmainfo 之后的 9.0-CURRENT。
900013May 24, 2010添加了针对 linux(4) 的 USB 修正之后的 9.0-CURRENT。
900014Jun 10, 2010添加了 Clang 之后的 9.0-CURRENT。
900015July 22, 2010引入了 BSD grep 之后的 9.0-CURRENT。
900016July 28, 2010在 struct malloc_type_internal 中加入了 mti_zone 之后的 9.0-CURRENT。
900017August 23, 2010默认 grep 改回使用 GNU grep 并增加 WITH_BSD_GREP 开关之后的 9.0-CURRENT。
900018August 24, 2010pthread_kill(3) 产生的信号在 si_code 中改为使用 SI_LWP 标记之后的 9.0-CURRENT。 之前, si_code 对应的标志为 SI_USER。
900019August 28, 2010mmap(2) 新增了 MAP_PREFAULT_READ 标志之后的 9.0-CURRENT。
900020September 9, 2010为 sbuf 增加了 drain 功能并改变了 struct sbuf 布局之后的 9.0-CURRENT。
900021September 13, 2010DTrace 增加用户态跟踪支持之后的 9.0-CURRENT。
900022October 2, 2010新增了 BSDL man 工具, 并淘汰 GNU/GPL man 工具之后的 9.0-CURRENT。
900023October 11, 2010引入 20101010 git 快照版本 xz 之后的 9.0-CURRENT。
900024November 11, 2010将 libgcc.a 替换为 libcompiler_rt.a 之后的 9.0-CURRENT。
900025November 12, 2010引入了模块化拥塞控制之后的 9.0-CURRENT。
900026November 30, 2010引入串行管理协议 (SMP) 直通, 以及与之对应的 CAM CCB XPT_SMP_IO 和 XPT_GDEV_ADVINFO 之后的 9.0-CURRENT。
900027December 5, 2010在 libm 中增加 log2 之后的 9.0-CURRENT。
900028December 21, 2010添加了 Hhook (Helper Hook)、 Khelp (Kernel Helpers) 和 Object Specific Data (OSD) KPI 之后的 9.0-CURRENT。
900029December 28, 2010修改 TCP 协议栈使其允许 Khelp 模块通过 helper hook 指针, 与 TCP 控制块交互并保存连接数据之后的 9.0-CURRENT。
900030January 12, 2011将 libdialog 更新至版本 20100428 之后的 9.0-CURRENT。
900031February 7, 2011添加了 pthread_getthreadid_np(3) 之后的 9.0-CURRENT。
900032February 8, 2011删除了 uio_yield 函数原型和符号之后的 9.0-CURRENT。
900033February 18, 2011将 binutils 更新至 2.17.50 之后的 9.0-CURRENT。
900034March 8, 2011修改了 struct sysvec (sv_schedtail) 之后的 9.0-CURRENT。
900035March 29, 2011将基本系统中 gcc 和 libstdc++ 升级至最后的 GPLv2 授权版本之后的 9.0-CURRENT。
900036April 18, 2011在基本系统中删去了 libobjc 和 Objective-C 支持之后的 9.0-CURRENT。
900037May 13, 2011在基本系统中引入了 libprocstat(3) 函数库以及 fuser(1) 工具之后的 9.0-CURRENT。
900038May 22, 2011为 VFS_FHTOVP(9) 添加锁标志参数之后的 9.0-CURRENT。
900039June 28, 2011引入了来自 OpenBSD 4.5 的 pf 之后的 9.0-CURRENT。
900040July 19, 2011将 amd64 和 ia64 平台上的 MAXCPU 提高到 64, 并把 XLP (mips) 上的值提高到 128 之后的 9.0-CURRENT。
900041August 13, 2011实现了 Capsicum capabilities 之后的 9.0-CURRENT。 fget(9) 新增了权限参数。
900042August 28, 2011提高修改过 ABI 的动态连接库版本号之后的 9.0-CURRENT。
900043September 2, 2011增加了对不支持 SCSI 快取缓存同步功能的 USB 大容量存储设备自动检测功能之后的 9.0-CURRENT。
900044September 10, 2011重构了 auto-quirk 之后的 9.0-CURRENT。
900045Oct 13, 2011将非兼容性系统调用入口点全部增加 sys_ 前缀之后的 9.0-CURRENT。

注意:

请注意, 2.2.5-RELEASE 之后有一段时间的 2.2-STABLE 会声称自己是 “2.2.5-STABLE”。 这种模式的版本号表示的是年月。 但随后, 我们决定, 从 2.2 开始, 将它改为更为简洁的 主/次 版本号的形式来命名版本。 这是因为并行地在多个分支上进行开发, 使得通过实际的发布日期来区分不同的版本变得不再现实。 如果您正在做新的 port, 应该不需要担心较早的 -CURRENT; 在此列出仅供参考。

12.6. 在 bsd.port.mk 之后写一些内容

不要在 .include <bsd.port.mk> 这行之后增加任何内容。 这通常可以通过在您的 Makefile 中间的某处引用 bsd.port.pre.mk, 并在结尾的地方引用 bsd.port.post.mk 来避免。

注意:

只能够采用 bsd.port.pre.mk/bsd.port.post.mkbsd.port.mk 两种写法之一; 任何时候都不要同时使用两种写法。

bsd.port.pre.mk 只定义了很少的变量, 它们可以在 Makefile 中用于进行一些测试, 而 bsd.port.post.mk 则定义了所有其它的变量。

下面是一些由 bsd.port.pre.mk 定义的比较重要的变量 (这并不是一份完整的列表, 您可以阅读 bsd.port.mk 以获得全部变量的名字)。

变量描述
ARCHuname -m 输出得到的硬件架构的名字 (例如, i386)
OPSYSuname -s 返回的操作系统类型 (例如, FreeBSD)
OSREL操作系统的版本号 (例如 2.1.52.2.7)
OSVERSION操作系统的版本号的数值形式; 它等于 __FreeBSD_version
PORTOBJFORMAT系统默认的执行文件格式 (elfaout; 请注意, “现代的” FreeBSD 版本中, aout 已在淘汰之列。)
LOCALBASE“local” 目录的根 (例如, /usr/local/)
PREFIXport 应被安装到哪里 (参见 关于 PREFIX 的更多说明)。

注意:

如果您需要定义 USE_IMAKEUSE_X_PREFIX, 或 MASTERDIR 这些变量, 则应在引用 bsd.port.pre.mk 之前完成。

下面是一些在引用 bsd.port.pre.mk 之后可以进行的判断:

# 如果 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= 后面使用制表符, 而不是空格, 对吧? :-)

12.7. 在 wrapper 脚本中使用 exec 语句

如果 port 安装了用以启动其他程序的脚本, 并且运行其他程序是这些脚本的最后一项操作, 请务必使用 exec 语句来运行这些程序, 例如:

#!/bin/sh
exec %%LOCALBASE%%/bin/java -jar %%DATADIR%%/foo.jar "$@"

使用 exec 语句表示执行指定的程序来取代 shell 进程。 如果省略了 exec, 则 shell 进程会一直在内存中, 从而不必要地消耗了额外的系统资源。

12.8. 理性行事

任何 Makefile 都应该简单并理性地行事。 如果您能让其中的条目更为简单和易读, 一定要这样做。 例如, 使用 make 提供的 .if 结构, 而不要使用 shell 的 if, 只要能重定义 EXTRACT* 就不要重载 do-extract, 尽量使用 GNU_CONFIGURE 而不是 CONFIGURE_ARGS += --prefix=${PREFIX}

如果您在尝试做什么事情的时候发现不得不写大量的代码, 请回过头来复审一下 bsd.port.mk, 看看是否有您正打算做的事情的现成实现。 尽管读起来可能很费劲, 但有很多貌似很难的问题, 在 bsd.port.mk 中都给出了十分简便的解决方案。

12.9. 遵循 CCCXX 设置

port 应遵循 CCCXX 变量的设置。 这也就是说, port 不应使用绝对的方式来设置这个变量的值, 而罔顾已经存在的设置; 与此相反, 它应该在其值后加入需要的其它值。 这样, 就可以设置全局的联编选项, 令其影响所有的 port 联编过程了。

如果实在无法这样做, 请在 Makefile 中加入 NO_PACKAGE=ignores cflags

下面的 Makefile 实例给出了如何遵循 CCCXX 变量的设置。 注意这里用到的 ?=

CC?= gcc
CXX?= g++

下面则是没有遵循 CCCXX 的例子:

CC= gcc
CXX= g++

在 FreeBSD 系统中, CCCXX 这两个变量都可以在 /etc/make.conf 中自行定义。 第一个例子只有在 /etc/make.conf 中没有定义时才对这两个变量进行定义, 从而保持了系统范围的配置。 而第二个例子则会覆盖任何现有的配置。

12.10. 遵循 CFLAGS

您的 port 应遵循 CFLAGS 变量的设置。 这也就是说, port 不应使用绝对的方式来设置这个变量的值, 而罔顾已经存在的设置; 与此相反, 它应该在其值后加入需要的其它值, 这样, 就可以设置全局的联编选项, 令其影响所有的 port 联编过程了。

如果实在无法这样做, 请在 Makefile 中加入 NO_PACKAGE=ignores cflags

下面的 Makefile 例子, 可以帮助我们理解如何遵循 CFLAGS 的设置。 注意所用的 +=

CFLAGS+= -Wall -Werror

下面是一个未能遵循 CFLAGS 设置的例子:

CFLAGS= -Wall -Werror

一般来说, CFLAGS 在 FreeBSD 系统中是在 /etc/make.conf 里配置的。 第一个例子在 CFLAGS 变量中增加了一些参数, 并保持了所有系统预定义的标志。 而第二个例子, 则会覆盖掉任何先前定义的参数。

您应从第三方软件的 Makefile 中去掉特殊的优化设置。 系统的 CFLAGS 给出了全系统范围内的优化设置参数。 下面是一个未经修改的 Makefile 实例:

CFLAGS= -O3 -funroll-loops -DHAVE_SOUND

如果使用系统的优化参数, 则 Makefile 中的设置应该类似下面这样:

CFLAGS+= -DHAVE_SOUND

12.11. 线程库

在 FreeBSD 上, 线程库必须通过特殊的连接器参数 -pthread 连接到可执行文件。 如果 port 一定要直接连接 -lpthread-lc_r, 则应将其改为使用由 ports 框架提供的 PTHREAD_LIBS。 这个变量的值通常是 -pthread, 但在某些特定平台上的 FreeBSD 版本中, 它可能是其它值, 因此, 不要将 -pthread 硬编码到您的补丁中, 而应使用 PTHREAD_LIBS 变量。

注意:

如果设置了 PTHREAD_LIBS, 而在联编时出现 unrecognized option '-pthread' 这样的错误, 可能需要通过将 CONFIGURE_ENV 设为 LD=${CC} 来使用 gcc 作为连接器。 -pthread 这一选项并不为 ld 所直接支持。

12.12. 反馈

如果进行了一些很好的修改和补丁, 一定要把它们发回给原作者, 或维护者, 以便在下一版本的代码中包含它们。 这会让您在软件发布新版本的时候变得轻松一些。

12.13. README.html

不要包含 README.html 文件。 这个文件并非 CVS 代码库中的一部分, 它是由 make readme 命令生成的。

12.14. 使用 BROKENFORBIDDENIGNORE 阻止用户安装 port

某些时候会需要阻止用户安装某个 port。 想要告诉用户某个 port 不应被安装, 有许多可以在 port 的 Makefile 中使用的 make 变量。 下列 make 的值, 将是在用户试图安装时得到的提示信息。 务请使用正确的 make 变量, 因为每一个都表达了截然不同的意义, 而且许多自动化系统, 例如 port 联编集群、 FreshPorts, 以及 portsmon, 都依赖于 Makefile 的正确性。

12.14.1. 变量

  • BROKEN 专门用于表达目前无法正确编译、 安装或卸载这类问题。 如果是临时性的问题, 则可以使用它。

    如果进行了相关的配置, 则联编集群仍将尝试联编它, 以确认导致问题的深层问题是否已被解决。 (不过, 一般情况下, 联编集群并不会这样做。)

    举例来说, 当 port 发生下述情况时, 应使用 BROKEN

    • 无法编译 (does not compile)

    • 无法正确进行配置或安装操作

    • ${LOCALBASE} 以外的地方安装文件

    • 卸载时无法删除所安装的全部文件 (不过, 留下用户改过的文件可接受的, 因为可能希望这样作)

  • FORBIDDEN 用于表示 ports 中包含安全漏洞, 或者可能会给安装了这个 port 的 FreeBSD 系统带来严重的安全隐患 (例如: 一个很不安全的程序, 或包含了能够被轻易攻陷的服务的软件)。 如果发现了安全漏洞, 而其作者没有发布升级版本, 则应立即把那个 port 标记为 FORBIDDEN。 理想情况下, 包含安全漏洞的 port 应被尽快升级, 以便减少包含漏洞的 FreeBSD 主机的数量 (我们希望保持良好的安全记录), 然而, 有时在安全漏洞的披露和软件更新之间可能会有一个间隔, 此时应予以说明。 除了安全之外, 请不要以任何其它理由将 port 标记为 FORBIDDEN

  • IGNORE 用来表示 port 由于某些其它原因不应予以联编。 如果认为发生了结构性的问题, 则应使用它。 任何情况下, 联编集群都不会联编标记为 IGNORE 的 port。 以下是使用 IGNORE 的一些例子:

    • 能够编译但无法正常运行

    • 无法与运行的 FreeBSD 版本一同工作

    • 联编时需要 FreeBSD 内核的源代码, 但用户没有安装它们

    • 由于授权原因, 必须手工下载 distfile

    • 无法与的某个已安装的 port 一同工作 (例如, port 依赖于 www/apache21 而安装的则是 www/apache13)

    注意:

    如果 port 与某个已经安装的 port 冲突 (例如, 它们在同一位置安装同名但功能不同的文件), 则应 使用 CONFLICTS 来标记它。 CONFLICTS 将自动地设置 IGNORE

  • 如果 port 只应在某些平台上标记为 IGNORE, 还有另外两个方便使用的 IGNORE 变量可供选择: ONLY_FOR_ARCHSNOT_FOR_ARCHS。 例如:

    ONLY_FOR_ARCHS= i386 amd64
    NOT_FOR_ARCHS= alpha ia64 sparc64

    可以使用 ONLY_FOR_ARCHS_REASONNOT_FOR_ARCHS_REASON 来配置定制的 IGNORE 消息。 此外, 还可以使用 ONLY_FOR_ARCHS_REASON_ARCHNOT_FOR_ARCHS_REASON_ARCH 来分别指定与具体平台有关的信息。

  • 如果 port 会下载并安装用于 i386 的预编译二进制文件, 则应设置 IA32_BINARY_PORT。 如果设置了这个变量, 则系统会检查是否已经在 /usr/lib32 目录中安装了 IA32 版本的函数库, 以及内核是否提供了 IA32 兼容支持。 如果这些依赖条件不满足, 则会自动设置 IGNORE

12.14.2. 实现说明

这些字串不应使用引号括起来。 此外, 由于显示给用户的方式不同, 这些字串的措辞也应有所不同。 例如:

BROKEN= this port is unsupported on FreeBSD 5.x
IGNORE= is unsupported on FreeBSD 5.x

它们分别会在 make describe 时产生下面的输出:

===>  foobar-0.1 is marked as broken: this port is unsupported on FreeBSD 5.x.
===>  foobar-0.1 is unsupported on FreeBSD 5.x.

12.15. 使用 DEPRECATEDEXPIRATION_DATE 表示某个 port 将被删除

一定要记得 BROKENFORBIDDEN 只应作为当某个 port 无法正常工作时的临时解决方案。 永久性地坏掉了的 port 应被从 ports tree 中完全删除。

需要时还可以使用 DEPRECATEDEXPIRATION_DATE 来通知用户某个 port 不应被使用, 并即将被删除。 前一个变量用来表达为什么计划删除 port; 而后一个是则是一个 ISO 8601 格式的日期 (YYYY-MM-DD)。 两者都会向用户呈现。

也可以设置 DEPRECATED 而不给出 EXPIRATION_DATE (例如, 建议使用某个新版本的 port), 但反之则没有意义。

目前还没有确切的关于需要给出多少通知的政策。 当前的实践是, 对于与安全有关的问题为一个月, 而与联编有关的问题则为两个月。 这也让有兴趣的 committer 能够有一点时间来修正问题。

12.16. 避免使用 .error 结构

Makefile 中给出信号, 表示由于某种外界因素 (例如, 用户指定了无效的联编选项) 而无法安装的方法是将变量 IGNORE 设为一非空值。 这个值将被格式化, 并在用户执行 make install 是给出提示。

.error 实现这一目的是一种常见的误用。 这样做的问题是, 许多在 ports 树上运行的自动化工具会因此而失败。 最常见的情况见于联编 /usr/ports/INDEX 的过程 (参见 第 9.1 节 “运行 make describe”)。 然而, 即使十分普通的命令, 例如 make maintainer, 在这种情况下也会失败。 这是不可接受的。

例 12.1. 怎样避免使用 .error

考虑有人在 make.conf 中设置了

USE_POINTYHAT=yes

的情形。 接下来的例子中, 第一个 Makefile 中的问题将导致 make index 失败, 而第二个则不会:

.if USE_POINTYHAT
.error "POINTYHAT is not supported"
.endif
.if USE_POINTYHAT
IGNORE=POINTYHAT is not supported
.endif

12.17. 对于 sysctl 的使用

除了在 target 中之外, 是不鼓励使用 sysctl 的。 这是因为计算 makevar, 例如在 make index 中所进行的那种, 都不得不运行一条命令, 这会使这一操作变得更慢。

在使用 sysctl(8) 时, 务必通过 SYSCTL 变量来进行, 因为此变量将展开成命令的完整路径, 并且用户可以根据需要另行指定。

12.18. 重新发布的 distfiles

有时, 一些软件的作者会修改业已发布的 distfile 的内容, 而并不修改文件名。 这种情况下, 您需要验证这些变动是来自软件作者的官方改动。 在过去, 曾经发生过下载服务器上的 distfile 被悄悄换成注入过恶意代码的版本, 并给用户安全造成威胁或损害的事情。

您应保留一份旧的 distfile, 并下载一份新的, 分别展开, 用 diff(1) 来对比其内容。 如果没有发现可疑的变动, 就可以更新 distinfo 了。 请务必在您的 PR 或 commit log 中对这些差异进行描述, 以便让别人了解您已经仔细对比过差异, 并确认没有问题了。

除此之外, 也可以联系软件的作者, 以确认这些修改是否是他们做的。

12.19. 杂记

需要仔细地反复检查 pkg-descrpkg-plist 这两个文件。 如果您正在复审一个 port, 并认为这两个文件应该改进, 请一定要这样做。

请不要在系统中复制多份 GNU General Public License。

一定要非常小心地处理法律问题! 不要让我们发布没有得到合法授权的软件!