Установка и пакетирование
Понятие о Filesystem_Hierarchy_Standard
- Выделенные каталоги для документации, man, библиотек, бинарноков и т. п.
- Стандартные пути поиска ⇒ установка — это подкладывание в каталог…
… + перегенерация каких-то индексов (стандартная, например, ld.so.conf)
- … + выполнение дополнительные действий в системе (задание спецпользователя, заведение пустой БД и т. п.)
Варианты установки:
В систему, непосредственно в /usr/bin, /usr/lib64 и т. п.
- «всё сразу работает»
- требует права root
- конфликтует с ПО из состава дистрибутива
Используется при пакетироовании
В систему, в выделенные каталоги /usr/local/bin, /usr/local/lib64 и т. п.
То же, но конфликт только с таким же сторонним ПО (зато более вероятный)
- Не соответствует FHS
Используется при пакетировании в монолитных UNIX-like системах
В $HOME/.local/bin (…/bin, …/share, …/lib)
не требует прав root
- ⇒ работает только у одного пользователя
- ⇒ могут не заработать «дополнительные действия»
Используется в пакетных системах, ориентированных на разработчика (python, ruby, node и т. п.)
⇒ Для собственно разработки требует нескольких независимых пространств установки (venv в Python)
- А для пользователя оказывается даже сложнее установки пакета
В отдельный подкаталог /opt/приложение/bin (…/bin, …/share, …/lib)
- ни с чем не кофликтует
- требует права root
- как правило, требует дополнительной настройки при старте (нестандартное место библиотек и т. п.), обычно — в обёрточных шелл-сценариях
Используется в несвободных / сложных «any linux» проектах (когда надо тащить с собой бинарники и библиотеки)
- Гибридная: одна из предыдущих схем + статическая компоновка с частью библиотек
- Довольно проста в эксплуатации
- Сочетает в себе недостатки статической сборки и выбранной схему
- Может привести к разноверсице прямо в бинарнике (между кодом статической библиотеки и внезапной динамической зависимостью на неё же)
Используется при разработке небольших средних приложений на высокоуровневых инструментариях, например, Qt (Telegram desktop Linux)
- Весь комплект оформляется как единый бинарник
- ни с чем не кофликтует
- можно копировать куда угодно — и оттуда запускать
не требует прав root
- требует статической сборки
- снимает проблему поиска требуемых библиотек при динамической линковке
- частично снимает разноверсицу системных и требуемых библиотек
- сильно увеличивает объём
- ⇒ Требует для сборки статической версии всех библиотек
- ⇒ Возможно, потребуется пересборка этих библиотек вместе с проектом
- - фиксирует ABI используемых библиотек (в том числе ошибочное и устаревшее)
агитка от Ульриха Дреппера против статической сборки
- Требует программной поддержки «ресурсов»: данные должны храниться не в виде отдельных файлов, а в виде прикомпилированных программно доступных объектов
Используется при разработке небольших средних приложений на высокоуровневых инструментариях, например, Qt (редко).
Простой пример: pcredemo и статическая libpcre2_8:
cc pcredemo.o -static -lpcre2-8 — полностью статическая
cc pcredemo.o /usr/lib64/libpcre2-8.a — гибридная
Поддержка вариантов установки в системах сборки
- Вручную
- Например, для сборки статического бинарника
Autotools: все варианты, но окружение должно их поддерживать (например, /usr/local/lib должно быть в ld.so.conf)
$DESTDIR
ключи configure — тонкая настройка
- Надо сильно поупражняться для полностью статической сборки
Libtool: все варианты + поддержка со стороны окружения (за счёт сценариев, .la-файлов и т. п.)
Используется только для тестовой установки после локальной сборки. Кажется, установка в /opt/… должна поддерживаться хорошо, но прецедентов я не помню
Возможные TODO
- Пример статической сборки
- Разбор обычного autotools-генерата
- Разбоор libtool-генерата
Введение в пакетирование
(сильно зависит от оставшегося времени)
TODO зафиксировать это время
План
- Свободное лицензирование
- Пакеты
- Репозитории пакетов
- Дистрибутивы
Как это связано с нашим курсом?
- Спецификация пакета: план сборки и план установки
Более подробные ссылки:
Д/З
- 1.Финальный проект. Взять какое-нибудь домашнее задание, или сделать новый проект любого уровня тупости. В проекте должны быть (в любом невырожденном объёме):
- Инструмент адаптации к окружению (autotools или аналоги)
- Перевод сообщений
- Unit-тесты
- Manpage
- Выгонка документации из исходников
внимание, опасно! Установка в систему от root-а и удаление оттуда (лучше сначала потренироваться на установке от пользователя в /tmp/qq)
- Установленная программа должна работать в двух локалях, man должен читаться
Необязательно — в состав может входить библиотека
В репозитории с домашними заданиями создать подкаталог 12_InstallPackaging и положить решение туда