Compilations

1. Compiler un logiciel à la main

L’éco-système logiciel de Guix a beau être riche, la compilation manuelle reste nécessaire parce que :

  • Il s’agit d’un code qu’on développe,

  • Le logiciel n’existe pas encore dans l’ensemble des canaux logiciels,

  • La version fournie n’a pas été compilée avec les options désirées, ou n’est pas à la version désirée.

Guix dispose d’une documentation complète et en Français, cette page ne s’y substitue pas. Merci de consulter https://guix.gnu.org/fr/manual/devel/fr/html_node/

Tous les outils nécessaires à une compilation « manuelle » sont disponibles. L’installation des logiciels se faisant « à la carte » pour tous les utilisateurs, il suffit de les installer dans son profil. Pour compiler des logiciels classiques écrits en C ou C++, les paquetages logiciels suivants doivent être installés :

  • gcc-toolchain (contient gcc, g++ mais aussi l’assembleur natif à la machine)

  • binutils (contient le linker)

  • make (pour gérer les Makefiles), mais aussi cmake si besoin

  • glibc (cela peut paraître contre-intuitif, mais cela est nécessaire pour avoir les Headers)

guix install gcc-toolchain binutils make glibc

Ces logiciels sont désormais installés dans le profil principal et sont disponibles à tout moment.

À partir de là, le processus habituel fonctionne : aller dans le répertoire contenant les sources et faire make.

1.1. Utiliser guix shell pour créer un environnement de développement propre et adapté

Pour mieux contrôler l’ensemble des dépendances nécessaires à la compilation d’un logiciel, il est conseillé d’utiliser la fonctionnalité de « guix shell » qui crée des environnements isolés. Ainsi :

guix shell gcc-toolchain binutils make glibc permet de créer un environnement temporaire ajoutant ces logiciels au-dessus du profil courant. À la sortie du shell, cet environnement d’exécution, volatil, disparaît.

guix shell -C gcc-toolchain binutils make glibc est plus radical, car il crée un conteneur totalement isolé du système doté uniquement des paquetages listés. Il est à noter que ce fait est noté par l’invite du prompt qui change : dupont-y@univ-nantes.fr@login-002-v4 ~ [env]$.

Avec l’exemple précédent, les commandes usuelles ps ou ls n’existent plus dans ce contexte d’exécution, car non intégrées explicitement à ce conteneur. Pour des raisons pratiques, ll est conseillé de les ajouter : ces commandes sont issues des paquetages coreutils et procps. De même, tar, gzip ou wget ne sont plus disponibles et il faut les ajouter si nécessaire (dans l’exemple à suivre, ce n’est pas le cas, l’opération de désarchivage est faite AVANT d’utiliser guix shell).

Bien entendu, si le logiciel dépasse les quelques centaines de lignes, il est probable qu’il soit lié avec des librairies tierces, qu’il faut installer dans son profil, ou dans un shell.

1.2. Exemple concret avec Gromacs

Gromacs est un logiciel de chimie relativement complexe. Bien qu’existant déjà dans les canaux Guix et GLiCID, la suite détaille une installation pas à pas pour le compiler manuellement.

L’installation manuelle est détaillée ici : https://manual.gromacs.org/documentation/current/install-guide/index.html et les instructions à suivre en sont dérivées.

  • Récupérer le source :

$ wget https://ftp.gromacs.org/gromacs/gromacs-2023.tar.gz
--2023-04-20 09:53:33--  https://ftp.gromacs.org/gromacs/gromacs-2023.tar.gz
Resolving proxy-upgrade.univ-nantes.prive (proxy-upgrade.univ-nantes.prive)... 172.20.12.74, 2001:660:7220:8381:3128:0:2:1
Connecting to proxy-upgrade.univ-nantes.prive (proxy-upgrade.univ-nantes.prive)|172.20.12.74|:3128... connected.
Proxy request sent, awaiting response... 200 OK
Length: 41863526 (40M) [application/x-gzip]
Saving to: ‘gromacs-2023.tar.gz’

gromacs-2023.tar.gz                                                                          100%[=============================================================================================================================================================================================================================================>]  39.92M  40.9MB/s    in 1.0s

2023-04-20 09:53:35 (40.9 MB/s) - ‘gromacs-2023.tar.gz’ saved [41863526/41863526]

$ dupont-y@univ-nantes.fr@login-002-v4 ~/GROMACS$

Exécuter le début de la doc d’installation

$ tar xfz gromacs-2023.tar.gz (1)
$ cd gromacs-2023
$ mkdir build
$ cd build
1 : comme précisé ici : [targzavantshell] , à faire avant de rentrer dans le shell.
  • À partir de là, démarrer un guix shell pour générer la compilation dans un environnement propre. Mais il s’avère que cela ne serait pas suffisant :

    • Il apparaît que la compilation de gromacs télécharge des librairies complémentaires (fftw). Il faut donc préserver les variables d’environnement (proxy)

    • Gromacs nécessite des outils supplémentaires pour mener la compilation à bien : sed, grep, file, diff (paquetage diffutils), awk (paquetage gawk), find (paquetage findutils). La nécessité d’avoir sed, grep, file, diff, awk et find d’installé n’est PAS spécifiée dans la documentation de gromacs comme dépendances nécessaires, les développeurs présument que ces logiciels sont toujours disponibles…

    • Gromacs ne se compile pas avec gcc12, mais compile bien avec gcc10 (paquetage « gcc-toolchain@10 »)

  • Ces faits étant désormais connus : il suffit de lancer un guix shell spécifique pour la compilation avec toutes les dépendances nécessaires et les bonnes options :

    • -E=proxy préserve toutes les variables d’environnement contenant proxy (http_proxy, https_proxy)

    • -C lance « guix shell » dans un conteneur isolé

    • -N autorise d’accès au réseau (gromacs va télécharger des librairies lors de sa compilation)

    • Le reste des arguments sont les paquetages nécessaires à la compilation

guix shell -E=*proxy* -CN gcc-toolchain@10 cmake make glibc coreutils procps sed grep file diffutils gawk findutils

Une fois dans le shell, continuer à suivre la documentation, mais dans un 1er temps, ne pas chercher à faire les tests.

cmake .. -DGMX_BUILD_OWN_FFTW=ON -DREGRESSIONTEST_DOWNLOAD=OFF
make

Après de nombreuses minutes de compilation, on obtient alors une version minimale de gromacs. Il serait nécessaire d’ajouter des paquetages (tels que hwloc ou cuda) pour générer un binaire disposant de fonctionnalités supplémentaires.

Une fois le logiciel compilé, il est possible de sortir du shell et d’utiliser le logiciel.

Dans les cas les plus complexes, il peut s’avérer pénible de retaper la liste des paquetages nécessaires. Dans ce cas, il est possible de créer un « manifest » :

  • Reprendre la commande « guix shell » précédente et s’en servir pour générer un manifeste :

guix shell -E=*proxy* -CN gcc-toolchain@10 cmake make glibc coreutils procps sed grep file diffutils gawk findutils --export-manifest > gromacs-manifest.scm

Le contenu du fichier est le suivant :

;; What follows is a "manifest" equivalent to the command line you gave.
;; You can store it in a file that you may then pass to any 'guix' command
;; that accepts a '--manifest' (or '-m') option.

(specifications->manifest
  (list "gcc-toolchain@10"
        "cmake"
        "make"
        "glibc"
        "coreutils"
        "procps"
        "sed"
        "grep"
        "file"
        "diffutils"
        "gawk"
        "findutils"))

Ce fichier peut être édité à la main. La commande « guix shell » peut désormais se résumer à :

guix shell -E=*proxy* -CN -m gromacs-manifest.scm

1.3. Générer un paquetage Guix

À partir de l’expérience précédente, il est possible d’automatiser la procédure et générer un paquetage guix avec la commande « guix build ».

WIP. A compléter. Consulter https://guix.gnu.org/fr/cookbook/fr/html_node/ .

1.4. Intégrer le paquetage aux canaux GLiCID

WIP. À compléter. Pointer sur gitlab.univ-nantes.fr et les canaux publics cf https://gitlab.univ-nantes.fr/glicid-public/guix-glicid et https://gitlab.univ-nantes.fr/glicid-public/glicid-non-free

2. Changer les options de compilation, dérivations

guix edit nomdupaquetage

WIP. A compléter. Consulter https://guix.gnu.org/fr/cookbook/fr/html_node/ .