GTK4 en Ubuntu 20.04 - Source Code

Veíamos en la entrada anterior como usar la librería GTK4 en Ubuntu 20.04 usando flatpak. Vamos a ver ahora como instalar directamente las librerías compilándolas desde el código fuente e instalarlas usando una carpeta local para no interferir en el resto de aplicaciones.

El proceso es sencillo aunque es necesario instalar bastantes dependencias para compilar las librerías.

Voy a partir de un Ubuntu 20.04 LTS recién instalado y actualizado pero sin ningún paquete añadido, de esta forma espero no dejarme ninguna dependencia. Si ya tenemos en nuestro sistema ese paquete instalado no hay problema. Todos las librerías nuevas las vamos a instalar en la carpeta $HOME/local, de esta forma no interfiere en las librerías de nuestro sistema. Para hacer uso de ellas cambiaremos unas variables de entorno que las harán accesibles.

Tenemos que construir e instalar los siguientes programas/librerías:

En el enlace que tenemos al lado de cada librería tenemos los git de cada proyecto, en el post he puesto la versión que he instalado, pero es muy probable que sea mejor descargar e instalar la versión más reciente en cada caso (clonar el git).

Preparación

Creamos una carpeta para los fuentes:

$ mkdir ~/gtk4

Es muy útil usar un sencillo script creado por Mibchael B. para ver el estado actual de las variables de entorno:

check_env
#!/bin/bash 
 
echo 
echo  -e "\e[0;34m=======================================================================================================================================================================" 
echo  -e  "\e[0;33mPKG_CONFIG_PATH:" "\e[0;38m$PKG_CONFIG_PATH" 
 
echo  -e "\e[0;34m=======================================================================================================================================================================" 
echo  -e "\e[0;33mPATH:\t\t" "\e[0;38m$PATH" 
 
echo  -e "\e[0;34m=======================================================================================================================================================================" 
echo  -e  "\e[0;33mLD_LIBRARY_PATH:" "\e[0;38m$LD_LIBRARY_PATH" 
 
echo  -e "\e[0;34m=======================================================================================================================================================================" 
echo  -e "\e[0;33mLDFLAGS:\t" "\e[0;38m$LDFLAGS" 
 
echo  -e "\e[0;34m=======================================================================================================================================================================" 
echo  -e "\e[0;33mCPPFLAGS:\t" "\e[0;38m$CPPFLAGS" 
 
echo  -e "\e[0;34m=======================================================================================================================================================================" 
echo  -e "\e[0;33mXDG_DATA_DIRS:\t" "\e[0;38m$XDG_DATA_DIRS" 
 
echo  -e "\e[0;34m=======================================================================================================================================================================" 
echo  -e "\e[0;33mGI_TYPELIB_PATH:" "\e[0;38m$GI_TYPELIB_PATH" 
 
echo  -e "\e[0;34m=======================================================================================================================================================================" 
echo  -e "\e[0;33mGSETTINGS_SCHEMA_DIR:" "\e[0;38m$GSETTINGS_SCHEMA_DIR" 
echo  -e "\e[0;34m=======================================================================================================================================================================" 
echo 
 

He modificado el proceso de instalación que utilizaba normalmente siguiendo algunas de las recomendaciones tanto de los vídeos de Michael B. como del tutorial de Toshio Sekiya sobre GTK4. Ambas fuentes completamente recomendables.

De esta forma podemos ver las variables de entorno que nos interesan ejecutando el script:

$ ./check_env 

=======================================================================================================================================================================
PKG_CONFIG_PATH:
=======================================================================================================================================================================
PATH:         /home/david/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
=======================================================================================================================================================================
LD_LIBRARY_PATH:
=======================================================================================================================================================================
LDFLAGS:    
=======================================================================================================================================================================
CPPFLAGS:    
=======================================================================================================================================================================
XDG_DATA_DIRS:     /usr/share/ubuntu:/home/david/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share:/var/lib/snapd/desktop
=======================================================================================================================================================================
GI_TYPELIB_PATH:
=======================================================================================================================================================================
GSETTINGS_SCHEMA_DIR:
=======================================================================================================================================================================

Y para cambiar las variables:

set_env
# compiler 
CPPFLAGS="-I$HOME/local/include" 
LDFLAGS="-L$HOME/local/lib" 
PKG_CONFIG_PATH="$HOME/local/lib/pkgconfig:$HOME/local/lib/x86_64-linux-gnu/pkgconfig:$HOME/local/share/pkgconfig" 
export CPPFLAGS LDFLAGS PKG_CONFIG_PATH 
 
# linker 
LD_LIBRARY_PATH="$HOME/local/lib/x86_64-linux-gnu/" 
PATH="$HOME/local/bin:$PATH" 
export LD_LIBRARY_PATH PATH 
 
# gir 
XDG_DATA_DIRS=$HOME/local/share:$XDG_DATA_DIRS 
export XDG_DATA_DIRS 
 
# girepository-1.0 
export GI_TYPELIB_PATH=$HOME/local/lib/x86_64-linux-gnu/girepository-1.0 
 
# gsetting 
export GSETTINGS_SCHEMA_DIR=$HOME/local/share/glib-2.0/schemas 

Lo ejecutamos y vemos la diferencia con check_env:

$ source set_env 
$ ./check_env

=======================================================================================================================================================================
PKG_CONFIG_PATH: /home/david/local/lib/pkgconfig:/home/david/local/lib/x86_64-linux-gnu/pkgconfig:/home/david/local/share/pkgconfig
=======================================================================================================================================================================
PATH:         /home/david/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
=======================================================================================================================================================================
LD_LIBRARY_PATH: /home/david/local/lib/x86_64-linux-gnu/
=======================================================================================================================================================================
LDFLAGS:     -L/home/david/local/lib
=======================================================================================================================================================================
CPPFLAGS:     -I/home/david/local/include
=======================================================================================================================================================================
XDG_DATA_DIRS:     /home/david/local/share:/usr/share/ubuntu:/home/david/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop
=======================================================================================================================================================================
GI_TYPELIB_PATH: /home/david/local/lib/x86_64-linux-gnu/girepository-1.0
=======================================================================================================================================================================
GSETTINGS_SCHEMA_DIR: /home/david/local/share/glib-2.0/schemas
=======================================================================================================================================================================

 

Meson        

Para construir algunos de los paquetes (como pango por ejemplo) necesitamos una versión de meson más actual de la 0.53.2 que trae por defecto (en este momento) los repositorios de ubuntu 20.04.

La vamos a instalar usando pip3. Si ya tuviéramos una versión instalada lo primero es desinstalarla:

sudo apt purge meson -y

Voy a omitir a partir de ahora en todo el post el uso del prompt de sistema en la línea de ordenes para facilitar el copiado de cada línea

y ahora sí instalamos la versión desde pip3:

sudo apt-get install python3-pip tracker
cd gtk4
mkdir Meson
cd Meson
wget https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py --upgrade --disable-pip-version-check --no-cache-dir
sudo pip3 install meson
sudo ln -s /usr/local/bin/meson /usr/bin/meson

Podemos comprobar la nueva versión:

$ meson --version
0.57.1

 

GLib        

Primero las dependencias:

sudo apt install git ninja-build cmake build-essential bison flex libpcre3-dev libpng-dev libtiff-dev libelf-dev gettext liblocale-msgfmt-perl libdbus-1-dev libxml2-utils libmount-dev libselinux1-dev libffi-dev libxt-dev

Y después descargamos, descomprimimos, construimos e instalamos (este es el proceso que vamos a seguir con todos los programas/librerías):

wget https://download.gnome.org/sources/glib/2.67/glib-2.67.6.tar.xz
tar -Jxf glib-2.67.6.tar.xz
cd glib-2.67.6
meson --prefix $HOME/local _build
ninja -C _build/
ninja -C _build install
cd ..

 

Cairo        

sudo apt install libx11-xcb-dev libbfd-dev liblzo2-dev libpoppler-glib-dev libspectre-dev librsvg2-dev 
wget https://gitlab.freedesktop.org/cairo/cairo/-/archive/master/cairo-master.tar.gz
tar -xzf cairo-master.tar.gz
cd cairo-master/
meson --prefix $HOME/local _build
ninja -C _build/
ninja -C _build install
cd ..

 

Gobject-introspection        

wget https://download.gnome.org/sources/gobject-introspection/1.68/gobject-introspection-1.68.0.tar.xz
tar -Jxf gobject-introspection-1.68.0.tar.xz
cd gobject-introspection-1.68.0
meson --prefix $HOME/local _build
ninja -C _build/
ninja -C _build install
cd ..

 

Pango        

sudo apt install ragel libfribidi-dev libthai-dev libharfbuzz-dev gperf libxft-dev help2man libgirepository1.0-dev
wget https://download.gnome.org/sources/pango/1.48/pango-1.48.3.tar.xz
tar -Jxf pango-1.48.3.tar.xz
cd pango-1.48.3
sudo pip3 install jinja2 toml typogrify
meson --prefix $HOME/local _build
ninja -C _build
ninja -C _build install

Cuando se instala da un error en pangofc porque no encuentra una dependencia. Si recompilamos y reinstalamos localiza la dependencia y subsanamos el error:

meson setup --wipe --prefix $HOME/local _build
ninja -C _build
ninja -C _build install

 

Gdk-pixbuf        

sudo apt install libtiff-dev xsltproc
sudo apt upgrade docbook-xml docbook-xsl
wget https://download.gnome.org/sources/gdk-pixbuf/2.42/gdk-pixbuf-2.42.2.tar.xz
tar -Jxf gdk-pixbuf-2.42.2.tar.xz
cd gdk-pixbuf-2.42.2
meson --prefix $HOME/local _build
ninja -C _build
ninja -C _build install

 

Gtk-doc        

sudo apt install fop dblatex itstool
wget https://download.gnome.org/sources/gtk-doc/1.33/gtk-doc-1.33.2.tar.xz
tar -Jxf gtk-doc-1.33.2.tar.xz
cd gtk-doc-1.33.2
meson --prefix $HOME/local _build
ninja -C _build
ninja -C _build install
cd..

 

Graphene        

wget https://download.gnome.org/sources/graphene/1.10/graphene-1.10.2.tar.xz
tar -Jxf graphene-1.10.2.tar.xz
cd graphene-1.10.2/
meson --prefix $HOME/local _build
ninja -C _build
ninja -C _build install
cd..

 

Harfbuzz        

wget https://github.com/harfbuzz/harfbuzz/releases/download/2.7.4/harfbuzz-2.7.4.tar.xz
tar -Jxf harfbuzz-2.7.4.tar.xz
cd harfbuzz-2.7.4/
meson --prefix $HOME/local _build
ninja -C _build
ninja -C _build install
cd..

 

Gtk4        

sudo apt install libxkbcommon-dev libwayland-dev libxrandr-dev libxi-dev librsvg2-dev libavfilter-dev libcups2-dev librest-dev libjson-glib-dev libsass-dev sassc libvulkan-dev libxinerama-dev libxcomposite-dev libxcursor-dev libxdamage-dev wayland-protocols libgraphene-1.0-dev libepoxy-dev libdrm-dev libgstreamer-plugins-bad1.0-dev highlight
git clone https://gitlab.gnome.org/GNOME/gtk.git
cd gtk
meson --prefix $HOME/local _build
ninja -C _build
ninja -C _build install
cd..

Aplicación GTK4 en C

Para finalizar vamos a ver el programa básico que vimos en GNOME - Infraestructura de desarrollo, pero en la versión para GTK4:

holagtk4c.c
/*  
 * holagtk4c.c  
 *  
 * (c) Author: David Quiroga  
 * e-mail: david [at] clibre [dot] io  
 *  
 ****************************************************************  
 * Descripción:  
 *  
 * 'Hola mundo' en GTK4  
 *  
 * SPDX-License-Identifier: GPL-3.0  
 */  
  
#include <gtk/gtk.h>  
  
static void  
funcion_button (GtkWidget *widget,  
             gpointer data)  
{  
    static gboolean hola = TRUE;  
    if(hola == TRUE) {  
        gtk_button_set_label (GTK_BUTTON(widget), "Hola Mundo!");  
        hola = FALSE;  
    } else {  
        gtk_button_set_label (GTK_BUTTON(widget), "Desde clibre.io");  
        hola = TRUE;  
    }  
}  
  
static void  
activate (GtkApplication *app,  
            gpointer user_data)  
{  
    GtkWidget *window;  
    GtkWidget *button;  
    GtkWidget *btsalir;  
    GtkWidget *button_box;  
  
    window = gtk_application_window_new (app);  
    gtk_window_set_title (GTK_WINDOW (window), "Hola GTK4");  
    gtk_window_set_default_size (GTK_WINDOW (window), 350, 140);  
  
  
    button_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 5);  
    gtk_box_set_homogeneous (GTK_BOX (button_box), TRUE); 
    gtk_window_set_child (GTK_WINDOW (window), button_box);  
  
    button = gtk_button_new_with_label ("Desde clibre.io");  
    btsalir = gtk_button_new_with_label ("Salir");  
    g_signal_connect (button, "clicked", G_CALLBACK (funcion_button), NULL);  
    g_signal_connect_swapped (btsalir, "clicked", G_CALLBACK (gtk_window_destroy), window);  
    gtk_box_append (GTK_BOX (button_box), button);  
    gtk_box_append (GTK_BOX (button_box), btsalir);  
  
    gtk_window_present (GTK_WINDOW (window));  
}  
  
int  
main (int argc,  
        char **argv)  
{  
    GtkApplication *app;  
    int status;  
  
    app = gtk_application_new ("org.comunidadlibre.appc", G_APPLICATION_FLAGS_NONE);  
    g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);  
    status = g_application_run (G_APPLICATION (app), argc, argv);  
    g_object_unref (app);  
  
    return status;  
}  

Para construir la aplicación:

$ gcc -Wall -g `pkg-config --cflags gtk4` holagtk4c.c -o holagtk4c `pkg-config --libs gtk4`

Aplicación GTK4 en Vala

Ahora la versión en Vala:

holagtk4vala.vala
/*  
 * holagtk4vala.vala  
 *  
 * (c) Author: David Quiroga  
 * e-mail: david [at] clibre [dot] io  
 *  
 ****************************************************************  
 * Descripción:  
 *  
 * 'Hola mundo' en GTK4  
 *  
 * SPDX-License-Identifier: GPL-3.0  
 */  
  
public class HolaMundo.Window : Gtk.ApplicationWindow {  
    public Window (Gtk.Application app) {  
        Object (application: app);  
  
        this.default_height = 140;  
        this.default_width = 350;  
        this.title = "Hola GTK";  
        bool hola = true;  
  
        // El contenedor box  
        Gtk.Box box = new Gtk.Box (Gtk.Orientation.VERTICAL, 5);  
        box.set_homogeneous (true); 
        this.set_child (box); 
  
        // Creamos los botones  
        var button = new Gtk.Button.with_label ("Desde clibre.io");  
        var salir = new Gtk.Button.with_label ("Salir");  
  
        // Conectamos las acciones al pulsar los botones  
        button.clicked.connect (() => {  
            if (hola == true) {  
                button.label = "Hola Mundo!";  
                hola = false;  
            } else {  
                button.label = "Desde clibre.io";  
                hola = true;  
            }  
        });  
        // y el boton salir  
        salir.clicked.connect (() => {  
            this.destroy ();  
        });  
  
         box.append (button); 
         box.append (salir); 
    }  
}  
  
int main (string[] args) {  
    var app = new Gtk.Application ("org.comunidadlibre.appvala", ApplicationFlags.FLAGS_NONE);  
    app.activate.connect (() => {  
        var win = app.active_window;  
        if (win == null) {  
            win = new HolaMundo.Window (app);  
        }  
        win.present ();  
    });  
  
    return app.run (args);  
}  

Para construir la aplicación:

$ valac --pkg gtk4 holagtk4vala.vala

Conclusión

Instlar GTK4 dede el código fuente es, como hemos visto, bastante más laborioso que usar flatpak. Merece la pena hacerlo y probarlo, pero lo cierto es que es más versátil usar flatpak que nos permite también exportar el paquete y poder usarlo desde cualquier equipo que corra flatpak. Pero para hacer cambios concretos, personalizar alguna librería o hacer algún cambio en los fuentes, esta es una buena manera de probarlo. Por este motivo y como un método no interfiere con el otro lo ideal es probar ambos. Espero que pueda resultar de utilidad.

Modificado por última vez enDomingo, 28 Marzo 2021 17:26
(3 votos)
Etiquetado como :

Más en esta categoría:

« GTK4 en Ubuntu 20.04 - Flatpak

Deja un comentario

Asegúrese de introducir toda la información requerida, indicada por un asterisco (*). No se permite código HTML.