Guix est passé en version 0.9 en début de mois et il devient sacrément intéressant. Il n'est pas disponible dans Debian donc nous allons voir comment l'installer.

Mais une petite présentation s'impose. GNU Guix est "un gestionnaire de paquets fonctionnel pour le système GNU". "Fonctionnel" car le but est que les builds soient reproductibles. C'est un moyen pour une fin.

Il est entièrement hackable en guile scheme. Et avec guix, ils construisent le système GuixSD (System Distribution), maintenant dispo pour clef bootable (et sans installateur graphique). Avec guix, on peut donc installer des paquets, mais aussi:

  • revenir à un point antérieur du système,
  • créer des environnements virtuels indépendants du language (une sorte de virtual env universel, et à propos de python vous pourrez essayer guix-tox),
  • créer des containers, à la Docker, mais avec des avantages certains,
  • avec GuixSD, déclarer son système entier dans un fichier guile,
  • etc

Guix est le sujet de recherche de son leader à l'INRIA.

Donc, installons-le pour jouer avec !

Il faut installer quelques dépendances:

apt-get install guile-2.0-dev guile-2.0 libgcrypt20-dev libbz2-dev libsqlite3-dev autopoint

Récupérons Guix. On peut télécharger un paquet binaire, avec lequel l'installation est rapide, mais nous allons le faire depuis les sources car c'est plus sport. De plus on ne va pas faire d'installation globale, on va le laisser dans son coin, c'est plus propre. (en gros, on ne va pas faire le make install).

Dans le doute, référez-vous à la doc: https://gnu.org/software/guix/manual/guix.html#Binary-Installation

Donc, pour les sources:

git clone git://git.savannah.gnu.org/guix.git

et le classique

./configure && make

mais là, ça fait un peu mal car make va compiler la déclaration des 346 paquets de base de guix le système et donc ça peut prendre longtemps :/ c'était au moins deux heures par intermittence sur ma vieille machine. Vous remarquerez que dans ces paquets de base on trouve des choses aussi diverses que abiword, zsh, python, haskell… ça peut rendre vert si on ne compte pas utiliser Guix le système. D'abord, rassurez-vous, guix ne va pas compiler ces logiciels, il va "juste" compiler leur déclaration en guile scheme (de .scm en .go, un peu comme fait emacs d'un .el à un .elc). Et puis on n'a pas le choix actuellement car la base de données des paquets est incluse dans le logiciel (la raison entendue est que c'est plus simple pour synchroniser l'api). D'après un développeur vu sur irc, un patch pour rendre cette compilation "beaucoup plus rapide" devrait bientôt être proposé sur la mailing liste. Vous pouvez aussi essayer de modifier la liste des modules dans le Makefile (voir la variable "MODULES").

Notez aussi que ces 346 paquets sont ceux de base, il y en a plus de 2000 autres disponibles. C'est peu encore par rapport à Debian, mais c'est assez pour certains qui utilisent GuixSD quotidiennement. Et le nombre de paquets augmente d'environ 500 à chaque nouvelle version.

Maintenant on va suivre un peu la doc et créer un utilisateur et un groupe pour le démon guix.

# Make the "worker users" and their group... this allows the daemon
# to offload package building while keeping things nicely contained
sudo groupadd guix-builder
for i in `seq 1 10`; do
    sudo useradd -g guix-builder -G guix-builder           \
                 -d /var/empty -s `sudo which nologin`          \
                 -c "Guix build user $i" --system          \
                 guix-builder$i;
done

# Make the /gnu/store directory, where packages are kept/built
sudo mkdir -p /gnu/store
sudo chgrp guix-builder /gnu/store
sudo chmod 1775 /gnu/store

# Authoriser le téléchargement de paquets binaires depuis la plateforme de build.
# Permet de ne pas tous les compiler par la suite.
# Guix parle de "substitutes".
sudo ./pre-inst-env guix archive --authorize < hydra.gnu.org.pub

Donc maintenant on a guix installé dans son répertoire. Comme il n'est pas installé globalement, on doit lancer le script ./pre-inst-env avant chaque commande ainsi que configurer notre path du shell. Je vous propose cette fonction bash pour le faire (merci à ma source (c'est le leader de mediagoblin)):

# Guix stuff (for .bashrc)
function guix-enable() {

    alias guix="$INSTALL_DIR/guix/pre-inst-env guix"
    alias guix-daemon="sudo $INSTALL_DIR/guix/pre-inst-env guix-daemon --build-users-group=guix-builder"

    # add guix's bin to the path
    export PATH=$HOME/.guix-profile/bin:$PATH
    # and others
    export PYTHONPATH="$HOME/.guix-profile/lib/python3.4/site-packages"
    export GUILE_LOAD_PATH="$GUILE_LOAD_PATH:$HOME/.guix-profile/share/guile/site/2.0/"
    export GUILE_LOAD_COMPILED_PATH="$GUILE_LOAD_PATH:$HOME/.guix-profile/share/guile/site/2.0/"
}

La source sus-citée donne aussi des indications pour configurer correctement emacs (qui possède un mode complet pour manipuler guix).

Ma foi, c'est fini !

Pour tout tester, on doit lancer le démon:

guix-daemon

si vous avez suivi, on doit au préalable lancer notre guix-enable.

Et dans un autre terminal, essayons quelques commandes:

guix-enable  # encore
guix package -i artanis # installer un framework web
guix package -i artanis -r abiword # installer et supprimer en même temps
guix package -s guile   # search

puis guix environment:

guix environment guile

puis guix container

Allez, il reste tout à découvrir, à plus !

(et si vous souhaitez aussi un paquet Debian, on essaye ensemble ?)

Dernier lien:

  • une vidéo de présentation et de démo récente, où on voit la bête en action et où on comprend les buts et limitations.