Compilar GIMP 2.9 usando Flatpak – Parte 2

En el post anterior tuvimos una larga introducción a Flatpak y tratamos de entender un poco su funcionamiento. En este post saltemos directo a la acción y tratemos de compilar GIMP 2.9 para poder usarlo con Flatpak.

¿Recuerdan un largo post anterior sobre compilar GIMP? Nos basaremos en él para compilar GIMP nuevamente pero esta vez dentro del ambiente aislado de una sandbox de Flatpak. Al igual que antes, tendremos que revisar la larga lista de librerías necesarias, ver si están instaladas en el runtime que usaremos y si cumplen con los requisitos mínimos de GIMP. De lo contrario tendremos que compilarlas manualmente, otra vez.

Flatpak cuenta con un sistema que puede ayudar a automatizar la compilación de las librerías necesarias pero, con el fin de entender mejor cómo funciona, lo haremos manualmente.

En primer lugar es necesario crear un directorio que servirá para compilar nuestro programa o librería. Flatpak cuenta con el comando flatpak build-init para inicializar un directorio con la estructura para una aplicación de Flatpak1; los argumentos para este comando son el nombre del directorio en el que se guardará nuestra aplicación, el nombre de nuestra aplicación siguiendo la convención usada para Flatpak, el SDK y el runtime que usaremos para compilar y correr la aplicación y, por último, la versión del SDK/runtime que usaremos. Así, por ejemplo, para nuestra versión de GIMP podemos usar el siguiente comando:

monstruosoft@monstruosoft-PC:~$ flatpak build-init gimp-2.9 org.monstruosoft.GIMP org.freedesktop.Sdk org.freedesktop.Platform 1.6

Para compilar manualmente un programa o librería para Flatpak debemos usar el comando flatpak build que recibe como primer argumento un directorio de trabajo como el que creamos con el comando anterior y ejecutará el comando que pasemos como segundo argumento como si este se ejecutara dentro de la sandbox, por ejemplo:

monstruosoft@monstruosoft-PC:~$ flatpak build gimp-2.9 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.

De esta forma, ahora podemos comenzar el proceso desde la carpeta en la que hemos extraído el código de GIMP, por ejemplo:

monstruosoft@monstruosoft-PC:~$ cd build/gimp-2.9.6/
monstruosoft@monstruosoft-PC:~/build/gimp-2.9.6$ flatpak build ~/gimp-2.9 ./configure --prefix=/app/
…
Error: GIMP configuration failed.

  - Error: missing dependency babl >= 0.1.30
  - Error: missing dependency gegl-0.3 >= 0.3.20
  - Error: missing dependency gegl
      *** Could not find gegl in your PATH.
  - Error: missing dependency gtk+-2.0 >= 2.24.10
      *** Test for GTK+ failed.
  - Error: missing dependency gexiv2 >= 0.10.6
  - Error: missing dependency libpng >= 1.6.25
  - Error: missing dependency libmypaint >= 1.3.0
  - PyGTK 2.10.4 or newer
      *** Please install it, or skip building the python scripting extension by
      *** passing --disable-python to configure (but then you will not be able
      *** to use scripts for GIMP that are written in Python).
  - pygtk-codegen-2.0 script
      *** Please install it, or skip building the python scripting extension by
      *** passing --disable-python to configure (but then you will not be able
      *** to use scripts for GIMP that are written in Python).
  - PyCairo 1.0.2 or newer
      *** Please install it, or skip building the python scripting extension by
      *** passing --disable-python to configure (but then you will not be able
      *** to use scripts for GIMP that are written in Python).

See the file 'INSTALL' for more help.

En el comando anterior ejecutamos el script de configuración de GIMP pero al usar el comando flatpak build indicamos que el script debía ejecutarse dentro de la sandbox. Como era de esperarse, hay algunas librerías faltantes, particularmente gtk+-2.0 que no viene incluída en el runtime org.freedesktop.Sdk. Hay dos opciones, podemos usar el runtime de GNOME o podemos intentar compilar gtk+-2.0 manualmente. En este caso y ya que estamos viendo cómo compilar dentro de una sandbox de Flatpak, he descargado la versión 2.24.312 desde la página oficial de GTK. Una vez descargado el archivo gtk+-2.24.31.tar.xz y después de descomprimir el código fuente, podemos compilar gtk+-2.0 dentro de la sandbox, por ejemplo:

monstruosoft@monstruosoft-PC:~$ cd
monstruosoft@monstruosoft-PC:~$ cd build/gtk+-2.24.31/
monstruosoft@monstruosoft-PC:~/build/gtk+-2.24.31$ flatpak build ~/gimp-2.9 ./configure --prefix=/app/
configuration:
        target: x11
monstruosoft@monstruosoft-PC:~/build/gtk+-2.24.31$ flatpak build ~/gimp-2.9 make -j 4
monstruosoft@monstruosoft-PC:~/build/gtk+-2.24.31$ flatpak build ~/gimp-2.9 make install

Eso fue fácil gracias a que las librerías necesarias para compilar gtk+-2.0 ya forman parte del runtime org.freedesktop.Sdk. Hay algunos puntos importantes que hay que notar aquí; debes haber notado que usamos la opción –prefix=/app/ en el script de configuración, la razón para esto es que al ejecutar nuestra aplicación en Flatpak, el directorio de nuestra aplicación, en este caso ~/gimp-2.9, será montado dentro de la sandbox en la ruta /app/. Lo mismo pasa al compilar nuestra aplicación ya que, como hemos visto, el runtime de ejecución y el runtime de desarrollo son básicamente lo mismo pero el segundo tiene instaladas las herramientas de desarrollo para compilar nuestros programas. Es decir, al usar el comando flatpak build para compilar un programa o librería, el directorio que pasamos como argumento es montado dentro de la sandbox en /app/ y, como parte del diseño de Flatpak, este es el único directorio en el que tenemos permisos de escritura dentro de la sandbox. No podemos instalar nuevas librerías en las rutas de sistema de la sandbox y eso es algo bueno ya que de lo contrario podríamos romper la compatibilidad de la sandbox con otros programas. Tal como en el post en el que compilamos GIMP con anterioridad, aún podemos instalar las librerías en un directorio diferente sin modificar las librerías de sistema.

Cuando usamos make en el comando anterior, la librería gtk+-2.0 fue compilada como era de esperarse pero los archivos fueron compilados con las herramientas disponibles dentro de la sandbox. Finalmente, al usar el comando make install, la librería fue instalada en la ruta /app/ dentro de la sandbox, equivalente al directorio ~/gimp-2.9/ en nuestro ejemplo, y podemos ver que, en efecto, este directorio ahora contiene los archivos instalados correspondientes a la librería gtk+-2.0.

Si ahora checamos la existencia de la librería gtk+-2.0 dentro de la sandbox, obtenemos el siguiente resultado:

monstruosoft@monstruosoft-PC:~/build/gtk+-2.24.31$ flatpak build ~/gimp-2.9 pkg-config --modversion gtk+-2.0
2.24.31

Como puedes ver, la ruta /app/ es automáticamente agregada a la lista de fuentes de pkg-config, lo que significa que las librerías instaladas están disponibles de inmediato para nuestra aplicación.

Las siguientes librerías faltantes en nuestra lista son babl y gegl que ya tuvimos oportunidad de compilar antes. Veamos cómo compilarlas dentro de la sandbox de Flatpak:

monstruosoft@monstruosoft-PC:~$ cd
monstruosoft@monstruosoft-PC:~$ cd build/babl-0.1.30/
monstruosoft@monstruosoft-PC:~/build/babl-0.1.30$ flatpak build ~/gimp-2.9 ./configure --prefix=/app/
monstruosoft@monstruosoft-PC:~/build/babl-0.1.30$ flatpak build ~/gimp-2.9 make
monstruosoft@monstruosoft-PC:~/build/babl-0.1.30$ flatpak build ~/gimp-2.9 make install
monstruosoft@monstruosoft-PC:~/build/babl-0.1.30$ flatpak build ~/gimp-2.9 pkg-config --modversion babl
0.1.30
monstruosoft@monstruosoft-PC:~$ cd
monstruosoft@monstruosoft-PC:~$ cd build/gegl-0.3.20/
monstruosoft@monstruosoft-PC:~/build/gegl-0.3.20$ flatpak build ~/gimp-2.9 ./configure --prefix=/app/
monstruosoft@monstruosoft-PC:~/build/gegl-0.3.20$ flatpak build ~/gimp-2.9 make
monstruosoft@monstruosoft-PC:~/build/gegl-0.3.20$ flatpak build ~/gimp-2.9 make install
monstruosoft@monstruosoft-PC:~/build/gegl-0.3.20$ flatpak build ~/gimp-2.9 pkg-config --modversion gegl-0.3
0.3.20

A continuación, GIMP requiere la versión 1.6.25 de libpng. Pero la versión en el runtime es 1.6.24, solamente un poco por debajo del requerimiento mínimo pero significa que debemos compilar libpng. Por suerte, si lo recuerda, es fácil de compilar:

monstruosoft@monstruosoft-PC:~$ cd
monstruosoft@monstruosoft-PC:~$ cd build/libpng-1.6.32/
monstruosoft@monstruosoft-PC:~/build/libpng-1.6.32$ flatpak build ~/gimp-2.9 ./configure --prefix=/app/
monstruosoft@monstruosoft-PC:~/build/libpng-1.6.32$ flatpak build ~/gimp-2.9 make
monstruosoft@monstruosoft-PC:~/build/libpng-1.6.32$ flatpak build ~/gimp-2.9 make install
monstruosoft@monstruosoft-PC:~/build/libpng-1.6.32$ flatpak build ~/gimp-2.9 pkg-config --modversion libpng
1.6.32

La próxima librería en la lista es gexiv2 que requiere instalar primero la librería exiv23:

monstruosoft@monstruosoft-PC:~$ cd
monstruosoft@monstruosoft-PC:~$ cd build/exiv2-trunk/
monstruosoft@monstruosoft-PC:~/build/exiv2-trunk$ flatpak build ~/gimp-2.9 ./configure --prefix=/app/
monstruosoft@monstruosoft-PC:~/build/exiv2-trunk$ flatpak build ~/gimp-2.9 make
monstruosoft@monstruosoft-PC:~/build/exiv2-trunk$ flatpak build ~/gimp-2.9 make install
monstruosoft@monstruosoft-PC:~/build/exiv2-trunk$ flatpak build ~/gimp-2.9 pkg-config --modversion exiv2
0.26
monstruosoft@monstruosoft-PC:~/build/exiv2-trunk$ cd
monstruosoft@monstruosoft-PC:~$ cd build/gexiv2-0.10.6/
monstruosoft@monstruosoft-PC:~/build/gexiv2-0.10.6$ flatpak build ~/gimp-2.9 ./configure --prefix=/app/
monstruosoft@monstruosoft-PC:~/build/gexiv2-0.10.6$ flatpak build ~/gimp-2.9 make
monstruosoft@monstruosoft-PC:~/build/gexiv2-0.10.6$ flatpak build ~/gimp-2.9 make install
monstruosoft@monstruosoft-PC:~/build/gexiv2-0.10.6$ flatpak build ~/gimp-2.9 pkg-config --modversion gexiv2
0.10.6

Eso fue fácil; si recuerdan, en el post anterior cuando compilamos GIMP, la librería exiv2 tenía algunos requerimientos nada obvios con los que no tuvimos que lidiar aquí gracias a las versiones de las librerías instaladas de forma predeterminada en el runtime de Flatpak.

La siguiente librería en la lista es libmypaint:

monstruosoft@monstruosoft-PC:~$ cd
monstruosoft@monstruosoft-PC:~$ cd build/libmypaint-1.3.0/
monstruosoft@monstruosoft-PC:~/build/libmypaint-1.3.0$ flatpak build ~/gimp-2.9 ./configure --prefix=/app/
monstruosoft@monstruosoft-PC:~/build/libmypaint-1.3.0$ flatpak build ~/gimp-2.9 make
monstruosoft@monstruosoft-PC:~/build/libmypaint-1.3.0$ flatpak build ~/gimp-2.9 make install
monstruosoft@monstruosoft-PC:~/build/libmypaint-1.3.0$ flatpak build ~/gimp-2.9 pkg-config --modversion libmypaint
1.3.0

Ahora estamos a punto de completar las dependencias de GIMP, sólo nos faltan las librerías pygtk-2.04 y pycairo5, o bien podemos deshabilitar Python en el script de configuración de GIMP. Para fines educativos, compilemos también estas librerías que tienen una forma particular de instalarse y que requieren también instalar la librería pygobject6. Irónicamente, este último paso que parecía ser el más sencillo fue el que me costó más trabajo; en particular, la librería pygobject-3.0 (la versión más reciente, 3.26.0) es fácil de instalar pero GIMP requiere la librería pygobject-2.0, así que tuve que bajar la vieja versión 2.28.6 de pygobject-2.0 y fue todo un verdadero desastre 😦 ; por ejemplo, pygobject 2.28.6 tiene un estúpido requerimiento forzado de automake 1.11 que tuve que cambiar editando el archivo autogen.sh pero para no hacer este post aún más largo, simplemente supongamos que todo salió bien a la primera 😦 :

monstruosoft@monstruosoft-PC:~$ cd
monstruosoft@monstruosoft-PC:~$ cd build/pycairo-1.15.3/
monstruosoft@monstruosoft-PC:~/build/pycairo-1.15.3$ flatpak build ~/gimp-2.9 python setup.py build
monstruosoft@monstruosoft-PC:~/build/pycairo-1.15.3$ flatpak build ~/gimp-2.9 python setup.py install --prefix=/app/
monstruosoft@monstruosoft-PC:~/build/pycairo-1.15.3$ flatpak build ~/gimp-2.9 pkg-config --modversion pycairo
1.15.3
monstruosoft@monstruosoft-PC:~/build/pycairo-1.15.3$  cd
### Aquí compilé pygobject-3.26.0 pero fue inútil ya que se requiere la versión 2.x
monstruosoft@monstruosoft-PC:~$  cd build/pygobject-3.26.0/
monstruosoft@monstruosoft-PC:~/build/pygobject-3.26.0$ flatpak build ~/gimp-2.9 ./configure --with-python=python2 --prefix=/app/
monstruosoft@monstruosoft-PC:~/build/pygobject-3.26.0$ flatpak build ~/gimp-2.9 make
monstruosoft@monstruosoft-PC:~/build/pygobject-3.26.0$ flatpak build ~/gimp-2.9 make install
monstruosoft@monstruosoft-PC:~/build/pygobject-3.26.0$ flatpak build ~/gimp-2.9 pkg-config --modversion pygobject-3.0
3.26.0
monstruosoft@monstruosoft-PC:~/build/pygobject-3.26.0$ cd
### Para compilar pygobject-2.28.6 fue necesario editar el archivo autogen.sh para cambiar el requisito forzoso de una versión antigua de automake 😦 a menos que encuentres una versión que ya venga con el script de configuración 'configure' previamente creado; si la encuentras házmelo saber 😦
### También tuve que deshabilitar la opción 'introspection' para poder compilar pygobject-2.28.6 sin meterme en más problemas 😦
monstruosoft@monstruosoft-PC:~$ cd build/PYGOBJECT_2_28_6/
monstruosoft@monstruosoft-PC:~/build/PYGOBJECT_2_28_6$ flatpak build ~/gimp-2.9 ./autogen.sh
monstruosoft@monstruosoft-PC:~/build/PYGOBJECT_2_28_6$ flatpak build ~/gimp-2.9 ./configure --prefix=/app/ --enable-introspection=no
monstruosoft@monstruosoft-PC:~/build/PYGOBJECT_2_28_6$ flatpak build ~/gimp-2.9 make
monstruosoft@monstruosoft-PC:~/build/PYGOBJECT_2_28_6$ flatpak build ~/gimp-2.9 make install
monstruosoft@monstruosoft-PC:~/build/PYGOBJECT_2_28_6$ flatpak build ~/gimp-2.9 pkg-config --modversion pygobject-2.0
2.28.6
monstruosoft@monstruosoft-PC:~/build/PYGOBJECT_2_28_6$ cd
monstruosoft@monstruosoft-PC:~$ cd build/pygtk-2.24.0/
monstruosoft@monstruosoft-PC:~/build/pygtk-2.24.0$ flatpak build ~/gimp-2.9 ./configure --prefix=/app/
monstruosoft@monstruosoft-PC:~/build/pygtk-2.24.0$ flatpak build ~/gimp-2.9 make
monstruosoft@monstruosoft-PC:~/build/pygtk-2.24.0$ flatpak build ~/gimp-2.9 make install
monstruosoft@monstruosoft-PC:~/build/pygtk-2.24.0$ flatpak build ~/gimp-2.9 pkg-config --modversion pygtk-2.0
2.24.0

Ahora podemos compilar el GIMP usando Flatpak:

monstruosoft@monstruosoft-PC:~$ cd build/gimp-2.9.6/
monstruosoft@monstruosoft-PC:~/build/gimp-2.9.6$ flatpak build ~/gimp-2.9 ./configure --prefix=/app/
Building GIMP with prefix=/app, datarootdir=${prefix}/share
Desktop files install into ${datarootdir}

Extra Binaries:
  gimp-console:        yes

Optional Features:
  Language selection:  yes
  Vector icons:        yes
  Dr. Mingw (Win32):   no

Optional Plug-Ins:
  Ascii Art:           no (AA library not found)
  Ghostscript:         no (Ghostscript library not found)
  Help Browser:        no (WebKit not found)
  JPEG 2000:           no (JasPer library not found)
  MNG:                 no (MNG header file not found)
  OpenEXR:             no (OpenEXR not found)
  WebP:                no (WebP not found)
  PDF (import):        Using PostScript plug-in (libpoppler-glib not found)
  PDF (export):        yes
  Print:               yes
  Python 2:            yes
  Script-Fu:           yes
  TWAIN (Win32):       no
  Webpage:             no (WebKit not found)
  WMF:                 no (libwmf not found)
  X11 Mouse Cursor:    yes
  XPM:                 yes
  Email:               yes (xdg-email)

Optional Modules:
  ALSA (MIDI Input):   yes
  Linux Input:         yes (GUdev support: no (libgudev not found))
  DirectInput (Win32): no

Tests:
  Use xvfb-run         no (not found)
  Test appdata         yes (this test requires network access; --without-appdata-test to disable)
monstruosoft@monstruosoft-PC:~/build/gimp-2.9.6$ flatpak build ~/gimp-2.9 make
monstruosoft@monstruosoft-PC:~/build/gimp-2.9.6$ flatpak build ~/gimp-2.9 make install

Todo lo que resta es configurar el archivo metadata de nuestra aplicación de Flatpak que define la interfaz entre la sandbox de Flatpak y la PC. Podemos editar el archivo manualmente o podemos usar el comando flatpak build-finish para configurar nuestra aplicación. En el caso de una aplicación como GIMP podemos, por ejemplo, darle a nuestra aplicación acceso al servidor X11 y compartir la carpeta home del usuario; esto se lograría con un comando como el siguiente:

monstruosoft@monstruosoft-PC:~$ flatpak build-finish gimp-2.9 --filesystem=home --socket=x11 --share=ipc --device=dri --command=gimp-2.9

Llegó la hora de la verdad, hora de probar nuestra aplicación. Todas las aplicaciones de Flatpak deben instalarse desde un repositorio. ¿Recuerdan el repositorio de ejemplo, tutorial-repo, que creamos en la primera parte de este post? Podemos agregar la nueva aplicación de GIMP a ese repositorio usando el comando flatpak build-export:

monstruosoft@monstruosoft-PC:~$ flatpak remote-list 
monstruosoft@monstruosoft-PC:~$ flatpak --user remote-list 
flathub      
tutorial-repo
monstruosoft@monstruosoft-PC:~$  ls
hello  repo  gimp-2.9 ...
monstruosoft@monstruosoft-PC:~$ flatpak --user remote-ls tutorial-repo 
org.test.Hello
monstruosoft@monstruosoft-PC:~$ flatpak build-export repo gimp-2.9
Commit: 75204b8f14f476e469111431ddd324434d346817468dca5a6d913abd8c5b9730
Metadata Total: 973
Metadata Written: 485
Content Total: 7119
Content Written: 6520
Content Bytes Written: 294561141 (294.6 MB)
monstruosoft@monstruosoft-PC:~$ flatpak --user remote-ls tutorial-repo 
org.monstruosoft.GIMP
org.test.Hello

Hemos agregado la aplicación de GIMP al repositorio tutorial-repo. Desde ahí podemos instalarla y ejecutarla como cualquier otra aplicación de Flatpak:

monstruosoft@monstruosoft-PC:~$ flatpak --user install tutorial-repo org.monstruosoft.GIMP
monstruosoft@monstruosoft-PC:~$ flatpak list 
org.monstruosoft.GIMP 
org.musicbrainz.Picard
org.test.Hello   
monstruosoft@monstruosoft-PC:~$ flatpak run org.monstruosoft.GIMP

Por supuesto, para mí no tiene mucho caso correr GIMP desde Flatpak pero el punto importante aquí es que ahora puedo distribuir esta versión de GIMP y, en teoría, cualquiera que tenga Flatpak instaldo podrá ejecutarla sin importar la distro de Linux que tenga. En el próximo post pondré el link de descarga de GIMP para Flatpak junto con las instrucciones para instalarlo.

2017-10-03-121530_1366x768_scrot


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