Jak zainstalować / parsować zależności kompilacji od debian / control?

11

Załóżmy, że pobrałeś folder kodu źródłowego, który zawiera istniejący /debian/folder oraz /debian/controlplik.

Załóżmy, że dany pakiet nie znajduje się w oficjalnym repozytorium Debiana, więc apt-get build-depnie można go użyć.

Jak parsować Build-Depends:linię?

Na przykład, jeśli wiersz przeczytałby Build-Depends: debhelper (>= 8), faketime, czy istnieje jakieś narzędzie, control-parse debian/control build-dependsktóre by echo debhelper faketime?

Zwłaszcza gdy jest to linia wieloliniowa?

Czy istnieją istniejące narzędzia Debiana lub ktoś napisał własny kod, aby to przeanalizować?

adrelanos
źródło

Odpowiedzi:

4

Możesz użyć dpkg-checkbuilddeps. Strona podręcznika mówi

Ten program sprawdza zainstalowane pakiety w systemie pod kątem zależności kompilacji i konfliktów kompilacji wymienionych w pliku sterującym. Jeśli jakieś nie są spełnione, wyświetla je i wychodzi z niezerowym kodem powrotu.

Na przykład:

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

Możesz jednak po prostu spróbować zbudować pakiet, używając (na przykład) debuild, np

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

Co daje te same informacje (ponieważ używa dpkg-checkbuilddeps), ale jest trochę głośniejsze.

Faheem Mitha
źródło
dpkg-checkbuilddepswyprowadza tylko niespełnione zależności kompilacji. Zobacz moją odpowiedź na temat analizowania w typowym przypadku.
Evgeny Vereshchagin
4

Rozbiór gramatyczny zdania:

Użyj modułów z libdpkg-perl( dpkg-checkbuilddepsużywa tych modułów wewnętrznie)

Dodaj następujące wiersze print-build-depsi uruchom print-build-depsw katalogu głównym pakietu źródłowego.

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

Zobacz też:

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

Instalacja:

Możesz używać mk-build-depsz 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 mówi:

mk-build-deps - build a package satisfying a package's build-dependencies
-i, --install
       Install the generated packages and its build-dependencies
Evgeny Vereshchagin
źródło
To wydaje się czystym rozwiązaniem, ponieważ wykorzystuje narzędzia z kontekstu, więc może być bardziej niezawodne. W najnowszym Debianie (przynajmniej) potrzebuje pakietów devscripts i equivs , generuje pakiet tymczasowy myproject-build-depsi instaluje go. To jest miłe, jeśli nie jesteś zamierza zachować zależności build-czasowych na komputerze: wystarczy odinstalować devscripts, equivsa myproject-build-deps.
Stéphane Gourichon
3

Jednowarstwowy Perl może być używany do analizowania zależności od debian-control:

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

lub

perl -ne 'next if /^#/; $p=(s/^Depends:\s*/ / or (/^ / and $p)); s/,|\n|\([^)]+\)//mg; print if $p' < debian/control 
Jakob
źródło
Dzięki tej jednej linii instalacja przeanalizowanych zależności jest tak prosta, jak apt-get install $(perl -ne 'next if /^#/; $p=(s/^Build-Depends:\s*/ / or (/^ / and $p)); s/,|\n|\([^)]+\)//mg; print if $p' < debian/control)'. Pamiętaj tylko, że zależności zostaną oznaczone jako zainstalowane ręcznie, więc będą się utrzymywać w środowisku kompilacji. Nie ma to znaczenia w środowisku kompilacji typu chroot, docker, ale jeśli budujesz w swoim zwykłym środowisku, pakiety zależności kompilacji pozostaną. Mogą być dość duże dla niektórych pakietów.
Stéphane Gourichon