<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Automatisation on Carnet de découvertes</title><link>https://fljd.in/tags/automatisation/</link><description>Recent content in Automatisation on Carnet de découvertes</description><generator>Hugo -- gohugo.io</generator><language>fr</language><managingEditor>Florent Jardin</managingEditor><lastBuildDate>Thu, 29 Sep 2022 00:00:00 +0000</lastBuildDate><atom:link href="https://fljd.in/tags/automatisation/index.xml" rel="self" type="application/rss+xml"/><item><title>Construire PostgreSQL avec Meson</title><link>https://fljd.in/2022/09/29/construire-postgresql-avec-meson/</link><pubDate>Thu, 29 Sep 2022 00:00:00 +0000</pubDate><author>Florent Jardin</author><guid>https://fljd.in/2022/09/29/construire-postgresql-avec-meson/</guid><description>&lt;p&gt;Alors que la version 15 de PostgreSQL se prépare à sortir dans les &lt;a href="https://www.postgresql.org/about/news/postgresql-15-rc-1-released-2516/" target="_blank" rel="noopener"&gt;prochains
jours&lt;/a&gt;, le groupe de développement du projet communautaire ont intégré &lt;a href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=e6927270cd18d535b77cbe79c55c6584351524be" target="_blank" rel="noopener"&gt;leurs
récents travaux&lt;/a&gt; pour accélérer les tâches d&amp;rsquo;automatisation et de compilation
à l&amp;rsquo;aide du système de construction &lt;a href="https://mesonbuild.com/" target="_blank" rel="noopener"&gt;Meson&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ce chantier n&amp;rsquo;est pas anodin et redessine les contours de l&amp;rsquo;écosystème du moteur
de bases de données open-source le plus avancé au monde. Depuis sa forme libre
publiée en 1998, PostgreSQL repose sur des solutions robustes et éprouvées, mais
de plus en plus complexes à maintenir pour les nouvelles générations de
contributeur·rices. En proposant de se tourner vers un logiciel comme Meson, ces
amoureux et amoureuses du libre se tournent résolument vers l&amp;rsquo;avenir.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://fljd.in/img/fr/2022-09-29-andres-freund-e692323.png" alt="patch"&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="en-finir-avec-autoconf"&gt;En finir avec autoconf&lt;/h2&gt;
&lt;p&gt;Un système de construction ou &lt;em&gt;build system&lt;/em&gt; (ne vous y trompez pas, j&amp;rsquo;ai une
préférence pour la dénomination anglaise) est un ensemble d&amp;rsquo;instructions dans
une syntaxe qui lui est propre, qui facilite la compilation d&amp;rsquo;un logiciel. Les
ramifications d&amp;rsquo;un projet, les dépendances et les librairies ou tout simplement
l&amp;rsquo;outillage interne, deviennent inexorablement la rançon d&amp;rsquo;une complexité après
plusieurs décennies d&amp;rsquo;existence.&lt;/p&gt;
&lt;p&gt;Le système le plus répandu est sans conteste &lt;a href="https://en.wikipedia.org/wiki/Make_%28software%29" target="_blank" rel="noopener"&gt;Make&lt;/a&gt; et son fichier déclaratif
&lt;em&gt;Makefile&lt;/em&gt; qui contiendra les instructions de compilation. Son principe absolu
consiste à transformer un fichier source (le code) en un autre fichier cible (le
binaire). Dans un projet minimaliste, le &lt;em&gt;Makefile&lt;/em&gt; suivant permet de générer le
binaire &lt;code&gt;foo&lt;/code&gt; si le code source &lt;code&gt;foo.c&lt;/code&gt; ou son en-tête &lt;code&gt;foo.h&lt;/code&gt; contiennent des
nouveautés.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-make" data-lang="make"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# ./Makefile
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gcc
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CFLAGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;-I.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;foo&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;.&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;foo&lt;/span&gt;.&lt;span class="n"&gt;h&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;$(&lt;/span&gt;CC&lt;span class="k"&gt;)&lt;/span&gt; -o foo foo.c
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;À l&amp;rsquo;appel de la commande &lt;code&gt;make&lt;/code&gt; à la racine du projet, le fichier &lt;em&gt;Makefile&lt;/em&gt;
sera parcouru pour détecter les cibles du projet et suivre les instructions
selon les règles qui y sont renseignées pour construire les fichiers binaires.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://fljd.in/img/fr/2022-09-29-makefile-workflow.png" alt="Compilation par Makefile"&gt;&lt;/p&gt;
&lt;p&gt;Une &lt;a href="https://en.wikipedia.org/wiki/List_of_build_automation_software#Build_script_generation" target="_blank" rel="noopener"&gt;pratique plus sophistiquée&lt;/a&gt; propose de générer ces instructions dans un
format compatible avec le système de construction, lorsque celles-ci sont
nombreuses, évolutives voire dépendantes d&amp;rsquo;un contexte ou d&amp;rsquo;un environnement tel
que le système d&amp;rsquo;exploitation ou l&amp;rsquo;utilisation d&amp;rsquo;une option spécifique.&lt;/p&gt;
&lt;p&gt;Dans le cas du projet PostgreSQL, c&amp;rsquo;est la suite &lt;a href="https://en.wikipedia.org/wiki/GNU_Autotools" target="_blank" rel="noopener"&gt;GNU Autotools&lt;/a&gt; qui a été
partiellement retenue pour faciliter la création des binaires sur un ensemble de
systèmes compatibles Unix. La génération repose sur les composants &lt;em&gt;Autoconf&lt;/em&gt;
(fichier &lt;code&gt;configure.ac&lt;/code&gt;) et &lt;em&gt;Automake&lt;/em&gt; (fichier &lt;code&gt;Makefile.am&lt;/code&gt;) pour aboutir au
même résultat que la commande &lt;code&gt;make&lt;/code&gt; de notre précédent exemple. Dans les faits,
seul le premier composant est véritablement employé pour préparer le script
&lt;code&gt;configure&lt;/code&gt; lors de la compilation de PostgreSQL.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://fljd.in/img/fr/2022-09-29-autotools-workflow.png" alt="Génération avec Autotools"&gt;&lt;/p&gt;
&lt;p&gt;Comme le montre le diagramme ci-dessus, les étapes avant d&amp;rsquo;obtenir le fichier
binaire sont un peu plus nombreuses, et dépendent d&amp;rsquo;un ensemble de fichiers
d&amp;rsquo;instructions qui deviennent complexes à rédiger sans introduire d&amp;rsquo;incohérences
ou de bogues.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est d&amp;rsquo;ailleurs l&amp;rsquo;un des constats de la communauté qui, depuis fin 2021, a
questionné la possibilité de passer sur un autre système de construction.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Autoconf is showing its age, fewer and fewer contributors know how to wrangle
it. Recursive make has a lot of hard to resolve dependency issues and slow
incremental rebuilds.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Le principal moteur de la réflexion, Andres Freund, annonçait dans un
&lt;a href="https://www.postgresql.org/message-id/20211012083721.hvixq4pnh2pixr3j%40alap3.anarazel.de" target="_blank" rel="noopener"&gt;message&lt;/a&gt; sur &lt;em&gt;pgsql-hackers&lt;/em&gt; qu&amp;rsquo;il observait de bien meilleures performances
avec une alternative bien plus moderne. Il y énonçait par ailleurs ses arguments
pour en finir avec &lt;em&gt;Autoconf&lt;/em&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;« &lt;em&gt;Autoconf&lt;/em&gt; et &lt;em&gt;make&lt;/em&gt; ne sont plus activement maintenus. Notamment &lt;em&gt;autoconf&lt;/em&gt;
qui reçoit à peine quelques correctifs mineurs. C&amp;rsquo;est également des
technologies que peu de monde veut utiliser &amp;ndash; m4 d&amp;rsquo;autoconf est effrayant et
effraie les personnes qui démarrent bien plus récemment que nous autres, les
&lt;em&gt;committers&lt;/em&gt; » ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;« &lt;em&gt;make&lt;/em&gt; en mode récursif comme nous l&amp;rsquo;utilisons n&amp;rsquo;est pas aussi bien employé
que ce qu&amp;rsquo;il devrait être. L&amp;rsquo;une des raisons pour laquelle le nettoyage du
&lt;em&gt;build&lt;/em&gt; est si lent est que nous devons retrouver les dépendances dans un
paquet d&amp;rsquo;endroits. En malgré cela, il m&amp;rsquo;arrive régulièrement de voir des
&lt;em&gt;builds&lt;/em&gt; incrémentaux échouer et nécessitant un nouveau &lt;em&gt;rebuild&lt;/em&gt; » ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;« Et nous n&amp;rsquo;avons pas uniquement un système de &lt;em&gt;build&lt;/em&gt; basé sur &lt;em&gt;autoconf&lt;/em&gt; et
&lt;em&gt;make&lt;/em&gt;, il y a surtout le projet de génération MSVC (&lt;em&gt;Microsoft Visual C++&lt;/em&gt;)
&amp;ndash; ce machin que la plupart d&amp;rsquo;entre nous ne veut pas toucher. Je pense qu&amp;rsquo;en
plus du fait qu&amp;rsquo;il n&amp;rsquo;y est pas facile de dérouler tous les tests, ce système
est juste tout simplement différent de l&amp;rsquo;autre, ce qui ne favorise pas l&amp;rsquo;intérêt
des développeurs sous Windows (et indirectement, la qualité de PostgreSQL sur
Windows) » ;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;« Le dernier gros problème que je vois avec la situation actuelle est qu&amp;rsquo;il
n&amp;rsquo;y a aucun bon test d&amp;rsquo;intégration. Le résultat de &lt;code&gt;make check-world&lt;/code&gt; est très
majoritairement illisible et impossible à analyser automatiquement. Ce qui
impose à la &lt;em&gt;&lt;a href="https://buildfarm.postgresql.org/cgi-bin/show_status.pl" target="_blank" rel="noopener"&gt;buildfarm&lt;/a&gt;&lt;/em&gt; de traiter les tests séparément afin que les
erreurs puissent être repérées et tracées correctement. Cette approche n&amp;rsquo;est
malheureusement pas adaptée aux processeurs multicœurs et ralentit considérablement
l&amp;rsquo;ensemble des serveurs ».&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="meson-une-alternative-moderne"&gt;Meson, une alternative moderne&lt;/h2&gt;
&lt;p&gt;À l&amp;rsquo;image des &lt;em&gt;Autotools&lt;/em&gt;, &lt;a href="https://mesonbuild.com/" target="_blank" rel="noopener"&gt;Meson&lt;/a&gt; est un système qui génère les instructions
de compilation. Ce fut le choix qu&amp;rsquo;a proposé Andres Freund à la communauté après
l&amp;rsquo;avoir analysé aux côtés de &lt;a href="https://cmake.org/cmake/help/book/mastering-cmake/chapter/Why%20CMake.html#" target="_blank" rel="noopener"&gt;CMake&lt;/a&gt; et &lt;a href="https://bazel.build/about/vision" target="_blank" rel="noopener"&gt;Bazel&lt;/a&gt;, deux autres compétiteurs
bien connus du monde libre. Meson est écrit en Python et son but premier est de
réduire la part d&amp;rsquo;efforts des développeurs dans la rédaction d&amp;rsquo;instructions au
profit d&amp;rsquo;une plus grande productivité sur le logiciel en tant que tel.&lt;/p&gt;
&lt;p&gt;Le projet Meson s&amp;rsquo;appuie sur un système de construction bas niveau appelé
&lt;a href="https://ninja-build.org/" target="_blank" rel="noopener"&gt;ninja&lt;/a&gt; qui se veut, d&amp;rsquo;après son auteur &lt;a href="https://neugierig.org/software/chromium/notes/2011/02/ninja.html" target="_blank" rel="noopener"&gt;Evan Martin&lt;/a&gt;, être minimaliste
et bien plus performant que &lt;code&gt;make&lt;/code&gt;. Les instructions de compilation sont
renseignées automatiquement par Meson dans le fichier &lt;code&gt;build.ninja&lt;/code&gt; qui sera
ensuite parcouru par la commande &lt;code&gt;ninja&lt;/code&gt; pour compiler les sources en un fichier
binaire.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://fljd.in/img/fr/2022-09-29-meson-workflow.png" alt="Génération avec Meson"&gt;&lt;/p&gt;
&lt;p&gt;Pour reprendre mon projet minimaliste &lt;code&gt;foo&lt;/code&gt;, le fichier &lt;em&gt;Makefile&lt;/em&gt; est remplacé
par le fichier &lt;code&gt;meson.build&lt;/code&gt;, en y renseignant les méta-données du projet, le
point d&amp;rsquo;entrée du programme et le fichier binaire souhaité.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-rb" data-lang="rb"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ./meson.build&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;foo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;executable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;foo&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;foo.c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Meson est un jeune projet, dont la première sortie date de 2013. Bien qu&amp;rsquo;il
rougît de son âge face à CMake, il n&amp;rsquo;en reste pas moins un concurrent qui ne
cesse de &lt;a href="https://gms.tf/the-rise-of-meson.html" target="_blank" rel="noopener"&gt;gagner du terrain&lt;/a&gt; depuis la dernière décennie. Parmi les
&lt;a href="https://mesonbuild.com/Users.html" target="_blank" rel="noopener"&gt;projets&lt;/a&gt; qui s&amp;rsquo;appuient désormais sur Meson, je peux citer de très connus
comme : &lt;code&gt;systemd&lt;/code&gt;, Gnome et GTK+, QEMU, Xorg et Wayland&amp;hellip; De quoi se parer
d&amp;rsquo;une forte communauté d&amp;rsquo;utilisateurs dans les prochaines années !&lt;/p&gt;
&lt;p&gt;Sur la page « &lt;a href="https://mesonbuild.com/Use-of-Python.html" target="_blank" rel="noopener"&gt;Use of Python&lt;/a&gt; » du projet, les créateurs de Meson se
défendent d&amp;rsquo;un reproche souvent adressé aux technologies modernes et affirment
ne reposer que sur &lt;code&gt;python3&lt;/code&gt; tout en interdisant l&amp;rsquo;usage de modules externes,
en gages de qualité et de compatibilité. Ainsi, le projet se veut accessible
pour tous les systèmes d&amp;rsquo;exploitation, faisait un pied de nez au mastodonte
&lt;em&gt;Autotools&lt;/em&gt; qui était très couplé au &lt;em&gt;shell&lt;/em&gt; Unix dans son implémentation.&lt;/p&gt;
&lt;p&gt;La décision pour le projet PostgreSQL de progressivement glisser vers Meson est
le fruit de plusieurs mois de réflexion, avec pour ambition notamment de se
passer du système &lt;a href="https://github.com/postgres/postgres/tree/master/src/tools/msvc" target="_blank" rel="noopener"&gt;MSVC&lt;/a&gt;, un ensemble de scripts Perl maison maintenus par
une poignée de personnes pour compiler le logiciel sous Windows. En prime, les
travaux d&amp;rsquo;Andres démontrent un gain significatif dans les temps de &lt;em&gt;build&lt;/em&gt;, ce
qui ne paraît pas surprenant au regard du &lt;em&gt;&lt;a href="https://mesonbuild.com/ARM-performance-test.html" target="_blank" rel="noopener"&gt;benchmark&lt;/a&gt;&lt;/em&gt; entre les deux
systèmes sur une architecture ARM.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://fljd.in/img/fr/2022-09-29-meson-autotools-benchmark-conf.png" alt="Benchmark sur le temps de configuration"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://fljd.in/img/fr/2022-09-29-meson-autotools-benchmark-build.png" alt="Benchmark sur le temps de configuration"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In any case, using Autotools for a modern C/C++ project in 2021 is like using
CVS for source code version control in 2021: there are better tools available
and thus it isn&amp;rsquo;t very interesting to still consider the legacy solutions.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Citation de &lt;a href="https://gms.tf/the-rise-of-meson.html" target="_blank" rel="noopener"&gt;Georg Sauthoff, The Rise of Meson&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;La route empruntée semble la bonne, bien que le chemin soit encore long pour se
débarrasser définitivement des résidus historiques d&amp;rsquo;&lt;em&gt;Autoconf&lt;/em&gt; dans le projet
PostgreSQL. Lors de la dernière &lt;em&gt;&lt;a href="https://wiki.postgresql.org/wiki/PgCon_2022_Developer_Unconference#Meson_new_build_system_proposal" target="_blank" rel="noopener"&gt;Developer Unconference&lt;/a&gt;&lt;/em&gt; qui s&amp;rsquo;est tenue
en ligne le 25 mai 2022 lors de l&amp;rsquo;événement annuel du PgCon, les membres de la
communauté ont statué sur les efforts à fournir pour porter ce chantier
titanesque.&lt;/p&gt;
&lt;p&gt;Avec ce récent &lt;a href="https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=e6927270cd18d535b77cbe79c55c6584351524be" target="_blank" rel="noopener"&gt;patch&lt;/a&gt; rattaché à présent à la branche &lt;em&gt;master&lt;/em&gt;, la
construction des binaires sur la plupart des systèmes d&amp;rsquo;exploitation est
implémentée, avec notamment la compilation de PostgreSQL sur Windows à travers
&lt;code&gt;ninja&lt;/code&gt;. C&amp;rsquo;est une première pierre qui est posée pour la prochaine version 16 en
cours de développement et l&amp;rsquo;émergence d&amp;rsquo;une architecture qui grandira avec
d&amp;rsquo;autres améliorations dans un avenir proche.&lt;/p&gt;</description></item></channel></rss>