Hardening consulting

Sortie d'accendino 0.6.2

Une nouvelle version d'accendino est sortie, la 0.6.2. Elle regroupe le travail cumulé depuis la 0.6.0 (qui avait introduit le support des toolchains et la compilation sous msys2), en passant par une 0.6.1 intermédiaire. Pour rappel accendino est un projet permettant de spécifier comment construire un logiciel et ses dépendances en multi-plateforme (au moins Windows, Linux, partiellement Mac, un peu FreeBSD), et de le builder en tirant parti au mieux des briques installables sur le système (si un package est dispo, on l'utilise, sinon on le build). Il essaye aussi de supporter au maximum MinGW pour pouvoir faire des cross-build pour windows sous Linux ou autre. Au menu des changements: la possibilité de construire avec toutes ses dépendances le projet wayvnc, le build de FreeRDP qui gagne en fonctionnalités pour suivre la branche master, et évidement plusieurs correctifs et améliorations.


Les nouveautés depuis la 0.6.0

Le build de FreeRDP s'enrichit

Plusieurs artefacts sont venus étoffer la construction de FreeRDP :

  • ajout du support de SDL3 et donc désormais par défaut est construit sdl-freerdp avec SDL3 comme backend graphique client ;
  • ajout de fido2, pour avoir la redirection de webauthn ;
  • ajout de libyuv qui est désormais utilisée par FreeRDP ;
  • tout un tas de libraries que j'utilise sur d'autres projets et que je voulais pouvoir construire facilement (spdlog, cpr, redis, ...)

Un nouveau venu : wayvnc

Un gros travail a été fait sur les fichiers accendino pour permettre de construire wayvnc, ainsi beaucoup de nouveaux fichiers .accendino ont aussi été ajoutés pour couvrir les dépendances nécessaires. Et aussi les fichiers existants ont été retravaillés car parmi les dépendances de wayvnc on doit avoir parmi les dernières versions de tout un tas de projets, et forcément même sur une Ubuntu 24.04 les versions livrées avec le système sont trop agées.

On avait donc besoin de pouvoir "forcer" le build d'une dépendance à partir des sources (et ce sans passer par un fichier d'options) à partir d'un autre fichier accendino. La nouvelle fonction stdBuildFromSourceTest(key: str, locals, defaultVal: bool) permet d'automatiser ce test: elle commence par regarder si la variable <key>_forceBuild existe (positionnée par un fichier accendino inclu précédement), elle regarde aussi si parmi le fichier d'options dans la section key on a l'entrée fromSources positionnée à vrai, et tout ceci permet ou non de forcer le build d'un artefact à partir des sources.

Par exemple le fichier wayland-protocols.accendino ressemble à ça:

wayland_protocols_fromSources = stdBuildFromSourceTest('wayland_protocols', locals(), False)
if wayland_protocols_fromSources:
    wayland_protocols_pkgDeps = {
        #UBUNTU_LIKE: ['libxcb-xkb-dev'],
    }

    ARTIFACTS += [
        MesonBuildArtifact('wayland-protocols', ['wayland-artifact'],
            stdGitSourceFromOptions('wayland-protocols', 'https://gitlab.freedesktop.org/wayland/wayland-protocols.git', 'main'),
            mesonOpts=[],
            pkgs=wayland_protocols_pkgDeps,
            provides=['wayland-protocols-artifact'],
            mesonVersion='latest'
        ),
    ]

else:
    wayland_protocols_pkgDeps = {
        UBUNTU_LIKE: ['wayland-protocols'],
        # REDHAT_LIKE: ['xkbcommon-devel'],
    }

    ARTIFACTS += [
        DepsBuildArtifact('wayland-protocols-artifact', [], pkgs=wayland_protocols_pkgDeps)
    ]

Et dans wlroots.accendino on a besoin d'une version moderne des wayland protocols sur Ubuntu quand c'est plus vieux que la 26.04 ce qui donnne:

...

if checkDistrib('<= Ubuntu 24'):
    wayland_protocols_forceBuild=True
include('wayland-protocols')

...

Petites fonctions bien utiles

  • stdGitSourceFromOptions : un raccourci pour créer une source git standard en tenant compte du fichier d'options, histoire de ne pas répéter le même code dans chaque fichier .accendino. Cela permet d'automatiser l'eventuel paramétrage de l'URL et du tag du repo git à partir du fichier d'options;
  • RemoteArchiveSource sait maintenant gérer les archives dont le contenu utile est stocké dans un sous-répertoire à extraire (utile pour libressl par exemple).

Robustesse et corrections

  • correction de la précédence des fichiers pkg-config : les paquets déployés par accendino dans son répertoire deploy sont désormais bien prioritaires sur ceux du système, ce qui évite de piocher la mauvaise version d'une lib ;
  • possibilité de spécifier la version de meson à utiliser, en effet pas mal de projets nécessitent des versions relativement récente de meson et il arrive que la version du système soit trop vieille ;
  • correction d'un bug dans la comparaison de versions ;
  • une correction du build de FreeRDP sous Ubuntu 22.04 : on doit builderlibcbor et fido2 car les versions livrées par le système sont trop vieilles;
  • tout un tas de correction pour MacOsX. Comme par exemple, la détection de la toolchain: elle était identifiée comme Gcc par défaut alors que cc/gcc
    sont en réalité des alias vers clang. On doit aussi forcer la construction de zlib à partir des sources sinon certain artefacts comme fido2 échouent car ils cherchent le fichier .pc qui n'est pas disponible sous Mac;

Nouvelles options en ligne de commande

Il m'arrive de me servir d'accendino en mode développement, je veux dire que je me sers d'accendino pour descendre un package et ses dépendances, et il m'arrive de modifier directement les sources, et donc il faut reconstruire.

Pour se simplifier la vie dans ce cas de figure j'ai rajouté 2 options en ligne de commande:

  • --refreshSources : qui force la mise à jour des sources git vers le bout de branche, et reconstruit les artefacts (et leurs dépendances)
    dont les sources ont effectivement changé. Pour les artefacts qui prennent leurs sources sur une branche de maintenance ou de développement cela permet de récupérer la dernière version et de reconstruire l'artefact et ses dépendants, alors qu'avant on devait faire ça à la main et aller effacer les fichiers de build stamps;
  • il y a aussi --refresh qui force la reconstruction des cibles demandées, même si elles ont déjà été construites. On peut se servir de ça pour développer dans les répertoires sources descendues par accendino;

Conclusion

Rien de révolutionnaire côté API par rapport à la 0.5.x, mais un bon lot de nouvelles pockets disponibles (SDL3, fido2, libyuv, wayvnc) et surtout des corrections qui rendent les builds plus fiables d'une distribution à l'autre. Ça devient très intéressant à utiliser.