Changeons de format pour une fois ! Je relate ma progression sur le support de la prochaine grosse version de macOS, à savoir Big Sur (numéro de version 10.16 et 11.0). Elle devrait sortir courant octobre, voire novembre. Et elle casse beaucoup de choses, dont notamment :

New in macOS Big Sur 11 beta, the system ships with a built-in dynamic linker cache of all system-provided libraries. As part of this change, copies of dynamic libraries are no longer present on the filesystem. Code that attempts to check for dynamic library presence by looking for a file at a path or enumerating a directory will fail. Instead, check for library presence by attempting to dlopen() the path, which will correctly check for the library in the cache. (62986286)

Résumé en français : il n'y a dorénavant plus de fichier physique pour les bibliothèques, tout est contenu en mémoire. Ça, c'est du « breaking change » !

Le challenge ici, c'est que Nuxeo a un contrat avec Apple et qu'il est stipulé dans celui-ci :

a) Licensor will certify the Software to run defect-free, including UI/UX, functional and technical features, for any and all new OS, iOS or Safari versions within ten (10) days of general release of that version, whether or not Licensor was able to obtain advance notice or access to the new version.

Résumé en français : dès lors qu'une nouvelle version de macOS sort, nous avons 10 jours pour faire en sorte que nos logiciels fonctionnent sur cette dernière.

Ça fait court !


Cet article concerne l'application multi-plateforme Nuxeo Drive et les étapes de progression sont retransmises dans cette épique.
Il va falloir être réactif parce que le logiciel repose sur plusieurs projets qui ne supportent pas encore Big Sur : CPython, Qt, PyQt, ou encore PyInstaller. Donc je vais mettre la main à la pâte et patcher ce que je pourrai. À noter que PyObjC supporte déjà Big Sur, c'est ça de moins à prendre en compte.

Concernant CPython, Apple contrinue directement, donc je ne me fais pas de soucis. Ceci dit, Nuxeo Drive utilise Python 3.7 et seul Python 3.8+ aura le support de Big Sur. Va d'abord falloir mettre à jour vers Python 3.8.

Pour Qt et PyQt, il n'y a pas grand détail, la progression est plus que floue. Mais il y a ces revues de code qui donnent espoir.


Mardi 29 septembre

Pour mettre à jour vers Python 3.8, il nous faut commencer par corriger une régression dans PyInstaller (#4693). Alors c'est parti !

Mercredi 30 septembre

J'ai trouvé le bon correctif, une PR a été ouverte (#5208). Il ne reste plus qu'à croiser les doigts pour que le support de MSYS2 soit toujours valide avec ce patch.

Jeudi 1 octobre

Pendant mes tests, il s'avère que même avec le patch #5208, l'application ne se lance toujours pas depuis le fichier Appimage. J'avance à tâton, je pense avoir cerner le soucis : une seconde régression depuis PyInstaller 3.6 (#5179). Un peu plus complexe à traiter, je m'y attaquerai demain.

Vendredi 2 octobre

Toujours en train d'essayer de comprendre le problème de lancement des fichiers AppImage. Tous mes essais se sont soldés par un échec. La procédure de test étant longue, le travail est fastidieux.
J'ai aussi amélioré la robustesse de la CI car au moindre bug aléatoire, il faut se retaper près de 5h de tests (#5219)...

Samedi 3 octobre

Non, je ne fais pas de zèle :)
Mais la personne ayant introduite la régression originale indique pouvoir tester mon patch après que ma branche soit mise à jour depuis la branche develop. Je le fais et, ô joie, il me confirme que le patch est compatible avec MSYS2. « Reste plus qu'à merger. »

Lundi 5 octobre

J'ai corrigé un test qui plantait sur Python 3.5, histoire d'avoir une CI verte (#5226).
Mes misères pour tenter de comprendre et contourner le problème de la seconde régression n'ont pas évolué : tout ce que j'ai tenté n' pas abouti à quelque chose d'intéressant. Espérons que demain soit un meilleur jour.

Mardi 6 octobre

J'ai ajouté un test de non régression (#5229). Cela permettra d'éviter de futures misères à propos du support des conteneurs AppImage. Il s'agit du seul test qui ne passe pas, merci aux patches #5219 et #5226.
En attendant qu'un mainteneur de PyInstaller valide et merge les PR critiques en attente (#5208 et #5229), j'en ai profité pour corriger d'autres petits détails qui sont gérés au cas par cas dans chacun des projets utilisant PyInstaller, à savoir #5230 et #5231. C'est ce que j'ai eu à faire du côté de Nuxeo Drive, donc autant que cela serve à tout le monde.

Mercredi 7 octobre

Quelle joie de voir qu'un contribiteur externe a corrigé le seconde régression dans la nuit (#5232) ! Le test ajouté hier passe effectivement grâce à ce patch. Ce qui, potentiellement, met fin à à l'arc "restauration du support de AppImage".
Suite à la revue de code de Rok Mandeljc, j'ai retravaillé le test de non régression pour supporter plus d'architectures et réduire le test au minimum vital.
Maintenant, attendons que toutes ces PR soient mergées.

Prochaine étape : la mise à jour vers Python 3.8.

Jeudi 8 octobre

Finalement, il y avait encore de quoi bosser sur le test de non régression. Il n'était pas bien au point et nécessitait de jouer avec la variable d'environnement PATH, ce qui n'est pas chose aisée à faire en utilisant tox ou pytest. Pour rester simple, le binaire nécessaire est téléchargé depuis Travis-CI avant les tests et roule ma poule.
Sinon, pas d'autre avancée, les PR sont toujours en attente d'un mainteneur qui jette un œil.

Vendredi 9 octobre

Je viens de recevoir le MacBook Pro de test pour pouvoir installer la beta de Big Sur. Dès que je recevrai le chargeur, il servira de test réel pour voir où nous en sommes.

Samedi 10 octobre

Ah, ça avance du côté de PyInstaller ! Les PR #5208, #5230 et #5231 ont été mergées.
J'ai installé la beta de Big Sur sur la machine de test. La suite lundi.

Dimanche 11 octobre

Petite nouvelle qui ne sera pas sans conséquences : je fais maintenant parti de l'équipe de développement de PyInstaller !

Vendredi 16 octobre

En utilisant Python 3.8.6 et PyInstaller 4.1dev, Nuxeo Drive démarre depuis les sources. Pour ce faire j'ai du déclarer cette variable d'environnement :

export LDFLAGS="-L$(xcrun --show-sdk-path)/usr/lib"

Ceci dit, une version utilisant la même stack technique packagée depuis macOS Catalina ne fonctionne pas du tout sur Big Sur. Les processeurs montent à 100% d'utilisation mais rien ne fonctionne, comme s'il y avait une boucle infinie quelque part. Voici le rapport de diagnostic pour l'histoire.

Dimanche 18 octobre

J'ai revu le test de non régression suite à la demande d'un core dev. La nouvelle version est clairement plus concise.

Jeudi 12 novembre

Big Sur (11.0.1) est sorti !
Le patch CPython a été mergé, ce qui est un bon début. Il reste de quoi faire côté packaging, Qt, PyQt et PyInstaller pour pouvoir utiliser Big Sur comme OS de déploiement.

Lundi 16 novembre

En utilisant Python 3.8.6, une version de PyInstaller non officielle et ce patch de Rok, Nuxeo Drive démarre sur Big Sur ! Le patch en question est ultra simple.
→ Et hop ! Le commit qui va bien.

Ceci dit, il n'est pas encore possible d'utiliser ces versions de Python et PyInstaller dans l'immédiat car tant que #5232 n'est pas mergée, le support de GNU/Linux serait perdu.

Mercredi 18 novembre

J'ai pris la décision de temporairement perdre le support de GNU/Linux pour gagner celui de Big Sur. C'est un compromis que je n'aime pas mais qui fait sens au vu de nos utilisateurs (sur un an, GNU/Linux représente moins de 1%, contre 30% pour macOS).
J'ai donc mis à jour Nuxeo Drive pour utiliser PyInstaller 4.1 et Python 3.8.6. La version alpha de l'application qui sortira demain, soit jeudi 19 novembre, sera donc totalement fonctionnelle sur Big Sur.

Jeudi 19 novembre

Et voilà le contrat des 10 jours rempli ☺