Menu Fermer

Comment compiler un logiciel depuis des sources sur Linux

Pour personnaliser des logiciels et bénéficier de modules non présents dans les paquets officiels, il peut être nécessaire de compiler le logiciel depuis les sources.
Parfois, il s’agit simplement d’installer un logiciel qui n’est pas présent dans les dépôts.

La compilation depuis les sources peut parfois être complexe, car il faut connaître l’environnement du langage de programme.
Toutefois, grâce à ce tutoriel, vous trouverez les prérequis, les outils nécessaires ainsi que les commandes à passer pour compiler un logiciel sur Linux.

Comment compiler un logiciel depuis des sources sur Linux

Comment compiler un logiciel depuis des sources sur Linux

Pour comprendre l’intérêt de compiler des paquets et logiciels, lire :

Préparer son système à la compilation

Pour obtenir votre système prêt à compiler des packages, il faut installer les utilitaires nécessaires à la compilation de sources comme gcc, make, g++, …
En général, on les trouve sous forme de paquets disponibles depuis les dépôts.

build-essential (Debian, Ubuntu, Mint)

Sur Debian, pour avoir les outils nécessaires à la compilation, il faut installer le paquet build-essential.

sudo apt install build-essential

kernel-devel (CentOS, Red Hat)

Du côté de Redhat, on installe les paquets nécessaires avec yum comme ceci :

sudo yum install gcc gcc-c++ kernel-devel make

base-devel (Arch)

Enfin sur la distribution Arch, il faut installer base-devel :

sudo pacman -S --needed base-devel

Obtenir le code source d’un logiciel

Le code source est donc les fichiers avec le langage informatique.
Pour les programmes Linux, en général, il s’agit de programme C, on trouve donc des fichiers avec l’extension .h et .c

Depuis le référentiel de votre distribution Linux

Tous les systèmes de paquets de chaque distribution Linux permettent de télécharger les sources des paquets disponibles depuis les dépôts.

Par exemple avec APT sur les distribuions à base Debian :

apt-get source packagename

Du côté des distributions Redhat avec yum, on utilise yumdownloader :

sudo yum install yum-utils
yumdownloader --source packagename

Enfin avec la distribution Arch Linux :

sudo pacman -S abs
sudo abs                     # this installs the ABS tree
sudo abs <packagename>

Depuis Github avec git

Github est in référentiel GitHub peut être utilisé pour stocker un projet de développement.
On peut donc y télécharger les codes sources d’un projet pour ensuite le compiler.
Pour vous y aider, les distributions Linux embarque l’outil git.

Cette commande télécharge tout le code source du référentiel GitHub et le stockera dans un répertoire avec le nom du projet.

git clone https://github.com/path-to-the-repo

En les téléchargements depuis le site officiel

La dernière méthode consiste à se rendre sur le site officiel du projet et chercher la partie download.
On arrive souvent à un lien vers une page avec les sources par version au format des tar.gz.
Vous pouvez alors utiliser wget ou curl pour récupérer les sources via un terminal.

Configurer le script

Le code source que vous avez téléchargé dans les étapes précédentes est toujours livré avec un script de configuration. Ce dernier vérifie votre système afin de s’assurer que tous les packages, librairies et outils essentiels nécessaires sont présents pour compiler avec succès et créer le makefile.
Afin d’exécuter le script de configuration, entrez dans le répertoire où votre code source est situé et exécuté:

./configure

Si le script de configuration retourne une erreur, c’est qu’en général il manque un package.
Bien souvent, il s’agit d’une librairies de développement (libxxx-dev).

Enfin le script de configuration accueille des paramètres que l’on nomme drapeaux (flags).
Cela permet de modifier les emplacements d’installation ou fichier de configuration.

./configure --conf-path=/chemin/fichier/conf/nginx.conf

Mais aussi d’activer des modules spécifiques.
C’est là tout l’intérêt de la compilation car vous pouvez activer des modules qui ne sont pas disponibles par les paquets de votre distribution de Linux.
Par exemple pour compiler php-fpm. avec le drapeaux –prefix pour indiquer l’emplacement d’installation et –enable pour activer les modules PHP.

./configure --prefix=/opt/php-8.0.2 --enable-mbstring --with-curl --with-zlib --enable-gd --disable-rpath --enable-inline-optimization --with-bz2 --with-zlib --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --enable-exif --enable-bcmath --with-mhash --with-zip --with-pdo-mysql --with-mysqli --with-mysql-sock=/var/run/mysqld/mysqld.sock --with-jpeg=/usr --with-openssl --with-fpm-user=www-data --with-fpm-group=www-data --with-libdir=/lib/x86_64-linux-gnu --enable-ftp --enable-opcache --enable-fpm --without-sqlite3

Voici un autre exemple avec les options de la compilation de nginx :

Le script effectue les vérifications et si tout est correct, on peut avoir un récapitulatif pour passer à l’étape suivant.

Compiler avec Make

Si votre commande de ./configure a été réussie, cela signifie qu’il a créé un fichier spécial appelé Makefile.
C’est le fichier qui définit l’ensemble des tâches à exécuter lors de la compilation et définit par le script de configuration.
On y trouve donc en en-tête des variables avec les flags et les dépendances.
Puis les commandes de compilation des binaires et les modules spécificités.

Pour lancer la compilation, utilisez la commande :

make

A nouveau des vérifications sont effectuées en début de compilation.

Puis les commandes gcc se déroulent pour compiler et créer les binaires.

La compilation peut prendre plusieurs minutes selon la taille du programme à compiler et la vitesse du PC.

Installer le logiciel compilé dans le système

Si tout s’est bien passé, le colis est prêt à être installé. Afin de réaliser cela, vous aurez besoin d’une troisième et dernière commande.
Elle doit être exécuté avec sudo ou en root car en général, cela nécessite d’écrire dans des dossiers du système.

sudo make install

Votre logiciel est installé et vous pouvez l’appelé à partir du binaire se trouvant en général dans /usr/local/bin ou /usr/share/bin