Compiler et utiliser des librairies sous linux sans être root

Note : Je me doute que pour la plupart des aficionados de linux cet article sera bête comme tout et complètement évident, mais je l’ai pour un usage interne au labo, et je me dis que ça pourrait toujours être utile à quelqu’un, donc here goes.

Il arrive que l’on aie besoin d’installer certains programmes sur une machine qui n’a pas forcément les librairies (ou bibliothèques, mais on va dire librairies parce que c’est plus court) requises. Par exemple, un programme peut avoir besoin d’une version de gtk+ plus récente que la 2.0, ou besoin d’une librairie carrément absente. Bref. Heureusement, tout n’est pas perdu : il est tout à fait possible d’installer et d’utiliser des librairies “système” à des emplacements accessibles en écriture à tout un chacun.

On va faire ça en 3 étapes.

Compiler la librairie

Créer un répertoire à un emplacement accessible en écriture.


	mkdir ~/local

(note : si vous ne voulez pas polluer votre $HOME avec des tas de répertoires qui foutent le bordel dans Nautilus, vous pouvez aussi tout mettre dans un répertoire invisible – genre mkdir ~/.local)

Maintenant on décompresse et on compile la librairie.


	tar zxf librarie-machin.tar.gz
	cd libraire-machin/
	./configure --prefix=~/local
	make
	make install

Quelques notes en passant :

  • On suppose que la librairie requise suit la petite danse GNUAutotools – configure, make, make install. Si elle fait son propre truc, il faudra improviser…
  • Si vous obtenez des erreurs de compilation parce que des autres librairies sont absentes, il faudra les compiler aussi… en remontant jusqu’à une librairie qui voudra bien compiler sans ressource supplémentaire.
  • On suppose que le shell utilisé est bash – si c’est tcsh ou un autre truc exotique il faudra modifier les lignes de commande en fonction.

Maintenant la librairie en question est compilée et installée dans le préfixe ~/local (“préfixe” signifie que la librairie a installé ses fichiers dans une arborescence de type bin/, lib/, etc/ utilisant ~/local comme point de départ).

Compiler le programme avec la nouvelle librairie

Tout d’abord il faut ajouter l’emplacement de la librairie aux variables d’environnement :


	export PKG_CONFIG_PATH=~/local:$PKG_CONFIG_PATH
	export PATH=~/local/bin:$PATH

Ensuite décompressez le programme en question, en lui indiquant où aller chercher la librairie :


	tar zxf programme-truc.tar.gz
	cd programme-truc/
	./configure --prefix=~/local -I~/local/include -L~/local/lib
	make
	make install

Le paramètre -I indique au compilateur où chercher les nouveaux fichiers include, le paramètre -L indique au linker l’emplacement des fichiers binaires de la nouvelle librairie. Si tout se passe bien le programme devrait compiler sans problème en utilisant notre nouvelle librairie, et s’installer gaiement dans le répertoire ~/local.

Si la compilation s’arrête, étudiez attentivement les messages d’erreur – parfois la solution est très simple. Par exemple, j’ai essayé de compiler un programme utilisant une version récente de la librairie freetype2 installée dans ~/local, mais pour des raisons étranges freetype2 voulait qu’on lui indique directement son répertoire include par un ./configure -I~/local/include/freetype2 et pas -I~/local/include (c’est assez inhabituel).

Exécuter le nouveau programme

Au moment d’éxecuter le programme, il faut lui préciser où chercher la librairie utilisée à la compilation :


	export LD_LIBRARY_PATH=~/local/lib:$LD_LIBRARY_PATH
	~/local/bin/programme-truc

Et voilà, ça devrait rouler. Si vous utilisez souvent la librairie ou le programme en question, il pourrait être avantageux de placer les lignes “export” dans le fichier ~/.bashrc, ça évite de devoir tout retaper à chaque fois – mais il faudra alors faire attention à des éventuels problèmes d’incompatibilité qui pourraient survenir entre la nouvelle librairie et d’anciens programmes.

This entry was posted in Technology and tagged , , , . Bookmark the permalink.

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 )

Twitter picture

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

Facebook photo

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

Google+ photo

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

Connecting to %s