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__ 宏。

  保守地使用:

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

若您有关于 FreeBSD ports 系统的问题, 请发送电子邮件至 <ports@FreeBSD.org>。
关于此文档的任何问题, 请致函 <doc@FreeBSD.org>。