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 demake 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 variableCFLAGS
duMakefile.config
et recommencer lemake
. - 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
, puismake 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 probablement 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.