Sistemas de Construcción de Paquetes (Parte 1)

Dentro de los sistemas de construcción de paquetes en los sistemas estilo Linux, el más conocido de ellos el GNU Build System, aka autotools.

Las autotools tienen la reputación de ser difíciles y abrumadoramente barrocas. Es por eso que han surgido sistemas alternativos siendo tal vez la más más popular cmake.

Es por ello que me propuse hacer una estadística, tal vez bastante rudimentaria acerca de los sistemas de construcción de paquetes.

Lo primero que hice fue ejecutar algo como esto:

repoquery -a --disablerepo=livna,rpmfusion-free,rpmfusion-free-updates --source | uniq | shuf -n 101 | sed 's/.src.rpm//g' | xargs yumdownloader --source

Con esto se consigue una muestra de 101 paquetes de los repositorios oficiales de Fedora 14.

Los paquetes son:

ailurus-10.10.3-1.fc14.src.rpm
alsa-oss-1.0.17-4.fc12.src.rpm
aplus-fsf-4.22.4-19.fc12.src.rpm
ar9170-firmware-2009.05.28-2.fc13.src.rpm
azureus-4.5.1.0-1.fc14.src.rpm
bitfrost-1.0.10-1.fc14.src.rpm
bwidget-1.9.0-1.fc13.src.rpm
cfitsio-3.250-5.fc14.src.rpm
congruity-14-1.fc13.src.rpm
dogtag-pki-ra-ui-1.3.2-1.fc14.src.rpm
drascula-international-1.0-3.fc12.src.rpm
dump-0.4-0.8.b43.fc14.src.rpm
dumpet-2.1-1.fc14.src.rpm
dx-4.4.4-16.fc14.2.src.rpm
easystroke-0.5.3-2.fc14.src.rpm
eblook-1.6.1-10.fc14.src.rpm
eclipse-jgit-0.10.1-1.fc14.src.rpm
emacs-common-tuareg-1.45.6-9.fc12.src.rpm
emacs-common-w3m-1.4.398-0.4.20100714cvs.fc14.src.rpm
emacspeak-29.0-3.fc12.src.rpm
fedora-packager-0.5.5.0-2.fc14.src.rpm
FlightGear-2.0.0-4.fc14.src.rpm
fmtools-2.0.1-2.fc13.src.rpm
func-0.25-3.fc14.src.rpm
gambas2-2.22.0-1.fc14.src.rpm
gbirthday-0.6.5-2.fc14.src.rpm
gedit-plugins-2.31.6-1.fc14.src.rpm
gfs-pyrsos-fonts-20090618-3.fc13.src.rpm
globus-gatekeeper-5.5-2.fc14.src.rpm
globus-gram-job-manager-10.59-2.fc14.src.rpm
globus-gram-job-manager-setup-sge-2.5-1.fc14.src.rpm
gmm-4.0.0-1.fc14.src.rpm
gnomeradio-1.8-6.fc14.src.rpm
html2text-1.3.2a-6.fc13.src.rpm
i3lock-1.0-4.20100320git.fc14.src.rpm
isync-1.0.4-6.fc12.src.rpm
javasqlite-20100727-1.fc14.src.rpm
kdetv-0.8.9-13.fc12.src.rpm
kmid2-2.3.0-2.fc14.src.rpm
lcms2-2.1-1.fc14.src.rpm
libfreebob-1.0.11-6.fc12.src.rpm
libgalago-0.5.2-9.fc12.src.rpm
libmusicbrainz3-3.0.3-2.fc14.src.rpm
libotr-3.2.0-5.fc14.src.rpm
lilypond-2.13.39-3.fc14.src.rpm
makebootfat-1.4-11.fc14.src.rpm
man-pages-cs-0.18.20090209-9.fc14.src.rpm
metromap-0.1.2-5.fc14.src.rpm
mono-basic-2.6.2-1.fc14.src.rpm
mysql-5.1.55-1.fc14.src.rpm
mysql-connector-c++-1.1.0-0.4.bzr895.fc14.src.rpm
nedit-5.5-23.fc14.src.rpm
nemiver-0.7.3-3.fc14.src.rpm
nntpgrab-0.6.91-2.fc14.src.rpm
nogravity-2.00-11.fc13.src.rpm
ocaml-lacaml-5.4.7-2.fc13.src.rpm
ogre-1.6.4-5.fc13.src.rpm
openjpeg-1.3-10.fc14.src.rpm
orage-4.6.1-2.fc13.src.rpm
pam_abl-0.2.3-8.fc12.src.rpm
perl-Catalyst-View-PDF-Reuse-0.03-4.fc14.src.rpm
perl-CGI-Session-4.35-5.fc14.src.rpm
perl-Color-Calc-1.061-2.fc14.src.rpm
perl-Inline-0.46-1.fc14.src.rpm
perl-Mixin-Linewise-0.003-2.fc14.src.rpm
perl-MooseX-MethodAttributes-0.24-1.fc14.src.rpm
perl-Net-FTPServer-1.122-9.fc14.src.rpm
perl-Net-Patricia-1.19-1.fc14.src.rpm
perl-Package-Stash-XS-0.19-1.fc14.src.rpm
perl-Regexp-Assemble-0.34-5.fc14.src.rpm
perl-String-Escape-2010.002-4.fc14.src.rpm
perl-Text-Kakasi-2.04-13.fc14.src.rpm
perl-UNIVERSAL-exports-0.05-8.fc14.src.rpm
php-gettext-1.0.9-2.fc13.src.rpm
php-pear-CodeGen-1.0.7-3.fc14.src.rpm
postal-0.70-6.fc14.src.rpm
pyclutter-gtk-0.10.0-2.fc14.src.rpm
pyflakes-0.4.0-4.fc14.src.rpm
python-billiard-0.3.1-2.fc14.src.rpm
python-rabbyt-0.8.3-2.fc14.src.rpm
python-zope-sqlalchemy-0.6-1.fc14.src.rpm
redir-2.2.1-4.fc12.src.rpm
rhncfg-5.9.22-2.fc14.src.rpm
R-nws-1.7.0.1-1.fc14.src.rpm
rubygem-shotgun-0.4-1.fc14.src.rpm
R-zoo-1.6-3.fc14.src.rpm
sarai-fonts-1.0-9.fc14.src.rpm
sblim-cmpi-params-1.2.6-1.fc13.src.rpm
scim-1.4.9-6.fc13.src.rpm
shed-1.15-5.fc12.src.rpm
sugar-tamtam-0-0.6.20100201git.fc14.src.rpm
Thunar-1.0.2-3.fc14.src.rpm
veusz-1.9-2.fc14.src.rpm
vhd2vl-2.3-1.fc14.src.rpm
virt-what-1.3-3.fc14.src.rpm
w3m-0.5.2-18.fc14.src.rpm
wannier90-1.2-2.fc13.src.rpm
writer2latex-1.0.2-3.fc14.src.rpm
ws-jaxme-0.5.1-4.4.fc12.src.rpm
xmlfy-1.5.3-1.fc14.src.rpm
xpaint-2.9.8.1-1.fc14.src.rpm

Esta historia continúa

Autotools: Detrás de los famosos 3 pasos

La mayoría de los usuarios con conocimiento intermedios (o más) en Linux y sistemas similares habrá alguna vez compilado alguna vez un paquete con la siguiente secuencia de comandos:

./configure

make

make install

Lo que tal vez no muchos conocen es qué herramientas permiten realizar eso y menos aun como se hace para construir los famosos archivos con extensión .tar.gz o .tar.bz2.

Autotools

Se conoce popularmente como autotools al GNU Build System, es decir al conjunto de herramientas para construir paquetes instalables de software.

Si bien un aplicación o una librería puede ser instalada – al menos en principio – a partir de un relativamente sencillo Makefile, tiene en principio dos grandes limitaciones, puede resultar poco flexible para el usuario instalador y puede resultar poco portable.

Las autotools se usan para estandarizar el proceso de instalación. Si bien la curva de aprendizaje de estas herramientas es algo empinada, proporciona una sistematización en la instalación de software a partir de código fuente.

Si bien se han creado con el tiempo algunos sistemas de construcción de paquetes alternativos en los sistemas operativos Linux y similares, es la suite preferida de una gran cantidad de proyectos open source.

De ahí que la secuencia de instalación ./configure && make && make install sea ampliamente conocido por los usuarios de sistemas operativos estilo Linux.

Componentes principales de autotools

autoconf

Crea el célebre script de alta portabilidad configure a partir de un archivo de macros M4. El script configure permite:

  • Personalizar la compilación (por ej: deshabilitar soporte para mysql)
  • Verificar que los archivos necesarios para compilar están presentes en el sistema
  • Imprimir mensajes descriptivos en cada caso
  • Crear un archivo Makefile

automake

Es un script de perl que a partir de un archivo “template” crea un archivo Makefile.in que genera archivos que permite crear archivos Makefile compatibles con GNU Coding Standards.1

libtool

Simplifica la creación de librerías (en particular de las dinámicas). Esta herramienta permite crear un nivel de abstracción del tipo de host que se está utilizando y permite al usuario compilar librerías con el mismo método de los tres pasos nombrados con anterioridad.

Resumen

Muy sintética y simplificadamente, la tarea del “maintainer” del paquete es crear de manera consistente archivos configura.ac (para autoconf), Makefile.am (para automake), además de echar mano de ser necesario de marcos M4 para resolver la realización de una tarea (por ejemplo verificar la existencia un determinado header).

Es un sistema que apunta a ser lo más portable posible y hacer previsible y flexible la tarea de instalar paquetes fuente al usuario.

El objetivo principal es hacerle la vida más fácil al usuario antes que al maintainer.

Desde luego, el usuario final rara vez compilará un programa. Sin embargo, crear un paquete instalable a partir del código fuente es el paso previo para crear paquetes ya compilados generalmente en formato RPM o Debian, dependiendo de la distribución. Y las autotools juegan un rol importante en esa etapa intermedia.

Los famosos 3 pasos

1http://www.gnu.org/prep/standards/standards.html

Licencia de Creative Commons
Usuario final: ¿A qué nos referimos? is licensed under a Creative Commons Atribución-CompartirDerivadasIgual 2.5 Argentina License. La manera de reconocer los créditos es citando la URL de este sitio.