Руководство FreeBSD по созданию портов
Пред. | Глава 16. Что делать нужно, и что делать нельзя | След.

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

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

Пред. | Начало | След.
`WRKDIRPREFIX` | Уровень выше | Значения __FreeBSD_version

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