Cómo crear paquetería con rpmbuild.

Introducción
Crear paquetería a través de rpmbuild no es tan complicado como algunos suponen. Aunque no se instala de modo predeterminado, rpmbuild es una herramienta que forma parte del paquete rpm-build y que se incluye en la mayoría de las distribuciones actuales que utilizan paquetería en formato RPM.
Este documento mostrará los procedimientos para:
  • Generar una clave GnuPG para firmar digitalmente los paquetes creados.
  • Configuración y creación de una jaula para rpmbuild.
  • Creación de archivos *.spec.
  • Uso del mandato rpmbuild.

Instalación del software necesario

Es indispensable contar con la paquetería de desarrollo mínima necesaria instalada en el sistema. Lamentablemente no hay recetas mágicas, si se pretende crear paquetería a partir de códigos fuente es necesario estar familiarizado con las bibliotecas compartidas necesarias, cabeceras de desarrollo, compiladores y otras herramientas de desarrollo relacionadas o requeridas por un software en particular. Un conjunto mínimo sería el siguiente:
  • Gcc: compilador.
  • glibc-devel: bibliotecas de desarrollo para C.
  • automake: generador de archivos Makefile.
  • autoconf: herramienta para configuración de códigos fuente y archivos Makefile.
  • rpm-build y rpm-devel
  • gnupg
  • Gpgme y seahorseherramientas incluidas en AL Desktop que se utilizará en los procedimientos de este documento para generar la clave utilizada para firmar digitalmente los paquetes rpm resultantes.
  • Si va a crear paquetería para GNOME, necesitará al menos lo siguiente, con todo lo que dependa de éstos: glib2-devel, atk-devel, pango-devel, gtk2-devel, libbonoboui-devel, libgnomeui-devel, gnome-vfs2-devel, libwnck-devel, gnome-panel-devel, gnome-desktop-devel, nautilus-devel, gstreamer-devel y gstreamer-plugins-devel.
  • Si va a crear paquetería para KDE, necesitará al menos lo siguiente, con todo lo que dependa de éstos: qt-devel, arts-devel, kdelibs-devel, kdebase-devel, kdenetwork-devel, kdegraphics-devel y kdemultimedia-devel.
Si utiliza Cent OS, White Box Enterprise Linux o bien Red Hat™ Enterprise Linux, necesitará correr lo siguiente para instalar el mínimo de paquetería:
yum -y install gcc* automake* autoconf* rpm-build rpm-devel gnupg
Si va a generar paquetería para GNOME, necesitará también instalar el mínimo de paquetería de desarrollo de GNOME:
yum -y install glib2-devel atk-devel pango-devel gtk2-devel libbonoboui-devel libgnomeui-devel gnome-vfs2-devel libwnck-devel gnome-panel-devel gnome-desktop-devel nautilus-devel gstreamer-devel gstreamer-plugins-devel
Si va a generar paquetería para KDE, necesitará también instalar el mínimo de paquetería de desarrollo de KDE:
yum -y install qt-devel arts-devel kdelibs-devel kdebase-devel kdenetwork-devel kdegraphics-devel kdemultimedia-devel
Si además tiene instalado AL Desktop, puede instalar también el software restante:
yum -y install seahorse gpgme

Procedimientos.

Creación de la clave GnuPG.

  1. Desde una sesión gráfica, inicie seahorse y de clic en en botón de «Nuevo» en el panel de «Opciones de primera vez».
  2. Lo anterior iniciará un asistente de creación de claves.
  3. Elija el nivel de seguridad como «Seguridad extra alta»
  4. Especifique su nombre completo, un breve comentario opcional y su cuenta de correo electrónico permanente que se relacionará exclusivamente con la nueva clave.
  5. Especifique una frase de paso que solo usted pueda recordar. Se recomienda utilizar espacios y signos de puntuación.
  6. En la pantalla de «Fecha de caducidad», salvo que específicamente requiera lo contrario, especifique «Sin caducidad».
  7. Tome nota de como parece exactamente el nombre de la llave, incluyendo paréntesis, espacios y otros símbolos, ya que se utilizarán en el siguiente procedimiento.

Configuración y creación de una jaula para rpmbuild.

Jamás utilice la cuenta de root, sin importar la circunstancia, para crear o reconstruir paquetería en formato RPM. Esto puede resultar peligroso debido a que la configuración de algunos programas pueden tratar de instalar componentes en el sistema en lugar de el directorio especificado para rpmbuild, lo cual tiene diversas consecuencias de seguridad y de estabilidad para el sistema.
La jaula será creada de modo seguro dentro de una cuenta de usuario normal sin privilegios a fin de poder detectar e impedir que algunos procedimientos durante la creación de paquetes traten de instalar componentes no deseados en el sistema.

Componentes del archivo ~/.rpmmacros.

Utilizando cualquier editor de texto, genere el archivo ~/.rpmmacros, en el cual se definirán valores para algunas variables utilizadas por rpmbuild:
  • %debug_package: sirve para especificar si se anula o no la generación de paquetería de depuración. La paquetería de depuración solo es útil para los programadores a fin de localizar fallas en los programas empaquetados. Para la mayoría de los casos se especifica el valor % a fin de impedir se genere paquetería de depuración.
  • %_unpackaged_files_terminate_build: sirve para especificar si la construcción de un paquete se deberá interrumpir si hay componentes ignorados por el archivo *.spec. 0 deshabilita, 1 habilita. ¿Que valor se recomienda? la respuesta es obvia: no es deseable un paquete al cual le faltan componentes, así que se especificará 1.
  • %_signature: se utilizará gpg para firmar los paquetes resultantes.
  • %_gpg_path: ruta del directorio .gpg a utilizar. Este estará localizado dentro de la carpeta de inicio del usuario utilizado.
  • %_gpg_name: identidad a utilizar para firmar los paquetes resultantes. El formato utilizado es el mismo como aparece el nombre de su clave GnuPG en seahorse: Su Nombre (Breve comentario)
  • %_gpgbin: ruta del binario gpg, normalmente en /usr/bin/gpg
  • %_topdir: ruta donde se localiza la jaula para rpmbuild
  • %_tmppath: directorio de elementos temporales que será utilizado para simular instalaciones.
  • %packager: su nombre completo y dirección de correo electrónico o bien el URL de su sitio de red.
  • %distribution: nombre del producto o bien para especificar para que distribución de GNU/Linux se utilizará la paquetería.
  • %vendor: nombre de su empresa u organización.
  • %desktop_vendor: variable opcional (y no oficial) para definir el nombre de la empresa en el nombre algunos archivos, principalmente entradas de menú. Especifique el nombre corto de su empresa sin espacios.
A continuación un ejemplo del contenido del archivo ~/.rpmmacros, utilizando valores ficticios:
%debug_package %
%_unpackaged_files_terminate_build 1
%_signature gpg
%_gpg_path %(echo "$HOME")/.gnupg
%_gpg_name Fulano de Perengano (Una empresa ficticia)
%_gpgbin /usr/bin/gpg
%_topdir %(echo "$HOME")/rpmbuild
%_tmppath %(echo "$HOME")/rpmbuild/TMP
%packager Fulano de Perengano <su cuenta de correo o bien http://su-sitio-de-red.com>
%distribution nombre de su producto aquí
%vendor su nombre o nombre de su empresa aquí
%desktop_vendor nombre-de-su-empresa-sin-espacios

Creación de la estructura de la jaula para rpmbuild.

Desde una terminal, genere la estructura de directorios necesaria utilizando lo siguiente:
mkdir -p ~/rpmbuild/
mkdir -p ~/rpmbuild/RPMS/

Creación de los archivos*.spec

Los archivos *.spec contienen la información que utilizará rpmbuild para construir un paquete. Del contenido de estos dependerá que sea posible descomprimir, configurar, compilar, instalar virtualmente y empaquetar un software en particular a partir de un código fuente.
Name:
Se refiere nombre del paquete. No puede llevar espacios. Regularmente es el mismo nombre utilizado para el paquete del código fuente.
Version:
Se refiere al número de versión del paquete
Release:
número de lanzamiento o entrega
URL:
URL original del sitio de red del software que se va a empaquetar.
Summary:
Resúmen o descripción corta del paquete.
License:
Licencia o licencias utilizadas por el paquete.
Group:
Grupo o categoría de software al cual pertenece el paquete. Lista de grupos válidos:
Amusements/Games
Amusements/Graphics
Applications/Archiving
Applications/Communications
Applications/Databases
Applications/Editors
Applications/Emulators
Applications/Engineering
Applications/File
Applications/Internet
Applications/Multimedia
Applications/Productivity
Applications/Publishing
Applications/System
Applications/Text
Development/Debuggers
Development/Languages
Development/Libraries
Development/System
Development/Tools
Documentation
System Environment/Base
System Environment/Daemons
System Environment/Kernel
System Environment/Libraries
System Environment/Shells
User Interface/Desktops
User Interface/X
User Interface/X Hardware Support
Buildroot:
Ruta donde se realizará la instalación virtual, es decir: %/%-%-root
Source:
Se puede especificar solamente el nombre del paquete utilizado para el código fuente, aunque por norma se sugiere especificar URL exacto hacia el código fuente.
BuildRequires:
Lista separada por comas o espacios de componentes o paquetes requeridos para poder construir el software involucrado.
BuildPreReq:
Lista de componentes o paquetes que deben estar previamente instalados en el sistema antes de iniciar la compilación del software involucrado.
Requires:
Lista de paquetes de los cuales depende el software empaquetado para poder funcionar.
PreReq:
Lista de componentes o paquetes que deben estar previamente instalados en el sistema antes de iniciar la instalación del software involucrado.
%description
Descripción detallada acerca del paquete
%prep
Procedimientos, si los hubiere, requeridos antes de desempaquetar el código fuente. Regularmente no los hay.
%setup
Procedimientos, si los hubiere, requeridos al desempaquetar o después de desempaquetar el código fuente. Regularmente aquí es donde se aplican parches y otros correctivos.
%build
Procedimientos necesarios para poder compilar desde el código fuente de un software en particular. Por lo general basta con un %configure y %__make, pero se recomienda leer a detalle el instructivo de instalación de cada software en particular a fin de asegurar los procedimientos correctos para compilar el software.
%install
Procedimiento de instalación requerido para un paquete en particular. Se recomienda limpiar cualquier instalación previa utilizando %__rm -fr %. La instalación será virtual y se realizará dentro de ~/rpmbuild/TMP/ que es establecido por la variable %. Por lo general es suficiente %__make DESTDIR=% install, sin embargo algunos software pudieran requerir instalación individual de algunos o todos sus componentes.
%clean
Procedimientos para limpiar aquello que ya no se necesita después de haber creado exitosamente el paquete RPM. Específicamente se refiere a la instalación virtual que se realizó dentro de ~/rpmbuild/TMP/. Para la mayoría de los casos es suficiente con utilizar %__rm -fr %.
%preun
Procedimientos que se deben correr justo antes de proceder a instalar un paquete. Se utiliza principalmente con paquetes que necesitan crear cuentas de sistema u otros preparativos.
%post
Procedimientos que se deben correr justo después de proceder a instalar un paquete. Ejemplos: Cuando los paquetes incluyen bibliotecas compartidas, se ejecuta ldconfig. Si un paquete incluye un esquema para GConf, se debe correr lo necesario para registrar el esquema.
%postun
Procedimientos que se deben correr justo después de proceder a desinstalar un paquete. Se utiliza principalmente con paquetes que necesitan correr tareas administrativas, como detener y/o dar de baja un servicio.
%files
Lista de todos los componentes del software empaquetado en sus rutas definitivas.
%changelog
Bitácora de cambios del archivo *.spec. Requiere un formato especial.:

* [Dia de la semana en abreviado y en inglés] [Mes abreviado en inglés] día año Nombre empaquetador
- Algunos cambios
- Más cambios
- Otros cambios

Ejemplo:
* Sun Sep 25 2005 Fulano de Perengano
- Archivo *.spec inicial.
- Se añadieron cosas
- Se puso un guión para algo

Ejemplo de archivo *.spec.

Name: algo
Version: 0.1
Release: 1
URL: http://sitio-de-red-del-software-a-utilizar/
Summary: Paquete imaginario que hace algo.
License: GPL
Group: Applications/File

Buildroot: %/%-%-root
Source: http://un-sitio-güeb.algo/algo-0.1.tar.bz2
BuildRequires: gtk2-devel
BuildPreReq: /usr/bin/desktop-file-install
Requires: gtk2
PreReq: /usr/bin/update-desktop-database

%description
Programa imaginario escrito en un lenguaje abstracto e inexistente que hace
cosas imaginarias e imposibles solo para fines demostrativos.


%prep 
%setup -q

%build
%configure

%__make

%install
%__make DESTDIR=% install

%clean
%__rm -fr %

%preun

%post
/sbin/ldconfig

%postun

%files
defattr(-,root,root)
/usr/bin/algo
/usr/lib/libalgo.so.0
/usr/share/applications/algo.desktop

%changelog
* Sun Sep 25 2005 Fulano de Perengano
- Se añadieron cosas
- Se puso un guión para algo

* Sat Sep 24 2005 Fulano de Perengano
- Archivo *.spec inicial.

Uso del mandato rpmbuild.

Lista y descripción de opciones principales:
--sign
Especifica que se debe firmar un paquete con clave digital predeterminada.
--clean
Solicita a rpmbuild corra los procesos especificados en la sección %clean para dejar limpio el directorio de temporales utilizado para realizar instalaciones virtuales.
--target=[arquitectura]
Se utilzia para indicar a rpmbuild para que arquitectura será construido el paquete. De modo predefinido rpmbuild crea los paquetes para la arquitectura predeterminada del sistema. Puede especificarse i386, i585, i686, noarch, athlon, etc., de acuerdo a lo que sea requerido.
-ba
Solicita a rpmbuild corra todos los procedimientos necesarios para generar un paquete RPM binario y el paquete RPM fuente (*.src.rpm) a partir de un archivo *.spec.
-bb
Solicita a rpmbuild corra todos los procedimientos necesarios para generar solamente un paquete RPM binario a partir de un archivo *.spec.
-bp
Solicita a rpmbuild corra todos los procedimientos necesarios en la sección %prep y aplicación de parches en %setup. Se utiliza principalmente para verificar y depurar estos procedimientos antes de comenzar la compilación e instalación.
-bc
Solicita a rpmbuild corra todos los procedimientos necesarios en la sección %prep, aplicación de parches en %setup y compilación en %build. No realiza instalación virtual ni crea paquetes RPM. Se utiliza principalmente para verificar y depurar estos procedimientos.
-bi
Solicita a rpmbuild corra todos los procedimientos necesarios en la sección %prep, aplicación de parches en %setup, compilación en %build e instalación virtual en %install. No crea paquetes RPM. Se utiliza principalmente para verificar y depurar estos procedimientos.
--short-circuit
Se utiliza en combinación con -bc y bi. Solicita a rpmbuild saltar todos los pasos previos y correr únicamente la compilación, en el caso de ser combinado con -bc o bien saltar todos los pasos previos y correr únicamente los procedimientos para realizar la instalación virtual, en el caso de ser combinado con -bi. Se utiliza principalmente para verificar y depurar estos procedimientos.
--rmspec
Solicita a rpmbuild elimine el archivo *.spec después de crear exitosamente los paquetes RPM correspondientes. Se utiliza para mantener limpia la jaula de rpmbuild.
--rmsource
Solicita a rpmbuild elimine todo lo que corresponda a las fuentes, es decir códigos fuentes, parches y otros elementos, después de crear exitosamente los paquetes RPM correspondientes. Se utiliza para mantener limpia la jaula de rpmbuild.
--rebuild
Solicita a rpmbuild reconstruya un paquete a partir de un *.src.rpm.

Ejemplos de uso del mandato rpmbuild.

Construir solo un paquete RPM, sin generar *.src.rpm, a partir de un archivo *.spec:
rpmbuild -bb algo.spec
Construir solo un paquete RPM junto con el correspondiente *.src.rpm a partir de un archivo *.spec:
rpmbuild -ba --clean --sign --rmspec --rmsource algo.spec
Construir solo un paquete RPM sin *.src.rpm a partir de un archivo *.spec, con firma digital, limpieza de directorio de instalaciones virtuales y eliminación de *.spec y fuentes tras terminar exitosamente:
rpmbuild -bb *.spec
Construir solo un paquete RPM y el correspondiente *.src.rpm a partir de un archivo *.spec, con firma digital, limpieza de directorio de instalaciones virtuales y eliminación de *.spec y fuentes tras terminar exitosamente:
rpmbuild -ba --clean --sign --rmspec --rmsource *.spec
Reconstruir solo un paquete RPM a partir de un *.src.rpm:
rpmbuild --rebuild cualquier-paquete.src.rpm
Reconstruir solo un paquete RPM a partir de un *.src.rpm, con firma digital, limpieza de directorio de instalaciones virtuales y eliminación de *.spec y fuentes tras terminar exitosamente:
rpmbuild --rebuild --clean --sign --rmspec --rmsource cualquier-paquete.src.rpm

Ejercicios.

Paquete RPM binario y el paquete *.src.rpm correspondiente creando el archivo *.spec necesario.

  1. Acceda hacia http://www.nano-editor.org y descargue el código fuente de la más reciente versión estable del editor de texto Nano.
  2. Coloque el *.tar.gz del código fuente dentro del directorio ~/rpmbuild/SOURCES/
    mv nano-1.2.5.tar.gz ~/rpmbuild/SOURCES/
  3. Cambie hacia el directorio ~/rpmbuild/SPECS/
    cd ~/rpmbuild/SPECS/
  4. Con cualquier editor de texto simple, genere el archivo ~/rpmbuild/SPECS/nano.spec con el siguiente contenido (al terminar, por favor verifique sintaxis línea por línea):
    Name: nano
    Version: 1.2.5
    Release: 1
    URL: http://www.nano-editor.org/
    Summary: Un pequeño editor de texto.
    License: GPL
    Group: Applications/Editors

    Buildroot: %/%-%-root
    Source: http://www.nano-editor.org/dist/v1.2/nano-1.2.5.tar.gz

    BuildRequires: ncurses-devel, glibc-devel, gcc
    Requires: ncurses

    %description
    GNU nano es un pequeño y fácil de utilizar editor de texto.

    %prep 
    %setup -q

    %build
    %configure

    %__make

    %install
    %__make DESTDIR=% install

    %clean
    %__rm -fr %

    %files
    %defattr(-,root.root)
    %doc AUTHORS BUGS COPYING ChangeLog INSTALL NEWS README THANKS TODO
    %doc nanorc.sample
    /usr/bin/nano
    /usr/share/info/nano.info.gz
    /usr/share/man/man1/nano.1.gz
    /usr/share/man/man5/nanorc.5.gz
    /usr/share/locale/*/LC_MESSAGES/nano.mo

    %changelog
    * Sun Sep 25 2005 Fulano de Perengano
    - Archivo *.spec inicial.
  5. Para poder construir nano, necesitará tener instalado los paquetes ncurses-devel (cabeceras de desarrollo para ncurses), glibc-devel (cabeceras de desarrollo para C) y gcc (compilador de GNU.org). De ser necesario, proceda a instalar éstos:
    yum -y install ncurses-devel glibc-devel gcc
  6. Utilice lo siguiente para generar los paquetes correspondientes:
    rpmbuild -ba nano.spec
  7. Suponiendo que utiliza una computadora con microprocesador compatible con Intel, al terminar el proceso, encontrará el paquete binario RPM dentro del directorio ~/rpmbuild/RPMS/i386/ y el paquete *.src.rpm dentro del directorio~/rpmbuild/SRPMS/.

Paquete RPM binario y el paquete *.src.rpm correspondiente realizando limpieza de directorio, firma digital.

  1. Utilizará el mismo archivo *.spec del ejercicio pasado.
  2. Utilice lo siguiente para generar los paquetes correspondientes, ingresando la clave de acceso para GnuPG cuando le sea requerida:
    rpmbuild -ba --clean --sign nano.spec
  3. Suponiendo que utiliza una computadora con microprocesador compatible con Intel, al terminar el proceso, encontrará el paquete binario RPM dentro del directorio ~/rpmbuild/RPMS/i386/ y el paquete *.src.rpm dentro del directorio~/rpmbuild/SRPMS/.


    Autor: Joel Barrios Dueñas
    Correo electrónico: darkshram en gmail punto com
    Sitio de Red: http://www.alcancelibre.org/
    Jabber ID: darkshram@jabber.org
    © 1999-2007 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector hace mal uso de éstos.

0 comentarios: