12.4. Различение операционных систем и версий ОС
Пред. | Глава 12. Что делать нужно, и что делать нельзя | След.

## 12.4. Различение операционных систем и версий ОС

Вы можете встретиться с кодом, который требует модификаций или условной компиляции в зависимости от того, с какой версией Unix он работает. Если вам нужно сделать такие изменения в коде для условной компиляции, то вы должны делать изменения как можно более общими, чтобы мы могли перенести код на более старые системы FreeBSD, а также и на другие системы 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.

Другим способом является использование для этого стиля 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 и более старших, правильным способом, как правило, будет использование макроса `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

Из сотен уже сделанных портов только в одном или двух случаях потребовалось использование `__FreeBSD__`. Если старые порты использовали этот макрос не по назначению, вовсе не значит, что вам нужно поступать точно также.

Пред. | Наверх | След.
12.3. `WRKDIRPREFIX` | Начало | 12.5. Значения `__FreeBSD_version`

Этот, и другие документы, могут быть скачаны с http://ftp.FreeBSD.org/pub/FreeBSD/doc/.

По вопросам, связанным с FreeBSD, прочитайте документацию прежде чем писать в <questions@FreeBSD.org>.
По вопросам, связанным с этой документацией, пишите в рассылку <doc@FreeBSD.org>.