I. Introduction

La dernière version stable de GTK+ vient de sortir (voir les nouveautés) et si vous êtes impatient ou que votre distribution ne propose pas de système de paquets, vous êtes obligés de passer par les sources. Cette étape n'est très compliquée mais pour éviter de s'y reprendre en plusieurs fois, je vais vous guider.
Si vous êtes arrivés sur ce tutorial, il est fort probable que vous connaissiez déjà GTK+, si ce n'est pas le cas, vous pouvais commencer par lire GTK+ par l'exemple pour apprendre à utiliser GTK+.

II. Fichiers nécessaires

Pour commencer, il faut télécharger les archives des sources de GTK+ ainsi que leurs dépendances, pour GTK+ 2.10, il vous faut (nous supposerons que les fichiers sont stockés dans le dossier ~/gtk+-2.10/) :

Il se peut que vous ayez besoin d'autres packages s'il s'agit de sa première installation.

II. Préparation de l'installation

Pour faire les choses proprement, nous allons tout intaller dans le répertoire /opt/gtk, commencons par le créer :

 
Sélectionnez
$ su
Password:
# mkdir -p /opt/gtk
# ls -l / /opt
/:
drwxr-xr-x   12 root root   4096 2006-07-04 18:24 opt

/opt/:
drwxr-xr-x   8 root root     4096 2006-07-04 18:29 gtk

Vérifiez que vous avez les droits nécessaires sur les dossiers créés.
Ensuite il faut extraire les archives :

 
Sélectionnez
$ cd ~/gtk+-2.10
$ tar -zxf atk-1.10.3.tar.gz
$ tar -zxf cairo-1.2.0.tar.gz
$ tar -zxf glib-2.12.0.tar.gz
$ tar -zxf gtk+-2.10.0.tar.gz
$ tar -zxf pango-1.13.2.tar.gz

Avant de nous lancer dans la compilation, nous allons définir deux variables d'environnement :

 
Sélectionnez
$ export PKG_CONFIG_PATH=/opt/gtk/lib/pkgconfig/:$PKG_CONFIG_PATH

Cette variable permet à l'utilitaire pkg-config de trouver les fichiers .pc qui lui permet de récuperer les informations sur les bibliothèques telles que les options de compilation pour gcc. Si vous avez une ancienne version de GTK d'installée, pensez à renommer les anciens fichiers .pc (généralement situés dans le répertoire /usr/lib/pkgconfig) en .pc.old (ou les déplacer) afin que pkg-config ne les utilise pas.

 
Sélectionnez
$ export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH

Cette variable permet à l'éditeur de lien ld de trouver nos bibliothèques nouvellement installées.
Voilà, nous sommes prêt pour lancer la compilation !

Avant de compiler, vous pouvez appliquer un petit correctif, voir la partie .

III. Compilation

C'est ici que les choses peuvent se compliquer puisqu'il faut installer les paquets en respectant les dépendances.
Nous allons commencer par la glib puisqu'elle ne nécessite aucune dépendance :

 
Sélectionnez

$ cd glib-2.12.0
$ ./configure --prefix=/opt/gtk
[...]
$ make
[...]
$ su
Password:
# make install
[...]

Voila rien de bien compliqué ! le parametre prefix de la commande configure permet de choisir le répertoire d'installation.
Et maintenant il faut vous armer de patience (surtout pour les petites configurations) et recommencer cette série de commandes pour les autres paquets en respectant l'ordre suivant :

  1. cairo
  2. atk
  3. pango
  4. gtk+

Normalement si tout c'est bien passé, votre système est prêt, reste plus qu'à tester !

IV. Test

Afin de vérifier que cette nouvelle version de GTK+ est bien installée, voici un petit programme de test ;

main.c
Sélectionnez
#include <stdio.h>
#include <stdlib.h>
#include <gtk/gtk.h>

int main (void)
{
  printf ("Version de GTK+ utilisee :\n");
  printf ("\tBibliotheque : %d.%d.%d\n", gtk_major_version, gtk_minor_version, gtk_micro_version);
  printf ("\tFichiers d'en tete : %d.%d.%d\n", GTK_MAJOR_VERSION, GTK_MINOR_VERSION, GTK_MICRO_VERSION);
  return EXIT_SUCCESS;
}

Pour compiler tapez :

 
Sélectionnez
$ gcc `pkg-config --cflags --libs gtk+-2.0` main.c

Et si tout c'est bien passé, vous devriez obtenir :

 
Sélectionnez
$ ./a.out
Version de GTK+ utilisee :
        Bibliotheque : 2.10.0
        Fichiers d'en tete : 2.10.0

V. Bug

Dans les versions précédentes les programmes écrits à l'aide de GTK+ pouvaient être compilés en mode ansi strict (option -ansi et -pedantic de gcc) mais avec cette dernière version, le fichier d'en tête gtktextbuffer.h n'est pas conforme :

 
Sélectionnez
$ gcc -Wall -O2 -ansi -pedantic -W `pkg-config --cflags --libs gtk+-2.0` main2.c
In file included from /opt/gtk/include/gtk-2.0/gtk/gtk.h:170,
                 from main.c:1:
/opt/gtk/include/gtk-2.0/gtk/gtktextbuffer.h:52: warning: ISO C restricts enumerator values to range of 'int'
/opt/gtk/include/gtk-2.0/gtk/gtktextbuffer.h:53: warning: ISO C restricts enumerator values to range of 'int'
/opt/gtk/include/gtk-2.0/gtk/gtktextbuffer.h:55: warning: ISO C restricts enumerator values to range of 'int'

Les messages étant un warning, en l'absence de l'option -Werror votre programme devrait tout de même compiler.
Si toute fois vous souhaitez corriger ce problème, vous pouvez appliquer ce patch :

 
Sélectionnez
$ patch ~/gtk+-2.10/gtk+-2.10.0/gtk/gtktextbuffer.h patch
patching file~/gtk+-2.10/gtk+-2.10.0/gtk/gtktextbuffer.h

Voilà, il ne vous reste plus qu'à relancer la compilation de GTK+.

Les programmes liés dynamiquement avec GTK+ patché ne seront pas compatible avec la version non patchée, mais cela n'a pas d'importance si vous distribuez les sources ou si GTK+ est lié statiquement à votre programme.

VI. Remerciements

Merci à Miles pour la relecture attentive de cet article.