Compiler Unison dans Termux
===========================

Date: 2024-08-08 09:51
Author: jdn06
Category: Distributions
Tags: Unison, Ocaml, Termux, Android, Téléphone

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.