GNU Portability Library

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 13:16, 15 апреля 2017.
GNULIB
Heckert GNU left white.svg
Разработчики: Bruno Haible, Jim Meyering
Выпущена: October 2013; 8 years ago (2013-10)
Постоянный выпуск: 0.1 / October 2013; 8 years ago (2013-10)
Состояние разработки: Active
Написана на: C
Размер дистрибутива: 6.07 MB
Веб-сайт gnu.org/software/gnulib/

Gnulib (англ. GNU Portability Library) является центральным хранилищем для общего кода GNU, предназначенным для совместного использования GNU пакетов. Gnulib использует особый подход: его компоненты предназначены для совместного использования на уровне исходного кода, а не библиотек, которые требуют сборку, установку и подключение. Таким образом, нет никакого распределения тарболом; идея состоит в том, чтобы скопировать файлы из Gnulib в свой собственный репозиторий. Gnulib также включает в себя копии нескольких файлов чисто для удобства: стандарты кодирования GNU, информация и сопровождении GNU, GPL и другие лицензии (в Texinfo), различные сценарии конфигурации и многое другое. Цель состоит в том, чтобы предоставить всю общую инфраструктуру, используемую пакетами.[Источник 1]

Преимущества использования Gnulib

В Gnulib улучшены различные аспекты пакета:[Источник 2]

  1. Переносимость: c Gnulib сопровождающий пакета может разрабатывать программы без использования POSIX и GNU libc API и все-таки ожидать хорошей переносимости на платформах, которые не реализуют POSIX.
  2. Сопровождаемость: когда пакет использует модули из Gnulib вместо кода, написанного специально для этого пакета, сопровождающему остается меньше кода для поддержки.
  3. Безопасность: Gnulib обеспечивает функции, которые имеют иммунитет к уязвимостям, которые приносит использование соответствующих банальных функций. Например,на функции asprintf и canonicalize_file_name не влияют проблемы, вызываемые размером буфера, тогда как sprintfи realpath к ним очень чувствительны. Функция openat не имеет условий гонки, которые у open есть. И т.п.
  4. Надежность: Gnulib предоставляет функции, которые содержат в себе вызов системной функции с проверкой результата. Примерами являются xalloc, xprintf, xstrtod, xgetcwd.
  5. Структура: Gnulib предлагает способ структурирования кода в модули: файл включений, файл исходного кода и один autoconf-макрос для каждой функции.

Переносимость и код приложения

Одна из задач Gnulib - сделать портативное программирование проще, на основе стандартов, имеющих значение для GNU (и Unix). Это делается с целью избежать деления сообщества пользователей на непересекающиеся части в соответствии с операционной системой вместо того, чтобы позволить взаимодействовать всем пользователям независимо от операционной системы.

Другой задачей Gnulib является предоставление кода, который может быть разделен между несколькими приложениями. Некоторые люди задаются вопросом: "Разве Glibc не имеет функцию, копирующую файл?" Действительно, сфера применения системный библиотеки libc заключается в реализации соответствующих стандартов (ISO C, POSIX), для обеспечения функций доступа к системным вызовам ядра и некоторого дополнительного функционала.

Например, Gnulib имеет средство для генерации имени файлов резервных копий. В то время как эта задача полностью лежит на уровне приложений ( не существует стандартов, устанавливающих API для этого), наивный код имеет некоторые проблемы с переносимостью, потому что на некоторых платформах длина имен файлов ограничена до 30 символов или около того. Gnulib решает эту проблему.

Кроме того, Gnulib имеет возможность выполнения команды в подпроцессе. Это одновременно увеличивает переносимость и помогает приложениям. К примеру: он заботится о перенаправлении стандартного ввода и/или стандартного вывода при необходимости и выдает сообщение об ошибке, если подпроцесс аварийно завершился.[Источник 2]

Целевые платформы

Gnulib поддерживает несколько платформ, которые участники GNU Project называют "разумные цели портативности". Этот класс состоит из широко распространенных операционных систем, в течение трех лет после их последней доступности или (для коммерческих операционных систем) до тех пор, пока поставщик обеспечивает их поддержку. Уже существующий Gnulib код для более старых операционных систем, как правило, остается на месте дольше, чем эти три года. Поэтому получается, что программы, использующие Gnulib с большой вероятностью будут корректно работать и на этих более старых операционных систем.

Некоторые операционные системы не очень распространены, но они являются свободным программным обеспечением и активно развиваются. Такие платформы также поддерживаются Gnulib, если сообщество разработчиков этой ОС находится в постоянном контакте с разработчиками Gnulib, предоставляя отчеты об ошибках, анализы или патчи. Для таких платформ, Gnulib поддерживает только версии прошлого года или последних нескольких месяцев в зависимости от степени развития проекта OS, числа ее пользователей и частоты ее обновлений этими пользователями.

Узкоспециализированные операционные системы, как правило, не поддерживаются Gnulib, хотя некоторые из их разработчиков или пользователей способствуют поддержке Gnulib.

Степень поддержки Gnulib гарантии для платформы зависит от количества тестирующих ее добровольцев. Платформы, на которых часто испытывают Gnulib эффективней поддерживаются. Затем идут платформы со случайными тестирования, потом платформы, которые редко тестируются. Как правило, сопровождение Gnulib исправляет ошибки, когда о них сообщают. Кроме того, так как некоторые редко тестируемые платформы имеют низкий приоритет, исправление ошибок для них может занимать куда больше времени.

По состоянию на 2016 год, список поддерживаемых платформ заключается в следующем:

  • Glibc системы. С GLibC 2.15 или выше частые испытания. О ядрах:
    • Glibc на Linux частые испытания.
    • Glibc на kFreeBSD редкие испытания.
  • Mac OS X. В версиях 10.11 периодические испытания. В версии 10.5 редкие испытания.
  • FreeBSD 9.1 или более поздней периодические испытания.
  • OpenBSD 5.8 или более поздней периодические испытания.
  • AIX 7.1 периодические испытания
  • Solaris 10 и 11 периодические испытания. Solaris 9 и старше редкие испытания (низкий приоритет).
  • Cygwin 2.6 периодические испытания. Cygwin 1.7.x редкие испытания.
  • MinGW периодические испытания. Некоторые модули в настоящее время не поддерживаются на MinGW: mgetgroups, getugroups, idcache, userspec, openpty, login_tty, forkpty, pt_chown, grantpt, Pty, savewd, mkancesdirs, MkDir-р, euidaccess, faccessat. Поддерживаемые версии Windows: Windows XP и более поздние версии. Только последняя версия MinGW проверяется; более старые версии не поддерживаются.
  • GNU Hurd 0.7 редкие испытания.
  • NetBSD 7.0 и старше редкие испытания.
  • Родные для Windows с компилятором MSVC редкие испытания (низкий приоритет).
  • MUSL Libc редкие испытания.
  • Minix 3.3.0 редкие испытания.
  • HP-UX 11.31 очень редкие испытания.
  • IRIX 6.5 нет испытаний.
  • OSF / 1 5.1 нет испытаний.
  • Interix 6.1 нет испытаний (+требует библиотеку suacomp в версии 0.6.8 или более поздней версии).
  • Haiku и BeOS нет испытаний.
  • uClibc на Linux нет испытаний.
  • QNX нет испытаний.

Gnulib поддерживает эти операционные системы только в невиртуализированной среде. При запуске ОС внутри виртуальной машины, нужно быть готовым к тому, что она сама может вызывать ошибки. Например, операций с плавающей запятой на Solaris может вести себя немного по-другому в QEMU, чем на реальном оборудовании. И программа bash в Haiku в VirtualBox 3 ведет себя плохо некорректно, тем не менее в VirtualBox 4 такой проблемы не наблюдается.

Точно так же, запуск бинарных файлов для Windows на GNU / Linux под WINE редко тестируется и имеет низкий приоритет: ВИНО имеет набор особенностей поведения и ошибок, которые немного отличаются от родной Windows.

Следующие платформы не поддерживаются Gnulib. Стоимость поддержки им будет превышать пользу, потому что они редко используются, или плохо документированы, или были вытеснены другими платформами, или сильно не соответствуют POSIX, или сочетание сразу нескольких факторов:[Источник 2]

  • Windows 95/98 / ME.
  • DJGPP и EMX (32-разрядные операционные системы, работающие в DOS).
  • MSDOS (16-разрядная операционная система).
  • Windows Mobile, Symbian OS, IOS.

Модули

Gnulib делится на модули. Каждый модуль выполняет определенную задачу. Модули могут зависеть от других модулей.

Модуль состоит из нескольких файлов и описание модуля. Gnulib-tool копирует файлы в пакет, который будет использоваться как есть, без изменений. Файлы исходных кодов (.h, .c) находятся в поддиректории lib/. Autoconf-макросы находятся в поддиректории m4/. Сборочные скрипты находятся в поддиректории build-aux/.

Описание модуля содержит несколько файлов, и gnulib-tool копирует их. Он содержит зависимости модуля, вызов макроса Autoconf (как правило единственная строчка либо вообще ничего). Описание модуля и спецификации файла включений предназначены для целей документирования и объединены в MODULES.html.

Модульная система служит двум целям:

  1. Обеспечить согласованность используемых autoconf-макросов и правил Makefile.am с исходным кодом.
  2. Обеспечивает масштабируемость. Это позволяет создавать сложные программы с множеством зависимостей без потери возможности сопровождения ее составляющих.

Другими словами, модуль является элементарной единицей кода в Gnulib, что сравнимо с классом в объектно-ориентированных языков программирования, таких как Java или C#.

Модульная система является основой для gnulib-tool: когда он копирует часть Gnulib в пакет, сначала компилируется список модулей, начиная с указанных модулей и добавления всех зависимостей, а затем собираются файлы, configure.ac-фрагменты и Makefile.am-фрагменты.[Источник 2]

Cсылки

Источники

  1. ARM [Электронный ресурс]: Gnulib - The GNU Portability Library / Дата обращения: 02.03.2017. Режим доступа: http://www.gnu.org/software/gnulib.
  2. 2,0 2,1 2,2 2,3 ARM [Электронный ресурс]: GNU Gnulib / Дата обращения: 02.03.2017. Режим доступа: http://www.gnu.org/software/gnulib/manual/gnulib.html.