Précisons tout de suite qu'il ne s'agit pas de compiler Safari sous Linux puisque le code source de ce navigateur n'est pas disponible, mais de compiler le moteur de rendu de Safari. Ainsi vous obtiendrez à la fin un navigateur des plus rustiques dont le principal objectif ne sera pas de naviguer sur le web comme vous le verrez, mais de vérifier l'apparence des pages web pour ceux qui développent des sites. Notez bien aussi que les versions compilables sous Linux ne correspondent pas encore à des Safari déjà sortis, il s'agit donc pour le moment de tests préliminaires avant d'invoquer Browsershots par exemple.

La compilation

Comme expliqué dans l'article Installing and Running WebKit in Linux Using Qt, la compilation en soi n'est pas compliquée à réaliser du moment que les bibliothèques nécessaires sont installées. Il faut donc commencer par cette étape qui, sous un Linux Debian ou dérivé, donne simplement :

$ sudo apt-get install libqt4-dev libxslt-dev gperf bison libsqlite3-dev flex build-essential subversion

Ensuite il faut récupérer le code source de WebKit avec Subversion pour le placer dans le répertoire WebKit, opération qui a pris près de une heure chez moi du fait du nombre important de fichiers à récupérer :

$ svn checkout http://svn.webkit.org/repository/webkit/trunk WebKit

Les habitués de l'outil SVN[1] auront tout de suite repéré le fait que l'on récupère ici la version la plus récente possible de WebKit et dont le comportement n'est pas forcément proche de celui de Safari du fait de l'évolution du code. Nous verrons par la suite comment choisir une autre version.

La compilation nécessite de spécifier l'emplacement des bibliothèques Qt. La commande de compilation est donc :

$ QTDIR=/usr/share/qt4/ WebKit/WebKitTools/Scripts/build-webkit

Attention : une fois compilé, le répertoire Webkit occupe chez moi 275Mo, prévoyez donc de la place !

Utiliser WebKit

La compilation n'installe absolument rien dans votre système, il faut donc lancer WebKit avec la commande suivante :

$ WebKit/WebKitBuild/Release/WebKitQt/QtLauncher/QtLauncher

Comme le montre la capture d'écran plus bas, on se retrouve alors avec un navigateur web des plus minimalistes : une barre d'adresse et 3 boutons en arrière, stop et en avant ! Comble de bonheur, il faut entrer intégralement les URL : http://www.debian.org et non debian.org ou encore www.debian.org. Mais c'est le moteur de rendu de Safari, alors c'est quand même mieux que d'avoir à acheter un Mac juste pour vérifier ses pages web ;-) . Par la suite, vous pourrez facilement vous créer une icône sur le bureau ou dans une de vos barres de tableau de bord.

webkit sous linux

mozilla.com prend mon Linux pour un Mac OS X : opération réussie ! (voir en grand)

Faire du ménage

Ça marche, cependant il serait bien intéressant de se débarrasser des 275Mo nécessaires à la compilation. Il faut pour cela d'abord vérifier que QtLauncher est bien un programme compilé :

$ file WebKit/WebKitBuild/Release/WebKitQt/QtLauncher/QtLauncher
WebKit/WebKitBuild/Release/WebKitQt/QtLauncher/QtLauncher: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.4.1, dynamically linked (uses shared libs), for GNU/Linux 2.4.1, not stripped

Puis on peut lister les dépendances de ce programme[2] avec la commande suivante :

$ ldd WebKit/WebKitBuild/Release/WebKitQt/QtLauncher/QtLauncher
       linux-gate.so.1 =>  (0xffffe000)
       libQtWebKit.so.1 => /.../WebKit/WebKitBuild/Release/lib/libQtWebKit.so.1 (0xb7722000)
       libQtGui.so.4 => /usr/lib/libQtGui.so.4 (0xb7034000)
       [...]

Seule la bibliothèque libQtWebKit.so.1 n'est pas fournie par le système. Il suffit donc de récupérer QtLauncher et libQtWebKit.so.1, ce qui ne représente plus que... 10Mo ! Il y a cependant une petite astuce : si on copie les deux fichiers dans un même répertoire et qu'on détruit le répertoire de compilation, QtLauncher ne trouve plus libQtWebKit.so.1. On peut alors soit placer libQtWebKit.so.1 dans un des répertoires traditionnels des bibliothèques[3], soit faire un script de lancement qui ajoute le répertoire courant dans les chemins de recherche des bibliothèques. Si on appelle ce sript webkit.sh, ça donnera :

#!/bin/sh
#
# starts the webkit web browser
#
# author: http://philipjm.free.fr/blog/

cd ${0/webkit.sh}
export LD_LIBRARY_PATH=.
./QtLauncher

Notez bien que la première ligne extrait le nom du répertoire en éliminant le nom du script de la commande lancée (que retourne ${0}). Les plus flémards pressés pourront donc récupérer ma compilation de la version du 16 juin 2007 de somme MD5 0be5f1cc9f782cf22edc36e782b71f23.

Récupérer une version précédente

Le dépôt de code source du projet WebKit permet de récupérer l'historique complet de chaque fichier et chaque répertoire. On peut donc récupérer n'importe quelle version précédente, le problème est de savoir laquelle... Pour cela le plus simple est de naviguer dans le dépôt en se rendant sur l'interface web Trac du projet.

On y retrouve bien sûr le code du tronc [4], c'est-à-dire la version la plus fraîche possible que nous avons récupérée tout à l'heure. En outre le répertoire tags rassemble habituellement les versions du projet correspondant au franchissement d'une étape. Son contenu est fort long et ce qui est susceptible de nous intéresser, ce sont les marques [5] dont le nom commence par Safari.

La page Safari and WebKit Version Information nous explique en effet le lien qu'il y a entre la version du système Mac OS X et celle de WebKit. Malheureusement il semble que les versions de WebKit inférieures à 421 correspondant aux Mac OS X actuellement commercialisés nécessitent Xcode, l'environnement de développement d'Apple, ce qui les rend non compilables sous Linux. On pourra donc récupérer la version Safari-421.35 par exemple, dernière mouture avant les versions en 500 :

$ svn checkout http://svn.webkit.org/repository/webkit/tags/Safari-421.35 Safari-421

La compilation s'effectue de la même manière que précédemment, à ceci près que le répertoire du code a changé de nom[6] :

$ QTDIR=/usr/share/qt4/ Safari-421/WebKitTools/Scripts/build-webkit

Une fois terminée, on peut à nouveau extraire QtLauncher et cette fois libQtWebKitQt.so.1 pour un poids de 16Mo en tout[7]. Vous pouvez bien sûr récupérer ma version Safari-421 de somme MD5 0031d69e5e8427ffcffd07cea8712fff.

Bon Safari !

Notes

[1] petit nom de Subversion

[2] liste des bibliothèques *.so requises pour le faire fonctionner

[3] /usr/lib ou /usr/local/lib par exemple

[4] trunk en anglais

[5] tags en anglais

[6] c'est le dernier argument de la commande précédente

[7] ne me demandez pas pourquoi 6Mo de plus que tout à l'heure, je n'en ai aucune idée !