Unison est un programme au centre de ma gestion de la synchronisation
de mes données d’un poste à l’autre. Ce programme est très fiable,
précis et permet de repérer et de réparer très facilement les
conflits de version. Contrairement à Nextcloud ou à Syncthing, il
n’agit que lorsqu’on le lui demande et liste les actions qu’il va
effectuer avant de faire quoi que ce soit. Contrairement à Git, il
est assez bien adapté aux fichiers binaires et ne conserve pas
l’ensemble des modifications apportées, ce qui tiendrait beaucoup de
place avec de gros fichiers binaires, comme des images, de l’audio ou
de la vidéo.
Bref, j’en ai besoin, partout où je travaille ou prends des notes.
Or, sur un téléphone Android, il n’est pas disponible dans les
magasins d’applications comme Google Play Store ou F-Droid. Il n’est
pas non plus disponible dans Termux. Pour l’utiliser, le plus simple
est d’utiliser depuis Termux PRoot Distro et d’installer par exemple
Alpine Linux, qui contient un paquet Unison. Malheureusement, cela ne
fonctionne pas sur mon vieux Fairphone 2, probablement à cause de son
vieux processeur 32 bits.
J’ai donc pris mon courage à deux mains et tenté de compiler OCaml,
le langage dans lequel est écrit Unison, puis Unison dans Termux.
Comme la chose n’est pas très évidente, je décris le processus ici,
afin de faire gagner peut-être un peu de temps à ceux qui voudraient
faire la même chose.
- pkg install build-essential libandroid-shmem (Il est possible qu’il
faille ajouter d’autres dépendances, car je ne suis pas parti d’un
Termux fraîchement installé et ne me souviens plus bien de ce que
j’ai pu bidouiller avant…)
- mkdir $HOME/tmp && export TMPDIR=$HOME/tmp
- Télécharger et décompresser ocaml-5.2
- À l’intérieur de la structure décompressée, lancer
./configure --prefix=$PREFIX --disable-warn-error --without-afl LDFLAGS="-landroid-shmem"
- Puis le classique make suivi de make install
- En cas d’erreur de type :
call to undeclared function 'issetugid'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 418 | if (!issetugid ()),
ajouter -Wno-implicit-function-declaration dans la variable CFLAGS
du Makefile.config et recommencer le make.
- Dans un autre emplacement, télécharger et décompresser unison-2.53.5
- À l’intérieur de la structure décompressée, lancer
make NATIVE=false, puis make NATIVE=false install
Voilà pour la partie compilation et installation. Reste un problème à
l’utilisation d’Unison ainsi compilé. L’utilisation avec ssh est
bloquée par le message :
Fatal error: Warning: the archives are locked. If no other instance of
unison is running, the locks should be removed.
Mais les fichiers mentionnés dans le message n’existent pas et ne
peuvent donc être supprimés pour débloquer la situation. J’ai d’abord
pensé que les deux machines étaient perçues comme étant la même
appelée localhost car Android ne gère pas le hostname. J’ai donc
utilisé la commande export UNISONLOCALHOSTNAME=montelephone. Cela a
modifié légèrement le message d’erreur (le nom du fichier d’archive
verrouillé n’était plus le même), mais n’a pas suffi à régler le
problème. En recherchant en ligne, on trouve quelques informations
expliquant que ce problème d’archives verrouillées serait probable-
-ment lié au SELINUX déployé sur Android. Comme il faut rooter le
téléphone pour agir sur le comportement de SELINUX et que la maîtrise
de SELINUX n’est pas tout à fait à ma portée, ne l’utilisant pas,
j’ai plutôt essayé de contourner le problème. En lançant la
synchronisation avec l’option -ignorelocks le problème disparaît.
Évidemment, ce n’est pas idéal, et il faut faire alors très attention
de ne pas lancer plusieurs synchronisations en même temps. Mais étant
le seul utilisateur, je devrais pouvoir y parvenir en me montrant un
peu rigoureux. Voilà en tout cas le principal verrou à mon
utilisation d’un téléphone Android disparu.