Bagaimana cara menginstal / mengurai dependensi build dari debian / control?

11

Misalkan Anda mengunduh folder kode sumber, yang berisi /debian/folder yang ada serta /debian/controlfile.

Misalkan paket yang dimaksud tidak dalam repositori resmi Debian, jadi apt-get build-deptidak bisa digunakan.

Bagaimana cara menguraikan Build-Depends:garis?

Misalnya, jika baris akan dibaca Build-Depends: debhelper (>= 8), faketime, apakah ada alat control-parse debian/control build-dependsyang akan bergema debhelper faketime?

Apalagi kalau sudah multi line?

Apakah ada alat Debian yang ada atau punya satu untuk menulis kode sendiri untuk menguraikan ini?

adrelanos
sumber

Jawaban:

4

Anda bisa menggunakannya dpkg-checkbuilddeps. Halaman manual mengatakan

Program ini memeriksa paket yang diinstal di sistem terhadap dependensi build dan membangun konflik yang tercantum dalam file kontrol. Jika ada yang tidak terpenuhi, ini akan menampilkannya dan keluar dengan kode pengembalian yang bukan nol.

Sebagai contoh:

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

Namun, Anda juga bisa mencoba membuat paket, menggunakan (misalnya) debuild, mis

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

Yang memberikan informasi yang sama (karena menggunakan dpkg-checkbuilddeps), tetapi sedikit ribut.

Faheem Mitha
sumber
dpkg-checkbuilddepsoutput hanya dependensi build yang tidak terpenuhi. Lihat jawaban saya tentang penguraian dalam kasus umum.
Evgeny Vereshchagin
4

Parsing:

Gunakan modul dari libdpkg-perl( dpkg-checkbuilddepsgunakan modul tersebut secara internal)

Tambahkan baris berikut ke print-build-depsdan jalankan print-build-depsdi root paket sumber.

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

Lihat juga:

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

Instalasi:

Anda dapat menggunakan mk-build-depsdari 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 mengatakan:

mk-build-deps - build a package satisfying a package's build-dependencies
-i, --install
       Install the generated packages and its build-dependencies
Evgeny Vereshchagin
sumber
Ini sepertinya solusi bersih karena menggunakan alat dari konteks, jadi mungkin lebih kuat. Pada Debian baru-baru ini (setidaknya) ia membutuhkan paket devscripts dan equivs , menghasilkan paket temp myproject-build-depsdan menginstalnya. Ini bagus jika Anda tidak bermaksud untuk menjaga dependensi build-time pada mesin Anda: cukup uninstall devscripts, equivsdan myproject-build-deps.
Stéphane Gourichon
3

Perl one-liner ini dapat digunakan untuk mengurai dependensi dari debian-control:

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

atau

perl -ne 'next if /^#/; $p=(s/^Depends:\s*/ / or (/^ / and $p)); s/,|\n|\([^)]+\)//mg; print if $p' < debian/control 
Jakob
sumber
Berkat yang satu-baris ini, menginstal dependensi yang diurai semudah apt-get install $(perl -ne 'next if /^#/; $p=(s/^Build-Depends:\s*/ / or (/^ / and $p)); s/,|\n|\([^)]+\)//mg; print if $p' < debian/control)'. Perlu diketahui bahwa dependensi akan ditandai sebagai diinstal secara manual, sehingga mereka akan menempel di lingkungan build. Ini tidak penting dalam lingkungan build yang dibuang (chroot, buruh pelabuhan), tetapi jika Anda membangun di lingkungan biasa Anda, paket dependensi build-time akan tetap ada. Mereka bisa sangat besar untuk beberapa paket.
Stéphane Gourichon