15.5 区分操作系统和版本

可能你必须修改一些代码以使你的port能够在特定的unix版本上运行.如果你做了,请确定你的修改是通用的,可以使我们可以把代码port到来自CSRG的4.4BSD,BSD/386,386BSD,NetBSD,OpenBSD.下面我们就来讲讲这个问题.

一个较好的办法是使用<sys/param.h>的BSD宏定义来区分 4.3BSD/Reno(1990)和新版本的BSD.希望你已经包含了这个文件,如果没有在你的c文件的合适位置定义以下代码:

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

我们相信每一个操作系统只要定义了这两个符号就应该有sys/param.h这个文件.如果你知道那个系统没有,请发信到.

另一种办法是使用GNU Autoconf的风格定义:

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

不要忘记在你的Makefile中增加这样一个CFLAGS: -DHAVE_SYS_PARAM_H.

一旦你包含了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__

使用方法:

注意: 2.2.5-RELEASE之后的2.2-STABLE 会把自己当成2.2.5-STABLE.因为使用的是年月的形式,从2.2开始我们采用更直接的主/次版本的形式.原因是开发者以时间不足以明确到底属于哪个发布版,如果你正进行port工作,完全不必管他,只是给你做个参考.

其实,在那么多的port中可能只有几个应该使用__FreeBSD__的.