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

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

Другим способом является использование для этого стиля 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
    
    
    Релиз __FreeBSD_version
    2.0-RELEASE 119411
    2.1-CURRENT 199501, 199503
    2.0.5-RELEASE 199504
    2.2-CURRENT до выхода 2.1 199508
    2.1.0-RELEASE 199511
    2.2-CURRENT до выхода 2.1.5 199512
    2.1.5-RELEASE 199607
    2.2-CURRENT до выхода 2.1.6 199608
    2.1.6-RELEASE 199612
    2.1.7-RELEASE 199612
    2.2-RELEASE 220000
    2.2.1-RELEASE 220000 (без изменений)
    2.2-STABLE после выхода 2.2.1-RELEASE 220000 (без изменений)
    2.2-STABLE после включения texinfo-3.9 221001
    2.2-STABLE после включения top 221002
    2.2.2-RELEASE 222000
    2.2-STABLE после выхода 2.2.2-RELEASE 222001
    2.2.5-RELEASE 225000
    2.2-STABLE после выхода 2.2.5-RELEASE 225001
    2.2-STABLE после появления ldconfig -R 225002
    2.2.6-RELEASE 226000
    2.2.7-RELEASE 227000
    2.2-STABLE после выхода 2.2.7-RELEASE 227001
    2.2-STABLE после изменения в semctl(2) 227002
    2.2.8-RELEASE 228000
    2.2-STABLE после выхода 2.2.8-RELEASE 228001
    3.0-CURRENT до изменения в mount(2) 300000
    3.0-CURRENT после изменения в mount(2) 300001
    3.0-CURRENT после изменения в semctl(2) 300002
    3.0-CURRENT после изменений в аргументах ioctl 300003
    3.0-CURRENT после перехода на формат ELF 300004
    3.0-RELEASE 300005
    3.0-CURRENT после выхода 3.0-RELEASE 300006
    3.0-STABLE после разбиения на ветки 3/4 300007
    3.1-RELEASE 310000
    3.1-STABLE после выхода 3.1-RELEASE 310001
    3.1-STABLE после изменения в порядке следования конструкторов/деструкторов в C++ 310002
    3.2-RELEASE 320000
    3.2-STABLE 320001
    3.2-STABLE после несовместимых изменений в IPFW и сокетах 320002
    3.3-RELEASE 330000
    3.3-STABLE 330001
    3.3-STABLE после добавления mkstemp(3) в libc 330002
    3.4-RELEASE 340000
    3.4-STABLE 340001
    4.0-CURRENT после появления ветки 3.4 400000
    4.0-CURRENT после изменения в работе динамического компоновщика 400001
    4.0-CURRENT после изменения в порядке следования конструкторов/деструкторов в C++ 400002
    4.0-CURRENT после появления функции dladdr(3) 400003
    4.0-CURRENT после исправления ошибки в работе функции __deregister_frame_info динамического компоновщика (а также 4.0-CURRENT после интеграции EGCS 1.1.2) 400004
    4.0-CURRENT после изменения интерфейса функции suser(9) (а также 4.0-CURRENT после появления newbus) 400005
    4.0-CURRENT после изменения в регистрации cdevsw 400006
    4.0-CURRENT после добавления so_cred в проверки на уровне сокетов 400007
    4.0-CURRENT после добавления обработчика системного вызова poll в libc_r 400008
    4.0-CURRENT после перехода в ядре с типа dev_t на указатель struct specinfo 400009
    4.0-CURRENT после исправления дыры в безопасности jail(2) 400010
    4.0-CURRENT после изменения в типе данных sigset_t 400011
    4.0-CURRENT после перехода на компилятор GCC 2.95.2 400012
    4.0-CURRENT после появления добавляемых обработчиков ioctl режима linux 400013
    4.0-CURRENT после заимствования OpenSSL 400014
    4.0-CURRENT после изменения в C++ ABI компилятора GCC 2.95.2 по умолчанию с -fvtable-thunks на -fno-vtable-thunks 400015
    4.0-CURRENT после заимствования OpenSSH 400016
    4.0-RELEASE 400017
    4.0-STABLE после появления 4.0-RELEASE 400018
    4.0-STABLE после интеграции кода библиотеки libxpg4 в libc. 400020
    4.0-STABLE после обновления пакета Binutils до версии 2.10.0, изменения в схеме пометки выполнимых файлов ELF и включения tcsh в качестве базового компонента. 400021
    4.1-RELEASE 410000
    4.1-STABLE после выхода 4.1-RELEASE 410001
    4.1-STABLE после переноса функции setproctitle(3) из библиотеки libutil в libc. 410002
    4.1.1-RELEASE 411000
    4.1.1-STABLE после выхода 4.1.1-RELEASE 411001
    4.2-RELEASE 420000
    4.2-STABLE после объединения libgcc.a и libgcc_r.a, а также соответствующих изменений в компоновке GCC. 420001
    4.3-RELEASE 430000
    4.3-STABLE после появления wint_t. 430001
    4.3-STABLE после добавления API состояния электропитания PCI. 430002
    4.4-RELEASE 440000
    4.4-STABLE после добавления d_thread_t. 440001
    4.4-STABLE после изменений в структуру для монтирования (это затрагивает KLD файловых систем). 440002
    4.4-STABLE после импортирования пользовательских компонент smbfs. 440003
    5.0-CURRENT 500000
    5.0-CURRENT после добавления дополнительных полей в заголовке ELF и изменения метода пометки принадлежности к определённой системе для выполнимых файлов в формате ELF. 500001
    5.0-CURRENT после изменений в метаданных kld. 500002
    5.0-CURRENT после изменений buf/bio. 500003
    5.0-CURRENT после обновления binutils. 500004
    5.0-CURRENT после интеграции кода библиотеки libxpg4 в libc и появления интерфейса TASKQ. 500005
    5.0-CURRENT после добавления интерфейсов AGP. 500006
    5.0-CURRENT после обновления Perl до версии 5.6.0 500007
    5.0-CURRENT после обновления кода KAME до версии 2000/07. 500008
    5.0-CURRENT после изменений в ether_ifattach() и ether_ifdetach(). 500009
    5.0-CURRENT после возврата в настройках утилиты mtree, применяемых по умолчанию, обратно к оригинальным и добавления флага -L для перехода по символическим ссылкам. 500010
    5.0-CURRENT после изменения в API для kqueue. 500011
    5.0-CURRENT после перемещения setproctitle(3) из библиотеки libutil в libc. 500012
    5.0-CURRENT после первого коммита SMPng. 500013
    5.0-CURRENT после переноса <sys/select.h> в <sys/selinfo.h>. 500014
    5.0-CURRENT после объединения libgcc.a и libgcc_r.a, а также соответствующих изменений в компоновке GCC. 500015
    5.0-CURRENT после изменения, позволяющего libc и libc_r быть скомпонованными вместе, что делает параметр -pthread ненужным. 500016
    5.0-CURRENT после перехода на использование struct xucred вместо struct ucred для стабилизиции экспортируемого API ядра для mountd и т.д. 500017
    5.0-CURRENT после добавления переменной make CPUTYPE позволяющей контролировать специфичные для CPU оптимизации. 500018
    5.0-CURRENT после переноса machine/ioctl_fd.h в sys/fdcio.h 500019
    5.0-CURRENT после изменения имен для локализации. 500020
    5.0-CURRENT после импортирования Bzip2. 500021
    5.0-CURRENT с поддержкой SSE. 500022
    5.0-CURRENT после KSE Этап 2. 500023
    5.0-CURRENT после d_thread_t и переноса UUCP в порты. 500024
    5.0-CURRENT после изменения ABI из-за переноса передачи дескриптора и прав на 64-разрядные платформы. 500025
    5.0-CURRENT после перехода на использование по умолчанию XFree86 4 для построения пакаджей и после добавления в библиотеку libc новой функции strnstr(). 500026
    5.0-CURRENT после добавления в библиотеку libc новой функции strcasestr(). 500027
    5.0-CURRENT после импортирования пользовательских компонент smbfs. 500028

Note: Заметьте, что 2.2-STABLE иногда идентифицирует себя как ``2.2.5-STABLE'' после 2.2.5-RELEASE. Такой принцип использовался год и месяц, но мы решили изменить его на более однозначную систему нумерации старший/младший, начиная с версии 2.2. Это объясняется тем, что параллельная разработка в нескольких ветках делает непрактичным идентификацию релизов просто по их реальным датам выпуска. Если вы сейчас делаете порт, вам не стоит заботиться о старых версиях -CURRENT; они перечислены здесь просто в информационных целях.

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

По вопросам связанным с системой портов для FreeBSD, пишите по адресу <[email protected]>.
По вопросам связанным с этом документацией, пишите по адресу <[email protected]>.