Установка и пакетирование

<!> Обратите внимание на то, что в «Практикуме» (репозиторий для предложений) рассматривается сборка полноценного пакета под платформу ALT.

Бонус пакетирования: сборка и формирование пакета не требуют прав root, установка полностью не зависима от исходников.

Варианты установки

  1. Не устанавливать, запускать из каталога сборки
    • Работает для одного пользователя
    • Перемешивает продукт сборки и продукт эксплуатации (например, конфигурационные файлы)
    • Если нечто работает из каталога сборки, не факт ,что оно вообще сумеет работать после установки согласно FHS
    • (./) Используется на начальных стадиях разработки

  2. В систему, непосредственно в /usr/bin, /usr/lib64 и т. п.

    • «всё сразу работает»
    • требует права root
    • конфликтует с ПО из состава дистрибутива
    • (./) Используется при пакетироовании

  3. В систему, в выделенные каталоги /usr/local/bin, /usr/local/lib64 и т. п.

    • То же, но конфликт только с таким же сторонним ПО (зато более вероятный)

    • Не соответствует FHS
    • (./) Используется при пакетировании в монолитных UNIX-like системах

  4. В $HOME/.local/bin (…/bin, …/share, …/lib)

    • не требует прав root

      • ⇒ работает только у одного пользователя
      • ⇒ могут не заработать «дополнительные действия»
    • (./) Используется в пакетных системах, ориентированных на разработчика (python, ruby, node и т. п.)

      • ⇒ Для собственно разработки требует нескольких независимых пространств установки (venv в Python)

      • А для пользователя оказывается даже сложнее установки пакета
  5. В отдельный подкаталог /opt/приложение/bin (…/bin, …/share, …/lib)

    • ни с чем не конфликтует
    • требует права root
    • как правило, требует дополнительной настройки при старте (нестандартное место библиотек и т. п.), обычно — в обёрточных шелл-сценариях
    • (./) Используется в несвободных / сложных «any linux» проектах (когда надо тащить с собой бинарники и библиотеки)

  6. Гибридная: одна из предыдущих схем + статическая компоновка с частью библиотек
    • Довольно проста в эксплуатации
    • Сочетает в себе недостатки статической сборки и выбранной схемы
    • Может привести к разноверсице прямо в бинарнике (между кодом статической библиотеки и внезапной динамической зависимостью на неё же)
    • (./) Используется при разработке небольших средних приложений на высокоуровневых инструментариях, например, Qt (Telegram desktop Linux)

  7. Монолитная: весь комплект оформляется как единый бинарник (статический или минимально гибридный: динамический с зависимостью только на glibc)

    • ни с чем не кофликтует
    • можно копировать куда угодно — и оттуда запускать
    • не требует прав root

    • требует монолитной сборки (неважно, статической или динамической)
      • снимает проблему поиска требуемых библиотек при динамической линковке
      • частично снимает разноверсицу системных и требуемых библиотек
      • сильно увеличивает объём
    • ⇒ Требует для сборки статической версии всех библиотек
      • ⇒ Возможно, потребуется пересборка этих библиотек вместе с проектом
      • - фиксирует ABI используемых библиотек (в том числе ошибочное и устаревшее)
      • агитка от Ульриха Дреппера против статической сборки

    • Требует программной поддержки «ресурсов»: данные должны храниться не в виде отдельных файлов, а в виде прикомпилированных программно доступных объектов
    • (./) Используется при разработке небольших средних приложений на высокоуровневых инструментариях, например, Qt (редко).

Простой пример: pcre2demo и статическая libpcre2_8:

Поддержка вариантов установки в системах сборки

  1. Вручную
    • Например, для сборки статического бинарника
    • GNU Make — нет выделенных инструментов установки!
      • А как же make install? А никак, без дополнительных инструментов это ручные действия.

  2. Autotools, AKA «configure - make - make install» AKA «Крибле! Крабле! Бумс!»
    • Все варианты, кроме №0 (без установки), но окружение должно их поддерживать (например, /usr/local/lib должно быть в ld.so.conf)

    • $DESTDIR

    • Ключи configure «--…dir=DIR»

      • тонкая настройка с помощью configure.ac

    • Надо сильно поупражняться для полностью статической сборки
    • Наш пример простейшей локализации поддерживает способ №2 «из коробки», а также №1, №3 и №4

  3. Libtool: все варианты + поддержка со стороны окружения (за счёт сценариев, .la-файлов и т. п.)

    • FrBrGeorge/MyDict/speech_balloon_question.png Используется только для тестовой установки после локальной сборки. Кажется, установка в /opt/… должна поддерживаться хорошо, но прецедентов я не помню

  4. CMake: cmake --install

    • Изобрели только в 2019 году FrBrGeorge/MyDict/alientech32.png

    • у меня были сложности с этим: очень часто CMake-проекты рассчитаны на запуск из каталога сборки, метод №0
  5. Meson: meson install

Введение в пакетирование

(сильно зависит от оставшегося времени)

Пакетирование отражает дисциплину разработки в конкретном Linux-сообществе (вплоть до различий форматах пакета, даже если они называются одинаково):

Создание (сборка) пакета:

Пакеты в ALT Linux Team:

(если вдруг останется ещё время)

Пакеты → репозиторий → дистрибутивы

Д/З

  1. Финальный проект. Сделать новый проект любого уровня тупости (можно просто какое-нибудь Д/З, но интереснее что-то новое?). В проекте должны быть (в любом невырожденном объёме):
    • Инструмент адаптации к окружению (autotools или аналоги)
    • Сборка динамической библиотеки, с которой будет собираться программа
    • Перевод сообщений
    • Unit-тесты
    • Manpage
    • Выгонка документации из исходников + описание проекта (в частности, инструкция по сборке и установке)
    • /!\ внимание, опасно! /!\

      • Установка в систему от root-а (разумеется, включая документацию, manpage и библиотеку)
      • Деинсталляция от root-а
      • (лучше сначала потренироваться на установке от пользователя в /tmp/qq)

    • Установленная от root программа должна работать в двух локалях, manpage должен читаться командой man

  2. В репозитории с домашними заданиями создать подкаталог 12_InstallPackaging и положить решение туда

LecturesCMC/LinuxApplicationDevelopment2025/12_InstallPackaging (последним исправлял пользователь FrBrGeorge 2025-12-09 17:36:36)