Вы можете встретиться с кодом, который требует модификаций
или условной компиляции в зависимости от того, с какой
версией UNIX он работает. Если вам нудно сделать такие
изменения в коде для условной компиляции, то вы должны делать
изменения как можно более общими, чтобы мы могли перенести
код на системы FreeBSD версий 1.x, а также и на другие
системы BSD, такие, как 4.4BSD от CSRG, BSD/386, 386BSD,
NetBSD, и OpenBSD.
Предпочтительным способом отделения кода для 4.3BSD/Reno
(1990) и и более новых версий BSD является использование
макроса BSD, определенного в файле
<sys/param.h>. Хорошо, если
этот файл уже включен; если это не так, то добавьте такой
код:
#if (defined(__unix__) || defined(unix)) && !defined(USG)
#include <sys/param.h>
#endif
в соответствующем месте файла
.c. Мы надеемся, что все системы, в которых определены
эти две константы, имеют файл
sys/param.h. Если вы обнаружите систему, в которой это
не так, мы хотим знать. Пошлите, пожалуйста, письмо на адрес
Список рассылки посвященный Портам FreeBSD
<freebsd-ports@FreeBSD.org>.
Другим способом является использование для этого стиля GNU
Autoconf:
#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
Не забудьте добавить
-DHAVE_SYS_PARAM_H к CFLAGS в
файле Makefile при использовании
этого метода.
Как только вы включите
sys/param.h, то сможете воспользоваться следующим:
#if (defined(BSD) && (BSD >= 199103))
для определения того, компилируется ли программа на основе
кода Net2 версии 4.3 или более новой версии (например,
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 и выше).
Значение макроса BSD равно 199506 для кода на основе 4.4BSD-Lite2.
Оно задано только для информационной целей. Оно не должно
использоваться для различия между версиями FreeBSD,
основанными на коде 4.4-Lite и версиями, в которые включены
изменения из 4.4-Lite2. Вместо этого нужно использовать
макрос __FreeBSD__.
Реже используйте:
-
__FreeBSD__ определен во всех
версиях FreeBSD. Используйте его, если изменение,
вносимое вами, касается только
FreeBSD. Проблемы портирования, такие, как использование
sys_errlist[] или strerror() являются особенностями систем
BSD, а не FreeBSD.
-
Во FreeBSD 2.x, значение
__FreeBSD__ определено как
2. В более ранних версиях оно равно 1. В более поздних версиях это значение
увеличивается в соответствии со старшим номером версии
системы.
-
Если вам нужно отделить системы FreeBSD 1.x от систем
FreeBSD 2.x или 3.x, правильным способом, как правило,
будет использование макроса BSD,
описанное выше. Если это действительно изменение,
специфичное для FreeBSD (например, особая опция для
динамической библиотеки при использовании ld), то для распознавания систем FreeBSD
2.x и более поздних нормальным будет использование __FreeBSD__ и
#if __FreeBSD__ > 1. Если вам нужно более точное
определение версий FreeBSD, начиная с 2.0-RELEASE, то вы
можете использовать следующее:
#if __FreeBSD__ >= 2
#include <osreldate.h>
# if __FreeBSD_version >= 199504
/* 2.0.5+ release specific code here */
# endif
#endif
Note: Заметьте, что 2.2-STABLE иногда
идентифицирует себя как ``2.2.5-STABLE'' после
2.2.5-RELEASE. Такой принцип использовался год и месяц,
но мы решили изменить его на более однозначную систему
нумерации старший/младший, начиная с версии 2.2. Это
объясняется тем, что параллельная разработка в нескольких
ветках делает непрактичным идентификацию релизов просто
по их реальным датам выпуска. Если вы сейчас делаете
порт, вам не стоит заботиться о старых версиях -CURRENT;
они перечислены здесь просто в информационных целях.
Из сотен уже сделанных портов только в одном или двух
случаях потребовалось использование
__FreeBSD__. Если старые порты использовали этот макрос
не по назначению, вовсе не значит, что вам нужно поступать
точно также.
По вопросам связанным с системой портов для FreeBSD, пишите по
адресу <