Compilar GIMP 2.9 usando Flatpak – Parte 1

Si has seguido el blog sabrás que hace poco compilamos la versión 2.9 de GIMP para Debian. En esta ocasión repetiremos ese proceso pero esta vez usando Flatpak. Flatpak es un sistema de distribución de aplicaciones para Linux que ofrece seguridad, al ejecutar programas usando una sandbox, y portabilidad, al permitir ejecutar un programa en cualquier distro de Linux que tenga Flatpak instalado. En cierta forma, Flatpak es similar a los contenedores LXC de los que ya hemos hablado pero ofrece mayor facilidad de uso para el usuario final.

En Debian 8.9 Flatpak solamente está disponible en el repositorio debian-backports en el paquete flatpak. En Debian 9 el paquete flatpak es parte del repositorio estable.

Flatpak funciona usando repositorios de software, listas de programas que han sido compilados para usarse con Flatpak y que se pueden instalar y ejecutar fácilmente. Flathub es uno repositorio de software para Flatpak. Para poder instalar el software disponible en Flathub, primero debemos agregar el repositorio de Flathub a la lista de repositorios de software para Flatpak; esto se puede hacer como un usuario normal, por lo que no es necesario usar sudo. Para instalar el repositorio de Flathub desde una cuenta norma de usuario, podemos usar el siguiente comando:

monstruosoft@monstruosoft-PC:~$ flatpak --user remote-list
monstruosoft@monstruosoft-PC:~$ flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo 
monstruosoft@monstruosoft-PC:~$ flatpak --user remote-list
flathub

Una vez instalado, podemos ver la lista de software disponible en el repositorio usando el comando:

monstruosoft@monstruosoft-PC:~$ flatpak --user remote-ls flathub 
ca._0ldsk00l.Nestopia                             
ca._0ldsk00l.Nestopia.Debug                       
ca._0ldsk00l.Nestopia.Sources                     
ca.desrt.dconf-editor                             
…
org.xiphos.Xiphos.Sources                         
ws.openarena.OpenArena                            
ws.openarena.OpenArena.Debug                      
ws.openarena.OpenArena.Sources

¡Rayos! Creo que debería haber escrito un post aparte sobre como usar e instalar software de Flatpak :D.

Lo que nos interesa en este post es GIMP pero podemos ver que GIMP no está disponible en el repositorio de Flathub. Por eso es que lo vamos a compilar. Si tenemos éxito, deberíamos poder distribuir nuestra versión de GIMP para Flatpak de manera que cualquiera que tenga Flatpak instalado la pueda ejecutar independientemente de la distro de Linux que tenga. ¿Recuerdan cuantas veces he mencionado lo difícil que es encontrar ejecutables en Linux? Flatpak ofrece una solución a ese problema.

Así que, ¿cómo compilamos GIMP para Flatpak? ¿podemos tomar el ejecutable que creamos en el post anterior donde compilamos GIMP y ponerlo en un paquete de Flatpak? Desafortunadamente no podemos usar el mismo ejecutable que creamos con anterioridad. Flatpak funciona usando runtimes, algo equivalente a un sistema Linux dentro de un contenedor LXC, con sus propias versiones de librerías de sistema, etc.. Para poder compilar GIMP para Flatpak debemos compilarlo usando las librerías disponibles dentro del runtime, tal como lo haríamos para compilar un programa dentro de un contenedor LXC. La única diferencia aquí es que al indicar a Flatpak qué versión de runtime usamos para compilar en programa, Flatpak sabrá qué runtime instalar en la PC del usuario final para que las librerías coincidan y el programa se ejecute sin problemas.

Existen dos tipos de runtimes, la plataforma de ejecución y el kit de desarrollo o SDK. La plataforma de ejecución contiene las librerías necesarias para ejecutar programas y el usuario final podrá instalar uno o varios de estos runtimes para ejecutar programas de Flatpak. Los runtimes de desarrollo o SDK contienen, como el nombre lo indica, las herramientas de desarrollo para la plataforma en cuestión, el equivalente a tener instalado en un contenedor LXC el software necesario para compilar tus programas. El usuario final normalmente no tendrá que instalar los runtimes de desarrollo pero son necesarios si quieres compilar programas para Flatpak ya que debes compilar tus programas usando las versiones de librerías disponibles en alguna de las plataformas o runtimes de Flatpak.

El párrafo anterior puede sonar más complicado de lo que realmente es. En Flatpak, existen normalmente dos versiones de runtimes para cada plataforma disponible, el runtime de ejecución y el runtime de desarrollo. Recuerda que puedes pensar en cada plataforma de Flatpak como si fuera una versión mínima de Linux instalada en un contenedor LXC o, por ejemplo, en una máquina virtual. Cuando eliges una plataforma de Flatpak, si quieres compilar programas para esa plataforma debes instalar las utilidades para desarrollar en esa plataforma (compiladores, versiones de desarrollo de las librerías instaladas, etc.) de forma que una vez que has compilado un programa, puedes compartirlo con otras personas aunque no tengan instalada la versión de desarrollo y podrán ejecutar tu programa ya que la plataforma (piensa de nuevo en el contenedor LXC o la máquina virtual) es exactamente la misma. Las versiones de las librerías disponibles en la plataforma de Flatpak son las mismas que usaste para compilar tu programa así que todo funciona sin problemas. Para eso sirve el runtime SDK, para compilar programas para la plataforma de ejecución correspondiente.

Si recuerdan el post sobre compilar GIMP, recordarán que tuvimos que instalar varias librerías manualmente. Lo mismo se puede hacer sin problemas en el kit de desarrollo de una plataforma de Flatpak. Al final simplemente debemos distribuir nuestro ejecutable junto con todas las librerías que compilamos manualmente. Puesto que las herramientas que usamos en el desarrollo son exactamente las mismas disponibles en la plataforma de ejecución, cualquier librería compilada manualmente debe ser compatible con el runtime de ejecución.

Suficiente teoría, vayamos a la práctica :P. En primer lugar debemos elegir una plataforma para la cual compilaremos GIMP. De momento, Flatpak ofrece dos posibles plataformas, la plataforma básica Freedesktop y la plataforma GNOME que agrega librerías extras de GNOME. En este post usaré la plataforma Freedesktop puesto que ya la tengo instalada 😛 . Para compilar GIMP tal vez la plataforma GNOME nos ahorraría el trabajo de compilar algunas librerías de forma manual.

Anteriormente agregamos el repositorio de Flathub que contiene los runtimes Freedesktop y GNOME, así que podemos instalar los runtimes de ejecución y desarrollo de Freedesktop usando el siguiente comando1:

monstruosoft@monstruosoft-PC:~$ flatpak install flathub org.freedesktop.Platform/x86_64/1.6 org.freedesktop.Sdk/x86_64/1.6

La versión 1.6 es la más reciente de la plataforma Freedesktop al momento de escribir este post. Aquí puedes ver una lista de las librerías instaladas en esta plataforma.

Este post se está volviendo más extenso de lo que esperaba 😛 así que lo dividiré en dos partes y dejaremos la compilación de GIMP para la segunda parte. Así que, antes de cerrar esta primera parte, este es un buen momento para probar el ejemplo de Hello world disponible en la página de Flatpak para entender un poco mejor cómo las aplicaciones de Flatpak se encuentran asiladas en su propia sandbox de manera similar a un contenedor LXC o una máquina virtual. Hay que tener en cuenta que el ejemplo de Hello world en la página de Flatpak no hace uso de ningún runtime SDK para desarrollar el ejemplo, esto es porque usa un simple script y no tiene que compilar nada.

La página del ejemplo describe seis pasos. Los primeros dos pasos consisten en instalar Flatpak e instalar un runtime. Ya lo hemos hecho, incluso hemos instalado un runtime de desarrollo que usaremos más tarde.

El tercer paso describe la creación de una simple aplicación. Primero debemos crear la estructura básica de directorios usando los siguientes comandos:

monstruosoft@monstruosoft-PC:~$ cd ~
monstruosoft@monstruosoft-PC:~$ mkdir hello
monstruosoft@monstruosoft-PC:~$ mkdir hello/files
monstruosoft@monstruosoft-PC:~$ mkdir hello/files/bin
monstruosoft@monstruosoft-PC:~$ mkdir hello/export

A continuación debemos crear en el directorio hello/files/bin/ un archivo llamado hello.sh, agregar lo siguiente al archivo y guardarlo:

#!/bin/sh
echo “Hola mundo, desde una sandbox de Flatpak”

Ahora debemos informar a Flatpak cómo ejecutar la aplicación. Esto se hace usando un archivo llamado metadata en el directorio hello. En este archivo especificamos el nombre de la aplicación (que sigue una convención similar a los paquetes de Java), el runtime necesario para ejecutar la aplicación (en general, será el mismo que se usó para crear la aplicación, pero en su versión de ejecución en lugar de la versión SDK) y el comando que se ejecutará dentro de la sandbox al ejecutar la aplicación de Flatpak. El archivo metadata puede definir muchas otras propiedades de la aplicación pero para este ejemplo sencillo el siguiente contenido es todo lo que necesita:

[Application]
name=org.test.Hello
runtime=org.freedesktop.Platform/x86_64/1.6
command=hello.sh

En el siguiente paso ponemos nuestra aplicación en un repositorio desde el cual podemos instalarla. Todas las aplicaciones de Flatpak deben instalarse desde un repositorio; por suerte podemos crear y registrar un repositorio local usando el siguiente comando:

monstruosoft@monstruosoft-PC:~$ cd ~
monstruosoft@monstruosoft-PC:~$ flatpak build-export repo hello
monstruosoft@monstruosoft-PC:~$ flatpak --user remote-add --no-gpg-verify tutorial-repo repo
monstruosoft@monstruosoft-PC:~$ flatpak --user install tutorial-repo org.test.Hello

Ahora podemos ejecutar nuestra aplicación usando el siguiente comando:

monstruosoft@monstruosoft-PC:~$ flatpak run org.test.Hello 
Hello world, from a sandbox

Funciona tal como era de esperarse. Sin embargo hay algo más que quiero demostrar con esta aplicación de ejemplo. Podemos ejecutar una línea de comandos dentro de la plataforma que estamos utilizando, de esta forma podemos ver el contenido de la sandbox, efectivamente el equivalente a una distro minimalista de Linux que contiene solamente lo necesario para ejecutar nuestra aplicación:

monstruosoft@monstruosoft-PC:~$ flatpak run --command=bash org.test.Hello 
bash-4.3$ cd /
bash-4.3$ ls
app  bin  dev  etc  home  lib  lib64  proc  run  sbin  sys  tmp  usr  var
bash-4.3$ cd app/bin
bash-4.3$ ls
hello.sh
bash-4.3$ ./hello.sh 
Hello world, from a sandbox
bash-4.3$ gcc --version
bash: gcc: command not found
bash-4.3$ exit
exit

Podemos ver que nuestra aplicación se encuentra ahí y podemos ejecutarla dentro de la sandbox como lo haríamos en cualquier distro de Linux. Podemos ver también que el comando gcc no está disponible dentro de la sandbox, esto porque al tratarse del runtime de ejecución no es necesario que tenga las herramientas de desarrollo, el runtime de ejecución tiene sólo lo mínimo para ejecutar las aplicaciones que creamos.

Por otro lado, ¿recuerdan el runtime de desarrollo? El runtime de desarrollo también es básicamente una distro minimalista de Linux con todas las librerías del runtime de ejecución pero además contiene las herramientas de desarrollo que esperaríamos en cualquier distro de Linux. Puesto que el runtime de desarrollo es también el equivalente a una distro minimalista de Linux, no hay nada que nos impida ejecutar nuestra aplicación dentro de la distro que representa. Para esto hay un par de opciones:

  • Usar el argumento –devel al ejecutar nuestra aplicación; esto indicará a Flatpak que debe usar el runtime de desarrollo de ser posible. Sin embargo, en mi versión de Flatpak esto parece no funcionar como debería, tal vez se trate de un bug en la versión de Flatpak en el repositorio de backports de Debian Jessie.

  • Forzar el uso de un runtime específico usando el argumento –runtime; esto puede funcionar si la opción anterior falla.

Así que, con esto en mente, echemos un vistazo a lo que contiene el runtime de desarrollo. Para ver cómo las herramientas de desarrollo se encuentran aisladas dentro de la sandbox, comparémoslas con las versiones instaladas en el sistema. Verás que dentro de la sandbox o runtime pueden estar instaladas versiones de las herramientas de desarrollo muy distintas a las instaladas en el sistema, comenzando por el mismo compilador gcc:

monstruosoft@monstruosoft-PC:~$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
monstruosoft@monstruosoft-PC:~$ pkg-config --modversion glib-2.0 
2.42.1
monstruosoft@monstruosoft-PC:~$ pkg-config --modversion harfbuzz
0.9.35
monstruosoft@monstruosoft-PC:~$ pkg-config --modversion libpng
1.2.50
monstruosoft@monstruosoft-PC:~$ flatpak run --devel --command=bash org.test.Hello 
error: Key file does not have key 'sdk'
monstruosoft@monstruosoft-PC:~$ flatpak run --runtime=org.freedesktop.Sdk --command=bash org.test.Hello 
bash-4.3$ gcc --version
gcc (GCC) 6.2.0
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
bash-4.3$ pkg-config --modversion glib-2.0
2.52.3
bash-4.3$ pkg-config --modversion harfbuzz
1.4.4
bash-4.3$ pkg-config --modversion libpng
1.6.24
bash-4.3$ cd /app/bin/
bash-4.3$ ./hello.sh 
Hello world, from a sandbox
bash-4.3$ exit
exit

Espero que este post te ayude a tener una idea de cómo funciona Flatpak. En la segunda parte iremos directamente a nuestro objetivo de compilar GIMP para Flatpak.


Referencias:

1 – Una variante del comando indicado en http://docs.flatpak.org/en/latest/getting-setup.html

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s