Я занимаюсь кроссплатформенной разработкой и хочу создать красивый, автономный (!) Пакет для Linux. . Я знаю, что это не так, как обычно, но приложение требует, чтобы все данные были в одном месте, поэтому я устанавливаю его в / opt, как и многие другие проприетарные программные пакеты. В конечном итоге я предоставлю пакеты deb и rpm, но пока это будет только .tar.gz. Пользователь должен его куда-то извлечь, и он должен работать. Я бы предпочел не иметь установщика.
Сначала мои вопросы, затем подробности:
Теперь для некоторых деталей: Это мой проект (( Для этой цели я называю его foo ) layout:
Теперь в пакете будут два дополнительных элемента:
libs будут содержать все общие библиотеки, необходимые для проекта, а foo.sh - это сценарий, который устанавливает LD_LIBRARY_PATH для включения libs . Следовательно, пользователь выполнит foo.sh , и программа должна запуститься.
У меня есть сценарий оболочки, который упаковывает программное обеспечение в следующие шаги:
Что вы думаете о это? У этого подхода есть некоторые проблемы:
Как вы это делаете?
Edit: Еще один вопрос, который только что возник: как вы определяете, от каких библиотек зависит ваше программное обеспечение? Я выполнил ldd foo , но их очень много. Я посмотрел, как выглядят пакеты WorldOfGoo, и в них очень мало библиотек. Как я могу сделать предположения о том, какая библиотека будет присутствовать в системе пользователя, а какая нет? Просто установите все целевые дистрибутивы в виртуальный дневник и посмотрите, что требуется?
Ваш способ упаковки ваших материалов (с зависимыми библиотеками) в / opt
- это то, как упаковывается проприетарное (и даже с открытым исходным кодом) программное обеспечение. Это рекомендованная практика Linux Foundation (см. мой ответ на другой вопрос для ссылок).
Внешние библиотеки могут быть либо скомпилированы с нуля и встроены в процесс сборки в качестве отдельного шага (особенно, если вы их изменяете), либо извлечены из пакетов некоторых дистрибутивов. Второй подход проще, но первый допускает большую гибкость.
Обратите внимание, что нет необходимости включать в ваш пакет некоторые действительно низкоуровневые библиотеки (такие как glibc, Xorg). Их лучше доверить настройку системным поставщикам, и вы можете просто предположить, что они существуют. Более того, существует Стандартная база Linux , в которой описаны наиболее важные библиотеки; эти библиотеки существуют почти везде, и им можно доверять.
Отметьте также, что если вы компилируете в новой системе, скорее всего, пользователи старых систем не смогут ее использовать, в то время как обратное неверно. Итак, для достижения лучшей совместимости может быть полезно скомпилировать пакет для системы, которая на два года старше, чем сегодня.
Я только что обрисовал в общих чертах, но считаю, что веб-сайт Linux Developers Network содержит дополнительную информацию об упаковке и переносимости.
Судя по тому, что я видел в проектах распространения с открытым исходным кодом, ваш сценарий делает это так же, как поставщики дистрибутивов упаковывают программное обеспечение.Их сценарии автоматически исправляют исходные коды, имитируют установку программного обеспечения и упаковывают полученные папки в файлы DEB и RPM.
Tar.gz, или конечно, тоже может работать, но создание, например, RPM недостаточно сложно, чтобы вы упустили такую возможность, чтобы сделать жизнь ваших пользователей намного проще.
Отвечая на ваши вопросы,
Да, вам нужно дважды жестко запрограммировать зависимости.
Дело в том, что когда вы жестко закрепляете их в CMake, вы указываете их в других терминах, чем когда вы указываете их в сценарии упаковки. CMake относится к разделяемым библиотекам и файлам заголовков , а сценарий упаковки относится к пакетам .
Между именами пакетов и общими библиотеками и заголовками нет взаимно-однозначной связи между распределениями. Это зависит от дистрибутива. Поэтому его следует указывать дважды.
Но пакет может быть легко перепакован поставщиками дистрибутивов, особенно если вы стремитесь упаковать в него все зависимые библиотеки (так что будет меньше внешних зависимостей для переноса). Кроме того, скоро появится инструмент, который может переносить пакеты из одного дистрибутива в другой (я обновлю свой ответ, когда он будет выпущен).
Да, вам нужно указать вашу версию дважды.
Но дело в том, что вы можете организовать процесс упаковки таким образом, чтобы версии пакета и программного обеспечения никогда не рассинхронизировались . Просто сделайте извлечение сценария упаковки из вашего репозитория (или загрузите с вашего веб-сайта) точно той же версии, которую сценарий запишет в спецификации пакета.
Для анализа зависимостей вашего программного обеспечения вы можете использовать наш бесплатный инструмент с открытым исходным кодом Linux Application Checker . Он сообщит список библиотек, от которых он зависит, покажет дистрибутивы, с которыми совместимо ваше программное обеспечение, и поможет вашему приложению быть более переносимым между дистрибутивами. Оказывается, иногда большей совместимости между дистрибутивами можно добиться с помощью небольших усилий, и вам не нужно ограничивать себя поддержкой лишь нескольких выбранных дистрибутивов.
Хорошо подумайте (или спросите свой отдел разработки продуктов), какие дистрибутивы / архитектуры вам необходимо поддерживать.
Убедитесь, что они полностью понимают значение тестирования.
Я ожидаю, что вы получите очень короткий список поддерживаемых дистрибутивов и архитектур.
Это действительно зависит от того, какие клиенты платят за поддержку Linux. Большинство людей используют Redhat Enterprise (на серверах) или Centos (что неотличимо с технической точки зрения).
Если вам нужно поддерживать только Redhat, вам нужно поддерживать только RPM, работа - хорошее дело.