Como instalar / analisar dependências de compilação do debian / control?

11

Vamos supor que você baixou uma pasta de código-fonte, que contém uma /debian/pasta existente e um /debian/controlarquivo.

Vamos supor que o pacote em questão não esteja no repositório oficial da Debian, portanto apt-get build-depnão pode ser usado.

Como analisar a Build-Depends:linha?

Por exemplo, se a linha ler Build-Depends: debhelper (>= 8), faketime, há alguma ferramenta control-parse debian/control build-dependsque ecoaria debhelper faketime?

Especialmente quando é multi-linha?

Existem ferramentas Debian existentes ou tem uma para escrever seu próprio código para analisar isso?

adrelanos
fonte

Respostas:

4

Você poderia usar dpkg-checkbuilddeps. A página do manual diz

Este programa verifica os pacotes instalados no sistema em relação às dependências e conflitos de compilação listados no arquivo de controle. Se algum não for atendido, ele será exibido e sairá com um código de retorno diferente de zero.

Por exemplo:

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

No entanto, você também pode tentar criar o pacote, usando (por exemplo) debuild, por exemplo

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

O que fornece a mesma informação (já que é usada dpkg-checkbuilddeps), mas é um pouco mais barulhento.

Faheem Mitha
fonte
dpkg-checkbuilddepsgera apenas dependências de construção não atendidas. Veja minha resposta sobre a análise no caso comum.
precisa
4

Análise:

Use módulos do libdpkg-perl( dpkg-checkbuilddepsusa esses módulos internamente)

Adicione as seguintes linhas print-build-depse execute print-build-depsna raiz do pacote de origem.

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

Veja também:

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

Instalação:

Você pode usar mk-build-depsem 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 diz:

mk-build-deps - build a package satisfying a package's build-dependencies
-i, --install
       Install the generated packages and its build-dependencies
Evgeny Vereshchagin
fonte
Parece uma solução limpa, pois utiliza ferramentas do contexto, portanto, pode ser mais robusta. No Debian recente (pelo menos), ele precisa de pacotes devscripts e equivs , gera um pacote temporário myproject-build-depse o instala. Isso é bom se você não está com a intenção de manter as dependências em tempo de compilação em sua máquina: basta desinstalar devscripts, equivse myproject-build-deps.
Stéphane Gourichon
3

Este one-liner Perl pode ser usado para analisar dependências de debian-control:

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

ou

perl -ne 'next if /^#/; $p=(s/^Depends:\s*/ / or (/^ / and $p)); s/,|\n|\([^)]+\)//mg; print if $p' < debian/control 
Jakob
fonte
Graças a isso, instalar dependências analisadas é tão fácil quanto apt-get install $(perl -ne 'next if /^#/; $p=(s/^Build-Depends:\s*/ / or (/^ / and $p)); s/,|\n|\([^)]+\)//mg; print if $p' < debian/control)'. Lembre-se de que as dependências serão marcadas como instaladas manualmente, para que elas permaneçam no ambiente de construção. Isso não tem importância em um ambiente de construção descartável (chroot, docker), mas se você criar em seu ambiente regular, os pacotes de dependências em tempo de construção permanecerão. Eles podem ser muito grandes para alguns pacotes.
Stéphane Gourichon