Wie installiere / analysiere ich Build-Abhängigkeiten von Debian / Control?

11

Angenommen, Sie haben einen Quellcode-Ordner heruntergeladen, der sowohl einen vorhandenen /debian/Ordner als auch eine /debian/controlDatei enthält.

Angenommen, das betreffende Paket befindet sich nicht im offiziellen Debian-Repository und apt-get build-depkann daher nicht verwendet werden.

Wie analysiere ich die Build-Depends:Zeile?

Wenn zum Beispiel die Zeile lesen würde Build-Depends: debhelper (>= 8), faketime, gibt es ein Werkzeug control-parse debian/control build-depends, das widerhallen würde debhelper faketime?

Besonders wenn es mehrzeilig ist?

Gibt es vorhandene Debian-Tools oder muss einer seinen eigenen Code schreiben, um dies zu analysieren?

adrelanos
quelle

Antworten:

4

Sie könnten verwenden dpkg-checkbuilddeps. Die Manpage sagt

Dieses Programm vergleicht die im System installierten Pakete mit den in der Steuerdatei aufgeführten Build-Abhängigkeiten und Build-Konflikten. Wenn einige nicht erfüllt sind, werden sie angezeigt und mit einem Rückkehrcode ungleich Null beendet.

Beispielsweise:

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

Sie können jedoch auch einfach versuchen, das Paket zu erstellen, indem Sie beispielsweise (z. B.) debuildz

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 <[email protected]>
 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

Das gibt die gleichen Informationen (da es verwendet dpkg-checkbuilddeps), ist aber etwas lauter.

Faheem Mitha
quelle
dpkg-checkbuilddepsgibt nur nicht erfüllte Build-Abhängigkeiten aus. Siehe meine Antwort zum Parsen im allgemeinen Fall.
Evgeny Vereshchagin
4

Parsing:

Verwenden Sie Module aus dem libdpkg-perl( dpkg-checkbuilddepsverwendet diese Module intern)

Fügen Sie die folgenden Zeilen zum Quellpaketstamm hinzu print-build-depsund führen Sie sie print-build-depsaus.

#!/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";

Siehe auch:

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

Installation:

Sie können verwenden mk-build-depsvon 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 sagt:

mk-build-deps - build a package satisfying a package's build-dependencies
-i, --install
       Install the generated packages and its build-dependencies
Evgeny Vereshchagin
quelle
Dies scheint eine saubere Lösung zu sein, da Tools aus dem Kontext verwendet werden, sodass sie möglicherweise robuster sind. Unter Debian benötigt es (zumindest) Pakete devscripts und equivs generiert ein temporäres Paket myproject-build-depsund installiert es. Das ist schön , wenn Sie beabsichtigen nicht die Build-Zeitabhängigkeiten auf Ihrem Computer zu halten: nur deinstallieren devscripts, equivsund myproject-build-deps.
Stéphane Gourichon
3

Mit diesem Perl-Einzeiler können Abhängigkeiten analysiert werden von debian-control:

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

oder

perl -ne 'next if /^#/; $p=(s/^Depends:\s*/ / or (/^ / and $p)); s/,|\n|\([^)]+\)//mg; print if $p' < debian/control 
Jakob
quelle
Dank dieser einzeiligen Funktion ist die Installation von analysierten Abhängigkeiten so einfach wie apt-get install $(perl -ne 'next if /^#/; $p=(s/^Build-Depends:\s*/ / or (/^ / and $p)); s/,|\n|\([^)]+\)//mg; print if $p' < debian/control)'. Beachten Sie jedoch, dass die Abhängigkeiten als manuell installiert markiert werden, damit sie in der Build-Umgebung verbleiben. Dies hat in einer wegwerfbaren Build-Umgebung (Chroot, Docker) keine Bedeutung. Wenn Sie jedoch in Ihrer regulären Umgebung erstellen, bleiben die Build-Time-Abhängigkeitspakete erhalten. Sie können für einige Pakete ziemlich groß sein.
Stéphane Gourichon