Руководство по портированию приложений во FreeBSD | ||
---|---|---|
Prev | Chapter 15. Что нужно, а что нельзя делать | Next |
Вы можете встретиться с кодом, который требует модификаций или условной компиляции в зависимости от того, с какой версией 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
Релиз | __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 после добавления mkstemps() в 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() из библиотеки libutil в libc. | 410002 |
4.1.1-RELEASE | 411000 |
4.1.1-STABLE после выхода 4.1.1-RELEASE | 411001 |
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 после изменений в ether_ifattach() и ether_ifdetach(). | 500009 |
5.0-CURRENT после обновления кода KAME до версии 2000/07. | 500008 |
5.0-CURRENT после изменения в API для kqueue. | 500011 |
5.0-CURRENT после перемещения setproctitle() из библиотеки libutil в libc. | 500012 |
5.0-CURRENT после первого коммита SMPng. | 500013 |
5.0-CURRENT после возврата в настройках утилиты mtree, применяемых по умолчанию, обратно к оригинальным и добавления флага -L для перехода по символическим ссылкам. | 500010 |
Note: Заметьте, что 2.2-STABLE иногда идентифицирует себя как ``2.2.5-STABLE'' после 2.2.5-RELEASE. Такой принцип использовался год и месяц, но мы решили изменить его на более однозначную систему нумерации старший/младший, начиная с версии 2.2. Это объясняется тем, что параллельная разработка в нескольких ветках делает непрактичным идентификацию релизов просто по их реальным датам выпуска. Если вы сейчас делаете порт, вам не стоит заботиться о старых версиях -CURRENT; они перечислены здесь просто в информационных целях.
Из сотен уже сделанных портов только в одном или двух случаях потребовалось использование __FreeBSD__. Если старые порты использовали этот макрос не по назначению, вовсе не значит, что вам нужно поступать точно также.
По вопросам связанным с системой
портов для FreeBSD, пишите по адресу <ports@freebsd.org>.
По вопросам связанным с этом документацией, пишите по адресу
<doc@freebsd.org>.