You may come across code that needs modifications or conditional compilation based upon what version of Unix it is running under. If you need to make such changes to the code for conditional compilation, make sure you make the changes as general as possible so that we can back-port code to older FreeBSD systems and cross-port to other BSD systems such as 4.4BSD from CSRG, BSD/386, 386BSD, NetBSD, and OpenBSD.
The preferred way to tell 4.3BSD/Reno (1990) and newer versions
of the BSD code apart is by using the BSD
macro
defined in
sys/param.h.
Hopefully that
file is already included; if not, add the code:
to the proper place in the .c
file. We
believe that every system that defines these two symbols has
sys/param.h
. If you find a system that
does not, we would like to know. Please send mail to the
FreeBSD ports 郵遞論壇.
Another way is to use the GNU Autoconf style of doing this:
Do not forget to add -DHAVE_SYS_PARAM_H
to the
CFLAGS
in the Makefile
for
this method.
Once you have sys/param.h
included, you may
use:
to detect if the code is being compiled on a 4.3 Net2 code base or newer (e.g. FreeBSD 1.x, 4.3/Reno, NetBSD 0.9, 386BSD, BSD/386 1.1 and below).
Use:
to detect if the code is being compiled on a 4.4 code base or newer (e.g. FreeBSD 2.x, 4.4, NetBSD 1.0, BSD/386 2.0 or above).
The value of the BSD
macro is
199506
for the 4.4BSD-Lite2 code base. This is
stated for informational purposes only. It should not be used to
distinguish between versions of FreeBSD based only on 4.4-Lite vs.
versions that have merged in changes from 4.4-Lite2. The
__FreeBSD__
macro should be used instead.
Use sparingly:
__FreeBSD__
is defined in all versions of
FreeBSD. Use it if the change you are making
only affects FreeBSD. Porting gotchas like
the use of sys_errlist[]
vs
strerror()
are Berkeley-isms, not FreeBSD
changes.
In FreeBSD 2.x, __FreeBSD__
is defined to
be 2
. In earlier versions, it is
1
. Later versions always bump it to match
their major version number.
If you need to tell the difference between a FreeBSD 1.x
system and a FreeBSD 2.x or above system, usually the right answer
is to use the BSD
macros described above. If
there actually is a FreeBSD specific change (such as special
shared library options when using ld
) then it
is OK to use __FreeBSD__
and #if
__FreeBSD__ > 1
to detect a FreeBSD 2.x and later
system. If you need more granularity in detecting FreeBSD
systems since 2.0-RELEASE you can use the following:
In the hundreds of ports that have been done, there have only
been one or two cases where __FreeBSD__
should
have been used. Just because an earlier port screwed up and used it
in the wrong place does not mean you should do so too.
本文及其他文件,可由此下載: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/。
若有 FreeBSD 方面疑問,請先閱讀
FreeBSD 相關文件,如不能解決的話,再洽詢
<questions@FreeBSD.org>。
關於本文件的問題,請洽詢
<doc@FreeBSD.org>。