sábado, 2 de enero de 2016

Cómo crear paquetes RPM

    Un día tuve que instalar una versión de un software para el cual no existía un .rpm para mi distribución (Fedora), pude encontrar el código fuente de la actualización pero no quería instalarlo siguiendo los clásicos ./configure, make y make install ya que si lo hacía así no iba a ser fácil desinstalarlo y volver a dejar mi sistema operativo como estaba.

    Y es que precisamente para eso están los manejadores de paquetes, con ellos no tenemos que preocuparnos por las dependencias de nuestros paquetes, ni tenemos que saber qué archivos el paquete instaló en nuestro equipo para después borrarlos, etc. Todo esto lo hace el manejador de paquetes automáticamente. El manejador de paquetes por lo general utiliza una base de datos que mantiene toda la información de los paquetes instalados, sus dependencias, etc.

    Cada vez que se necesita remover un paquete, por ejemplo, el manejador de paquetes sabe qué archivos este paquete instaló y los puede borrar. También sabe si este paquete depende de otros o si otros dependen de él.

    El tema de este artículo es cómo crear un paquete a partir del código fuente de un software que deseamos instalar para poder aprovechar las ventajas del manejador de paquetes de Red Hat (RPM), el mismo que se utiliza en Fedora, Centos y Suse.

    Lo primero que hice fue descargar una versión anterior del paquete con el código fuente del programa que deseaba actualizar. Para esto simplemente utilicé el siguiente comando:

dnf download --source telepathy-gabble-0.18.2

    Este comando habilita los repositorios que contienen el código fuente de los programas y descarga el paquete telepathy-gabble-0.18.2-5.fc23.src.rpm en el directorio en el que nos encontramos actualmente.

    En CentOS o Red Hat todavía se utiliza yum, por lo que el comando para descargar el paquete en esas distribuciones sería:

yum  download --source telepathy-gabble-0.18.2

    Los paquetes src.rpm son paquetes de código fuente y traen todo lo necesario para construir un paquete rpm con la aplicación compilada y toda la metadata, o sea que a partir de un src.rpm podemos construir un paquete rpm "normal" o un paquete que solamente contiene los binarios y toda la información necesaria para actualizar la base de datos del manejador de paquetes.

    Es por ello que al instalar un paquete src.rpm no se instala la aplicación propiamente, sino que al instalarlo éste genera una serie de directorios con el código fuente de la aplicación, los patches, y el .spec que es un archivo que rpmbuild utiliza para saber cómo contruir el paquete. O sea, todo lo necesario para crear un rpm.

    En Fedora para instalar el src.rpm se utilizan los mismos comandos que para instalar un paquete binario

rpm -i  telepathy-gabble-0.18.2-5.fc23.src.rpm

   Eso me crea un directorio en mi home llamado rpmbuild con los siguientes directorios:



    Es importante señalar que tanto para instalar el src.rpm como para construir el binario no hace falta ser root ya que estamos trabajando en el directorio del usuario normal y no estamos instalando la aplicación, simplemente estamos creando un nuevo rpm. También la localización y el nombre del directorio rpmbuild pueden variar en otras distribuciones.

    En esta captura de pantalla se puede observar que tengo varios paquetes tar.gz que contienen el código fuente de la aplicación, así como varios patches. Naturalmente la última versión del código fuente (0.18.3) la agregué yo para poder construir la nueva versión del rpm.  El código fuente lo bajé desde http://telepathy.freedesktop.org/releases/telepathy-gabble/telepathy-gabble-0.18.3.tar.gz

    Así las cosas, sólo quedaba modificar el correspondiente .spec con las instrucciones para compilar y construir el paquete rpm:

%if 0%{?rhel}
%global run_tests 0
%else
%global run_tests 1
%endif

Name:           telepathy-gabble
Version:        0.18.2
Release:        5%{?dist}
Summary:        A Jabber/XMPP connection manager

Group:          Applications/Communications
License:        LGPLv2+
URL:            http://telepathy.freedesktop.org/wiki/
Source0:        http://telepathy.freedesktop.org/releases/%{name}/%{name}-%{version}.tar.gz
Patch1:         telepathy-gabble-0.18.0-build.patch
Patch2:         0001-xmpp-console-Explicitly-state-python-in-the-shebang.patch

BuildRequires:  dbus-devel >= 1.1.0
BuildRequires:  dbus-glib-devel >= 0.82
BuildRequires:  telepathy-glib-devel >= 0.19.9
BuildRequires:  glib2-devel >= 2.32
BuildRequires:  gnutls-devel >= 2.12.0
BuildRequires:  sqlite-devel
BuildRequires:  libuuid-devel
BuildRequires:  libsoup-devel
BuildRequires:  libnice-devel >= 0.0.11
BuildRequires:  cyrus-sasl-devel
BuildRequires:  libxslt
%if %{run_tests}
# Build Requires needed for tests.
BuildRequires:  python
BuildRequires:  python-twisted
BuildRequires:  dbus-python
BuildRequires:  pygobject2
%endif

Requires:       telepathy-mission-control >= 5.5.0
Requires:       telepathy-filesystem

# Removed in F17
Obsoletes:      telepathy-butterfly < 0.5.15-5


%description
A Jabber/XMPP connection manager, that handles single and multi-user
chats and voice calls.


%prep
%setup -q
%patch1 -p 1 -b .build
%patch2 -p 1 -b .shebang


%if %{run_tests}
%check
#make check
%endif


%build
%configure --enable-static=no
make %{?_smp_mflags}


%install
make install DESTDIR=$RPM_BUILD_ROOT
find $RPM_BUILD_ROOT -name '*.la' -exec rm -f {} ';'

## Don't package html doc to incorrect doc directory
rm -f $RPM_BUILD_ROOT%{_docdir}/%{name}/*.html


%post -p /sbin/ldconfig


%postun -p /sbin/ldconfig


%files
%doc COPYING AUTHORS
%doc docs/*.html
%{_bindir}/%{name}-xmpp-console
%{_libexecdir}/%{name}
%{_datadir}/dbus-1/services/*.service
%{_datadir}/telepathy/managers/*.manager
%{_mandir}/man8/%{name}.8.gz
## If more connection managers make use of libdir/telepathy this
## be moved to the tp-filesystem spec file.
%dir %{_libdir}/telepathy
%dir %{_libdir}/telepathy/gabble-0
%dir %{_libdir}/telepathy/gabble-0/lib
%dir %{_libdir}/telepathy/gabble-0/plugins
%{_libdir}/telepathy/gabble-0/lib/libgabble-plugins-*.so
%{_libdir}/telepathy/gabble-0/lib/libgabble-plugins.so
%{_libdir}/telepathy/gabble-0/lib/libwocky-telepathy-gabble-*.so
%{_libdir}/telepathy/gabble-0/lib/libwocky.so
%{_libdir}/telepathy/gabble-0/plugins/libconsole.so
%{_libdir}/telepathy/gabble-0/plugins/libgateways.so


%changelog
* Fri Jun 19 2015 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 0.18.2-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild

* Wed Feb 18 2015 Slavek Kabrda <bkabrda@redhat.com> - 0.18.2-4

....

    Aquí simplemente cambié la versión a 0.18.3, el Release (la versión del rpm) a 1 y eliminé las líneas que aplicaban los patches a la versión anterior. La sección files le indica al manejador de paquetes dónde debe de instalar los archivos. Es importante leer el código fuente del programa para verificar que no haya nuevas dependencias que debamos incluir, generalmente podemos encontrar un README o un INSTALL con información importante.

    Una vez hecho todo lo anterior, sólamente quedaba crear el paquete rpm utilizando para ello el comando rpmbuild -bb ~/rpmbuild/SPECS/telepathy-gabble.spec este comando compilará las fuentes y creará un nuevo paquete en el directorio /RPMS/x86_64 (arquitectura de mi equipo) llamado en este caso telepathy-gabble-0.18.3-1.fc23.x86_64.rpm listo para ser instalado.

    Espero que esta información les sea útil y les dejo el link de la documentación oficial, que aunque está un poco desactualizada puede servir de guía.

https://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/pdf/RPM_Guide/Fedora_Draft_Documentation-0.1-RPM_Guide-en-US.pdf

Saludos

No hay comentarios:

Publicar un comentario