Как установить / разобрать зависимости сборки от 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.