Cómo se hacen los paquetes RPM: el archivo de especificaciones

En el artículo anterior sobre la creación de paquetes RPM, vio que los RPMS fuente incluyen el código fuente del software, junto con un archivo de “especificaciones”. Esta publicación profundiza en el archivo de especificaciones, que contiene instrucciones sobre cómo construir el RPM. Nuevamente, este artículo usa fpaste como un example.

Entendiendo el código fuente

Antes de que pueda comenzar a escribir un archivo de especificaciones, debe tener una idea del software que desea empaquetar. Aquí, está viendo fpaste, una pieza de software muy simple. Está escrito en Python y es un script de un archivo. Cuando se lanza una nueva versión, se proporciona aquí en Pagure: https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz

La versión actual, como muestra el archivo, es 0.3.9.2. Descárgalo para que puedas ver lo que hay en el archivo:

                      $ 
                      
                        wget https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz
                      
                      
$ 
                      
                        tar -tvf fpaste-0.3.9.2.tar.gz
                      
                      
drwxrwxr-x root/root         0 2018-07-25 02:58 fpaste-0.3.9.2/
-rw-rw-r-- root/root        25 2018-07-25 02:58 fpaste-0.3.9.2/.gitignore
-rw-rw-r-- root/root      3672 2018-07-25 02:58 fpaste-0.3.9.2/CHANGELOG
-rw-rw-r-- root/root     35147 2018-07-25 02:58 fpaste-0.3.9.2/COPYING
-rw-rw-r-- root/root       444 2018-07-25 02:58 fpaste-0.3.9.2/Makefile
-rw-rw-r-- root/root      1656 2018-07-25 02:58 fpaste-0.3.9.2/README.rst
-rw-rw-r-- root/root       658 2018-07-25 02:58 fpaste-0.3.9.2/TODO
drwxrwxr-x root/root         0 2018-07-25 02:58 fpaste-0.3.9.2/docs/
drwxrwxr-x root/root         0 2018-07-25 02:58 fpaste-0.3.9.2/docs/man/
drwxrwxr-x root/root         0 2018-07-25 02:58 fpaste-0.3.9.2/docs/man/en/
-rw-rw-r-- root/root      3867 2018-07-25 02:58 fpaste-0.3.9.2/docs/man/en/fpaste.1
-rwxrwxr-x root/root     24884 2018-07-25 02:58 fpaste-0.3.9.2/fpaste
lrwxrwxrwx root/root         0 2018-07-25 02:58 fpaste-0.3.9.2/fpaste.py -> fpaste

                    

Los archivos que desea instalar son:

  • fpaste.py: que debe instalarse en /usr/bin/.
  • docs/man/en/fpaste.1: el manual, que debe ir a /usr/share/man/man1/.
  • COPIANDO: el texto de la licencia, que debe ir a /usr/share/license/fpaste/.
  • README.rst, TODO: documentación diversa que va a /usr/share/doc/fpaste.

El lugar donde se instalan estos archivos depende del estándar de jerarquía del sistema de archivos. Para obtener más información al respecto, puede leer aquí: https://www.nombrederuta.com/fhs/ o mire la página del manual en su Fedora sistema:

                      $ man hier
                    

Parte 1: ¿Qué estamos construyendo?

Ahora que sabemos qué archivos tenemos en el origen y dónde deben ir, veamos el archivo de especificaciones. Puedes ver el archivo completo aquí: https://src.fedoraproject.org/rpms/fpaste/blob/master/f/fpaste.spec

Aquí está la primera parte del archivo de especificaciones:

                      Name:   fpaste
Version:  0.3.9.2
Release:  3%{?dist}
Summary:  A simple tool for pasting info onto sticky notes instances
BuildArch:  noarch
License:  GPLv3+
URL:    https://pagure.io/fpaste
Source0:  https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz

Requires:    python3

%description
It is often useful to be able to easily paste text to the Fedora
Pastebin at https://paste.fedoraproject.org and this simple script
will do that and return the resulting URL so that people may
examine the output. This can hopefully help folks who are for
some reason stuck without X, working remotely, or any other
reason they may be unable to paste something into the pastebin
                    

El nombre, la versión, etc. se denominan etiquetas y se definen en RPM. Esto significa que no puedes simplemente inventar etiquetas. ¡RPM no los entenderá si lo haces! Las etiquetas a tener en cuenta son:

  • Source0: le dice a RPM dónde se encuentra el archivo fuente de este software.
  • Requiere: enumera las dependencias en tiempo de ejecución del software. RPM puede detectar automáticamente algunos de estos, pero en algunos casos deben mencionarse manualmente. Una dependencia en tiempo de ejecución es una capacidad (a menudo un paquete) que debe estar en el sistema para que este paquete funcione. Así es como dnf detecta si necesita extraer otros paquetes cuando instala este paquete.
  • BuildRequires: enumera las dependencias de tiempo de compilación para este software. Por lo general, estos deben determinarse manualmente y agregarse al archivo de especificaciones.
  • BuildArch: las arquitecturas informáticas para las que se está construyendo este software. Si se omite esta etiqueta, el software se creará para todas las arquitecturas admitidas. El valor noarch significa que el software es independiente de la arquitectura (como fpaste, que está escrito exclusivamente en Python).

Esta sección proporciona información general sobre fpaste: qué es, qué versión se está convirtiendo en un RPM, su licencia, etc. Si tiene fpaste instalado y mira sus metadatos, puede ver esta información incluida en el RPM:

                      $ 
                      
                        sudo dnf install fpaste
                      
                      
$ 
                      
                        rpm -qi fpaste
                      
                      
Name        : fpaste
Version     : 0.3.9.2
Release     : 2.fc30
...
                    

RPM agrega algunas etiquetas adicionales automáticamente que representan cosas que conoce.

En este punto, tenemos la información general sobre el software para el que estamos creando un RPM. A continuación, comenzamos a decirle a RPM qué hacer.

Parte 2: preparación para la compilación

La siguiente parte de la especificación es la sección de preparación, indicada por %prep:

                      %prep
%autosetup
                    

Para fpaste, el único comando aquí es %autosetup. Esto simplemente extrae el archivo tar en una nueva carpeta y lo mantiene listo para la siguiente sección donde lo construimos. Puede hacer más aquí, como aplicar parches, modificar archivos para diferentes propósitos, etc. Si miraste el contenido de la fuente rpm para Python, habrías visto muchos parches allí. Todo esto se aplica en esta sección.

Por lo general, cualquier cosa en un archivo de especificaciones con el % prefijo es una macro o etiqueta que RPM interpreta de una manera especial. A menudo, estos aparecerán con llaves, como %{example}.

Parte 3: Construcción del software

La siguiente sección es donde se construye el software, indicado por “% build”. Ahora, dado que fpaste es un script de Python simple y puro, no es necesario compilarlo. Entonces, aquí obtenemos:

                      %build
#nothing required
                    

Sin embargo, en general, tendría comandos de compilación aquí, como:

                      configure; make
                    

La sección de compilación suele ser la sección más difícil de la especificación, porque aquí es donde se compila el software desde la fuente. Esto requiere que sepa qué sistema de compilación está usando la herramienta, que podría ser uno de muchos: Autotools, CMake, Meson, Setuptools (para Python), etc. Cada uno tiene sus propios comandos y estilo. Debe conocerlos lo suficientemente bien como para que el software se compile correctamente.

Parte 4: Instalación de los archivos

Una vez que se crea el software, debe instalarse en la sección %install:

                      %install
mkdir -p %{buildroot}%{_bindir}
make install BINDIR=%{buildroot}%{_bindir} MANDIR=%{buildroot}%{_mandir}
                    

RPM no juega con los archivos de su sistema al crear RPM. Es demasiado arriesgado agregar, eliminar o modificar archivos en una instalación en funcionamiento. ¿Qué pasa si algo se rompe? Entonces, en su lugar, RPM crea un sistema de archivos artificial y funciona allí. Esto se conoce como buildroot. Entonces, aquí en buildroot, creamos /usr/bin, representado por la macro %{_bindir}, y luego instalamos los archivos usando el Makefile proporcionado.

En este punto, tenemos una versión compilada de fpaste instalada en nuestra raíz de compilación artificial.

Parte 5: Listado de todos los archivos que se incluirán en el RPM

La última sección del archivo de especificaciones es la sección de archivos, %files. Aquí es donde le decimos a RPM qué archivos incluir en el archivo que crea a partir de este archivo de especificaciones. La sección del archivo fpaste es bastante simple:

                      %files
%{_bindir}/%{name}
%doc README.rst TODO
%{_mandir}/man1/%{name}.1.gz
%license COPYING
                    

Observe cómo, aquí, no especificamos buildroot. Todos estos caminos son relativos a él. Los comandos %doc y %license simplemente hacen un poco más: crean las carpetas requeridas y recuerdan que estos archivos deben ir allí.

RPM es bastante inteligente. Si instaló archivos en la sección %install, pero no los enumeró, le dirá esto, por example.

Parte 6: documente todos los cambios en el registro de cambios

Fedora es un proyecto basado en la comunidad. Muchos contribuyentes mantienen y comantienen paquetes. Por lo tanto, es imperativo que no haya confusión sobre qué cambios se han realizado en un paquete. Para asegurar esto, el archivo de especificaciones contiene la última sección, el Registro de cambios, %registro de cambios:

                      %changelog
* Thu Jul 25 2019 Fedora Release Engineering  - 0.3.9.2-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
 
* Thu Jan 31 2019 Fedora Release Engineering  - 0.3.9.2-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
 
* Tue Jul 24 2018 Ankur Sinha  - 0.3.9.2-1
- Update to 0.3.9.2
 
* Fri Jul 13 2018 Fedora Release Engineering  - 0.3.9.1-4
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
 
* Wed Feb 07 2018 Fedora Release Engineering  - 0.3.9.1-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
 
* Sun Sep 10 2017 Vasiliy N. Glazov  - 0.3.9.1-2
- Cleanup spec
 
* Fri Sep 08 2017 Ankur Sinha  - 0.3.9.1-1
- Update to latest release
- fixes rhbz 1489605
...
....

                    

Debe haber una entrada de registro de cambios para cada cambio en el archivo de especificaciones. Como puede ver aquí, aunque he actualizado la especificación como mantenedor, otros también lo han hecho. Tener los cambios documentados claramente ayuda a todos a saber cuál es el estado actual de la especificación. Para todos los paquetes instalados en su sistema, puede usar rpm para ver sus registros de cambios:

                      $ rpm -q --changelog fpaste
                    

Construyendo el RPM

Ahora estamos listos para construir el RPM. Si desea seguir y ejecutar los comandos a continuación, asegúrese de haber seguido los pasos de la publicación anterior para configurar su sistema para crear RPM.

Colocamos el archivo de especificaciones de fpaste en ~/rpmbuild/SPECS, el archivo de código fuente en ~/rpmbuild/SOURCES/ y ahora podemos crear el RPM fuente:

                      $ 
                      
                        cd ~/rpmbuild/SPECS
                      
                      
$ 
                      
                        wget https://src.fedoraproject.org/rpms/fpaste/raw/master/f/fpaste.spec
                      
                      

$ 
                      
                        cd ~/rpmbuild/SOURCES
                      
                      
$ 
                      
                        wget https://pagure.io/fpaste/archive/0.3.9.2/fpaste-0.3.9.2.tar.gz
                      
                      

$ 
                      
                        cd ~/rpmbuild/SPECS
                      
                      
$ 
                      
                        rpmbuild -bs fpaste.spec
                      
                      
Wrote: /home/asinha/rpmbuild/SRPMS/fpaste-0.3.9.2-3.fc30.src.rpm
                    

Echemos un vistazo a los resultados:

                      $ 
                      
                        ls ~/rpmbuild/SRPMS/fpaste*
                      
                      
/home/asinha/rpmbuild/SRPMS/fpaste-0.3.9.2-3.fc30.src.rpm

$ 
                      
                        rpm -qpl ~/rpmbuild/SRPMS/fpaste-0.3.9.2-3.fc30.src.rpm
                      
                      
fpaste-0.3.9.2.tar.gz
fpaste.spec
                    

Ahí estamos: se ha construido la fuente rpm. Construyamos juntos tanto la fuente como el binario rpm:

                      $ cd ~/rpmbuild/SPECS
$ rpmbuild -ba fpaste.spec
..
..
..
                    

RPM le mostrará el resultado completo de la compilación, con detalles sobre lo que está haciendo en cada sección que vimos antes. Este “registro de compilación” es extremadamente importante. Cuando las compilaciones no salen como se esperaba, los empaquetadores dedicamos mucho tiempo a revisarlas, rastreando la ruta de compilación completa para ver qué salió mal.

¡Eso es realmente! Sus RPM listos para instalar están donde deberían estar:

                      $ 
                      
                        ls ~/rpmbuild/RPMS/noarch/
                      
                      
fpaste-0.3.9.2-3.fc30.noarch.rpm
                    

Resumen

Hemos cubierto los conceptos básicos de cómo se crean los RPM a partir de un archivo de especificaciones. Este no es un documento exhaustivo. De hecho, no es documentación en absoluto, realmente. Solo trata de explicar cómo funcionan las cosas debajo del capó. He aquí un breve resumen:

  • Los RPM son de dos tipos: fuente y binario.
  • Los RPM binarios contienen los archivos que se instalarán para usar el software.
  • Los RPM de origen contienen la información necesaria para crear los RPM binarios: el código fuente completo y las instrucciones sobre cómo crear el RPM en el archivo de especificaciones.
  • El archivo de especificaciones tiene varias secciones, cada una con su propio propósito.

Aquí, hemos construido RPMs localmente, en nuestro Fedora instalaciones. Si bien este es el proceso básico, los RPM que obtenemos de los repositorios se crean en servidores dedicados con configuraciones y métodos estrictos para garantizar la corrección y la seguridad. Esta Fedora La tubería de empaque será discutida en una publicación futura.

¿Le gustaría empezar a crear paquetes y ayudar al Fedora comunidad mantener la enorme cantidad de software que proporcionamos? Puede comience aquí uniéndose a los mantenedores de la colección de paquetes .

Para cualquier consulta, publique en el Fedora lista de correo de desarrolladores — ¡siempre estamos felices de ayudar!

Referencias

Aquí hay algunas referencias útiles para construir RPM:

Related Posts