Як встановити / проаналізувати побудову залежностей від debian / control?


11

Припустимо, ви завантажили папку з вихідним кодом, яка містить наявну /debian/папку, а також /debian/controlфайл.

Припустимо, відповідний пакет не знаходиться в офіційному сховищі Debian, тому apt-get build-depйого не можна використовувати.

Як розібрати Build-Depends:рядок?

Наприклад, якщо рядок читав Build-Depends: debhelper (>= 8), faketime, чи є якийсь інструмент, control-parse debian/control build-dependsякий би лунав debhelper faketime?

Особливо, коли це багаторядковий?

Чи існують інструменти Debian або є хто має написати власний код для розбору цього?

Відповіді:


4

Ви можете використовувати dpkg-checkbuilddeps. Сторінка людини говорить

Ця програма перевіряє встановлені пакети в системі на залежність від побудови та створює конфлікти, перелічені у файлі управління. Якщо якісь не виконані, він відображає їх та виходить із ненульовим кодом повернення.

Наприклад:

faheem@orwell:/usr/local/src/julia/julia-0.3.2$ dpkg-checkbuilddeps
dpkg-checkbuilddeps: Unmet build dependencies: libopenblas-dev (>= 0.2.10-1~) libopenlibm-dev libopenspecfun-dev (>= 0.4~) patchelf python-sphinx-rtd-theme

Однак ви також можете просто спробувати скласти пакет, використовуючи (наприклад) debuild, наприклад

faheem@orwell:/usr/local/src/julia/julia-0.3.2$ debuild -uc -us
 dpkg-buildpackage -rfakeroot -D -us -uc
dpkg-buildpackage: source package julia
dpkg-buildpackage: source version 0.3.2-1
dpkg-buildpackage: source changed by Sébastien Villemot <sebastien@debian.org>
 dpkg-source --before-build julia-0.3.2
dpkg-buildpackage: host architecture amd64
dpkg-checkbuilddeps: Unmet build dependencies: libopenblas-dev (>= 0.2.10-1~) libopenlibm-dev libopenspecfun-dev (>= 0.4~) patchelf python-sphinx-rtd-theme
dpkg-buildpackage: warning: build dependencies/conflicts unsatisfied; aborting
dpkg-buildpackage: warning: (Use -d flag to override.)
debuild: fatal error at line 1357:
dpkg-buildpackage -rfakeroot -D -us -uc failed

Що дає ту саму інформацію (оскільки вона використовує dpkg-checkbuilddeps), але трохи шумніше.


dpkg-checkbuilddepsвиводить лише невстановлені залежності побудови. Дивіться мою відповідь про розбір у загальній справі.
Євгеній Верещагін

4

Розбір:

Використовувати модулі з libdpkg-perl( dpkg-checkbuilddepsвикористовує ці модулі внутрішньо)

Додайте наступні рядки до print-build-depsта запустіть print-build-depsу корені вихідного пакета.

#!/usr/bin/perl
use strict;
use warnings;

use Dpkg::Control::Info;
use Dpkg::Deps;

my $control = Dpkg::Control::Info->new();
my $fields = $control->get_source();
my $build_depends = deps_parse($fields->{'Build-Depends'});
print deps_concat($build_depends) . "\n";

Дивись також:

perldoc Dpkg::Control::Info
perldoc Dpkg::Deps

Установка:

Ви можете використовувати mk-build-depsз devscripts:

apt-get install devscripts
apt-get install equivs
cd project-root # project-root contains debian/control
mk-build-deps -i

man mk-build-deps каже:

mk-build-deps - build a package satisfying a package's build-dependencies
-i, --install
       Install the generated packages and its build-dependencies

Це здається чистим рішенням, оскільки він використовує інструменти з контексту, тому може бути більш надійним. На останньому Debian він (принаймні) потребує пакунків devscripts і equivs , генеруючи тимчасовий пакет myproject-build-depsта встановлюючи його. Це добре , якщо ви не збираєтеся тримати залежності збірки часу на вашій машині: просто видалити devscripts, equivsі myproject-build-deps.
Стефан Гурішон

3

Цей однолінійний Perl можна використовувати для розбору залежностей від debian-control:

perl -ne 'next if /^#/; $p=(s/^Build-Depends:\s*/ / or (/^ / and $p)); s/,|\n|\([^)]+\)//mg; print if $p' < debian/control 

або

perl -ne 'next if /^#/; $p=(s/^Depends:\s*/ / or (/^ / and $p)); s/,|\n|\([^)]+\)//mg; print if $p' < debian/control 

Завдяки цій однорівневій установці проаналізовані залежності так само просто apt-get install $(perl -ne 'next if /^#/; $p=(s/^Build-Depends:\s*/ / or (/^ / and $p)); s/,|\n|\([^)]+\)//mg; print if $p' < debian/control)'. Просто майте на увазі, що залежності будуть позначені як встановлені вручну, тому вони будуть триматися в середовищі збірки. Це не має значення в середовищі викидання (chroot, docker), але якщо ви будуєте у звичайному середовищі, пакети залежностей від часу побудови залишаться. Вони можуть бути досить великими для деяких пакетів.
Стефан Гурішон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.