06 mayo 2014

Cómo crear paquetes .tgz o .txz en Slackware

No sé si algunas vez se han preguntado como hacer un paquetes tgz. Para los que han usado Slackware. O cuando se baja algún programa pero no esta el tgz. Nos vemos obligados a bajar el source y compilarlo a pata. Que tampoco es la gran tragedia, pero es tedioso. Por eso les voy a explicar como crear paquetes tgz.
Para solo tener que compilar el programa una vez. Y poder usar el paquete indefinidamente(hasta que salga una nueva versión).
La ventaja de compilar paquetes desde el source es que te quedan a la medida. Le podes habilitar soporte para muchas opciones y de paso deshabilitar otra que no quieres que estén.



Todas las explicaciones son para la consola, que es mas versatil, al margen que ni siquiera busque una aplicacion grafica que haga esto

Paso 1
Descargar el source y descomprimirlo.


root@gostir:~$ mkdir temporario
root@gostir:~$ cd temporario
root@gostir:~$ wget ftp://descarga.paquete.tld/descarga/paquete.tar.gz

root@gostir:~$ tar -xzvf paquete.tar.gz

 o si es un .BZ2

root@gostir:~$ tar -xjvf paquete.tar.bz2

Ingresar a la carpeta descomprimida

root@gostir:~$ cd paquete

Crear un directorio, donde se guardara el source ya compilado. Este es el código que se instalara cuando instalemos el paquete. Para este ejemplo llamemos al directorio CONSTRD. (Puede ser cualquier nombre)

root@gostir:~$ mkdir CONSTRD

Paso 2
En este paso es cuando elegimos las opciones que le queremos dar a nuestro programa. Y las opciones que queremos activar del software. Por ejemplo Amarok (Reproductor de música muy famoso) trae por default soporte para manejar su base de datos en SQlite. Sin embargo compilando desde el source se puede dar soporte para que maneje su base de datos en MySql.


Variables de entorno para la compilación
Exporto las variables con los flags de optimización. En este caso pondré los que se usan en la mayoría de los paquetes oficiales de Slackware:

root@gostir:~$ export CHOST="i686-pc-linux-gnu"
root@gostir:~$ export CFLAGS="-O2 -march=i486 -mtune=i686"
root@gostir:~$ export CXXFLAGS="-O2 -march=i486 -mtune=i686"

El archivo configure puede tener millones de opciones. Y estas dependen de cada programa. Para mas información de las opciones, ejecutar:

root@gostir:~$ ./configure --help


Corro los scripts para preparar las fuentes:
root@gostir:~$ autogen.sh # si existe autogen.sh
root@gostir:~$ ./configure –prefix=/usr –sysconfdir=/etc –localstatedir=/var/lib –mandir=/usr/man

Es posible que alguno de los argumentos no exista, si esto es así basta con quitar el argumento para poder continuar:


Opciones básicas explicadas:

–prefix=/usr/local
Con esta opción le decimos a partir de cual directorio se va a instalar. En GNU/Linux /usr/local es el directorio donde por defecto o estándar, se instalan los programas que instale el usuario. Sin embargo también se pueden instalar en /usr o en /opt.

–sysconfdir=/etc

Esta opción es para especificarle donde quedarán los archivos de configuración. EN GNU/Linux los archivos de configuración son guardados en /etc.

–localstatedir=/var/lib

Esta opción especifica donde van a quedar las librerías del programa. Si no se especifica esta opción, se instalarán en /usr/local/lib. Si antes se añade esta opción: –prefix=/usr/local

Se pueden agregar todas las opciones que quieran. Al final quedará algo así:

root@gostir:~$ ./configure --sysconfdir=/etc --prefix=/usr/local --localstatedir=/var/lib (Mas opciones)*

Luego de ejecutar ./configure y que se verifique que se cumplen todas las dependencias. Se ejecuta make, para compilar el programa.

root@gostir:~$ make

Preparando el directorio de trabajo (para los binarios)

Creo un directorio de instalación, en este caso en /tmp/tgz.

root@gostir:~#su - 

a partir de aquí actuaremos como superusuario, noten como cambia el prompt de "root@gostir:~$"a "root@gostir:~#"

root@gostir:~# mkdir /tmp/tgz

Paso 3
Luego de esto hay que instalar el programa. Pero le vamos a especificar que se instale en nuestra carpeta CONSTRD (Con el path desde la raíz del file system). Instalo los binarios en la ruta creada en el paso anterior:

root@gostir:~# make install DESTDIR=/path/al/source/CONSTRD

Creo un directorio para documentación y otro para el fichero de descripción:

root@gostir:~# mkdir -p /path/al/source/CONSTRD/usr/doc/- /path/al/source/CONSTRD/install #donde - es el nombre y la versión

Copio la documentación al directorio creado para ese fin:

root@gostir:~# cp -R AUTHORS ChangeLog.pre-1-0 HACKING NEWS* README COPYING ChangeLog* INSTALL LICENSE TODO doc*


Paso 4
Luego de ejecutarlo y ver que no salga ningún error. Debemos crear un archivo de descripción. Para que sea usado por el comando para instalar paquetes tgz (installpkg). Hay que crear un directorio install dentro de la carpeta CONSTRD.

root@gostir:~# cd CONSTRD
root@gostir:~# mkdir install
root@gostir:~# cd install

Con cualquier editor crear un archivo llamado slack-desc, con 11 lineas comenzando con el nombre del programa y una descripción (Puede ser cualquier cosa). Cada linea en el fichero debe comenzar por el nombre del paquete, cuya primera letra debe ser minuscula. Si estas condiciones no se cumplen la descripción no será mostrada al instalar el tgz. Por convención se crean exactamente once lineas, aunque no es estrictamente necesario para el correcto despliegue del slack-desc. Esto es un ejemplo:

paquete:
paquete:
paquete:       Nombre del Paquete
paquete:            version XX
paquete:
paquete:       Creado por Vampii
paquete:
paquete: Paquete con soporte para viajar en el tiempo y entre dimensiones.
paquete:
paquete:
paquete:

Como veran hay un editor llamado slack-desc ideal para crear el archivo en cuestion.

Paso 5
Luego

root@gostir:~# cd ..

Preparación de los binarios para empaquetar

Depuro los ficheros a efectos de conseguir un paquete mas pequeño.

root@gostir:~# find -xtype f | xargs file | grep ELF | cut -f 1 -d : | xargs strip

Para que el paquete funcione, salvo raras excepciones, no es necesario cambiar los permisos de los ficheros que contiene, empero algunas veces estos retoques pueden ser por demás útiles. Para entender esto basta decir que en ocasiones un administrador puede querer que un determinado programa solo pueda ser ejecutado por el conjunto de usuarios pertenecientes a determinado grupo, para ello solo basta modificar el grupo principal en los ficheros del directorio de trabajo.
En este ejemplo hago que todos los ficheros y directorios pertenezcan a root.root (propietario/grupo), salvo los que se instalan en /usr/bin o /usr/sbin, que cambian a root.bin. Además coloco permisos 644 a los ficheros y 755 a los directorios.

root@gostir:~# find . -xtype f -exec chown root.root {} \;
root@gostir:~# find . -xtype d -exec chown root.root {} \;
root@gostir:~# chown -R root.bin ./usr/bin    #puede no existir
root@gostir:~# chown -R root.bin ./usr/sbin    #puede no existir
root@gostir:~# find . -xtype f -exec chmod 644 {} \;
root@gostir:~# find . -xtype d -exec chmod 755 {} \;

Construyo el paquete:
Asegurarse estar en la raíz del directorio CONSTRD y ejecutar:


root@gostir:~# makepkg -l y -c n /tmp/tgz/nombrePaquete-version-Arquitectura-1_Iniciales.txz

Con este creamos el paquete con el nombre que deseemos. Para el nombre de los paquetes se maneja el siguiente formato:

Donde "nombrePaquete" es el nombre del paquete, "version" es la version, "Arquitectura" la arquitectura para la que fue compilado e "Iniciales" es cualquier cosa que permita identificar el paquete, normalmente las iniciales del empaquetador. El "1" representa el número de “release”, muy útil para diferenciar varios paquetes creados a partir de las mismas fuentes. Adicionalmente se puede agregar alguna palabra significativa luego del nombre del paquete, para distinguirlo de alguna característica en especial que no posean los demás paquetes.

Limpiando directorio de trabajo

Borro todo lo que ya no voy a necesitar y copio el paquete a mi carpeta personal:

root@gostir:~# cd && rm -r /tmp/tgz /home/vampii/paquetes
exit


Eso es todo. Espero que les sea útil.

Nota:
Checkinstall también puede crear ficheros rpm o deb. No elegí el formato rpm, y muchisimo menos deb, porque las herramientas tgz necesitan tan sólo una consola con bash (por decir algo) para funcionar. Rpm necesita algunas librerías adicionales y es más complicado. Cuando tengas que recuperar un sistema dañado, por ejemplo, es más fácil que te funcionen las herramientas tgz que un sistema de paquetes basado en rpm.

Basado en:
http://www.slackwiki.com/Building_A_Package
http://www.slacky.eu/wikislack/index.php?title=Creare_pacchetti_tgz_per_Slackware
http://kompuhint.wordpress.com/2008/12/14/%C2%BFcomo-crear-paquetes-tgz-slackware/

No hay comentarios: