Я пытаюсь создать пакеты 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 со всеми файлами, изображениями, иконками и т.д... им нужно)
Возможно ли это вообще? Спасибо!
конечно, возможно (и довольно часто) собрать несколько двоичных пакетов из одного исходного пакета.
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
, но с разными функциями). кажется, ваш вопрос не об этом варианте использования, поэтому я пропускаю эту часть; напишите в комментариях, если вам это нужно)