¿Cómo instalar / analizar dependencias de compilación de debian / control?

11

Supongamos que descargó una carpeta de código fuente, que contiene una /debian/carpeta existente así como un /debian/controlarchivo.

Supongamos que el paquete en cuestión no está en el repositorio oficial de Debian, por apt-get build-deplo que no se puede usar.

¿Cómo analizar la Build-Depends:línea?

Por ejemplo, si la línea dijera Build-Depends: debhelper (>= 8), faketime, ¿hay alguna herramienta control-parse debian/control build-dependsque haga eco debhelper faketime?

¿Especialmente cuando es multilínea?

¿Existen herramientas de Debian existentes o tiene una para escribir su propio código para analizar esto?

adrelanos
fuente

Respuestas:

4

Podrías usar dpkg-checkbuilddeps. La página del manual dice

Este programa verifica los paquetes instalados en el sistema contra las dependencias de compilación y los conflictos de compilación enumerados en el archivo de control. Si no se cumple alguno, los muestra y sale con un código de retorno distinto de cero.

Por ejemplo:

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

Sin embargo, también podría intentar compilar el paquete, utilizando (por ejemplo) debuild, por ejemplo

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

Lo que da la misma información (ya que usa dpkg-checkbuilddeps), pero es un poco más ruidoso.

Faheem Mitha
fuente
dpkg-checkbuilddepssolo genera dependencias de compilación no satisfechas. Vea mi respuesta sobre el análisis en el caso común.
Evgeny Vereshchagin
4

Analizando:

Use módulos de libdpkg-perl( dpkg-checkbuilddepsusa esos módulos internamente)

Agregue las siguientes líneas print-build-depsy ejecútelas print-build-depsen la raíz del paquete fuente.

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

Ver también:

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

Instalación:

Puedes usar mk-build-depsdesde 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 dice:

mk-build-deps - build a package satisfying a package's build-dependencies
-i, --install
       Install the generated packages and its build-dependencies
Evgeny Vereshchagin
fuente
Esto parece una solución limpia porque usa herramientas del contexto, por lo que podría ser más robusto. En Debian reciente (al menos) necesita paquetes devscripts y equivs , genera un paquete temporal myproject-build-depsy lo instala. Esto es bueno si usted no está con la intención de mantener las dependencias en tiempo de compilación en su máquina: basta de desinstalación devscripts, equivsy myproject-build-deps.
Stéphane Gourichon
3

Este Perl one-liner se puede utilizar para analizar dependencias de debian-control:

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

o

perl -ne 'next if /^#/; $p=(s/^Depends:\s*/ / or (/^ / and $p)); s/,|\n|\([^)]+\)//mg; print if $p' < debian/control 
Jakob
fuente
Gracias a esta línea, instalar dependencias analizadas es tan fácil como apt-get install $(perl -ne 'next if /^#/; $p=(s/^Build-Depends:\s*/ / or (/^ / and $p)); s/,|\n|\([^)]+\)//mg; print if $p' < debian/control)'. Solo tenga en cuenta que las dependencias se marcarán como instaladas manualmente, por lo que se mantendrán en el entorno de compilación. Esto no tiene importancia en un entorno de compilación desechable (chroot, docker), pero si construye en su entorno normal, los paquetes de dependencias de tiempo de compilación permanecerán. Pueden ser bastante grandes para algunos paquetes.
Stéphane Gourichon