Как установить / разобрать зависимости сборки от 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 или есть один, чтобы написать собственный код для разбора этого?

adrelanos
источник

Ответы:

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 
Jakob
источник
Благодаря этой линии установка разбираемых зависимостей так же проста, как и 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), но если вы соберете в своей обычной среде, пакеты зависимостей во время сборки останутся. Они могут быть довольно большими для некоторых пакетов.
Стефан Гурихон