<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Florian RICHER</title><link>https://mrdev023.fr/</link><description>Recent content on Florian RICHER</description><generator>Hugo -- gohugo.io</generator><language>fr</language><atom:link href="https://mrdev023.fr/index.xml" rel="self" type="application/rss+xml"/><item><title>My first participation in a KDE PIM Sprint</title><link>https://mrdev023.fr/p/kde-sprint-pim-2025/</link><pubDate>Mon, 15 Dec 2025 00:00:00 +0000</pubDate><guid>https://mrdev023.fr/p/kde-sprint-pim-2025/</guid><description>&lt;h1 id="my-first-participation-in-a-kde-sprint"&gt;My First Participation in a KDE Sprint
&lt;/h1&gt;&lt;p&gt;During Akademy 2025 in Berlin, I signed up for the KDE PIM Sprint. While I had never worked on PIM before, I had contributed to Plasma Mobile, Koko (for OCR implementation, still a work in progress), and Solid (for LED implementation). This was also my first time participating in a KDE Sprint.&lt;/p&gt;
&lt;p&gt;I arrived by train from Limoges to Paris at 10:30 PM on Friday. Unfortunately, I couldn&amp;rsquo;t arrive earlier due to professional commitments, and I had to leave again on Sunday at 5:30 PM.&lt;/p&gt;
&lt;h2 id="starting-the-sprint"&gt;Starting the Sprint
&lt;/h2&gt;&lt;p&gt;On Saturday morning, I joined everyone for breakfast. Afterward, we had meetings throughout the morning and part of the afternoon. In parallel, I compiled &lt;strong&gt;Merkuro&lt;/strong&gt; and &lt;strong&gt;KMail&lt;/strong&gt; on my laptop. Normally, I work on my desktop computer, so I needed to compile all the KDE packages on my laptop, which isn&amp;rsquo;t very powerful. Luckily, I had started the compilation process on the train.&lt;/p&gt;
&lt;p&gt;Once the meetings were over, I began working on PIM projects. My first task was to read the codebase to understand the various packages related to &lt;strong&gt;Merkuro&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="understanding-merkuro"&gt;Understanding Merkuro
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Merkuro&lt;/strong&gt; relies on components from &lt;strong&gt;Akonadi&lt;/strong&gt;, &lt;strong&gt;KMailTransport&lt;/strong&gt;, &lt;strong&gt;KDE PIM Runtime&lt;/strong&gt;, and &lt;strong&gt;KIdentityManagement&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;However, I encountered an issue with &lt;strong&gt;distrobox&lt;/strong&gt;: when Carl and I tried to configure an IMAP account in Merkuro Mail, the password was never saved. After some investigation, I discovered that this was related to &lt;strong&gt;KWallet&lt;/strong&gt; and &lt;strong&gt;KSecrets&lt;/strong&gt;. Since &lt;strong&gt;distrobox&lt;/strong&gt; doesn&amp;rsquo;t use the Plasma Desktop environment by default, many &amp;ldquo;basic&amp;rdquo; KDE services aren&amp;rsquo;t running in the background.&lt;/p&gt;
&lt;p&gt;To fix this, I had to run the following commands:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/kde/build/kwallet/prefix.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ksecretd &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kwalletd6 &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;wait&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;After that, I successfully configured my first IMAP account in &lt;strong&gt;KMail&lt;/strong&gt; and &lt;strong&gt;Merkuro&lt;/strong&gt;, and I was able to retrieve all my emails from Proton Mail.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The IMAP accounts in &lt;strong&gt;KMail&lt;/strong&gt; and &lt;strong&gt;Merkuro&lt;/strong&gt; are synchronized because both use &lt;strong&gt;KIdentityManagement&lt;/strong&gt; and &lt;strong&gt;KMailTransport&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="contributions"&gt;Contributions
&lt;/h2&gt;&lt;p&gt;I also opened a small merge request based on Carl&amp;rsquo;s recommendation regarding the unnecessary use of &lt;code&gt;Layout.fillWidth: true&lt;/code&gt; (&lt;a class="link" href="https://invent.kde.org/pim/merkuro/-/merge_requests/595" target="_blank" rel="noopener"
&gt;MR #595&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Next, I tried to add a new identity in &lt;strong&gt;Merkuro&lt;/strong&gt;, but it wasn&amp;rsquo;t saved. This time, the issue wasn&amp;rsquo;t related to &lt;strong&gt;KWallet&lt;/strong&gt;. Instead, it was because when the identity was passed as a property to the component, it was copied. So, when I modified the identity, it only modified the copy, not the &amp;ldquo;main&amp;rdquo; identity reference itself. This happened because &lt;strong&gt;Identity&lt;/strong&gt; is a &lt;strong&gt;QGadget&lt;/strong&gt; type, not a &lt;strong&gt;QObject&lt;/strong&gt; see the definition &lt;a class="link" href="https://invent.kde.org/pim/kidentitymanagement/-/blob/037e26915ea0deb0c61e17196d6f5147aa2e0cf7/src/core/identity.h#L78" target="_blank" rel="noopener"
&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To fix this, I changed the property type to the backend type. I could then access the current identity using &lt;code&gt;backend.identity&lt;/code&gt;. I updated all occurrences in the code and opened the following merge requests:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://invent.kde.org/pim/kidentitymanagement/-/merge_requests/38" target="_blank" rel="noopener"
&gt;MR #38&lt;/a&gt; to fix the Cryptography component.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://invent.kde.org/pim/kidentitymanagement/-/merge_requests/40" target="_blank" rel="noopener"
&gt;MR #40&lt;/a&gt; to fix the remaining identity information.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Finally, I started investigating why I didn&amp;rsquo;t receive any errors when trying to add an IMAP account related to &lt;strong&gt;KSecrets&lt;/strong&gt;. It seems to be managed &lt;a class="link" href="https://invent.kde.org/pim/kmailtransport/-/blob/89b0b266c3b7275fb2f651401987fca9dfe90311/src/transport.cpp#L210" target="_blank" rel="noopener"
&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I left the Sprint having started work on the &lt;strong&gt;&amp;ldquo;Add an Identity&amp;rdquo; feature&lt;/strong&gt;, which you can follow &lt;a class="link" href="https://invent.kde.org/pim/kidentitymanagement/-/tree/work/florianricher/add-identity?ref_type=heads" target="_blank" rel="noopener"
&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;I really enjoyed participating in the KDE Sprint. It was wonderful to catch up with Carl again. I&amp;rsquo;m truly grateful for the time he took to help me get up to speed with the project.
The discussions with Laurent were also incredibly engaging, and even my brief conversation with Ingo was meaningful, though I still struggle a bit with spoken communication.&lt;/p&gt;
&lt;p&gt;Once I&amp;rsquo;m less busy personally, I plan to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Migrating the &lt;strong&gt;Waydroid implementation&lt;/strong&gt; to &lt;strong&gt;Plasma Workspace&lt;/strong&gt;, as discussed with Carl.&lt;/li&gt;
&lt;li&gt;Continuing my contributions to &lt;strong&gt;PIM&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Helping out with &lt;strong&gt;KAIChat&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Looking forward to the next opportunity to collaborate with the KDE community!&lt;/p&gt;
&lt;h2 id="useful-links"&gt;Useful links
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://planet.kde.org/volker-krause-2025-12-20-kde-pim-sprint-2025-in-paris/" target="_blank" rel="noopener"
&gt;Official KDE PIM Sprint 2025 Blog post&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Gitlab projects:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://invent.kde.org/pim/merkuro" target="_blank" rel="noopener"
&gt;Merkuro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://invent.kde.org/pim/kmailtransport" target="_blank" rel="noopener"
&gt;KMailTransport&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://invent.kde.org/pim/kidentitymanagement" target="_blank" rel="noopener"
&gt;KIdentityManagement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://invent.kde.org/pim/kdepim-runtime" target="_blank" rel="noopener"
&gt;KDE PIM Runtime&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://invent.kde.org/pim/kmail" target="_blank" rel="noopener"
&gt;KMail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://invent.kde.org/utilities/kaichat" target="_blank" rel="noopener"
&gt;KAIChat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://invent.kde.org/frameworks/kwallet" target="_blank" rel="noopener"
&gt;KWallet &amp;amp; KSecret&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Configurer kde-builder sur des bases immuables et lancer un projet KDE</title><link>https://mrdev023.fr/p/kdedev_on_immuable/</link><pubDate>Sun, 06 Oct 2024 00:00:00 +0000</pubDate><guid>https://mrdev023.fr/p/kdedev_on_immuable/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Les systèmes d&amp;rsquo;exploitation à base immuable, tels que NixOS ou Fedora Atomic, offrent de nombreux avantages en termes de stabilité et de sécurité. Cependant, ils présentent également des défis uniques pour les développeurs, notamment lorsqu&amp;rsquo;il s&amp;rsquo;agit de configurer des environnements de développement comme kde-builder. Dans ce post, nous explorerons comment surmonter ces obstacles en utilisant des outils comme distrobox ou toolbox, permettant ainsi aux développeurs de profiter des avantages des systèmes immuables tout en conservant la flexibilité nécessaire pour travailler efficacement avec kde-builder.&lt;/p&gt;
&lt;h2 id="préparer-son-environnement"&gt;Préparer son environnement
&lt;/h2&gt;&lt;h3 id="introduction-1"&gt;Introduction
&lt;/h3&gt;&lt;p&gt;La préparation de l&amp;rsquo;environnement de développement est essentielle pour utiliser kde-builder sur des systèmes immuables. Les outils et étapes varient selon la distribution : Fedora Atomic intègre toolbox, facilitant le processus, tandis que NixOS nécessite la configuration manuelle de distrobox.
Je vais donc dans un premier temps expliquer comment installer distrobox sur NixOS. Ensuite, je finirais par la configuration générale pour Fedora Atomic et aussi pour Nix OS.&lt;/p&gt;
&lt;h3 id="installation-de-distrobox-sur-nix-os"&gt;Installation de distrobox sur Nix OS
&lt;/h3&gt;&lt;p&gt;Pour installer distrobox, il suffit de rajouter dans sa configuration &lt;code&gt;configuration.nix&lt;/code&gt; ou dans son &lt;code&gt;flake&lt;/code&gt; la configuration suivante:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nix" data-lang="nix"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Active docker&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;virtualisation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt; &lt;span class="o"&gt;=&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;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;true&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="p"&gt;};&lt;/span&gt;
&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="c1"&gt;# Rajoute l&amp;#39;utilisateur au group docker pour éviter d&amp;#39;utiliser la commande sudo tout le temps.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Par contre, ça rajoute un risque d&amp;#39;élévation de privilège sur le système&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Voir le warning ici https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="sr"&gt;&amp;lt;user&amp;gt;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extraGroups&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;docker&amp;#34;&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# On peut aussi l&amp;#39;ajouter en rootless&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;virtualisation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rootless&lt;/span&gt; &lt;span class="o"&gt;=&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;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;true&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="c1"&gt;# L&amp;#39;option setSocketVariable définit la variable DOCKER_HOST pour l&amp;#39;instance Docker rootless pour les utilisateurs normaux par défaut.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;setSocketVariable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;true&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="p"&gt;};&lt;/span&gt;
&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="c1"&gt;# Si vous souhaitez utiliser podman à la place&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;virtualisation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;containers&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;true&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;virtualisation&lt;/span&gt; &lt;span class="o"&gt;=&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;podman&lt;/span&gt; &lt;span class="o"&gt;=&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;enable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;true&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Ajoute l&amp;#39;alias `docker` pour une utilisation plus transparente avec les outils compatibles docker seulement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dockerCompat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;true&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Nécessaire pour que les conteneurs sous podman-compose puissent communiquer entre eux.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;defaultNetwork&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dns_enabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;true&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="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# On rajoute distrobox&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;systemPackages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;distrobox&lt;/span&gt; &lt;span class="p"&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Une fois la configuration ajouté, il suffit de taper la commande:&lt;/p&gt;
&lt;p&gt;Sans flake&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nix" data-lang="nix"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;nixos-rebuild&lt;/span&gt; &lt;span class="n"&gt;switch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Avec flake&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nix" data-lang="nix"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;nixos-rebuild&lt;/span&gt; &lt;span class="n"&gt;switch&lt;/span&gt; &lt;span class="err"&gt;--&lt;/span&gt;&lt;span class="n"&gt;flake&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="n"&gt;du&lt;/span&gt; &lt;span class="n"&gt;flake&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="c1"&gt;#[nom de la configuraiton]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Normalement, vous devriez avoir la commande &lt;code&gt;distrobox&lt;/code&gt; de disponible. Si c&amp;rsquo;est le cas, vous pouvez allez à &lt;a class="link" href="#test-de-notre-environnement" &gt;cette étape&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="création-du-container-pour-travailler"&gt;Création du container pour travailler
&lt;/h2&gt;&lt;h3 id="nixos-distrobox"&gt;NixOS Distrobox
&lt;/h3&gt;&lt;p&gt;Pour créer le container avec distrobox, on peut passer par ce fichier &lt;code&gt;distrobox.ini&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;; Nom de notre environnement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;[kdedev]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;quay.io/fedora/fedora:latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;; Change le home directory si vous souhaitez isoler votre environnement de travail de votre home directory host&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;home&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;${HOME}/.distrobox_home/kdedev&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;; Uniquement si vous possedez une carte NVIDIA. Distrobox va intégrer des patchs pour mieux gérer les intégrations avec NVIDIA.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;nvidia&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;; Si vous souhaitez faire une image rootless&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;; Pull l&amp;#39;image durant la création de l&amp;#39;environnement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;pull&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ensuite, il suffit de taper la commande pour créer notre environnement nommé &lt;code&gt;kdedev&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;distrobox assemble create
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Une fois l&amp;rsquo;environnement créer, il reste une dernière étape à faire.
Je recommande de rajouter ceci dans votre &lt;code&gt;~/.bashrc&lt;/code&gt; ou dans le &lt;code&gt;bashrc&lt;/code&gt; situé dans le container configuré avec &lt;code&gt;home&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;new_shell&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;env -u PATH -u QML2_IMPORT_PATH -u QT_PLUGIN_PATH -u NIXPKGS_QT6_QML_IMPORT_PATH -u XDG_CONFIG_DIRS bash -l&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Vous pouvez l&amp;rsquo;éditer plus facilement en allant dans votre environnement de travail avec:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;distrobox enter kdedev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Cet alias peut-être utile pour retirer les variables d&amp;rsquo;environnements que rajoute NixOS. Sur Fedora Atomic, ça ne pose pas de problème, car ils respectent la FHS donc les librairies pointent au même endroit que dans le container. Sauf que Nix OS ne respecte pas la FHS (pour de bonnes raisons), donc on peut avoir des conflits lors de la compilation ou de l&amp;rsquo;exécution de programme que l&amp;rsquo;on aura compilé avec &lt;code&gt;kde-builder&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;La FHS est une structure de fichier normalisé dans le monde Linux &lt;a class="link" href="https://fr.wikipedia.org/wiki/Filesystem_Hierarchy_Standard" target="_blank" rel="noopener"
&gt;plus d&amp;rsquo;info ici&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pour l&amp;rsquo;utiliser, une fois dans votre environnement de travail, il suffit de faire:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;distrobox enter kdedev &lt;span class="c1"&gt;# Pour rentrer dans votre environnement de travail&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;new_shell
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="fedora-toolbox"&gt;Fedora Toolbox
&lt;/h3&gt;&lt;p&gt;Pour la configuration avec Fedora Toolbox, c&amp;rsquo;est assez simple, car Fedora intègre tout par défaut. Il suffit de taper la commande:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;toolbox create -r &lt;span class="o"&gt;[&lt;/span&gt;numéro de release fedora&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;nom de l&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;environnement&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Dans notre cas, ça sera:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;toolbox create -r &lt;span class="m"&gt;40&lt;/span&gt; kdedev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: À l&amp;rsquo;heure ou j&amp;rsquo;écris le post, j&amp;rsquo;ai encore des soucis pour lancer &lt;code&gt;kwin&lt;/code&gt; avec Fedora Toolbox. J&amp;rsquo;ai des problèmes de permission sur les DRM. Je pense que c&amp;rsquo;est lié à &lt;code&gt;selinux&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;obtiens l&amp;rsquo;erreur ci-dessous lors du lancement de &lt;code&gt;kwin_wayland&lt;/code&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;KMS: DRM_IOCTL_MODE_CREATE_DUMB failed: Permission denied
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;DRM : C&amp;rsquo;est Direct Rendering Manager et non Digital Rights Management &lt;a class="link" href="https://en.wikipedia.org/wiki/Direct_Rendering_Manager" target="_blank" rel="noopener"
&gt;pour plus d&amp;rsquo;infos&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="test-de-notre-environnement"&gt;Test de notre environnement
&lt;/h2&gt;&lt;p&gt;Avant de lancer notre test, il faut installer &lt;code&gt;kde-builder&lt;/code&gt;. Vous pouvez voir mon post précédent &lt;a class="link" href="https://mrdev023.fr/p/kde-first-contrib/#ma-configuration" &gt;ici&lt;/a&gt; ou vous pouvez suivre ce &lt;a class="link" href="https://kde-builder.kde.org/en/getting-started/before-building.html#install-kde-builder" target="_blank" rel="noopener"
&gt;lien&lt;/a&gt; qui est le même que dans le post.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rappel&lt;/strong&gt; Il faut l&amp;rsquo;installer dans votre environnement créé juste avant.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;distrobox enter kdedev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;NixOS Distrobox&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;toolbox enter kdedev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Fedora Toolbox&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Une fois votre environnement configurer, normalement vous pouvez tester de compiler &lt;code&gt;solid&lt;/code&gt; avec la commande :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kde-builder solid
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Puis de lancer solid avec la commande:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/kde/build/solid/prefix.sh&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; solid-hardware6 list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Voilà 🙂 Normalement vous êtes prêt à travailler sur KDE avec un système immuable.&lt;/p&gt;
&lt;h2 id="note-pour-le-démarrage-de-kde-plasma-mobile"&gt;Note pour le démarrage de KDE Plasma Mobile
&lt;/h2&gt;&lt;p&gt;Pour plasma-mobile, il est nécessaire de configurer d&amp;rsquo;autres variables d&amp;rsquo;environnements. Voici le script que j&amp;rsquo;utilise :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/kde/build/plasma-mobile/prefix.sh&amp;#34;&lt;/span&gt;
&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="nv"&gt;QT_QPA_PLATFORM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;offscreen plasma-mobile-envmanager --apply-settings
&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="c1"&gt;# Environment variables&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;QT_WAYLAND_DISABLE_WINDOWDECORATION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;QT_QUICK_CONTROLS_MOBILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PLASMA_PLATFORM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;phone:handheld
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;QT_QUICK_CONTROLS_STYLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;org.kde.breeze
&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="nv"&gt;QT_QPA_PLATFORM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;wayland dbus-run-session kwin_wayland --xwayland &lt;span class="s2"&gt;&amp;#34;plasmashell -p org.kde.plasma.mobileshell&amp;#34;&lt;/span&gt; --width &lt;span class="m"&gt;360&lt;/span&gt; --height &lt;span class="m"&gt;720&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;a class="link" href="https://invent.kde.org/plasma/plasma-mobile/-/wikis/Building-and-Testing-Locally#running-the-shell-in-a-window" target="_blank" rel="noopener"
&gt;Source&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Vous pouvez aussi lancer le menu du haut sans lancer tout &lt;code&gt;kwin&lt;/code&gt; avec le script :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/kde/build/plasma-mobile/prefix.sh&amp;#34;&lt;/span&gt;
&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="nv"&gt;QT_QPA_PLATFORM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;offscreen plasma-mobile-envmanager --apply-settings
&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="c1"&gt;# Environment variables&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;QT_WAYLAND_DISABLE_WINDOWDECORATION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;QT_QUICK_CONTROLS_MOBILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PLASMA_PLATFORM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;phone:handheld
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;QT_QUICK_CONTROLS_STYLE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;org.kde.breeze
&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;qmlscene-qt6 &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/kde/src/plasma-mobile/tests/ActionDrawerTest.qml&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description></item><item><title>Découverte de Nix et de Flake</title><link>https://mrdev023.fr/p/nix-flake/</link><pubDate>Fri, 04 Oct 2024 00:00:00 +0000</pubDate><guid>https://mrdev023.fr/p/nix-flake/</guid><description>&lt;hr&gt;
&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Avant de commencer, je tiens à dire que j&amp;rsquo;ai fait ce post en partie pour l&amp;rsquo;entreprise &lt;a class="link" href="https://unova.fr/" target="_blank" rel="noopener"
&gt;Unova&lt;/a&gt; où je travaillais. Je tiens à les remercier pour m&amp;rsquo;avoir autorisé à réutiliser le contenu sur mon site.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nix est un gestionnaire de paquets basé sur le langage Nix. Il permet de gérer facilement une configuration système, d&amp;rsquo;un projet ou même d&amp;rsquo;un package (logiciel) et surtout de s&amp;rsquo;assurer de la reproductibilité de la configuration. Cependant, par défaut, Nix ne permet pas de &amp;ldquo;lock&amp;rdquo; la version de la configuration sur l&amp;rsquo;ensemble des machines. C&amp;rsquo;est pour cela que les développeurs développent Flake.&lt;/p&gt;
&lt;p&gt;Flake est une feature experimentale qui permet de lock les dépendances sur une version très précise.
Un peu comme le Gemfile.lock ou même le package-lock.json.&lt;/p&gt;
&lt;p&gt;Grâce au coté déclaratif de Nix, on peut par exemple facilement tester un outils sans devoir l&amp;rsquo;installer de manière permanente sur sa machine avec :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nix run nixpkgs#cowsay Salut &lt;span class="c1"&gt;# Lance directement la commande cowsay avec l&amp;#39;argument Salut&lt;/span&gt;
&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;nix shell nixpkgs#cowsay &lt;span class="c1"&gt;# Prépare un shell avec la commande cowsay dedans&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cowsay Salut &lt;span class="c1"&gt;# La commande est disponible&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="c1"&gt;# On revient sur notre shell de base&lt;/span&gt;
&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;nix-collect-garbage &lt;span class="c1"&gt;# On nettoie les dépendances inutiles (Supprime cowsay)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ou même configurer son shell existant pour pouvoir développer sur un logiciel&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nix develop nixpkgs#cowsay &lt;span class="c1"&gt;# Prépare le shell actuel avec toutes les dépendances nécessaires pour compiler et exécuter cowsay&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Attention: Il créer un shell avec les outils nécessaires pour travailler dessus, mais ne récupère pas le projet en lui-même.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="le-langage-nix"&gt;Le langage Nix
&lt;/h2&gt;&lt;p&gt;Nix est un langage de programmation dédié pour la configuration d&amp;rsquo;une machine ou compilation de programme donc il peut être compliqué à prendre en main.
Il est différent des langages traditionnels, on peut le voir comme un language de construction d&amp;rsquo;un &lt;code&gt;attribut set&lt;/code&gt; qui sera utilisé ensuite.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Un &lt;code&gt;attribut set&lt;/code&gt; peut-être vu comme un objet JS.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nix" data-lang="nix"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;p&gt;Je ferrais surement un post pour expliquer plus en détail le langage car il est assez complexe. J&amp;rsquo;ai rajouté quelques liens utiles &lt;a class="link" href="#liens-utiles" &gt;ici&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="structure-dun-flake"&gt;Structure d&amp;rsquo;un Flake
&lt;/h2&gt;&lt;h3 id="partie-inputs"&gt;Partie &lt;code&gt;inputs&lt;/code&gt;
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nix" data-lang="nix"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;inputs&lt;/span&gt; &lt;span class="o"&gt;=&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;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;github:nixos/nixpkgs/nixpkgs-unstable&amp;#34;&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;flake-utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;github:numtide/flake-utils&amp;#34;&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="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Dans cette exemple, on peut voir que j&amp;rsquo;ai rajouté les dépendances &lt;code&gt;nixpkgs&lt;/code&gt; et &lt;code&gt;flake-utils&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La dépendance &lt;code&gt;nixpkgs&lt;/code&gt; correspond au repo &lt;a class="link" href="https://github.com/NixOS/nixpkgs" target="_blank" rel="noopener"
&gt;github nixpkgs&lt;/a&gt;. En général, on l&amp;rsquo;utilise pour récupérer des packages ou utiliser les outils mis à disposition par les contributeurs de NixOS.&lt;/p&gt;
&lt;p&gt;On peut retrouver dans le repo.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/nixos&lt;/code&gt; Contiens la configuration pour nixos (La distribution basée sur Nix)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/pkgs&lt;/code&gt; Contiens tous les packages (ex: ruby_3_3)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Les nouveaux packages doivent être mis dans le sous-dossier &lt;code&gt;by-name&lt;/code&gt;. C&amp;rsquo;est un nouveau standard du projet. Les packages déjà existants migrent dessus petit à petit. Si un package manque, n&amp;rsquo;hésitez surtout pas à contribuer au projet.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lib&lt;/code&gt; Contiens plein d&amp;rsquo;outils pratiques comme &lt;code&gt;makeLibraryPath&lt;/code&gt; ou &lt;code&gt;makeIncludePath&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;doc&lt;/code&gt; Contiens la doc ^^&lt;/li&gt;
&lt;li&gt;&lt;code&gt;maintainers&lt;/code&gt; Contiens la liste de tous les mainteneurs des packages.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;La dépendance &lt;code&gt;flake-utils&lt;/code&gt; contient des helpers pour faciliter la configuration pour un ensemble de systèmes (&lt;code&gt;x86_64-linux&lt;/code&gt;, &lt;code&gt;x86_64-darwin&lt;/code&gt;, &amp;hellip;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;darwin&lt;/code&gt; Correspond au système Mac OS&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="partie-outputs"&gt;Partie &lt;code&gt;outputs&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;Outputs est une fonction qui prend en paramètre un &lt;code&gt;attribute set&lt;/code&gt; avec pour attributs self et les dépendances déclarées dans la partie &lt;code&gt;inputs&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Dans le cas ou l&amp;rsquo;on a les dépendances suivantes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nix" data-lang="nix"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;inputs&lt;/span&gt; &lt;span class="o"&gt;=&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;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;github:nixos/nixpkgs/nixpkgs-unstable&amp;#34;&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;flake-utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;github:numtide/flake-utils&amp;#34;&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;mon-input-custom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;github:mongithub/monprojet&amp;#34;&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="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;On aura les entrées suivantes dans &lt;code&gt;outputs&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nix" data-lang="nix"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;outputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flake-utils&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mon-input-custom&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="c1"&gt;# ^^^^^^^ ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Doit avoir le même nom que dans les inputs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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;devShells&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x86_64-linux&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;...&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;packages&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x86_64-linux&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;...&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;nixosConfigurations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x86_64-linux&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;...&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="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Les attributs que l&amp;rsquo;on peut retrouver dans &lt;code&gt;outputs&lt;/code&gt; sont:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;devShells&lt;/code&gt; Des environnements de développement.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nixosConfigurations&lt;/code&gt; Des configurations de NixOS (La distribution Linux)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;darwinConfigurations&lt;/code&gt; Des configurations pour Mac OS &lt;a class="link" href="https://github.com/LnL7/nix-darwin" target="_blank" rel="noopener"
&gt;En savoir plus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;packages&lt;/code&gt; Des packages (Docker, ruby, go, rust, &amp;hellip;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[...]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="exemple-de-flake"&gt;Exemple de flake
&lt;/h3&gt;&lt;p&gt;Dans cette example, j&amp;rsquo;ai déclaré un environnement de travail utilisable avec la commande &lt;code&gt;nix develop&lt;/code&gt;.
J&amp;rsquo;ai rajouté en dépendances la librairie &lt;code&gt;openssl&lt;/code&gt;, la commande &lt;code&gt;redis&lt;/code&gt; et un script au lancement du shell.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nix" data-lang="nix"&gt;&lt;span class="line"&gt;&lt;span class="cl"&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;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ma description&amp;#34;&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;inputs&lt;/span&gt; &lt;span class="o"&gt;=&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;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;github:nixos/nixpkgs/nixpkgs-unstable&amp;#34;&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;flake-utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;github:numtide/flake-utils&amp;#34;&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="p"&gt;};&lt;/span&gt;
&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="n"&gt;outputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flake-utils&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;flake-utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eachDefaultSystem&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;system&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="k"&gt;let&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;nixpkgs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;inherit&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;;&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="k"&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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;devShells&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;rec&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;default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mkShell&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;inputsFrom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;openssl&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;packages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;redis&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;shellHook&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; echo &amp;#34;Votre shell est configuré&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#39;&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="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="mettre-a-jour-le-flakelock"&gt;Mettre à jour le &lt;code&gt;flake.lock&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;Le flake.nix vient avec un fichier flake.lock qui permet de vérrouiller la version de chaque input. Si on souhaite mettre à jour nos packages pour notre projet. Il est nécessaire de le mettre à jour.&lt;/p&gt;
&lt;p&gt;On retrouve deux commandes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;nix flake update&lt;/code&gt; Mets à jour tous les inputs&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nix flake lock --update-input &amp;lt;input&amp;gt;&lt;/code&gt; Mets à jour uniquement un input en particulier&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="débugger-sa-configuration-avec-la-console-nix"&gt;Débugger sa configuration avec la console nix
&lt;/h2&gt;&lt;p&gt;Il existe une console depuis la version expérimentale de nix &lt;code&gt;nix-command&lt;/code&gt;. On peut y accéder avec la commande &lt;code&gt;nix repl&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Normalement, on doit avoir un shell comme ci-dessous&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nix repl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Welcome to Nix 2.18.2. Type :? &lt;span class="k"&gt;for&lt;/span&gt; help.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nix-repl&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Dedans, on peut écrire n&amp;rsquo;importe quoi en nix mais aussi lui demander de charger notre configuration flake avec l&amp;rsquo;aide de la commande &lt;code&gt;:lf [path racine ou ce trouve le flake]&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;lf&lt;/code&gt; est l&amp;rsquo;abréviation de &lt;code&gt;Load Flake&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nix repl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Welcome to Nix 2.18.2. Type :? &lt;span class="k"&gt;for&lt;/span&gt; help.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nix-repl&amp;gt; :lf .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Added &lt;span class="m"&gt;13&lt;/span&gt; variables.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Une fois chargé, on peut accéder aux outputs avec &lt;code&gt;outputs.&amp;lt;type de conf&amp;gt;.&amp;lt;system&amp;gt;.&amp;lt;nom&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tips : Vous pouvez appuyer deux fois sur Tab pour avoir de l&amp;rsquo;aide.&lt;/p&gt;
&lt;p&gt;Vous pouvez aussi facilement vérifier votre configuration nix avec la commande&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nix flake check .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/blockquote&gt;
&lt;h2 id="fonctionnement-des-environnements-de-développement"&gt;Fonctionnement des environnements de développement
&lt;/h2&gt;&lt;h3 id="utiliser-un-devshell"&gt;Utiliser un devShell
&lt;/h3&gt;&lt;p&gt;Les devShells permettent de configurer des environnements par défaut.
On peut y accéder avec l&amp;rsquo;aide de la commande &lt;code&gt;nix develop [path du flake]#[nom de l'environnement]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ex: &lt;code&gt;nix develop .#default&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Le path par défaut est déjà le répertoire courant et la configuration utilisée par défaut est également default
Donc la commande &lt;code&gt;nix develop&lt;/code&gt; suffit dans notre cas, mais si on configure par exemple &lt;code&gt;outputs.devShells.&amp;lt;system&amp;gt;.monshell&lt;/code&gt;.
Dans ce cas, il faudra utiliser &lt;code&gt;nix develop .#monshell&lt;/code&gt; ou &lt;code&gt;nix develop /home/user/monflake#monshell&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On peut accéder aux environnements utilisés pour développer n&amp;rsquo;importe quel package nix. Par exemple, si l&amp;rsquo;on souhaite aider au développement de ruby. On peut lancer une console de développement avec la commande &lt;code&gt;nix develop nixpkgs#ruby&lt;/code&gt; ou même voir la configuration d&amp;rsquo;un package avec &lt;code&gt;nix edit nixpkgs#ruby&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On remarquera qu&amp;rsquo;ici j&amp;rsquo;utilise &lt;code&gt;nixpkgs&lt;/code&gt; et pas le path du flake. Ça permet d&amp;rsquo;utiliser la configuration d&amp;rsquo;un package depuis nixpkgs directement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Attention&lt;/strong&gt;
Pour des logiciels compilés, en général, il faut d&amp;rsquo;abord configurer le compilateur via les &lt;code&gt;phases&lt;/code&gt; du logiciel. ex: &lt;code&gt;configurePhase&lt;/code&gt; et ensuite compiler le logiciel ex: &lt;code&gt;buildPhase&lt;/code&gt; . Les phases peuvent varier en fonction du logiciel.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="configurer-son-propre-devshell"&gt;Configurer son propre devShell
&lt;/h3&gt;&lt;p&gt;Voici une configuration de shell avec des commentaires pour expliquer le fonctionnement.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;span class="lnt"&gt;28
&lt;/span&gt;&lt;span class="lnt"&gt;29
&lt;/span&gt;&lt;span class="lnt"&gt;30
&lt;/span&gt;&lt;span class="lnt"&gt;31
&lt;/span&gt;&lt;span class="lnt"&gt;32
&lt;/span&gt;&lt;span class="lnt"&gt;33
&lt;/span&gt;&lt;span class="lnt"&gt;34
&lt;/span&gt;&lt;span class="lnt"&gt;35
&lt;/span&gt;&lt;span class="lnt"&gt;36
&lt;/span&gt;&lt;span class="lnt"&gt;37
&lt;/span&gt;&lt;span class="lnt"&gt;38
&lt;/span&gt;&lt;span class="lnt"&gt;39
&lt;/span&gt;&lt;span class="lnt"&gt;40
&lt;/span&gt;&lt;span class="lnt"&gt;41
&lt;/span&gt;&lt;span class="lnt"&gt;42
&lt;/span&gt;&lt;span class="lnt"&gt;43
&lt;/span&gt;&lt;span class="lnt"&gt;44
&lt;/span&gt;&lt;span class="lnt"&gt;45
&lt;/span&gt;&lt;span class="lnt"&gt;46
&lt;/span&gt;&lt;span class="lnt"&gt;47
&lt;/span&gt;&lt;span class="lnt"&gt;48
&lt;/span&gt;&lt;span class="lnt"&gt;49
&lt;/span&gt;&lt;span class="lnt"&gt;50
&lt;/span&gt;&lt;span class="lnt"&gt;51
&lt;/span&gt;&lt;span class="lnt"&gt;52
&lt;/span&gt;&lt;span class="lnt"&gt;53
&lt;/span&gt;&lt;span class="lnt"&gt;54
&lt;/span&gt;&lt;span class="lnt"&gt;55
&lt;/span&gt;&lt;span class="lnt"&gt;56
&lt;/span&gt;&lt;span class="lnt"&gt;57
&lt;/span&gt;&lt;span class="lnt"&gt;58
&lt;/span&gt;&lt;span class="lnt"&gt;59
&lt;/span&gt;&lt;span class="lnt"&gt;60
&lt;/span&gt;&lt;span class="lnt"&gt;61
&lt;/span&gt;&lt;span class="lnt"&gt;62
&lt;/span&gt;&lt;span class="lnt"&gt;63
&lt;/span&gt;&lt;span class="lnt"&gt;64
&lt;/span&gt;&lt;span class="lnt"&gt;65
&lt;/span&gt;&lt;span class="lnt"&gt;66
&lt;/span&gt;&lt;span class="lnt"&gt;67
&lt;/span&gt;&lt;span class="lnt"&gt;68
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-nix" data-lang="nix"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;outputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nixpkgs&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;flake-utils&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="c1"&gt;# Génère une configuration avec l&amp;#39;ensemble des systèmes par défaut&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# aarch64-linux =&amp;gt; ARM sur Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# aarch64-darwin =&amp;gt; M1, M2, M3, ... sur MacOS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# x86_64-linux =&amp;gt; AMD et Intel sur Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# x86_64-darwin =&amp;gt; Intel sur MacOS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Pour configurer avec une liste précise de systèmes, vous pouvez utiliser cette fonction&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# flake-utils.lib.eachSystem [&amp;#34;aarch64-linux&amp;#34; &amp;#34; x86_64-darwin&amp;#34;] (system: [...])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Voir plus https://github.com/numtide/flake-utils&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Les éléments d&amp;#39;un tableau ne sont pas séparés par une virgule ex: [ 12 14 ]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;flake-utils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;eachDefaultSystem&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;system&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="k"&gt;let&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Importe les packages pour le système.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;nixpkgs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;inherit&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;;&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="c1"&gt;# Le mot clef inherit équivaut à import nixpkgs { system = system };&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# On peut aussi inherit depuis autre chose&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# { inherit (pkgs.ruby) pname; } renverra { pname = &amp;#34;ruby&amp;#34; }&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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;devShells&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;rec&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="c1"&gt;# rec Permet d&amp;#39;utiliser les variables dans le même attributs set&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Exemple:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# { a = 12; b = a + 2; } =&amp;gt; error: undefined variable &amp;#39;a&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# rec { a = 12; b = a + 2; } =&amp;gt; { a = 12; b = 14; }&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Attention, car parfois, on peut faire des infinites recurse par accident.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Exemple:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# rec { a = b + 2; b = a + 2; } =&amp;gt; error: infinite recursion encountered&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;#&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Car a dépend de b pour fonctionner, mais b dépend également de a&lt;/span&gt;
&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="c1"&gt;# On utilise la fonction pkgs.mkShell qui contient tout ce qui nous faut pour créer notre environnement de travail&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mkShell&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="c1"&gt;# On rajoute des dépendances pour la compilation comme les librairies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;inputsFrom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;openssl&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="c1"&gt;# On rajoute des binaires ou des librairies pour l&amp;#39;execution&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;packages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;redis&lt;/span&gt; &lt;span class="n"&gt;minio&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="c1"&gt;# with pkgs permet d&amp;#39;éviter de faire [ pkgs.redis pkgs.minio ]&lt;/span&gt;
&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="c1"&gt;# On créer une variable d&amp;#39;environnement&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;MY_CUSTOM_ENV_VAR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;test&amp;#34;&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Parfois nécessaire pour lancer des projets avec des librairies comme Ruby par exemple.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# *_LIBRARY_PATH permet de dire à l&amp;#39;OS ou chercher les librairies.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Il faut le rajouter par exemple si on rencontre le soucis `Could not open library &amp;#39;libsodium.so.23&amp;#39;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# LD_LIBRARY_PATH =&amp;gt; Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# DYLD_LIBRARY_PATH =&amp;gt; MacOS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;LD_LIBRARY_PATH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;makeLibraryPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;libsodium&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;DYLD_LIBRARY_PATH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;makeLibraryPath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;libsodium&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Parfois nécessaire pour configurer des projets comme Ruby avec bundle&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Certaines gems Ruby génèrent un fichier .c avec du code en dure et surtout un `#include &amp;lt;malib.h&amp;gt;` dedans.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Sauf qu&amp;#39;ils utilisent pas les outils de configuration du compilateur fournis par les OS. Donc, il faut créer des variables d&amp;#39;environnements pour dire au compilateur ou chercher les fichiers requis.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# C_INCLUDE_PATH =&amp;gt; Pour le language C&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# CPLUS_INCLUDE_PATH =&amp;gt; Pour le language C++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;C_INCLUDE_PATH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;makeIncludePath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;libsodium&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;CPLUS_INCLUDE_PATH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;makeIncludePath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;pkgs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;libsodium&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Le shellHook est un script lancé au lancement du shell&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;shellHook&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; echo &amp;#34;Votre shell est configuré avec MY_CUSTOM_ENV_VAR = $MY_CUSTOM_ENV_VAR&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#39;&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="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="liens-utiles"&gt;Liens utiles
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Pour apprendre nix&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://nixcloud.io/tour/?id=introduction/nix" target="_blank" rel="noopener"
&gt;https://nixcloud.io/tour/?id=introduction/nix&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://nix.dev/tutorials/nix-language" target="_blank" rel="noopener"
&gt;https://nix.dev/tutorials/nix-language&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Pour trouver des packages&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://search.nixos.org/packages" target="_blank" rel="noopener"
&gt;https://search.nixos.org/packages&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Repository officiel de nixpkgs&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/NixOS/nixpkgs" target="_blank" rel="noopener"
&gt;https://github.com/NixOS/nixpkgs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Pour connaître l&amp;rsquo;état d&amp;rsquo;une Pull Request&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://nixpk.gs/" target="_blank" rel="noopener"
&gt;https://nixpk.gs/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Compiler un paquet Postmarket OS</title><link>https://mrdev023.fr/p/pmbootstrap-own-paquet/</link><pubDate>Sun, 18 Feb 2024 00:00:00 +0000</pubDate><guid>https://mrdev023.fr/p/pmbootstrap-own-paquet/</guid><description>&lt;h2 id="à-propos-de-postmarket-os"&gt;À propos de Postmarket OS
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://postmarketos.org/" target="_blank" rel="noopener"
&gt;Postmarket OS&lt;/a&gt; est une distribution basée sur &lt;a class="link" href="https://www.alpinelinux.org/" target="_blank" rel="noopener"
&gt;Alpine&lt;/a&gt; conçut pour fonctionner sur téléphone, tablette
ou sur Raspberry PI.
La communauté autour du projet propose un ensemble d&amp;rsquo;outils comme &lt;code&gt;pmbootstrap&lt;/code&gt; qui permet de configurer et d&amp;rsquo;installer Postmarket OS sur son téléphone.
On peut aussi l&amp;rsquo;utiliser pour compiler son propre paquet et l&amp;rsquo;installer sur son téléphone facilement.&lt;/p&gt;
&lt;h2 id="configuration-de-notre-environnement-de-travail"&gt;Configuration de notre environnement de travail
&lt;/h2&gt;&lt;p&gt;Avant de pouvoir l&amp;rsquo;utiliser, il faut d&amp;rsquo;abord l&amp;rsquo;installer depuis ce &lt;a class="link" href="https://wiki.postmarketos.org/wiki/Pmbootstrap" target="_blank" rel="noopener"
&gt;lien&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Une fois installé et configuré, il faut d&amp;rsquo;abord préparer son environnement de travail.
Il est parfois nécessaire de mettre à jour le repository pmaports en local.
On peut le faire assez facilement avec la commande :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pmbootstrap pull
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;Met à jour le repository &lt;a class="link" href="https://wiki.postmarketos.org/wiki/Pmaports.git" target="_blank" rel="noopener"
&gt;pmaports.git&lt;/a&gt; cloné en local.&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Le repo pmaports.git stocke tous les paquets Alpine avec le fichier &lt;code&gt;APKBUILD&lt;/code&gt; utilisé par le serveur de compilation.&lt;/p&gt;
&lt;p&gt;Le fonctionnement est similaire à &lt;code&gt;PKGBUILD&lt;/code&gt; pour les utilisateurs de &lt;a class="link" href="https://archlinux.org/" target="_blank" rel="noopener"
&gt;Archlinux&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ce fichier contient toute la procédure pour préparer les sources, compiler le paquet depuis les sources, le numéro de version
ainsi que la procédure pour vérifier si le paquet fonctionne correctement.
Généralement on utilise les tests du projet comme les tests unitaires ou les tests fonctionnels.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On peut également mettre à jour le cache de la commande &lt;code&gt;apk&lt;/code&gt; même si c&amp;rsquo;est pas forcément obligatoire.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pmbootstrap update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;Met à jour le cache de la commande APK depuis l&amp;rsquo;environnement de travail&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;L&amp;rsquo;environnement de travail se situe par défaut dans le dossier &lt;code&gt;$HOME/.local/var/pmbootstrap/&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si on a déjà un environnement de travail en cours et qu&amp;rsquo;il contient du cache ou un travail en cours, on peut le réinitialiser assez facilement avec la commande :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pmbootstrap zap
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;em&gt;Supprime le dossier de la commande chroot pour repartir de 0&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;La commande chroot permet de changer la racine Linux.
Par exemple, on peut faire &lt;code&gt;chroot $HOME/mon_dossier&lt;/code&gt; et à partir de ce moment-là, &lt;code&gt;/&lt;/code&gt; pointera vers &lt;code&gt;$HOME/mon_dossier&lt;/code&gt; dans notre shell actuel.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est très utilisé par pmbootstrap pour configurer le système Alpine.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pour ceux qui veulent utiliser une autre branche, on peut également changer la branche disponible sur le repository.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git -C &lt;span class="nv"&gt;$workdir&lt;/span&gt; checkout &lt;span class="o"&gt;[&lt;/span&gt;branch&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;$workdir&lt;/code&gt; par défaut se situe dans le dossier &lt;code&gt;$HOME/.local/var/pmbootstrap/cache_git/pmaports/&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Exemple de branche utile : &lt;code&gt;kde-nightly&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="compilation-de-notre-paquet-alpine"&gt;Compilation de notre paquet Alpine
&lt;/h2&gt;&lt;p&gt;Maintenant, on va pouvoir compiler n&amp;rsquo;importe quel paquet avec la commande.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pmbootstrap build &lt;span class="o"&gt;[&lt;/span&gt;nom_du_paquet&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Par exemple, on peut compiler plasma-mobile (Attention le paquet est long à compiler)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pmbootstrap build plasma-mobile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Par défaut, pmbootstrap va recompiler l&amp;rsquo;intégralité des dépendances du projet pour s&amp;rsquo;assurer que notre test sera reproductible.
Cependant, lorsque l&amp;rsquo;on souhaite juste tester un truc, ça peut-être ultra long.&lt;/p&gt;
&lt;p&gt;On peut donc utiliser deux options pour nous aider:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-i&lt;/code&gt; Permet de dire de compiler uniquement les dépendances du paquet défini dans le fichier &lt;code&gt;APKBUILD&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-n&lt;/code&gt; Permet d&amp;rsquo;éviter de compiler les dépendances du paquet défini dans le fichier &lt;code&gt;APKBUILD&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Avec le combot des deux options, ça nous évite de tout recompiler.&lt;/p&gt;
&lt;p&gt;On a aussi l&amp;rsquo;option &lt;code&gt;-mp&lt;/code&gt; qui peut-être pratique pour changer de mirroir si le téléchargement est lent ou si l&amp;rsquo;on souhaite télécharger des paquets nightly.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Un mirroir est un serveur utilisé pour télécharger les dépendances&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On utilise cette option de cette manière:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pmbootstrap &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -mp https://nightly.postmarketos.org/plasma-mobile/packages/ &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -mp http://mirror.postmarketos.org/postmarketos/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;On a aussi d&amp;rsquo;autres options comme:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--details-to-stdout&lt;/code&gt; : Affiche le fichier de log dans la console&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-j N&lt;/code&gt; : Défini le nombre de core CPU utilisé pour la compilation&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-t [En seconde]&lt;/code&gt; : Le nombre de secondes sans nouveau log dans le fichier avant d&amp;rsquo;abandonner la compilation&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--src&lt;/code&gt; : Change les sources du paquet. Par défaut ce sont les sources définies dans le fichier &lt;code&gt;APKBUILD&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--arch [arch]&lt;/code&gt; : L&amp;rsquo;architecture CPU du téléphone&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un exemple concret d&amp;rsquo;une commande que j&amp;rsquo;ai utilisé pour recompiler ma version de plasma-mobile avec mes changements.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pmbootstrap &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -mp https://nightly.postmarketos.org/plasma-mobile/packages/ &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -mp http://mirror.postmarketos.org/postmarketos/ &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --details-to-stdout &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -j &lt;span class="m"&gt;32&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="c1"&gt;# Pour utiliser toute la puissance de mon CPU&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -t &lt;span class="m"&gt;3600&lt;/span&gt; -v &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="c1"&gt;# La compilation est ultra longue donc pmbootstrap abandonne la build avant la fin de la compilation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; build plasma-mobile &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --src &lt;span class="nv"&gt;$home&lt;/span&gt;/plasma-mobile/ &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --arch aarch64 &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="c1"&gt;# Mon téléphone utilise l&amp;#39;architecture aarch64 (ARM64)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -i &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -n
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Attention&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Avant de compiler depuis le repository Nightly, il faut d&amp;rsquo;abord rajouter la clef de signature&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget https://nightly.postmarketos.org/plasma-mobile/pmos@local-662fcd2f.rsa.pub
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mv pmos@local-662fcd2f.rsa.pub &lt;span class="k"&gt;$(&lt;/span&gt;pmbootstrap config work&lt;span class="k"&gt;)&lt;/span&gt;/config_apk_keys/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Source : &lt;a class="link" href="https://wiki.postmarketos.org/wiki/Nightly" target="_blank" rel="noopener"
&gt;https://wiki.postmarketos.org/wiki/Nightly&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si vous souhaitez avoir plus d&amp;rsquo;informations, il suffit de taper la commande&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pmbootstrap build --help
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Et pour avoir les arguments généraux&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pmbootstrap --help
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="envoie-du-paquet-compilé-sur-le-téléphone"&gt;Envoie du paquet compilé sur le téléphone
&lt;/h2&gt;&lt;p&gt;Une fois le paquet compilé, il suffit de demander à &lt;code&gt;pmbootstrap&lt;/code&gt; de l&amp;rsquo;envoyer sur notre téléphone via la connexion SSH.
Avec &lt;code&gt;pmbootstrap&lt;/code&gt;, on utilise la commande &lt;code&gt;sideload&lt;/code&gt; comme dans l&amp;rsquo;exemple ci-dessous.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pmbootstrap sideload plasma-mobile &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --host &lt;span class="o"&gt;[&lt;/span&gt;SSH HOST&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --port &lt;span class="o"&gt;[&lt;/span&gt;SSH PORT&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --user &lt;span class="o"&gt;[&lt;/span&gt;SSH USER&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --arch &lt;span class="o"&gt;[&lt;/span&gt;ARCH&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --install-key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;On a les arguments suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--host [SSH HOST]&lt;/code&gt; (Ex: 192.168.1.1)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--port [SSH PORT]&lt;/code&gt; (Ex: 22)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--user [SSH USER]&lt;/code&gt; (Ex: 192.168.1.1)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--arch [ARCH]&lt;/code&gt; : Permet de modifier la valeur définie pour le téléphone (Ex : aarch64)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--install-key&lt;/code&gt; : Permet d&amp;rsquo;installer la clef utilisée pour la vérification des paquets de la machine actuelle.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Tout gestionnaire de paquet comme APK, vérifie si le paquet est valide par rapport à la signature électronique du mainteneur du paquet.
Dans notre cas, la signature ne sera pas valide, car le paquet n&amp;rsquo;est pas compilé par le mainteneur original donc il suffit de rajouter notre signature.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pour revenir en arrière, il suffit de taper la commande ci-dessous depuis le téléphone ou depuis la connexion SSH&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apk upgrade -a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;APK va réinstaller les paquets depuis les repos officiels.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En cas de problème liée à des conflits de fichier, on peut utiliser cette commande&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apk fix --force
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Cette commande va forcer APK à écraser les fichiers en conflit.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Ma première contribution à KDE</title><link>https://mrdev023.fr/p/kde-first-contrib/</link><pubDate>Fri, 12 Jan 2024 00:00:00 +0000</pubDate><guid>https://mrdev023.fr/p/kde-first-contrib/</guid><description>&lt;h2 id="rapide-rappel-à-propos-de-kde"&gt;Rapide rappel à propos de KDE
&lt;/h2&gt;&lt;p&gt;KDE est un projet qui a pour but de développer des logiciels open-source. Le projet comporte plusieurs éléments les plus connus.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://develop.kde.org/products/frameworks/" target="_blank" rel="noopener"
&gt;KF5 ou KF6&lt;/a&gt; est un ensemble de librairies utilisées pour le développement de l&amp;rsquo;ensemble des logiciels de KDE. Il est basé sur la librairie &lt;a class="link" href="https://www.qt.io/" target="_blank" rel="noopener"
&gt;QT&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Exemple&lt;/em&gt; : Kirigami que l&amp;rsquo;on peut voir comme un &amp;ldquo;flutter&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;KF5 =&amp;gt; Basé sur QT5&lt;/p&gt;
&lt;p&gt;KF6 =&amp;gt; Basé sur QT6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://kde.org/fr/plasma-desktop/" target="_blank" rel="noopener"
&gt;Plasma Shell&lt;/a&gt; est l&amp;rsquo;environnement de bureau développé pour Linux.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ma-configuration"&gt;Ma configuration
&lt;/h2&gt;&lt;p&gt;Pour développer sur KDE, KDE fournis un utilitaire assez puissant &lt;code&gt;kdesrc-build&lt;/code&gt;.
Il permet de configurer l&amp;rsquo;IDE, compiler, exécuter et gérer les dépendances avec l&amp;rsquo;aide d&amp;rsquo;une seule ligne de commande.&lt;/p&gt;
&lt;p&gt;Pour le configurer, il suffit de suivre la procédure sur ce &lt;a class="link" href="https://community.kde.org/Get_Involved/development/Set_up_a_development_environment" target="_blank" rel="noopener"
&gt;lien&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;EDIT&lt;/strong&gt;: Aujourd&amp;rsquo;hui, il est recommandé d&amp;rsquo;utiliser &lt;code&gt;kde-builder&lt;/code&gt;. C&amp;rsquo;est le même outil sauf qu&amp;rsquo;il est écrit en python au lieu de perl. C&amp;rsquo;est plus simple pour les développeurs qui souhaitent contribuer au projet, car python est plus connu. La configuration reste exactement la même.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://kde-builder.kde.org/en/getting-started/before-building.html#install-kde-builder" target="_blank" rel="noopener"
&gt;Pour plus d&amp;rsquo;info&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="mes-premières-difficultés"&gt;Mes premières difficultés
&lt;/h3&gt;&lt;p&gt;Il faut savoir que quand j&amp;rsquo;ai commencé à vouloir contribuer au projet KDE. Le projet était en train de migrer de QT5 à QT6.
Donc, les configurations nécessaires pour compiler correctement la version 6 était nettement plus compliqué que maintenant.
Il n&amp;rsquo;y avait aucune documentation pour migrer la configuration fournie de base, il fallait fouiller sur Github ou sur les blogs pour réussir
à avoir la configuration.
Aujourd&amp;rsquo;hui, il suffit juste de suivre le lien ci-dessus et on peut directement travailler sur KDE 6.&lt;/p&gt;
&lt;p&gt;Pour le développement sur KDE Plasma 6, j&amp;rsquo;ai dû faire quelques réajustements sur le fichier &lt;code&gt;~/.config/kdesrc-buildrc&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai changé la branche par défaut avec l&amp;rsquo;option &lt;code&gt;branch-group kf6-qt6&lt;/code&gt;.
Elle permet de cloner les repositories correctement et d&amp;rsquo;ajouter l&amp;rsquo;option cmake &lt;code&gt;-DBUILD_WITH_QT6=on&lt;/code&gt;.
J&amp;rsquo;ai aussi changé les fichiers de configuration utilisées pour obtenir le résultat ci-dessous.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;global
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; branch-group kf6-qt6
&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;end global
&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;include ~/kde/src/kdesrc-build/data/build-include/kf6-common-options.ksb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;include ~/kde/src/kdesrc-build/data/build-include/kf6-frameworks.ksb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;include ~/kde/src/kdesrc-build/data/build-include/kf6-workspace.ksb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;include ~/kde/src/kdesrc-build/data/build-include/kf6-applications.ksb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;include ~/kde/src/kdesrc-build/data/build-include/kf6-kdepim.ksb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="configurations-utiles"&gt;Configurations utiles
&lt;/h3&gt;&lt;h4 id="désactiver-larrêt-de-la-compilation-lors-dune-erreur-de-compilation"&gt;Désactiver l&amp;rsquo;arrêt de la compilation lors d&amp;rsquo;une erreur de compilation.
&lt;/h4&gt;&lt;p&gt;En général, &lt;code&gt;kdesrc-build&lt;/code&gt; s&amp;rsquo;adapte et retire tous les projets qui dépendent de la dépendance qui n&amp;rsquo;a pas réussi à compiler.
Le projet était encore en cours de développement donc les erreurs de compilations étaient très régulières.
J&amp;rsquo;ai tout simplement désactivé avec l&amp;rsquo;option &lt;code&gt;stop-on-failure false&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id="activer-le-support-des-lsp"&gt;Activer le support des LSP
&lt;/h4&gt;&lt;p&gt;C&amp;rsquo;est très pratique si on utilise VSCode ou même n&amp;rsquo;importe quel outil qui supporte les &lt;a class="link" href="https://microsoft.github.io/language-server-protocol/" target="_blank" rel="noopener"
&gt;LSP&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il suffit d&amp;rsquo;activer les options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;compile-commands-linking&lt;/code&gt; =&amp;gt; &lt;code&gt;true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;compile-commands-export&lt;/code&gt; =&amp;gt; &lt;code&gt;true&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="générer-les-projets-vscode"&gt;Générer les projets VSCode
&lt;/h4&gt;&lt;p&gt;Il va générer automatiquement les workspaces VSCode avec les extensions recommander et le paramètrage par défaut.
Ça permet de travailler dans de très bonne condition avec VSCode.&lt;/p&gt;
&lt;p&gt;Il suffit de l&amp;rsquo;activer avec &lt;code&gt;generate-vscode-project-config true&lt;/code&gt;&lt;/p&gt;
&lt;h4 id="options-utiles-pour-la-commande-kdesrc-build"&gt;Options utiles pour la commande kdesrc-build
&lt;/h4&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-D&lt;/code&gt; : Pour ne pas inclure les dépendances dans la compilation&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Exemple: kdesrc-build -D kate&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-S&lt;/code&gt; : Pour ne pas mettre à jour les sources&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Exemple: kdesrc-build -S kate&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="ma-contribution"&gt;Ma contribution
&lt;/h2&gt;&lt;p&gt;J&amp;rsquo;ai contribué sur le support de la lampe torche pour l&amp;rsquo;environnement Plasma Mobile.
La lampe torche fonctionnait uniquement sur les &lt;a class="link" href="https://pine64.org/devices/pinephone/" target="_blank" rel="noopener"
&gt;pinephones&lt;/a&gt; en utilisant le fichier en dure &lt;code&gt;/sys/devices/platform/led-controller/leds/white:flash/brightness&lt;/code&gt;
(&lt;a class="link" href="https://invent.kde.org/plasma/plasma-mobile/-/blob/f970aa7acf2e9794ab4ed6b75e8f549bece83561/quicksettings/flashlight/flashlightutil.cpp#L17" target="_blank" rel="noopener"
&gt;Source&lt;/a&gt;).
J&amp;rsquo;ai réécris le module pour que ça fonctionne de manière générale sur tous les téléphones.&lt;/p&gt;
&lt;h3 id="rappel-sur-le-fonctionnement-du-noyau-linux-autour-des-leds"&gt;Rappel sur le fonctionnement du noyau Linux autour des leds
&lt;/h3&gt;&lt;p&gt;Pour comprendre comment la fonctionnalité, un petit rappel s&amp;rsquo;impose autour du fonctionnement des leds avec le noyau Linux.
Dès qu&amp;rsquo;une led est détecté par le noyau, il va mettre à disposition plusieurs fichiers.
On les trouvent dans le dossier correspondant au driver et aussi à l&amp;rsquo;emplacement physique sur la carte mère ou sur le SOC.
Mais on peut aussi les trouver plus facilement dans le répertoire &lt;code&gt;/sys/class/leds/&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;sys =&amp;gt; Fichiers système
class =&amp;gt; Trier par class.
leds =&amp;gt; La class &lt;code&gt;leds&lt;/code&gt;. On peut trouver aussi par appareil &lt;code&gt;bluetooth&lt;/code&gt;, puce &lt;code&gt;tpm&lt;/code&gt;, &amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On disposent de plusieurs fichiers importants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;brightness&lt;/code&gt; : Permet de changer ou de récupérer l&amp;rsquo;intensité de la led actuelle.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max_brightness&lt;/code&gt; : Permet de connaitre l&amp;rsquo;intensité max de la led.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;color&lt;/code&gt; : Ce fichier n&amp;rsquo;existe pas tout le temps mais permet d&amp;rsquo;avoir la couleur de la led.&lt;/li&gt;
&lt;li&gt;Le reste des fichiers ne sont pas important pour nous.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="explication-du-fonctionnement-de-mon-code-petit-à-petit"&gt;Explication du fonctionnement de mon code petit à petit
&lt;/h3&gt;&lt;p&gt;Tout d&amp;rsquo;abord, il faut savoir que j&amp;rsquo;utilise la libraire Udev. Il est prévu que je migre vers la librairie &lt;a class="link" href="https://invent.kde.org/frameworks/solid" target="_blank" rel="noopener"
&gt;Solid&lt;/a&gt; une fois le support des leds ajoutées.
Udev pour faire simple, c&amp;rsquo;est une librairie qui permet d&amp;rsquo;interagir avec les appareils assez directement sans intermédiaire.
La librairie permet également de lister, filtrer, détecter si un appareil est connecté/déconnecté, &amp;hellip;.&lt;/p&gt;
&lt;p&gt;Pour commencer, je dois d&amp;rsquo;abord instancier Udev avec pour l&amp;rsquo;utiliser par la suite.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;udev&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;udev&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;udev_new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ensuite, je liste tous les périphériques qui m&amp;rsquo;intéressent donc ceux appartenant à la class &lt;code&gt;leds&lt;/code&gt;.
Pour ça, il me suffit de créer un énumerateur sur lequel on appliquera tous les filtres.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On peut voir une class comme une catégorie d&amp;rsquo;appareils.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;udev_enumerate&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;enumerate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;udev_enumerate_new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;udev&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;J&amp;rsquo;applique le filtre pour lister uniquement ceux qui appartiennent à la class &lt;code&gt;leds&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define TORCH_SUBSYSTEM &amp;#34;leds&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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;udev_enumerate_add_match_subsystem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TORCH_SUBSYSTEM&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;J&amp;rsquo;applique le filtre pour lister uniquement ceux qui ont dans le nom &lt;code&gt;flash&lt;/code&gt; ou &lt;code&gt;torch&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;udev_enumerate_add_match_sysname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;*:torch&amp;#34;&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;udev_enumerate_add_match_sysname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;*:flash&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Puis je lance le scan avec mes filtres.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;udev_enumerate_scan_devices&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Au début, il faut savoir que je prenais le premier appareil avec le code ci-dessous mais certain téléphone ont une torche de couleur jaune et blanche.
Certain utilisateur malheureusement ne pouvait pas utiliser la fonctionnalité.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;udev_list_entry&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;devices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;udev_enumerate_get_list_entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enumerate&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="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;udev_list_entry&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;udev_list_entry_get_next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;devices&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;a class="link" href="https://invent.kde.org/plasma/plasma-mobile/-/blob/5c6a97caa52d549c0cb02b17fc65a3a7d729d237/quicksettings/flashlight/flashlightutil.cpp" target="_blank" rel="noopener"
&gt;Source&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Donc, j&amp;rsquo;ai changé le code avec le code ci-dessous qui permet d&amp;rsquo;itérer sur tous les appareils.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;udev_list_entry&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;devices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;udev_enumerate_get_list_entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enumerate&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="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;udev_list_entry&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;nullptr&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;udev_device&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;nullptr&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;udev_list_entry_foreach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;devices&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="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Pour chaque appareil, j&amp;rsquo;ai récuperé le répertoire ou se situe l&amp;rsquo;appareil avec le code ci-dessous
qui me renvoie par exemple: &lt;code&gt;/sys/devices/platform/led-controller/leds/white:flash&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;udev_list_entry_get_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;J&amp;rsquo;instancie une instance udev_device pour interagir avec lui depuis le répertoire.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;udev_device&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;udev_device_new_from_syspath&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;udev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Et à partir de là, il me suffit de lire les fichiers dont j&amp;rsquo;ai besoin.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;maxBrightness&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;udev_device_get_sysattr_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;device&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;[NOM DU FICHIER]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Je lis d&amp;rsquo;abord le fichier &amp;lsquo;color&amp;rsquo; et je regarde si la couleur est blanche sinon je continue.
Si je ne trouve pas de led de couleur blanche, je prends la dernière valeur récupérée.&lt;/p&gt;
&lt;p&gt;Une fois pour chaque appareil trouvé, il me reste plus qu&amp;rsquo;à récupérer les infos dont j&amp;rsquo;ai besoin.
Donc, la luminosité maximale &lt;code&gt;max_brightness&lt;/code&gt; et la luminosité actuelle &lt;code&gt;brightness&lt;/code&gt; pour correctement initialiser l&amp;rsquo;interface de Plasma Mobile.&lt;/p&gt;
&lt;p&gt;Quand je souhaite changer la valeur, je dois d&amp;rsquo;abord convertir la valeur entière en chaîne de charactère.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;const_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m_torchEnabled&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;0&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;m_maxBrightness&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ensuite, je change la luminosité&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;udev_device_set_sysattr_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m_device&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;brightness&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nouvelle_valeur_en_char_&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Si vous le souhaitez, vous pouvez retrouver le fichier dans son intégralité &lt;a class="link" href="https://invent.kde.org/plasma/plasma-mobile/-/blob/d162f96a63600d5b45bb8294afdb84efd85833f9/quicksettings/flashlight/flashlightutil.cpp" target="_blank" rel="noopener"
&gt;ici&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="info-utile-pour-débugger-kde-plama-mobile-depuis-postmarket-os"&gt;Info utile pour débugger KDE Plama Mobile depuis Postmarket OS
&lt;/h2&gt;&lt;p&gt;Le fichier de log se situe dans &lt;code&gt;~/.local/state/tinydm.log&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Archives</title><link>https://mrdev023.fr/archives/</link><pubDate>Sun, 06 Mar 2022 00:00:00 +0000</pubDate><guid>https://mrdev023.fr/archives/</guid><description/></item><item><title>À propos de moi</title><link>https://mrdev023.fr/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mrdev023.fr/about/</guid><description>&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Passionné d&amp;rsquo;informatique depuis mon plus jeune âge, mon parcours est marqué par une curiosité insatiable et un désir constant d&amp;rsquo;apprendre. Dès l&amp;rsquo;enfance, j&amp;rsquo;ai plongé dans le monde de l&amp;rsquo;électronique, allant jusqu&amp;rsquo;à assembler mon premier ordinateur à partir de pièces récupérées. Cette expérience précoce a nourri ma fascination pour la technologie.&lt;/p&gt;
&lt;p&gt;À 12 ans, j&amp;rsquo;ai fait mes premiers pas en programmation avec les scripts Batch, avant de me plonger rapidement dans le langage Java. Cette maîtrise m&amp;rsquo;a permis de créer des jeux vidéo en 3D utilisant OpenGL avec LWJGL 2/3, et même de participer à des compétitions de programmation de jeux vidéo en Java.&lt;/p&gt;
&lt;p&gt;Mon parcours académique m&amp;rsquo;a conduit d&amp;rsquo;un BAC STI2D à un DUT Informatique à l&amp;rsquo;IUT de Limoges, où j&amp;rsquo;ai découvert Linux, devenu depuis mon système d&amp;rsquo;exploitation principal. J&amp;rsquo;ai ensuite poursuivi avec une Licence Professionnelle en développement web et du Big Data. Ces formations ont considérablement élargi mes horizons et renforcé mes compétences techniques.&lt;/p&gt;
&lt;p&gt;Au fil des années, mon expertise s&amp;rsquo;est considérablement étendue. Du développement web avec React, Ruby on Rails, Symfony, Tailwindcss et Bootstrap, à la création d&amp;rsquo;applications mobiles avec Flutter, en passant par le développement système en Rust, j&amp;rsquo;ai acquis un large éventail de compétences. Ma passion pour les nouvelles technologies reste intacte, comme en témoigne mon intérêt récent pour l&amp;rsquo;intelligence artificielle.&lt;/p&gt;
&lt;p&gt;Ce qui me caractérise, c&amp;rsquo;est ma soif d&amp;rsquo;apprentissage constante et ma capacité à m&amp;rsquo;adapter rapidement aux nouvelles technologies. Chaque projet est pour moi une opportunité d&amp;rsquo;approfondir mes connaissances et de relever de nouveaux défis, toujours guidé par ma curiosité et mon enthousiasme pour l&amp;rsquo;innovation technologique.&lt;/p&gt;
&lt;h2 id="expérience-professionnelle"&gt;Expérience professionnelle
&lt;/h2&gt;&lt;h3 id="axyus-cdi"&gt;Axyus (CDI)
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Développeur Web, Mobile et Système&lt;/strong&gt; | &lt;em&gt;Octobre 2024 - Aujourd&amp;rsquo;hui&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="unova-cdi---5-ans-et-1-mois"&gt;Unova (CDI) - 5 ans et 1 mois
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Développeur Web, Mobile et Système&lt;/strong&gt; | &lt;em&gt;Septembre 2019 - Octobre 2024&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3D (WebGL / Godot Engine)&lt;/li&gt;
&lt;li&gt;Front (React, Flutter, Tailwindcss, Bootstrap, SolidJS)&lt;/li&gt;
&lt;li&gt;Back (Symfony, Ruby on Rails)&lt;/li&gt;
&lt;li&gt;Devops (Rust, Docker, Gitlab-CI)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="limouzik-divers---2-ans-et-3-mois"&gt;Limouzik (Divers) - 2 ans et 3 mois
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Développeur Web, Application 2D et Devops&lt;/strong&gt; | &lt;em&gt;Avril 2017 - Juillet 2019&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CDI (11 mois) | &lt;em&gt;Septembre 2018 - Juillet 2019&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Site web (Symfony, Bootstrap, ReactJS)&lt;/li&gt;
&lt;li&gt;Application v2 (Unity 3D)&lt;/li&gt;
&lt;li&gt;Serveur (Docker, Gitlab-CI, Nginx)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Alternance (1 an) | &lt;em&gt;Septembre 2017 - Août 2018&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Site web (Symfony, Bootstrap, ReactJS)&lt;/li&gt;
&lt;li&gt;Application v1 (ReactJS, Webpack)&lt;/li&gt;
&lt;li&gt;Serveur (Docker, Gitlab-CI, Nginx)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CDD (1 mois) | &lt;em&gt;Juillet 2017&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Site web (Symfony, Bootstrap, ReactJS)&lt;/li&gt;
&lt;li&gt;Application v1 (ReactJS, Webpack)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stage (3 mois) | &lt;em&gt;Avril 2017 - Juin 2017&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Site web (Symfony, Bootstrap, ReactJS)&lt;/li&gt;
&lt;li&gt;Application v1 (ReactJS, Webpack)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="compétences"&gt;Compétences
&lt;/h2&gt;&lt;h3 id="langages-de-programmation"&gt;Langages de programmation
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;JavaScript / Typescript&lt;/li&gt;
&lt;li&gt;Ruby&lt;/li&gt;
&lt;li&gt;C#&lt;/li&gt;
&lt;li&gt;Rust&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="technologies-et-frameworks"&gt;Technologies et frameworks
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Nginx / Traefik&lt;/li&gt;
&lt;li&gt;CI/CD (Gitlab CI, Github Actions)&lt;/li&gt;
&lt;li&gt;OpenGL&lt;/li&gt;
&lt;li&gt;Linux | Utilisation quotidienne + développement&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="soft-skills"&gt;Soft skills
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Travail en équipe&lt;/li&gt;
&lt;li&gt;Résolution de problème&lt;/li&gt;
&lt;li&gt;Conception&lt;/li&gt;
&lt;li&gt;Autonomie&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="formation"&gt;Formation
&lt;/h2&gt;&lt;h3 id="licence-professionnelle-en-développement-web-et-du-big-data"&gt;Licence Professionnelle en développement web et du Big Data
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;IUT du Limousin&lt;/strong&gt; | &lt;em&gt;2017 - 2018&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="dut-informatique"&gt;DUT Informatique
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;IUT du Limousin&lt;/strong&gt; | &lt;em&gt;2015 - 2017&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="bac-sti2d-sin"&gt;Bac STI2D SIN
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Lycée Jean Favard (Guéret)&lt;/strong&gt; | &lt;em&gt;2012 - 2015&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;STI2D : &lt;strong&gt;S&lt;/strong&gt;ciences et &lt;strong&gt;T&lt;/strong&gt;echnologies de l&amp;rsquo;&lt;strong&gt;I&lt;/strong&gt;ndustrie et du &lt;strong&gt;D&lt;/strong&gt;éveloppement &lt;strong&gt;D&lt;/strong&gt;urable&lt;/li&gt;
&lt;li&gt;SIN : &lt;strong&gt;S&lt;/strong&gt;ystèmes d&amp;rsquo;&lt;strong&gt;I&lt;/strong&gt;nformation et du &lt;strong&gt;N&lt;/strong&gt;umérique&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="concours"&gt;Concours
&lt;/h2&gt;&lt;h3 id="global-game-jam-édition-2019"&gt;Global Game Jam édition 2019
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lieu :&lt;/strong&gt; 3iL - Limoges&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Date :&lt;/strong&gt; 25 janvier 2019 - 27 janvier 2019&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thème :&lt;/strong&gt; What home means to you&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Objectif :&lt;/strong&gt; Développer un jeu en 48h à partir du thème donné&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Participants :&lt;/strong&gt; Ezyrath, Fabien87, Flavien, MrDev023 (Moi), php4ever, spoutnik87&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Technologie employée&lt;/strong&gt; : Unity 3D&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Projet :&lt;/strong&gt; &lt;a class="link" href="https://github.com/mrdev023/Global-Game-Jam-2019" target="_blank" rel="noopener"
&gt;Cauchemar en forêt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://github.com/mrdev023/Global-Game-Jam-2019/blob/master/ggj_2019_maison.png?raw=true"
loading="lazy"
alt="Capture d’écran du projet"
&gt;&lt;/p&gt;
&lt;h3 id="global-game-jam-édition-2017"&gt;Global Game Jam édition 2017
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lieu :&lt;/strong&gt; 3iL - Limoges&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Date :&lt;/strong&gt; 20 janvier 2017 - 22 janvier 2017&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thème :&lt;/strong&gt; Waves&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Objectif :&lt;/strong&gt; Développer un jeu en 48h à partir d&amp;rsquo;un thème donné&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Participants :&lt;/strong&gt; emiko, Fiesta87, MrDev023 (Moi), TheKitolex&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Technologies employées&lt;/strong&gt; : Java 1.8 et le moteur graphique que j&amp;rsquo;ai conçu pour l&amp;rsquo;occasion avec LWJGL 3&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Projet :&lt;/strong&gt; &lt;a class="link" href="https://github.com/mrdev023/Global-Gam-Jam-2017/" target="_blank" rel="noopener"
&gt;Beach Fighter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="global-game-jam-édition-2016"&gt;Global Game Jam édition 2016
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lieu :&lt;/strong&gt; 3iL - Limoges&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Date :&lt;/strong&gt; 29 janvier 2016 - 31 janvier 2016&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thème :&lt;/strong&gt; Ritual&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Objectif :&lt;/strong&gt; Développer un jeu en 48h à partir d&amp;rsquo;un thème donné&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Participants :&lt;/strong&gt; Aliths, dikaios, Fiesta87, MrDev023 (Moi), TheKitolex&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Projet :&lt;/strong&gt; &lt;a class="link" href="https://github.com/mrdev023/Global-Game-Jam-2016" target="_blank" rel="noopener"
&gt;Bifrost Saver&amp;rsquo;s&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Outils utilisés&lt;/strong&gt;: Java 1.8 et ACM Graphics&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://github.com/mrdev023/Global-Game-Jam-2016/blob/master/ggj_into.png?raw=true"
loading="lazy"
alt="Capture d’écran du projet"
&gt;&lt;/p&gt;
&lt;h3 id="nuit-de-linfo-édition-2016"&gt;Nuit de l’info édition 2016
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lieu :&lt;/strong&gt; Bordeaux&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Date :&lt;/strong&gt; 1er décembre 2016 - 2 décembre 2016&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thème :&lt;/strong&gt; Venir en aide aux réfugiés&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Objectif :&lt;/strong&gt; Développer un projet WebGL en 8h&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Équipe :&lt;/strong&gt; echo &amp;ldquo;Avis de template&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Slogan :&lt;/strong&gt; Qui sème le vent récolte le Template&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Projet :&lt;/strong&gt; &lt;a class="link" href="https://github.com/mrdev023/NUIT_INFO_2_DECEMBRE_2016" target="_blank" rel="noopener"
&gt;Lien vers le projet GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Résultats :&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;1er prix WebGL&lt;/li&gt;
&lt;li&gt;1er prix Méthode agile&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Search</title><link>https://mrdev023.fr/search/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://mrdev023.fr/search/</guid><description/></item></channel></rss>