Creating a Compressed Extension from Source-es

From DSL Wiki

   [Volver a la Pagina principal]  [In other languajes: english]

Contents

Introducción

Antes de comenzar, consideremos algunos motivos por los que podríamos optar por una extensión *.tar.gz (o 'verde') en vez de la manera estándar *.dsl. Para empezar, está el asunto del uso de la memoria. La instalación de una extensión *.dsl provoca la ejecución del script 'mkwriteable', que copia una gran parte del sistema de archivos al disco RAM para permitir la escritura de esos archivos. Esto, por supuesto emplea más RAM. Abrir archivos adicionales abre también el sistema a posibles daños. Cuando se puede sobreescribir un programa o librería, posiblemente pueda causar problemas. Una extensión *.tar.gz no ejecuta mkwriteable, de modo que las librerías base del sistema no se pueden modificar. Estas extensiones solo deberían escribir en /opt, /tmp, y /home (/etc es accesible, pero no se recomienda por falta de espacio RAM).

Por otra parte, existen motivos para no elegir este método. Muchos programas están construídos de tal modo que tienen que modificar ciertos archivos o escribir en determinados directorios que no están abiertos a *.tar.gz. O quizá no necesiten instalarse en esos directorios, pero requieran algunos cambios en esos archivos para ejecutarse correctamente. También está el hecho de que mucha gente no sabe o símplemente no quiere tener que compilar código fuente, o puede que no tengan las herramientas para hacerlo. Puede ser más fácil recolectar los archivos instalados mediante un sistema de paquetes y ponerlos en los mismos sitios en el paquete myDSL.

Construír una extensión verde puede a veces ser tan simple como empaquetar un binario pre-compilado con el usuario apropriado. Sin embargo, más frecuentemente suele resultar algo más difícil. Como los programas pre-compilados generalmente buscan sus archivos de apoyo en los directorios en los que se instalaron (/usr/share, /usr/lib, etc.), a veces es mejor empezar desde los fuentes y compilarlos especificamente para ejecutarse en /opt. Este procedimiento permite también efectuar al programa ajustes para DSL que podrían no ser tán simples tras la compilación de la aplicación.

He aquí un metodo...Construyendo desde los fuentes. Este documento presume que el programa puede instalarse mediante el uso del método típico "configure; make; make install". Existen otras maneras de instalar programas desde los fuentes, y llevaría todo un libro explicarlos todos. En la actualidad la mayoría de las aplicaciones Linux emplean este método. Otra asunción es que tienes acceso a un ordenador que tiene un entorno de desarrollo adecuado para compilar aplicaciones Linux.

Como ejemplo, vamos a construir una extensión verde desde las fuentes de ImageMagick.

Lee la Documentación

El primer paso es un poco de lectura. Toma el archivo fuente de tu programa (imagemagick.org), extrae el archivo, y asegúrate de leer el archivo README y los archivos que tratan las licencias y el copyright. Los programas Linux no son todos libres y no siempre puedes redistribuir el paquete. Los programas GPL son una apuesta bastante segura que puedes modificar y distribuir. Lo siguiente a leer es el archivo INSTALL, que a veces contiene solo texto genérico, pero a menudo te da alguna información útil respecto a los detalles específicos del procedimiento de instalación, y finalmente, justo antes de ponerte a trabajar, ejecuta el script configure (si lo hay) con la opción '--help'. Esto listará todas las opciones que le puedes pasar para configurar de modo que quizá no tengas que volver atrás y modificar los archivos Make a mano. Quizá quieras redireccionar la salida de este comando a un archivo para tenerlo a la vista mientras pruebas varias opciones de configuración: "./configure --help > conf-help.txt". Como con cualquier otra cosa, cuanto más compiles más cómodo te sentirás con ello, y mejor entenderás lo que puedes hacer para construir una extensión mejor. Una opción de configuracion que casi siempre estará en una extension verde es '--prefix=', que establece la localización de la instalación de la aplicación.


Configura

Una vez terminada tu investigación, ya puedes ejecutar configure. En el directorio que contiene este script, ejecuta "./configure --prefix=/opt/imagemagick" y debería empezar comprobando que están los componentes necesarios en tu sistema. Si escupe un error acerca de que no tienes compilador, es que no tienes el entorno de desarrollo necesario para compilar aplicaciones. Por desgracia este how-to no está equipado para explicar todos los pasos necesarios para montar un sistema de desarrollo funcional.

Suponiendo que tienes instalado al menos un sistema de desarrollo básico, el script probablemente te de información acerca de tu sistema y o termine bien o tosa un error indicándote lo que te falta. Si has ejecutado con éxito configure, el script habrá creado los archivos make que make emplea para compilar el programa. Si obtienes errors acerca de un componente que crees que no es vital para el programa, podrías probar deshabilitando ese componente y volviendo a ejecutar configure. La opción '--help' de configure debería decirte que funcionalidades se pueden desactivar de este modo (por ejemplo: ./configure --prefix=/opt/imagemagick --disable-x). De otro modo, quizá necesites instalar algunos archivos de apoyo. De nuevo, esto cae fuera del alcance de este documento, y de verdad debieras considerar aprender algo más acerca de la compilacion de software en Linux.

NOTA: Un conocimiento útil que recientemente (por fin) he logrado comprender es el empleo de variables al configurar la construccion (build). Por ejemplo, , he estado incluyendo libpng.so.3 con algunos de mis paquetes DSL porque no podía lograr que los programas compilaran contra versiones anteriores para compatabilizarlos con la libpng de DSL. Finalmente he instalado libpng 1.0.12 en el /opt de mi sistema de desarrollo, y ahora cuando compilo para DSL empleo el comando

   CPPFLAGS=-I/opt/png-1.0.12/include LDFLAGS=-L/opt/png-1.0.12/lib ./configure --blah --blah

y entonces emplea la version 1.0.12 de libpng en vez de la que generalmente encuentra primero en mi sistema de desarrollo.

Compila

Bueno, digamos que configure fué bien. Ahora puedes hacer 'make', y si funciona, puedes hacer 'make install' como root, instalando la aplicación en /opt/imagemagick. Si compilaste con éxito este programa dentro de un sistema DSL, probablemente puedas ejecutarlo sin problemas. Pero si la aplicación se construyó en otro sistema, quizá tengas por delante una labor de pruebas seria. Si es éste el caso, copia el directorio /opt/imagemagick a DSL y mira primaro si DSL tiene los archivos de soporte necesarios para ejecutar la aplicación. Puedes hacer esto tecleando "ldd /opt/imagemagick/bin/display". Esto listará las librerías requeridas por el programa y te dirá si se encuentran en DSL. Si ves algún mensaje de "not found" refiriéndose a librerías que se instalaron en el directorio lib del programa, quizá necesites decirle a ldd que existen:

   LD_LIBRARY_PATH=/opt/imagemagick/lib ldd /opt/imagemagick/bin/display

El programa ldd debería al menos encontrar cualquier librería que se instalara con el programa. Si ves más mensajes "not found", necesitarás encontrar esas librerías que faltan y copiarlas a DSL. El lugar más cómodo para ponerlas sería el mismo directorio lib, junto con las librerías pripias del programa. Si el programa no tiene librerías propias, puedes crearte un directorio /opt/imagemagick/lib y colocar las librerías adicionales ahí. Con toda probabilidad necesitarás establecer el LD_LIBRARY_PATH en tiempo de ejecución para decirle al programa donde encontrar las librerías. Afortunadamente Imagemagick construye y enlaza (linka) sus propias librerías, así que cualquier librería adicional se puede dejar en este directorio sin necesidad de cambiar el LD_LIBRARY_PATH. En el caso de ImageMagick hay varias librerías requiridas que no son parte del sistema base de DSL, de modo que habrá que copiarlas desde tu sistema de desarrollo a /opt/imagemagick/lib.

Es posible que tu programa requisra una gran cantidad de librerías, o librerías enormes. En este caso quizá quieras reconsiderar si es una buena idea aplicar una cura de adelgazamiento. Piensa qué es realmente necesario en un sistema "Damn Small" y qué es susceptible de ser considerado mero lastre. Si algunas de esas libresías no son terriblemente importantes y se pueden desactivar mediante el script de configuración, quizá no sea mala idea volver atrás y recompilar la aplicación sin esas librerías.


Prueba la Aplicación

Cuando tengas todas las librerías necesarias copiadas en un directorio en DSL donde puedan ser encontradas estarás listo para probar el propio programa en sí. Estas pruebas debieran ejecutarse en un sistema DSL sin modificar, como uno arrancado desde liveCD sin restaurar configuraciones ni software adicional instalado. Desde una ventana de terminal (para poder ver la salida del programa), teclea el comando para llamar al programa incluyendo la ruta, ya que /opt/imagemagick/bin no está en el $PATH de DSL. ¿Algún mensaje de error? Con suerte, no. En tal caso, prueba el comando LD_LIBRARY_PATH mencionado en la última sección para ver que falta en DSL. Si tienes todas las librerías necesarias en su sitio, tu programa se cargará. Si no, es que tienes problemas más allá del alcance de este documento y quizá quieras considerar la opción de buscar ayuda en damnsmalllinux.org o el canal IRC #damnsmalllinux de freenode.

Si la aplicación carga sin problemas, la cosa pinta bien. No obstante no supongas que esto implica que todo está ya listo. Siempre está la posibilidad de que tu programa llame a otro que no sea necesario durante su arraque. Siempre es buena idea probar a conciencia las funcionalidades de tu aplicación antes de suponer que está completa. Abre algunos archivos, graba otros, edita archivos desde tu programa si eso es lo que el programa hace. Cualquiera que sea la utilidad del programa, debería ser probada con tantas funciones come sea posible.

Deacuerdo al espírutu de mantenerlo pequeño, quizá quieras considerar la posibilidad de desnudar tus archivo(s) binarios(s), si tienes a mano el programa para hacerlo. Esto eliminará los comentarios y objetos de debugging del programa, reduciendo su tamaño. Después de hacer esto deberías probar más, por si acaso algo hubiese ido mal.


Construye la Estructura de Archivos

¿Ya funciona tu programa? Bien. Ahora podemos empaquetarlo como una extensión DSL.

Primero decidimos si incluir un icono o no. Si el programa es una aplicación de consola no interactiva no hay mucho motivo para tener un icono. Muchas veces, sin embargo, será un programa interactivo que se lance desde el escritorio. En última instancia se reduce a si quieres molestarte o no en añadir el icono, y si dispones de una imagen adecuada para él. Supongamos que quieres un icono. El archivo del icono tiene que ser de un formato legible por xtdesk (se pueden emplear png, gif, jpg, y xpm...probablemente algún otro formato también), y lo más cómodo es ponerlo en el directorio /home/dsl/.xtdesktop. El otro archivo necesario is el *.lnk que usa Xtdesk para posicionar y nombrar al icono en el escritorio. El archivo lnk is un mero archivo de texto plano con una extensión lnk (nombre.lnk). El formato del archivo es el siguiente:

        table Icon
        Type: Program
        Caption: ImageMagick (el nombre que aparecerá junto al icono)
        Command: /opt/imagemagick/bin/display (comando para llamar al programa, en este caso es el frontend de imagemagick)
        Icon: /home/dsl/.xtdesktop/imagemagick.xpm (ruta al archivo del icono)
        X: 420 (X position)
        Y: 384 (Y position)
        end

Hay otras opciones disponibles para el archivo pero esto es adecuado para un lanzador de programas. Si necesitas apuntar la aplicación a alguna librería en tiempo de ejecución puedes añadir la ruta a la linea 'Command':

   LD_LIBRARY_PATH=/opt/iamgemagick/lib /opt/imagemagick/bin/display

Esto establece la variable LD_LIBRARY_PATH especificamente para esta aplicación. Otra opción es crear un envoltorio (wrapper), como se ha comentado antes. El envoltorio simplemente contiene un comando o dos para establecer en entorno, después de lo cual llama al programa real. Recuerda, ImageMagick tiene sus propias librerías enlazadas, así que en esta ocasión no debe ser necesario.

A continuación, necesitamos copiar todos los archivos instalados en una estructura de archivos con la que crear un tarball. Como la aplicación se instaló entira en un unico directorio (+ archivos en $HOME donde proceda) no hay necesidad alguna de rebuscar los archivos. Hazte root y create un directorio donde no estorbe, en $HOME por ejemplo. Supongamos que el directorio de trabajo se llamará '/home/dsl/work'.

        sudo su
        mkdir -p /home/dsl/work/opt # la parte de opt es solo para ahorrar un paso más adelante.
        cd /home/dsl/work/

Importante

Presta atención a las rutas que empleas. Todo lo que se hace a partir de esre punto de hace dentro de /home/dsl/work/. NO es lo mismo efectuar un comando sobre './opt' u 'opt' que realizarlo sobre '/opt'. '/opt' es un directorio del sistema, y 'opt' u './opt' es el directorio opt de dentro de /home/dsl/work.

Si tienes archivos que vayan en /home/dsl necesitarás crear este directorio también:

        mkdir -p ./home/dsl/.xtdesktop # por supuesto xtdesktop es para tu icono, si tienes.

Ahora copia los archivos instalados.

        cp -Pr /opt/imagemagick ./opt/
        cp -Pr /home/dsl/loquesea ./home/dsl/ #solo si hay otros archivos necesarios en /home/dsl

Si quieres un elemento en el menú, hay que ponerlo en tmp/mydsl.menu/. La decisión de crear un elemento del menú es análoga a la decisión de usar un icono. Si la aplicación no es interactiva y generalmente requiere varias opciones en la línea de comandos, un elemento de menú probablemente no resulte útil. De nuevo, supongamos que se usará un elemento de menú:

        mkdir -p tmp/mydsl.menu
        touch tmp/mydsl.menu/imagemagick

tmp/mydsl.menu/imagemagick es el nombre de tu elemento de menú que usa mydsl-load. Aunque en el momento de escribir esto el elemento de menú en una extensión tar.gz no necesita tener el mismo nombre que el paquete, se recomienda simplemente para ser consistente con las extensiones UCI (y porque las cosas podrían cambiar en un futuro y requerirlo). Los contenidos de un elemento de menú son identicos a las líneas del archivo menu de fluxbox:

        [ejec] (nombre) {comando}

Nota: las extensiones .dsl tienen que tener el mismo nombre que su correspondiente elemento de menú para que éste séa válido.

Si necesitas especificar la ruta a una librería, se puede hacer del mismo mode que en el archivo del icono. Podría haber problemas si el nombre del elemento de menú lo emplean también otras extensiones. Entonces habría dos elementos en la misma línea y solo la primera se mostraría. Esto se puede evitar añadiendo un salto de línea después de la línea del menú en tmp/mydsl.menu/imagemagick

Suponiendo que todos los archivos se copian en su lugar corecto en la estructura de directorios, es el momento de comprobar los dueños de los archivos. Como root creó un directorio home/dsl, sabemos que como mínimo éste necesita ser transferido con chown al usuario dsl. Una manera rápida de hacer esto es simplemente dar posesión a root de todo y luego cambiar la posesión a los pocos archivos que deben ser del usuario dsl.

  • /opt y todo su contenido pertenece a root.root (0.0)
  • /home pertenece a root.root (0.0)
  • /home/dsl y todo su contenido pertenece a dsl.staff (1001.50)
  • /var y todo su contenido, excepto el propio archivo del menu, es root.root (0.0)

Esto debiera dar los propietarios correctos a todos los archivos

        chown -R 0.0 ./{opt/,tmp/}
        chown -R 1001.50 ./home/dsl/
        chown 1001.50 ./tmp/mydsl.menu/loquesea

En este ejemplo empleamos la asignación numérica por si el sistema en el que se esté construyendo la extensión no no tenga el usuario 'dsl' y el grupo 'staff'.

Crea la Lista de Archivos

A continuación necesitamos crear una lista de archivos con todo lo que irá en el paquete.

        find . > lista.txt

Esto emplea el comando find para crear una lista de todo lo que hay en el directorio actual y debajo de él. Ahora tenemos que editarla para eliminar algunas líneas que sobran por innecesarias o porque podrían provocar problemas con las pertenencias. Abre lista.txt en un editor de texto y empieza a borrar líneas sobrantes. Dependiendo de cuantos archivos haya, este método puede ser un proceso tedioso El archivo tendrá una pinta como ésta (los numeros se añaden solo para referenciar):

       1 .
       2 ./lista.txt
       3 ./home
       4 ./home/dsl
       5 ./home/dsl/.xtdesktop
       6 ./home/dsl/.xtdesktop/imagemagick.xpm
       7 ./home/dsl/.xtdesktop/imagemagick.lnk
       8 ./tmp
       9 ./tmp/mydsl.menu
       10 ./tmp/mydsl.menu/imagemagick
       11 ./opt
       12 ./opt/imagemagick
       13 ./opt/imagemagick/bin
       14 ./opt/imagemagick/bin/display
       15 ./opt/imagemagick/man
       16 ./opt/imagemagick/man/man1
       17 ./opt/imagemagick/man/man1/display.1

1. Hay que eliminar esto a toda costa. La instalación se ejecutará desde el directorio raíz, que ya existe. No quieres sobreescribir este directorio, en especial si cometirte un error con los permisos. Borra esta línea.

2. Este es el archivo de la lista...no se le necesita dentro del paquete. Borrar.

3-5. Lo mismo que 1 - cualquier directorio que ya exista no se necesita.

6&7. Estos quieres conservarlos.

8. Lo mismo que 1

9. Este se creará automaticamente con 10, así que no es necesario

10. Conserva éste

11-13. Borrar

14. Mantener

15-17. Borrar. Las páginas Man se pueden encontrar en cientos de sitios online.

(Nota: Debes borrar toda línea en blanco porque hacen que tar produzca mensajes de error confusos.)


El juego consiste en mantener tu extensión endemoniadamente pequeña ("damn small"). Lo mismo se puede aplicar a documentos de ayuda, includes, y cualquier otra cosa que no sea vital para ejecutar el programa. Probar la aplicación sin ciertas partes disponibles ayudará a determinar qué no es tán esencial.

Así que en éste caso terminarás con 4 líneas: 6,7,10, y 14. Por sipuesto, esto es solo un ejempo símple y no está completo ni para el paquete imagemagick, pero el método se puede aplicar a listas más largas.

Modo Alternativo de Crear la Lista de Archivos

Si tu programa contiene muchos archivos y directorios, eliminar los que sobran es tedioso. Una forma más fácil es hacer:

        find . ! -type d > lista.txt

Esto añade a lista.txt solo cosas que no séan directorios (el ! niega). No obstante sigues teniendo que ir a lista.txt a comprobarlo y a eliminar el propio 'lista.txt'.

Ten en cuenta que este método añadirá (correctamente) archivos y enlaces simbólicos a la lista. También añadirá cosa raras como sockets o FIFOs, en el improbable caso de que los haya. Pero los directorios vacíos no se incluirán, así que si los necesitas tendrás que añadirlos a mano.

Crea el Paquete

       tar cvf imagemagick.tar --no-recursion --numeric-owner -T lista.txt
       gzip -9 imagemagick.tar

Ahora estas listo para probar el producto final. Con suerte se instalará correctamente con el sistema MyDSL, incluyendo los elementos de menú e iconos que hayas usado. Si no se ejecuta bien, o si los programas dejan de funcionar después de la instalación, es probable que el problema venga de los permisos de los archivos del paquete. Tendrás que volver atrás un par de pasos y comprobar cuidadosamente tus archivos.

Si es una extensión para el repositorio oficial DSL, asegúrate de crear un archivo info (echa un vistazo a otros para tener una referencia) y un md5sum:

       md5sum imagemagick.tar.gz > imagemagick.tar.gz.md5.txt