Создайте более одного пакета Debian

Я пытаюсь создать пакеты Debian из источников CPP, созданных с использованием CMake.

Я использую дебилд, я НЕ использую cpack.

На данный момент я достиг следующего этапа:

debian/rules выглядит следующим образом:

%:
    dh $@ --buildsystem=cmake

override_dh_auto_configure:
    dh_auto_configure -- --no-warn-unused-cli -DPACKAGE_ONE=ON -DPACKAGE_TWO=OFF

Debian/Control выглядит так:

Source: blabla
Maintainer: ME <[email protected]>
Section: misc
Priority: optional
Build-Depends:
 debhelper-compat (= 12),
 cmake (>= 3.10.0),

Package: package1
Architecture: any
Pre-Depends: ${misc:Pre-Depends}
Depends:
 ${misc:Depends},
 ${shlibs:Depends},
 ${debconf:Depends},
 unzip
Description: Package 1
 The first package.

#Package: package2
#Architecture: any
#Pre-Depends: ${misc:Pre-Depends}
#Depends:
# ${misc:Depends},
# ${shlibs:Depends},
# ${debconf:Depends},
# unzip
#Description: Package 2
# The second package.

Очень упрощенный файл CMakeLists.txt выглядит так:

project(blabla)

add_subdirectory(common_dependencies)

if (PACKAGE_ONE)
  add_subdirectory(package1)
endif ()

if (PACKAGE_TWO)
  add_subdirectory(package2)
endif ()

add_subdirectory(other_dependencies)

CMakeLists.txt в соответствующих подкаталогах package1/2 заботится о создании исполняемого файла и т. д.

Проблема в том, что для получения результата мне нужно сгенерировать два разных пакета Debian (package1.deb, package2.deb) при вызове debuild...

Но я просто не могу себе представить, как я могу собрать два разных пакета Debian из одного и того же источника, используя приведенные выше требования, то есть: передать флаг CMake, когда есть только один файл debian/rules (устанавливая различные дополнительные файлы для разных пакетов, которые я разобрались, создав package1.install, package2.install со всеми файлами, изображениями, иконками и т.д... им нужно)

Возможно ли это вообще? Спасибо!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

конечно, возможно (и довольно часто) собрать несколько двоичных пакетов из одного исходного пакета.

  • debian/control должен перечислять все создаваемые бинарные пакеты.
  • есть только один файл debian/rules, потому что этот файл содержит рецепт сборки всего
  • обычно вы затем сортируете различные артефакты сборки в любой из двух двоичных пакетов.

поэтому обычно у вас будет такой debian/control (обратите внимание, что package2 не прокомментирован):

Source: blabla
Maintainer: ME <[email protected]>
Section: misc
Priority: optional
Build-Depends:
 debhelper-compat (= 12),
 cmake (>= 3.10.0),

Package: package1
Architecture: any
Pre-Depends: ${misc:Pre-Depends}
Depends:
 ${misc:Depends},
 ${shlibs:Depends},
 ${debconf:Depends},
 unzip
Description: Package 1
 The first package.

Package: package2
Architecture: any
Pre-Depends: ${misc:Pre-Depends}
Depends:
 ${misc:Depends},
 ${shlibs:Depends},
 ${debconf:Depends},
 unzip
Description: Package 2
 The second package.

ваш debian/rules может выглядеть так (обратите внимание, что оба пакета собраны):

%:
    dh $@ --buildsystem=cmake

override_dh_auto_configure:
    dh_auto_configure -- --no-warn-unused-cli -DPACKAGE_ONE=ON -DPACKAGE_TWO=ON

единственное, что осталось — это рассортировать артефакты сборки по двум пакетам.

предположим, что здание с -DPACKAGE_ONE=1 создает артефакт /usr/bin/package1, а -DPACKAGE_ONE=2 создает артефакт /usr/bin/package2 при запуске make install.

затем вам нужно создать/отредактировать еще несколько файлов, debian/package1.install и debian/package2.install, которые, будучи очень декларативными, просто перечисляют файлы, которые входят в каждый пакет.

поэтому debian/package1.install будет содержать:

/usr/bin/package1

и debian/package2.install будет содержать:

/usr/bin/package2

под капотом dh вызывает dh_auto_install, который инструктирует cmake установить все файлы в DESTDIR=$(pwd)/debian/tmp/. это место, где dh_install будет искать файлы, перечисленные в различных debian/*.install файлах, и сортировать их по $(pwd)/debian/<pkgname>/ перед сборкой окончательного пакета. Есть много способов настроить все это, но стандартное поведение, скорее всего, подойдет вашим потребностям.

один случай, с которым я иногда сталкиваюсь и который плохо обрабатывается dh, — это когда оба варианта сборки являются взаимоисключающими (например, они оба производят /usr/bin/mybin, но с разными функциями). кажется, ваш вопрос не об этом варианте использования, поэтому я пропускаю эту часть; напишите в комментариях, если вам это нужно)

umläute 09.04.2024 18:01

Другие вопросы по теме