viernes, 22 de agosto de 2014

Aprende a crear tu primer rpm - Parte I-



La creación de un rpm puede ser sencillo, si usted tiene la voluntad de aprender. Para crear un rpm no hay nada mas que tener una distribución basada en Redhat, en este caso nos enfocaremos en Fedora.

Preparando el entorno de construcción

Paso 1

Necesitamos instalar toda aquella dependencia para creación de rpm


yum install @development-tools
yum install fedora-packager


Paso 2

Creamos un nuevo usuario, es recomendable ya que por cualquier error que cometamos, solo será en ese usuario y no nuestro usuario habitual. Al terminar le pedira una contraseña, apuntela en un lugar seguro a manera de  que usted no la olvide.


/usr/sbin/useradd makerpm
usermod -a -G mock makerpm
passwd makerpm


Paso 3
Reiniciamos la pc e ingresamos con el usuario "makerpm"


Paso 4
Creamos la estructura de un fakeroot, que le servira a rpmbuild en la construccion del rpm.



rpmdev-setuptree




Breve explicación de "rpmdev-setuptree"

Esto no es mas que directorios y subdirectorios de construcción.

Los directorios:

SPECS: Es el directorio donde usted debe poner el .spec. El spec es la parte mas importante, ya que podria decirse que es un script con las instrucciones de compilación e instalación de nuestro programa a empaquetar.

SOURCES: Es el directorio donde usted deberá poner el codigo fuente que por lo general sera un comprimido o ejecutable, en los formatos que existen; donde mas adelante rpmbuild extrae el comprido. Asi tambien aqui debe incluir todo parche y complemento que le servirá para compilar su programa, previo a su rpm, podria ser un icono...

BUILD: Es el directorio de construcción donde, el "SOURCE" es extraido para ser compilado.

BUILDROOT: Es el directorio que imita las rutas de instalacion, un fakeroot podria decirse.

RPMS: Es el directorio donde finalmente crea el rpm.


Creando nuestro primer rpm

No hay nada mejor que hacerlo con un ejemplo real no?
Para ello crearemos un rpm con "winetricks" que será sin arquitectura, eso quiere decir que podra instalarse tanto una pc de 32 bits como de 64. Un ejemplo ideal para aprender a crear un rpm de algun programa escrito en python, perl, script u otro.

Macros:
Los macros son rutas represantados como variables, que nos ayudan entrecortar rutas, nombres etc. Aqui puede encontrar algunos macros. Son los que habitualmente se utilizan. Sin embago usted puede ver una lista escribiendo:


less /usr/share/doc/rpm/macros


Creación del spec

Como mencionaba crearemos un .spec de winetricks, el cual  será creado con algún editor de texto, como gedit u otro de su elección... y guardaremos con el nombre de winetricks.spec.

.

.

Explicando el spec.

Summary: Usted debe incluir una pequeña descripcion del programa.

Name: Aqui debe escribir el nombre de programa sin espacios

Version: Aqui debe incluir la version del programa en empaquetar.

Release: Esta es la numeración de empaquetado, cada cambio que usted haga, debe cambiarlo con la siguiente numeración. Si es un nuevo paquete iniciara con 1, si despues usted encontro un error y encontro la solucion para aplicarlo al rpm seguira con la siguiente numeración "2", sucesivamente. En resumen es el número de veces que esta versión de software ha sido empaquetado.

%{?dist} es un macro que nombra la version de  Fedora.


BuildArch: Aqui ponemos la arquitectura, que generalmente puede ser  i686 o x86_64, en nuestro caso sera un noarch que corresponde a programas que se pueden ejecutar en cualquier arquitectura de computadora (ejemplo: los scripts escritos en bash, perl, python, etc)

License: Aqui usted debe escribir el tipo de licencia del programa.

Group: La etiqueta de grupo define un grupo de paquetes, que el paquete es una parte de. La etiqueta debe definir un grupo ya existente, por ejemplo, Applications/Engineering. Para ver una lista completa de los grupos existentes, ejecute el siguiente comando:


less /usr/share/doc/rpm/GROUPS


Source: Aquí incluimos la direccion directa al codigo fuente, o simplemente el nombre y extension del programa a empaquetar, que debe estar en el directorio SOURCES.

Source2: Como necesito un icono para el lanzador, lo ubico como Source2, y asi sucesivamente si quisiera incluirle mas cosas a mi rpm.

URL: Aqui usted debe escribir la direccion oficial del programa

Requires: Aqui usted debe incluir las dependencias para que el programa pueda ejecutarse.


%description
En esta etiqueta usted debe incluir la descripcion del programa.

%prep
Aqui incluimos toda modificación o preparación del codigo fuente, asi tambien todo parche.

%build
Esta parte es la mas complicada, porque en esta etiqueta %build escribimos las instrucciones para compilar, en nuestro caso no es necesario porque no hay nada para compilar, solamente el script de winetrick, por lo tanto la dejaremos vacia.

%install
En esta etiqueta es donde nuestro paquete es instalado en un entorno fakeroot simulando una instalacion real, en nuestro caso como es un script,  solamente debemos copiar a /usr/bin, pero como es un fakeroot la ruta debe ser $RPM_BUILD_ROOT%{_bindir}/%{name} que es igual a /home/makerpm/rpmbuild/BUILDROOT/usr/bin/


install -Dm 0755 %{SOURCE0} $RPM_BUILD_ROOT%{_bindir}/%{name}

No es nada menos que copiar mi codigo fuente a la ruta /usr/bin

En teoria lo siguiente es lo que hicimos con el comando "install"
cp %{SOURCE0} $RPM_BUILD_ROOT%{_bindir}/%{name}, el comando "install" facilita las cosas porque podemos darle automaticamente permisos de ejecucion.


#icons

Como nuestro rpm es solamente un script, y necesitamos crear un lanzador, es necesario crear las rutas destino del icono y el .desktop


NOTA

Según Filesystem Hierarchy Standard (FHS)

Los ejecutables ejecutables deben ir en la ruta /usr/bin

Los iconos deben ir en la ruta /usr/share/icons/ o usr/share/pixmaps

Lo accesos directos a /usr/share/applications/


Ahora crearemos ese directorio en nuestro fakeroot, porque no existe.

mkdir -p %{buildroot}%{_datadir}/icons/


Ahora copiamos la fuente (%{SOURCE2}) que corresponde al icono, a /usr/share/icons/, recuerde que estamos trabajando en un entorno fakeroot, por lo que el macro "%buildroot" debe ser lo primero antes de poner la ruta destino "%buildroot/%{_datadir}/icons/"


install -m 644 %{SOURCE2} %buildroot/%{_datadir}/icons/


Nuestro acceso directo
Para crear un .desktop existe un estandar, no lo explicaremos para no perdernos, pero, por lo general esta es la estructura que debe tener, debe recordar que en la etiqueta "Exec" debe icluir la ruta directa al ejecutable. Asi tambien la ruta al icono en la etiqueta "Icon".

Lo siguiente es un pequeño truco para evitarnos crear un .desktop a mano y tener que ponerlo como otro Source... como no existe la ruta a /usr/share/applications/ en nuestro fakeroot, lo creamos con el comando mkdir, anteponiendo siempre la ruta %{buildroot}, que es lo mismo /home/makerpm/rpmbuild/BUILDROOT/.


# menu-entry

mkdir -p %{buildroot}%{_datadir}/applications

cat %{buildroot}/%{_datadir}/applications/%{name}.desktop EOF
[Desktop Entry]
Name=Winetricks
GenericName=Winetricks
Comment=Winetricks is an easy way to work around problems in Wine.
Icon=/usr/share/icons/winetricks.png
Type=Application
Categories=Application;Game;
Exec=winetricks
StartupNotify=false
Terminal=false
EOF


%files

Llegamos a la parte importante, al spec debemos decirle las rutas de lo que estamos empaquetando. Por lo tando aqui si debemos incluir la ruta final del contenido del rpm. En este caso yo utilizo macros para entrecortar rutas de instalación.

%{_bindir}/%{name}
%{_datadir}/applications/%{name}.desktop
%{_datadir}/icons/%{name}.png


%changelog

La ultima parte, aqui debe incluir la fecha de creación del rpm, asi tambien su nombre y email, seguidamente por la versión, y todo cambio que usted haya realizado en su rpm.


Creación final del rpm

Antes de contruir su rpm, usted NO debe hacer lo siguiente como root, porque un error suyo podria crear problema en el sistema.

Como usted tiene su spec de winetricks en el directorio (winetricks.spec),  $HOME/makerpm/rpmbuild/SPECS haga un cambio de directorio con el comando "cd"


cd /home/makerpm/rpmbuild/SPECS

rpmlint winetricks.spec

rpmbuild -ba winetricks.spec


Si no hay ningun error

rpmbuild -ba winetricks.spec


Ahora usted tendra su rpm en /home/makerpm/rpmbuild/RPMS




Articulos relacionados: 
Crea paquetes rpm y deb desde cualquier distribución Linux!



Referencias:

http://www.rpm.org/max-rpm/

https://fedoraproject.org/wiki/How_to_create_an_RPM_package/es

http://rpmdev.proyectofedora.org/projects/rpmfed/wiki/C%C3%B3mo_crear_un_paquete_RPM
Reacciones:

1 comentario:

Si comentas te pedimos por favor respeto y críticas constructivas referentes al título del articulo. Cualquier comentario para desviar el tema, spam o trolleo no será permitido. Gracias por comentar.