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 mailing list.
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 versus 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[]
versus 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.
This, and other documents, can be downloaded from http://ftp.FreeBSD.org/pub/FreeBSD/doc/
For questions about FreeBSD, read the
documentation before
contacting <questions@FreeBSD.org>.
For questions about this documentation, e-mail <doc@FreeBSD.org>.