Рейтинг:1

Может ли пакет .deb включать исходные коды, которые должны быть скомпилированы dpkg?

флаг us

У меня есть pkg с некоторым кодом C++. В настоящее время я компилирую часть кода C++ как двоичный файл, часть как библиотеку, и я могу отправить и развернуть его на других платформах.

Однако у меня также есть драйвер, который я не могу кросс-компилировать из-за его зависимости от ядра, из-за чего каждому ядру может потребоваться другой двоичный файл.

Итак, я хочу иметь .deb, где я буду хранить двоичный файл в /usr/bin (готово), библиотеку в /usr/lib (тоже готово) и исходный код драйвера в /opt/driver (я думаю ... Это законное место для этого?)

Упаковать это легко, так как все, что мне нужно сделать, это поместить его в свое рабочее пространство и вызвать dpkg-deb. В чем я не уверен, так это в двух вещах

  1. Законно ли упаковывать исходный код в .deb? (В терминологии Python - это .deb bdist (двоичный дистрибутив) или также может быть sdist (исходный дистрибутив))
  2. Если это законно, как я могу вызвать команды make? Может дпкг/аппт сделать это для меня? Или мне нужно бежать dpkg -я упаковка а затем запустить делать? [смотря на постинста но я не уверен, что это правильный путь]

Я открыт для любой системы сборки, если она может решить эту проблему, хотя в настоящее время я использую cmake и предпочел бы придерживаться ее.


Мой ПОК:

дерево bla_x86_64
bla_x86_64
✓ DEBIAN
✓ ✓ управление
âââ postinst
âââ выбор
âââ bla.cpp
âââ usr
    âââ мусорное ведро
    âââ bla.bin
    âââ библиотека
        âââ bla.lib
кошка bla_x86_64/DEBIAN/postinst 
#!/бин/ш

установить -е

эхо привет мир!
эхо-компиляция $(ls /opt/bla.cpp)
очистка эха
rm -rvf /opt/bla.cpp
$ dpkg-deb --build --root-владелец-группа bla_x86_64/
dpkg-deb: сборка пакета «bla» в «bla_x86_64.deb».
$ sudo dpkg -i bla_x86_64.deb 
(Чтение базы данных... На данный момент установлено 407519 файлов и каталогов.)
Подготовка к распаковке bla_x86_64.deb...
Распаковка бла (4.0) поверх (3.0)...
Настройка бла (4.0)...
Привет, мир!
компиляция /opt/bla.cpp
уборка
удален '/opt/bla.cpp'
флаг ru
`dpkg` ничего не контролирует. Если вы правильно используете DKMS, вам *не нужна* команда `make` где-либо в файле Debian. DKMS автоматически скомпилирует что-то там, где это необходимо - вам не нужно где-либо иметь какие-либо специальные команды `make`.
CIsForCookies avatar
флаг us
@ThomasWard Мне понадобится команда `dkms`, не так ли? Итак, мне все еще интересно, оставлено ли это, и если да, то есть ли кто-нибудь, кто уже сделал это (я использовал `make` в своем вопросе вместо `dkms`, чтобы упростить, но я думаю, что это просто усложняет вещи. ..)
Рейтинг:2
флаг cn

Технически не существует такого понятия, как «законное» или «незаконное» содержимое файла .deb. Вы можете упаковать в него все, что захотите.

Хорошее место для размещения вашего исходного кода в целевой системе было бы под /usr/доля/${имя_пакета}.

Иметь дпкг или же подходящий вызовите свои команды make, просто поместите их в папку вашего пакета постинста сценарий. Убедитесь, что вы объявили в качестве зависимостей все программы, необходимые для процесса сборки, такие как cmake, г++ и binutils, а также заголовки ядра, иначе установка завершится ошибкой в ​​системах, где не установлен компилятор. Также убедитесь, что вы выполняете правильную обработку ошибок в постинста скрипт, чтобы избежать вывода целевой системы из строя из-за установки плохого модуля ядра в результате неудачной компиляции.

Обратите внимание, что это решает только половину вашей проблемы. В дополнение к компиляции вашего драйвера для ядра, используемого при установке вашего пакета, вам также необходимо убедиться, что он перекомпилирован для нового ядра после каждого обновления ядра. Решением для этого является DKMS, сокращение от Dynamic Kernel Module Support. Таким образом, вы также захотите изучить поддержку DKMS в своем пакете .deb.

CIsForCookies avatar
флаг us
Вы случайно не знаете о пакетах, которые делают такие вещи? (т.е. вызов make/dkms из postinst). Я пытаюсь найти парней, которые делали это до меня, и учиться у них.
Tilman avatar
флаг cn
Не навскидку. Если бы я хотел найти его, я бы, вероятно, посмотрел на пакеты Linux от производителей оборудования, которые поддерживают драйверы вне дерева. На ум приходят графические адаптеры.
CIsForCookies avatar
флаг us
нашел это. Nvidia взаимодействует с dkms в своем скрипте postinst.
CIsForCookies avatar
флаг us
Знаете ли вы, должен ли такой `.deb` (т.е. только исходники) иметь специальную `arch`? Он должен быть архинезависимым, но я не уверен, что это возможно.
Tilman avatar
флаг cn
Вы можете установить «Архитектура» на «все», чтобы указать архитектурно-независимый пакет. Другой подход, если ваш пакет действительно содержит _только_ исходники, состоит в том, чтобы фактически сделать его исходным пакетом.
CIsForCookies avatar
флаг us
Я не уверен. Исходники в пакете должны быть скомпилированы в драйвер. Я читал о пакетах с исходным кодом в https://wiki.debian.org/Packaging/SourcePackage, но я думаю, поскольку [quote] «Исходники обычно **не** устанавливаются», лучше всего использовать бинарный пакет — он будет содержать исходники + команда make в `postinst` и установка пакета `создают` исходники. Что вы думаете?
Tilman avatar
флаг cn
Если вы планируете сделать его пакетом с исходным кодом, вам следует прочитать о системе сборки пакетов deb. Это также прояснит смысл предложения, которое вы цитируете. В противном случае придерживайтесь «Архитектура: все».
CIsForCookies avatar
флаг us
Можешь поделиться ссылкой? Я нашел много данных, но ничего похожего на то, что я искал
Tilman avatar
флаг cn
Я предлагаю вам начать с https://wiki.debian.org/Packaging/Intro и двигаться дальше оттуда.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.