<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://blog.mrvym.dev/</id>
    <title>MrVyM.dev Blog</title>
    <updated>2025-08-03T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://blog.mrvym.dev/"/>
    <subtitle>MrVyM.dev Blog</subtitle>
    <icon>https://blog.mrvym.dev/img/favicon.ico</icon>
    <rights>Copyright © ${new Date().getFullYear()} MrVym.dev.</rights>
    <entry>
        <title type="html"><![CDATA[Understanding and mastering inter-processor communication on STM32MP]]></title>
        <id>https://blog.mrvym.dev/understanding-ipcc-on-stm32</id>
        <link href="https://blog.mrvym.dev/understanding-ipcc-on-stm32"/>
        <updated>2025-08-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In modern embedded systems, it is common to find multiple processor cores (CPUs) working together, each potentially running a different operating system — for example, Linux on a Cortex-A core and an RTOS such as FreeRTOS on a Cortex-M.]]></summary>
        <content type="html"><![CDATA[<p>In modern embedded systems, it is common to find multiple processor cores (CPUs) working together, each potentially running a different operating system — for example, Linux on a Cortex-A core and an RTOS such as FreeRTOS on a Cortex-M.</p>
<p>Communication between these cores is essential, but there is no single standard to achieve this. OpenAMP, with its RPMsg and RemoteProc components, provides a flexible and widely adopted solution for intercommunication between Linux and RTOS or bare-metal systems.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="what-will-and-will-not-be-covered">What will and will not be covered<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#what-will-and-will-not-be-covered" class="hash-link" aria-label="Lien direct vers What will and will not be covered" title="Lien direct vers What will and will not be covered" translate="no">​</a></h2>
<p>This article focuses on the principles of inter-processor communication between heterogeneous processors (Linux and RTOS) in embedded systems, using OpenAMP and its components. We will explain how the key mechanisms work (RPMsg, RemoteProc, IPCC, VirtIO). We will not dive into implementation details (assembly code, hardware registers).</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="prerequisite">Prerequisite<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#prerequisite" class="hash-link" aria-label="Lien direct vers Prerequisite" title="Lien direct vers Prerequisite" translate="no">​</a></h2>
<ul>
<li><strong>ARM Programming (STM32):</strong> basic knowledge of the ARM architecture.</li>
<li><strong>C language:</strong> used for embedded development.</li>
<li><strong>Understanding of an RTOS or Linux:</strong> basic concepts of real-time operating systems (RTOS) and/or Linux.</li>
</ul>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="targeted-audience">Targeted audience<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#targeted-audience" class="hash-link" aria-label="Lien direct vers Targeted audience" title="Lien direct vers Targeted audience" translate="no">​</a></h2>
<ul>
<li><strong>Engineering students</strong> interested in exploring multi-core embedded systems.</li>
<li><strong>Beginner engineers</strong> in the field of embedded software.</li>
</ul>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="global-overview">Global Overview<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#global-overview" class="hash-link" aria-label="Lien direct vers Global Overview" title="Lien direct vers Global Overview" translate="no">​</a></h2>
<p>To better understand the architecture, here’s a diagram that illustrates the separation between the Linux and RTOS environments, and the communication mechanisms between them:</p>
<p><img decoding="async" loading="lazy" alt="Global Overview" src="https://blog.mrvym.dev/assets/images/Global_overview-91f71c638724a5e7d4653340ab2eec7d.png" width="675" height="810" class="img_ev3q"></p>
<blockquote>
<p><em>Figure 1: OpenAMP architecture overview between Linux and RTOS</em></p>
</blockquote>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="booting-and-managing-the-remote-core">Booting and managing the remote core<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#booting-and-managing-the-remote-core" class="hash-link" aria-label="Lien direct vers Booting and managing the remote core" title="Lien direct vers Booting and managing the remote core" translate="no">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="how-does-ipcc-work">How does IPCC work?<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#how-does-ipcc-work" class="hash-link" aria-label="Lien direct vers How does IPCC work?" title="Lien direct vers How does IPCC work?" translate="no">​</a></h3>
<p>IPCC (Inter Processor Communication Channel) is a hardware peripheral found on some STM32 microcontrollers, such as the STM32MP1 family. It allows interrupts to be triggered between microcontrollers.</p>
<p>This component consists of several channels. For example, the STM32MP257F has 16 channels on IPCC1 <a href="https://wiki.st.com/stm32mpu/wiki/IPCC_internal_peripheral#On_STM32MP2-lines_3" target="_blank" rel="noopener noreferrer">^MP257F Lines</a>.</p>
<p><img decoding="async" loading="lazy" alt="IPCC Peripheral" src="https://blog.mrvym.dev/assets/images/IPCC_peripheral-5dffa79f2d4ff672ab2f93226c953be2.png" width="844" height="355" class="img_ev3q"></p>
<blockquote>
<p><em>Figure 2: How the IPCC hardware component is working for 6 channel (STM32MP157F)</em></p>
</blockquote>
<p>A board may include multiple IPCC peripherals. They enable communication between two or more processors. The IPCC2 peripheral allows communication between all Cortex cores on the board.</p>
<p><img decoding="async" loading="lazy" alt="IPCC Features Implementation" src="https://blog.mrvym.dev/assets/images/IPCC_Features_Implementation-05d0be5a0db17ae89682f711e9ba3aaf.png" width="988" height="437" class="img_ev3q"></p>
<blockquote>
<p><em>Figure 3: Extract from the documentation of the STM32MP257F</em></p>
</blockquote>
<p>Each channel has a specific function. For example, channel 3 <a href="https://wiki.st.com/stm32mpu/wiki/IPCC_internal_peripheral#On_STM32MP2-lines_3" target="_blank" rel="noopener noreferrer">^MP257F Lines</a> is used by the RemoteProc framework to shut down the Cortex-M33.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="life-cycle-management">Life Cycle Management<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#life-cycle-management" class="hash-link" aria-label="Lien direct vers Life Cycle Management" title="Lien direct vers Life Cycle Management" translate="no">​</a></h3>
<p>RemoteProc <sup><a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#user-content-fn-remoteproc-f76317" id="user-content-fnref-remoteproc-f76317" data-footnote-ref="true" aria-describedby="footnote-label" class="footnoteRefStickyNavbar_i6ta">1</a></sup> is a framework used to manage the lifecycle (boot, shutdown, supervision) of a remote processor. On Linux, RemoteProc can be used to load a firmware image onto a Cortex-M core (running an RTOS or bare-metal), monitor its state, or shut it down.</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">remoteproc_start</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">struct</span><span class="token plain"> </span><span class="token class-name">remoteproc</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain">rproc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">remoteproc_stop</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">struct</span><span class="token plain"> </span><span class="token class-name">remoteproc</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain">rproc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">remoteproc_shutdown</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">struct</span><span class="token plain"> </span><span class="token class-name">remoteproc</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain">rproc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre></div></div>
<p>RemoteProc relies on specific drivers and on the firmware’s resource table to allocate shared memory and required peripherals.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="role-of-ipcc-in-triggering-remote-boot">Role of IPCC in triggering remote boot<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#role-of-ipcc-in-triggering-remote-boot" class="hash-link" aria-label="Lien direct vers Role of IPCC in triggering remote boot" title="Lien direct vers Role of IPCC in triggering remote boot" translate="no">​</a></h3>
<p>IPCC plays a key role in booting the remote core. When Linux wants to start a firmware on an RTOS core, it uses IPCC to send an initialization signal. This signal triggers the remote core boot process, allowing it to initialize its own environment. IPCC can also be used to synchronize other actions, such as data exchange or critical event notification.</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="inter-processor-data-exchange">Inter-Processor Data Exchange<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#inter-processor-data-exchange" class="hash-link" aria-label="Lien direct vers Inter-Processor Data Exchange" title="Lien direct vers Inter-Processor Data Exchange" translate="no">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="virtio">VirtIO<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#virtio" class="hash-link" aria-label="Lien direct vers VirtIO" title="Lien direct vers VirtIO" translate="no">​</a></h3>
<p>Communication between cores primarily takes place through shared memory (SRAM).</p>
<p><img decoding="async" loading="lazy" alt="Shared Memory Cortex" src="https://blog.mrvym.dev/assets/images/Shared_memory_cortex-096f503196f3821dadac6eb1b5f588f2.png" width="1550" height="322" class="img_ev3q"></p>
<p>VirtIO is a standard that defines a protocol for communication between drivers and devices of different types.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>astuce</div><div class="admonitionContent_BuS1"><p>The choice of shared memory must consider security (restricted access), performance (latency, bandwidth), and manageability (size, alignment).</p></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="ring-buffer">Ring Buffer<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#ring-buffer" class="hash-link" aria-label="Lien direct vers Ring Buffer" title="Lien direct vers Ring Buffer" translate="no">​</a></h4>
<p>The framework uses ring buffers, which can be seen as channels with their own queues.</p>
<p>VirtIO relies on a shared-memory ring buffer mechanism called VRing. Each VRing is made of two parts:</p>
<ul>
<li><strong><code>AVAIL</code></strong>: A ring where the sender posts available buffers.</li>
<li><strong><code>USED</code></strong>: A ring where the receiver posts completed buffers.</li>
</ul>
<p>Each side writes only to its own ring (sender to <code>AVAIL</code>, receiver to <code>USED</code>), preventing race conditions.
VirtIO supports multiple VRings, allowing concurrent communication channels (e.g., one for commands, one for data, one for control messages).</p>
<hr>
<p><img decoding="async" loading="lazy" alt="Resource assignement" src="https://blog.mrvym.dev/assets/images/resource-assignment-886116124d076224ccb42079495d78d3.svg" width="1172" height="340" class="img_ev3q"></p>
<blockquote>
<p><em>Figure 4: Resource assignement example for IPC</em></p>
</blockquote>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="rpmsg-abstraction">RPMsg abstraction<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#rpmsg-abstraction" class="hash-link" aria-label="Lien direct vers RPMsg abstraction" title="Lien direct vers RPMsg abstraction" translate="no">​</a></h3>
<p>RPMsg is a VirtIO-based messaging bus that allows kernel drivers to communicate with remote processors present in the system. It provides the infrastructure to exchange wire-protocol messages between client drivers. These drivers can then expose appropriate user space interfaces if needed.</p>
<p>The RPMsg client driver implements a service associated with the remote processor. This driver is probed by the RPMsg framework when a corresponding service is announced by the remote processor via a “new service announcement” RPMsg message.</p>
<p><img decoding="async" loading="lazy" alt="RPMSG Flow" src="https://blog.mrvym.dev/assets/images/rpmsg_flow-c1911cb204ff51c97f84f918dbb522fb.jpg" width="951" height="960" class="img_ev3q"></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="rpmsg-client-driver">RPMsg Client Driver<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#rpmsg-client-driver" class="hash-link" aria-label="Lien direct vers RPMsg Client Driver" title="Lien direct vers RPMsg Client Driver" translate="no">​</a></h4>
<p>The RPMsg client driver serves to handle a specific communication service between cores. For example, if the remote core exposes a logging or file-access service, an RPMsg client driver on Linux receives the message and routes it to the appropriate Linux subsystem.</p>
<p>It abstracts the low-level messaging details, allowing developers to implement high-level inter-core services (e.g., sensor acquisition, control, logging, RPC).</p>
<h5 class="anchor anchorWithStickyNavbar_LWe7" id="why-recode-this-driver">Why recode this driver?<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#why-recode-this-driver" class="hash-link" aria-label="Lien direct vers Why recode this driver?" title="Lien direct vers Why recode this driver?" translate="no">​</a></h5>
<p>You may want to re-implement or customize an RPMsg client driver in these situations:</p>
<ul>
<li>You are designing a custom protocol or service not covered by existing drivers.</li>
<li>You need to support a proprietary message format or payload.</li>
<li>You want to expose RPMsg messages to user space differently (e.g., via character device, netlink, or custom interface).</li>
<li>You need to implement secure or encrypted communication on top of RPMsg.</li>
</ul>
<p>By customizing the RPMsg client driver, developers can fully adapt the communication stack to their application's needs.</p>
<hr>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="openamp-high-level-interface">OpenAMP high-level interface<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#openamp-high-level-interface" class="hash-link" aria-label="Lien direct vers OpenAMP high-level interface" title="Lien direct vers OpenAMP high-level interface" translate="no">​</a></h3>
<p>OpenAMP’s high-level interface integrates and abstracts the complexities of managing remote cores and orchestrating inter-processor communication (IPC) in heterogeneous multicore environments. By leveraging RemoteProc for lifecycle management, RPMsg for robust messaging, and VirtIO for virtual device abstraction.</p>
<p><img decoding="async" loading="lazy" alt="OpenAMP overview" src="https://blog.mrvym.dev/assets/images/overview-architecture-0f7352d204ab237338561a3aeeec27e5.svg" width="1247" height="529" class="img_ev3q"></p>
<p>OpenAMP enables seamless control and data exchange between master and remote processors—regardless of whether they run Linux, RTOS, or bare-metal firmware.</p>
<p>The framework’s support for various topologies (star, chain, or combined) and its compatibility with industry-standard IPC mechanisms (such as IPCC, Mailbox, and RPMsg) further enhance its flexibility and reliability in real-world deployments.
<img decoding="async" loading="lazy" alt="OpenAMP overview" src="https://blog.mrvym.dev/assets/images/topo-types-132bb39a96dc425b7febc16ed8cd0bf3.svg" width="945" height="340" class="img_ev3q"></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="openamp-proxy">OpenAMP Proxy<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#openamp-proxy" class="hash-link" aria-label="Lien direct vers OpenAMP Proxy" title="Lien direct vers OpenAMP Proxy" translate="no">​</a></h4>
<p>The framework’s proxy mechanism extends this interoperability, allowing system calls such as open, read, and write to be transparently forwarded from an RTOS or bare-metal context to Linux, effectively giving remote cores access to host filesystem resources without requiring a full OS stack.</p>
<p>This is really valuable in scenarios where resource-constrained remote cores need to offload I/O operations to a more capable master processor.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="whats-the-difference-between-linux-and-freertos-on-ipc">What's the difference between Linux and FreeRTOS on IPC?<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#whats-the-difference-between-linux-and-freertos-on-ipc" class="hash-link" aria-label="Lien direct vers What's the difference between Linux and FreeRTOS on IPC?" title="Lien direct vers What's the difference between Linux and FreeRTOS on IPC?" translate="no">​</a></h2>
<p>The main difference between Linux and FreeRTOS regarding Inter-Processor Communication (IPC) lies in the abstraction layers and available mechanisms:</p>
<p>Linux: Drivers and frameworks (RemoteProc, RPMsg, VirtIO) are tightly integrated into the kernel. This integration provides fine-grained control over resources and peripherals, enabling robust and scalable IPC solutions. For instance, on STM32MP1xx, Linux can communicate with the Cortex-M4 core using OpenAMP-based virtual UART devices, which appear as TTY devices in the Linux filesystem and allow for message passing and synchronization via shared memory and IPCC peripherals.</p>
<p>FreeRTOS (or RTOS in general): OpenAMP provides a lightweight library implementing similar concepts as Linux, but with an interface simplified for real-time constraints. Each vendor porting OpenAMP provides an implementation of libmetal for their system. For example, STM32MP1xx has strong support for OpenAMP, with documentation and examples dedicated to testing the library on these devices.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="libmetal">LibMetal<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#libmetal" class="hash-link" aria-label="Lien direct vers LibMetal" title="Lien direct vers LibMetal" translate="no">​</a></h3>
<p>LibMetal is the abstraction layer used by OpenAMP to manage hardware resources and portability. On FreeRTOS, libmetal is typically provided by the vendor and adapted to the specific hardware and RTOS environment, enabling OpenAMP to function across different platforms and RTOSes.</p>
<p>For instance, on STM32MP1xx, the OpenAMP middleware initializes and configures the IPCC peripheral through HAL, sets up the OpenAMP/RPMsg framework, and creates virtual UART instances for IPC. The Cortex-M4 firmware (running FreeRTOS or bare metal) communicates with Linux on the Cortex-A7, using shared memory and IPCC for synchronization.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="closing-remarks">Closing remarks<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#closing-remarks" class="hash-link" aria-label="Lien direct vers Closing remarks" title="Lien direct vers Closing remarks" translate="no">​</a></h2>
<p>OpenAMP is a powerful framework for intercommunication between Linux and RTOS or bare-metal cores in multi-core embedded systems. It relies on open standards (RPMsg, VirtIO, RemoteProc) and uses hardware peripherals such as IPCC for synchronization. Understanding these mechanisms is essential to designing modern, flexible, and high-performance embedded systems.</p>
<p>However, it’s important to remember that, like in any field (and especially in IT) this technology is just one among many. If this topic has piqued your interest, I encourage you to learn more about Symmetric Multi-Processing <sup><a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#user-content-fn-smp-f76317" id="user-content-fnref-smp-f76317" data-footnote-ref="true" aria-describedby="footnote-label" class="footnoteRefStickyNavbar_i6ta">2</a></sup> (SMP).</p>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="glossary">Glossary<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#glossary" class="hash-link" aria-label="Lien direct vers Glossary" title="Lien direct vers Glossary" translate="no">​</a></h2>
<ul>
<li><strong>LCM</strong> – Life Cycle Management of remote processor: managing the remote processor's lifecycle (boot, stop, supervision).</li>
<li><strong>RPMsg</strong> – Lightweight messaging protocol used over shared memory.</li>
<li><strong>RemoteProc</strong> – Framework for booting and managing remote cores.</li>
<li><strong>IPCC</strong> – Hardware peripheral for signaling between processors.</li>
<li><strong>AMP</strong> – Asymmetric Multi-Processing: architecture where multiple processors run different operating systems.</li>
<li><strong>OpenAMP</strong> – Middleware for AMP communication (based on RPMsg + RemoteProc).</li>
<li><strong>VirtIO</strong> - Standard that allows virtual machines to efficiently access simplified virtual devices, such as network and storage.</li>
<li><strong>VRing</strong> – A data structure (ring buffer) defined by the VirtIO specification, used to organize and exchange buffers.</li>
</ul>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="references-and-further-reading">References and Further Reading<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#references-and-further-reading" class="hash-link" aria-label="Lien direct vers References and Further Reading" title="Lien direct vers References and Further Reading" translate="no">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="virtio-mechanisms">Virtio Mechanisms<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#virtio-mechanisms" class="hash-link" aria-label="Lien direct vers Virtio Mechanisms" title="Lien direct vers Virtio Mechanisms" translate="no">​</a></h3>
<ul>
<li><a href="https://docs.kernel.org/driver-api/virtio/virtio.html" target="_blank" rel="noopener noreferrer">Linux Virtio</a></li>
<li><a href="https://docs.oasis-open.org/virtio/virtio/v1.2/virtio-v1.2.html" target="_blank" rel="noopener noreferrer">Virtio Specification v1.2</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ipcc-mechanisms">IPCC Mechanisms<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#ipcc-mechanisms" class="hash-link" aria-label="Lien direct vers IPCC Mechanisms" title="Lien direct vers IPCC Mechanisms" translate="no">​</a></h3>
<ul>
<li><a href="https://wiki.st.com/stm32mpu/wiki/IPCC_internal_peripheral#Peripheral_overview" target="_blank" rel="noopener noreferrer">STM32 IPCC</a></li>
<li><a href="https://docs.zephyrproject.org/latest/services/ipc/ipc_service/ipc_service.html" target="_blank" rel="noopener noreferrer">Zephyr IPC Service</a></li>
<li><a href="https://www.st.com/resource/en/application_note/an5617-stm32h745755-and-stm32h747757-lines-interprocessor-communications-stmicroelectronics.pdf" target="_blank" rel="noopener noreferrer">AN5617: IPCC Application Note</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="openamp-library">OpenAMP Library<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#openamp-library" class="hash-link" aria-label="Lien direct vers OpenAMP Library" title="Lien direct vers OpenAMP Library" translate="no">​</a></h3>
<ul>
<li><a href="https://www.openampproject.org/docs/whitepapers/Introduction_to_OpenAMPlib_v1.1a.pdf" target="_blank" rel="noopener noreferrer">Introduction to OpenAMP Library (Whitepaper)</a></li>
<li><a href="https://wiki.st.com/stm32mpu/wiki/Coprocessor_management_overview" target="_blank" rel="noopener noreferrer">Coprocessor Management Overview on STM32MPx</a></li>
<li><a href="https://www.youtube.com/watch?v=QzICJz-xRzk" target="_blank" rel="noopener noreferrer">STM32 Dual Core - Inter-core communication using HSEM (YouTube)</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="rpmsg">RPMsg<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#rpmsg" class="hash-link" aria-label="Lien direct vers RPMsg" title="Lien direct vers RPMsg" translate="no">​</a></h3>
<ul>
<li><a href="https://wiki.st.com/stm32mpu/wiki/Linux_RPMsg_framework_overview" target="_blank" rel="noopener noreferrer">Linux RPMsg on OpenStLinux</a></li>
<li><a href="https://wiki.st.com/stm32mpu/wiki/Getting_started/STM32MP1_boards/STM32MP157x-EV1/Develop_on_Arm%C2%AE_Cortex%C2%AE-M4/Modify,_rebuild_and_reload_a_firmware" target="_blank" rel="noopener noreferrer">Develop on Arm (STM32MP157x-EV1)</a></li>
<li><a href="https://github.com/STMicroelectronics/linux/blob/v6.6-stm32mp/include/linux/rpmsg.h" target="_blank" rel="noopener noreferrer">Linux RPMsg driver source</a></li>
<li><a href="https://wiki.st.com/stm32mpu/wiki/Exchanging_buffers_with_the_coprocessor" target="_blank" rel="noopener noreferrer">Exchanging buffers with RPMsg</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="additional-resources">Additional resources<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#additional-resources" class="hash-link" aria-label="Lien direct vers Additional resources" title="Lien direct vers Additional resources" translate="no">​</a></h3>
<ul>
<li><a href="https://github.com/diegosueiro/meta-ipc" target="_blank" rel="noopener noreferrer">Yocto meta-ipc layer</a></li>
</ul>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorWithStickyNavbar_LWe7 sr-only" id="footnote-label">Footnotes<a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#footnote-label" class="hash-link" aria-label="Lien direct vers Footnotes" title="Lien direct vers Footnotes" translate="no">​</a></h2>
<ol>
<li id="user-content-fn-remoteproc-f76317">
<p><a href="https://docs.kernel.org/staging/remoteproc.html" target="_blank" rel="noopener noreferrer">https://docs.kernel.org/staging/remoteproc.html</a> <a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#user-content-fnref-remoteproc-f76317" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
<li id="user-content-fn-smp-f76317">
<p><a href="https://en.wikipedia.org/wiki/Symmetric_multiprocessing" target="_blank" rel="noopener noreferrer">https://en.wikipedia.org/wiki/Symmetric_multiprocessing</a> <a href="https://blog.mrvym.dev/understanding-ipcc-on-stm32#user-content-fnref-smp-f76317" data-footnote-backref="" aria-label="Back to reference 2" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section>]]></content>
        <author>
            <name>Vianney Marticou</name>
            <uri>https://github.com/mrvym</uri>
        </author>
        <category label="stm32" term="stm32"/>
        <category label="IPC" term="IPC"/>
        <category label="OpenStLinux" term="OpenStLinux"/>
        <category label="IPCC" term="IPCC"/>
        <category label="ARM" term="ARM"/>
        <category label="OpenAMP" term="OpenAMP"/>
        <category label="RPMsg" term="RPMsg"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Désactiver les pinsyscalls sur OpenBSD]]></title>
        <id>https://blog.mrvym.dev/pinsyscall-on-openbsd</id>
        <link href="https://blog.mrvym.dev/pinsyscall-on-openbsd"/>
        <updated>2025-05-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Les versions récentes d'OpenBSD empêchent l'utilisation directe des syscalls depuis le code utilisateur, en imposant une vérification dans le linker (ld.so).]]></summary>
        <content type="html"><![CDATA[<p>Les versions récentes d'OpenBSD empêchent l'utilisation directe des syscalls depuis le code utilisateur, en imposant une vérification dans le linker (<code>ld.so</code>).
Cela renforce la sécurité en rendant les exploits plus difficiles. Cet article explore la mise en place de cette protection, son fonctionnement, et comment la désactiver en modifiant le code source du kernel.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="pinsyscalls-">Pinsyscalls ?<a href="https://blog.mrvym.dev/pinsyscall-on-openbsd#pinsyscalls-" class="hash-link" aria-label="Lien direct vers Pinsyscalls ?" title="Lien direct vers Pinsyscalls ?" translate="no">​</a></h2>
<p>Avant de voir comment désactiver un pinsyscalls, cela peut être intéressant de voir ce que cela signifie.
Le kernel OpenBSD a mise en place une sécurité particulière sur ces syscalls. Cela a pour but de faire en sorte qu'un syscall ne puisse être call que dans une certaine plage d'addresse dans un binaire.</p>
<p>Cette sécurité veut dire que l'on ne peut pas exécuter un syscall à la main (cf <a href="https://blog.mrvym.dev/pinsyscall-on-openbsd#coder-le-syscall">Coder le sycall</a>).</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="trouver-le-num-dun-syscall">Trouver le num d'un syscall<a href="https://blog.mrvym.dev/pinsyscall-on-openbsd#trouver-le-num-dun-syscall" class="hash-link" aria-label="Lien direct vers Trouver le num d'un syscall" title="Lien direct vers Trouver le num d'un syscall" translate="no">​</a></h2>
<p>Avant tout, nous devons faire un test en appelant un syscall.
Pour trouver le numéro de syscall de <code>void exit(int num)</code>, nous allons lire le man.</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ </span><span class="token function" style="color:rgb(80, 250, 123)">man</span><span class="token plain"> </span><span class="token number">9</span><span class="token plain"> syscall</span><br></span></code></pre></div></div>
<p>Section <code>Code references</code> on trouve /sys/kern/syscall.master</p>
<p>Ce fichier est très important, il contient la liste des syscalls sur OpenBSD. À noter qu'à la différence de Linux, leurs déclarations sont faites dans ce fichier donc dynamique.
Cela fait un des grandes forces de BSD, c'est relativement "simple" d'ajouter un syscall.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="coder-le-syscall">Coder le syscall<a href="https://blog.mrvym.dev/pinsyscall-on-openbsd#coder-le-syscall" class="hash-link" aria-label="Lien direct vers Coder le syscall" title="Lien direct vers Coder le syscall" translate="no">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="en-asm">En ASM<a href="https://blog.mrvym.dev/pinsyscall-on-openbsd#en-asm" class="hash-link" aria-label="Lien direct vers En ASM" title="Lien direct vers En ASM" translate="no">​</a></h3>
<div class="language-asm codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-asm codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">.global main</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">.section .text</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">main:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  movl $1, %eax;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  syscall;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  ret;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="en-c">En C<a href="https://blog.mrvym.dev/pinsyscall-on-openbsd#en-c" class="hash-link" aria-label="Lien direct vers En C" title="Lien direct vers En C" translate="no">​</a></h3>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">main</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">asm</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">volatile</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"movl $1, %eax;"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                </span><span class="token string" style="color:rgb(255, 121, 198)">"syscall;"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// Unreached code </span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="result">Result<a href="https://blog.mrvym.dev/pinsyscall-on-openbsd#result" class="hash-link" aria-label="Lien direct vers Result" title="Lien direct vers Result" translate="no">​</a></h2>
<p>On remarque assez vite que le binaire que nous avons compilé, ne fonctionne pas.
<code>main[10291]: pinsyscalls addr 5a288eab978 code 1, pinoff 0xffffffff (pin 330 5a4c881d000-5a4c882b66d e66d) (libcpin 331 5a5145d0000-5a514687000 b7000) error 78 Abort trap (core dumped)</code></p>
<p>Je suppose que cela doit venir d'un process interne au kernel, qui check la validité de notre appel et qui nous SIGABRT.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="comment-fix-le-syscall-">Comment fix le syscall ?<a href="https://blog.mrvym.dev/pinsyscall-on-openbsd#comment-fix-le-syscall-" class="hash-link" aria-label="Lien direct vers Comment fix le syscall ?" title="Lien direct vers Comment fix le syscall ?" translate="no">​</a></h2>
<p>L'idée est de trouver l'endroit qui check le linkage des syscalls dans le kernel et bypass le <code>if</code>.</p>
<p>Dans un premier temps, on cherche dans les <code>man</code> et non pas dans le code.
5 min de lecture peuvent nous éviter beaucoup de recherche dans une codebase.</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ </span><span class="token function" style="color:rgb(80, 250, 123)">apropos</span><span class="token plain"> syscall</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">pinsyscalls</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> - pin system call entry to precise locations </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">in</span><span class="token plain"> the address space</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">sqlite3_vfs, sqlite3_syscall_ptr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> - OS interface object</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ktrace, ktrgenio, ktrnamei, KTRPOINT, ktrpsig, ktrsyscall, ktrsysret</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">9</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> - process tracing kernel interface</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">syscall</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">9</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> - system calls overview</span><br></span></code></pre></div></div>
<p>Nous avons déjà lu le syscall(9) pour trouver notre numéro de syscall, mais pas encore le premier pinsyscalls(2)</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="pinsyscalls2">pinsyscalls(2)<a href="https://blog.mrvym.dev/pinsyscall-on-openbsd#pinsyscalls2" class="hash-link" aria-label="Lien direct vers pinsyscalls(2)" title="Lien direct vers pinsyscalls(2)" translate="no">​</a></h3>
<p>On apprend que :</p>
<ul>
<li>ld.so(1) cree des entry point pour chaque syscalls</li>
<li>si on ne respecte pas les entry point alors SIGABRT</li>
<li>Ca correspond a notre erreur</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="trouver-pinsyscall">Trouver pinsyscall<a href="https://blog.mrvym.dev/pinsyscall-on-openbsd#trouver-pinsyscall" class="hash-link" aria-label="Lien direct vers Trouver pinsyscall" title="Lien direct vers Trouver pinsyscall" translate="no">​</a></h3>
<p>J'en déduis que l'on cherche ou est <code>pinsyscall(1)</code>, trouver le code qui l'appelle puis le fix.</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">cd</span><span class="token plain"> /usr/src</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Un peu de recherche sur le mode clef syscall plus tard</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ </span><span class="token function" style="color:rgb(80, 250, 123)">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-r</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"PINSYSCALL"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">#  ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">lib/libc/arch/amd64/SYS.h:	PINSYSCALL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">SYS_ </span><span class="token comment" style="color:rgb(98, 114, 164)">## x, 97b)</span><br></span></code></pre></div></div>
<p>Alors la macro pinsyscall n'est pas défini dans ce fichier (qui est machine-depend). En regardant les include du header, on voit</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">include</span><span class="token macro property"> </span><span class="token macro property string" style="color:rgb(255, 121, 198)">"DEFS.h"</span><span class="token macro property"> </span><span class="token macro property comment" style="color:rgb(98, 114, 164)">// Machine independent</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">include</span><span class="token macro property">  </span><span class="token macro property comment" style="color:rgb(98, 114, 164)">// Machine // independent</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="trouver-lutilisation-du-pinsyscall">Trouver l'utilisation du pinsyscall<a href="https://blog.mrvym.dev/pinsyscall-on-openbsd#trouver-lutilisation-du-pinsyscall" class="hash-link" aria-label="Lien direct vers Trouver l'utilisation du pinsyscall" title="Lien direct vers Trouver l'utilisation du pinsyscall" translate="no">​</a></h3>
<p>Je découvre que la fonction <code>pinsyscall(1)</code> est défini dans mon fichier <code>DEFS.h</code>. C'est une macro qui génère de l'assembleur.
Je ne me lance pas dans l'analyse de son code pour le moment, néanmoins, je garde en tête son existence.
Pour le moment, je cherche le code qui check le fonctionnement du <code>pinsyscall</code>.</p>
<p>J'ai vu que le include  existe, je vais aller voir par la.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="syssyscallh">sys/syscall.h<a href="https://blog.mrvym.dev/pinsyscall-on-openbsd#syssyscallh" class="hash-link" aria-label="Lien direct vers sys/syscall.h" title="Lien direct vers sys/syscall.h" translate="no">​</a></h3>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ find </span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain"> </span><span class="token operator">-</span><span class="token plain">name </span><span class="token string" style="color:rgb(255, 121, 198)">"syscall.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token operator">/</span><span class="token plain">libexec</span><span class="token operator">/</span><span class="token plain">ld</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">so</span><span class="token operator">/</span><span class="token plain">syscall</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">h</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token operator">/</span><span class="token plain">sys</span><span class="token operator">/</span><span class="token plain">arch</span><span class="token operator">/</span><span class="token plain">riscv64</span><span class="token operator">/</span><span class="token plain">include</span><span class="token operator">/</span><span class="token plain">syscall</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">h</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token operator">/</span><span class="token plain">sys</span><span class="token operator">/</span><span class="token plain">sys</span><span class="token operator">/</span><span class="token plain">syscall</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">h</span><br></span></code></pre></div></div>
<p>Deux fichiers ont l'air intéressant celui de ld.so (cf le man que l'on a lu sur les pinsyscall).</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="le-dossier-libexecldso">Le dossier libexec/ld.so<a href="https://blog.mrvym.dev/pinsyscall-on-openbsd#le-dossier-libexecldso" class="hash-link" aria-label="Lien direct vers Le dossier libexec/ld.so" title="Lien direct vers Le dossier libexec/ld.so" translate="no">​</a></h4>
<p>Après un rapide grep dans le directory du syscall.h pour trouver qui l'utilise. Je trouve le fichier <code>resolve.c</code>.
Cela me permet de découvrir l'implémentation de la fonction <code>pinsyscall</code> et de la struct.</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockTitle_OeMC">/usr/src/libexec/ld.so/resolve.c </div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token macro property directive-hash">#</span><span class="token macro property"> </span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">line</span><span class="token macro property"> </span><span class="token macro property expression number">782</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">struct</span><span class="token plain"> </span><span class="token class-name">pinsyscalls</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  u_int offset</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  u_int sysno</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="le-dossier-syssys">Le dossier sys/sys<a href="https://blog.mrvym.dev/pinsyscall-on-openbsd#le-dossier-syssys" class="hash-link" aria-label="Lien direct vers Le dossier sys/sys" title="Lien direct vers Le dossier sys/sys" translate="no">​</a></h4>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-r</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"syscall.h"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">syscall.h:/*	</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$OpenBSD</span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">:</span><span class="token plain"> syscall.h,v </span><span class="token number">1.282</span><span class="token plain"> </span><span class="token number">2025</span><span class="token plain">/02/17 </span><span class="token number">13</span><span class="token plain">:10:56 mpi Exp $	*/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">syscall_mi.h:</span><span class="token comment" style="color:rgb(98, 114, 164)">#include </span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="the-patch">The patch<a href="https://blog.mrvym.dev/pinsyscall-on-openbsd#the-patch" class="hash-link" aria-label="Lien direct vers The patch" title="Lien direct vers The patch" translate="no">​</a></h3>
<p>Nous avons enfin trouvé le fichier qui contient le fameux <code>if</code> qui vérifie la condition d'appels des syscalls.
Il nous suffit maintenant de supprimer le <code>else</code> pour ne jamais set le variable <code>error</code>.</p>
<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ diff syscall_mi.h.patch syscall_mi.h -Naur &gt; syscall.patch</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token coord">--- syscall_mi.h	2025-02-20 14:13:12.237060577 +0100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token coord">+++ syscall_mi.h.patch	2025-02-20 14:17:23.279746175 +0100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token coord">@@ -94,8 +94,7 @@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">; /* multiple locations, hopefully a boring operation */</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">else</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">error = ENOSYS;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">	} else</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token deleted-sign deleted prefix deleted" style="color:rgb(255, 85, 85)">-</span><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)">		error = ENOSYS;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token deleted-sign deleted line" style="color:rgb(255, 85, 85)"></span><span class="token inserted-sign inserted prefix inserted" style="color:rgb(80, 250, 123)">+</span><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)">	}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token inserted-sign inserted line" style="color:rgb(80, 250, 123)"></span><span class="token plain">if (error == 0)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">return (0);</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">die:</span><br></span></code></pre></div></div>]]></content>
        <author>
            <name>Vianney Marticou</name>
            <uri>https://github.com/mrvym</uri>
        </author>
        <category label="openbsd" term="openbsd"/>
        <category label="syscall" term="syscall"/>
        <category label="pinsyscall" term="pinsyscall"/>
        <category label="kernel" term="kernel"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[How copy-paste works on Linux ?]]></title>
        <id>https://blog.mrvym.dev/how-copy-paste-works-on-linux</id>
        <link href="https://blog.mrvym.dev/how-copy-paste-works-on-linux"/>
        <updated>2025-04-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In this article, we will explore the internal workings of copy and paste in Linux.]]></summary>
        <content type="html"><![CDATA[<p>In this article, we will explore the internal workings of copy and paste in Linux.
First, let me provide some context. There is a manual, almost like an RFC.</p>
<p>The Inter-Communication Client Conventions Manual (ICCCM for short), which lays down some rules.
The first version was published in July 1989, the second in 1994.
This manual, written 30 years ago, is therefore the reference for the subject.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="first-some-history">First some history<a href="https://blog.mrvym.dev/how-copy-paste-works-on-linux#first-some-history" class="hash-link" aria-label="Lien direct vers First some history" title="Lien direct vers First some history" translate="no">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="x-vs-xorg-vs-x11">X vs X.org vs X11<a href="https://blog.mrvym.dev/how-copy-paste-works-on-linux#x-vs-xorg-vs-x11" class="hash-link" aria-label="Lien direct vers X vs X.org vs X11" title="Lien direct vers X vs X.org vs X11" translate="no">​</a></h3>
<p>The X Window System, also known as X, is old. Written in 1984, it was the default windowing system for most Unix systems.
But X is not the implementation, it is more a set of protocols and architecture.</p>
<p>X.org is the free and open source implementation of the X Window System. X.org is also a foundation that oversees the development of X11.</p>
<p>X11 is the latest version (since 1987) of the X architecture, and X10 is the first iteration of the project born with X in 1984.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="x10-and-cut-buffers">X10 and cut-buffers<a href="https://blog.mrvym.dev/how-copy-paste-works-on-linux#x10-and-cut-buffers" class="hash-link" aria-label="Lien direct vers X10 and cut-buffers" title="Lien direct vers X10 and cut-buffers" translate="no">​</a></h2>
<p>For context, the first release of X10 was in 1985. At that time, the ICCCM hadn't been released.
Xorg was doing its own thing. They used a thing called <code>cut-buffer' or also known as </code>buffer-cut'.</p>
<p>A cut-buffer works like a circular buffer of 8 buffers, ranging from CUTBUFFER0 to CUTBUFFER7.
When a user tries to add a string to a cut buffer, each string is swapped to a different buffer.
So the circular buffer is like a history of all copy-paste.</p>
<p>Nowadays, there are no more programs that use a cut-buffer, or at least they used the cut-buffer and the new method.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="x11-support">X11 support<a href="https://blog.mrvym.dev/how-copy-paste-works-on-linux#x11-support" class="hash-link" aria-label="Lien direct vers X11 support" title="Lien direct vers X11 support" translate="no">​</a></h2>
<p>X has an object called 'selections'. It is basically a clipboard, but for a different use.
There are THREE selections defined by ICCCM: Primary, Secondary, and Clipboard The ICCCM also makes a distinction between <code>Passive</code> and <code>Active</code> selections.</p>
<p>Passive</p>
<blockquote>
<p>When some data is selected, the client handling the window where this selection is done transfers it somewhere, and no longer needs to care about it</p>
</blockquote>
<p>Active</p>
<blockquote>
<p>Transfer of data to a client requires the client "holding" the selection to actively participate in the exchange.</p>
</blockquote>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="primary">PRIMARY<a href="https://blog.mrvym.dev/how-copy-paste-works-on-linux#primary" class="hash-link" aria-label="Lien direct vers PRIMARY" title="Lien direct vers PRIMARY" translate="no">​</a></h4>
<p>I is mostly used when you select some text with your mouse. You can use your mouse middle click to paste it.
I said "mostly" because it depends on the software. Each X11 application decides which binding it uses to interact with a selection.</p>
<p>So, as you understand, it's a `passive' selection. The user does not ask the system to copy this text.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="clipboard">CLIPBOARD<a href="https://blog.mrvym.dev/how-copy-paste-works-on-linux#clipboard" class="hash-link" aria-label="Lien direct vers CLIPBOARD" title="Lien direct vers CLIPBOARD" translate="no">​</a></h4>
<p>This is an <code>active</code> selection. It's used when the user wants to copy some data. It can be done with either <code>Ctrl-C</code> or the simpler <code>Mouse right click + copy</code>.</p>
<p>In <code>vim</code> you could copy something with <code>*y</code> and <code>*p</code> or</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">set clipboard=unnamedplus</span><br></span></code></pre></div></div>
<p>So when the user requests <code>Paste</code>, it will be the contents of the CLIPBOARD selection.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="secondary">SECONDARY<a href="https://blog.mrvym.dev/how-copy-paste-works-on-linux#secondary" class="hash-link" aria-label="Lien direct vers SECONDARY" title="Lien direct vers SECONDARY" translate="no">​</a></h4>
<p>To be honest, I looked for as much information as I could about this selection, but I couldn't find any application that used it for any good reason.</p>
<p>In <code>vim</code> you could copy something in it with <code>+y</code> and <code>+p</code>.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">set clipboard=unnamed</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="xdnd">XDND<a href="https://blog.mrvym.dev/how-copy-paste-works-on-linux#xdnd" class="hash-link" aria-label="Lien direct vers XDND" title="Lien direct vers XDND" translate="no">​</a></h2>
<p>Such a complex word, it's just the first letter of <code>X Drag and Drop Protocol</code>. When I did some research on the clipboard, I found information about drag and drop.</p>
<p>When a drag starts, the source takes ownership of <code>XDNDSelection</code> (a structure inside X11), and when the mouse leaves the source, X11 sends a message to the target. At this point the user can release the mouse, the target gets a lot of information with a specific selection <code>XA_PRIMARY</code>. XA stands for XDNDAware, the module responsible for DND in X. With all this information, the target software could easily request the resource from the source software.
I learn that within the first iteration of X, there are no optimizations when `target = source'.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="alias">Alias<a href="https://blog.mrvym.dev/how-copy-paste-works-on-linux#alias" class="hash-link" aria-label="Lien direct vers Alias" title="Lien direct vers Alias" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token builtin class-name" style="color:rgb(189, 147, 249)">alias</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">paste</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"xclip -o"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">alias</span><span class="token plain"> </span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">copy</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"xclip"</span><br></span></code></pre></div></div>
<p>And so you can use like this.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token function" style="color:rgb(80, 250, 123)">cat</span><span class="token plain"> LONG_FILE </span><span class="token operator">|</span><span class="token plain"> copy </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">paste</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">vim</span><span class="token plain"> - </span><br></span></code></pre></div></div>
<p>Sources :</p>
<ul>
<li><a href="https://x.org/releases/X11R7.6/doc/xorg-docs/specs/ICCCM/icccm.html" target="_blank" rel="noopener noreferrer">ICCCM</a></li>
<li><a href="http://vimdoc.sourceforge.net/htmldoc/gui_x11.html#quoteplus" target="_blank" rel="noopener noreferrer">VimDoc</a></li>
<li><a href="https://www.freedesktop.org/wiki/Specifications/ClipboardsWiki/" target="_blank" rel="noopener noreferrer">ClipbordWiki</a></li>
<li><a href="https://superuser.com/questions/90257/what-is-the-difference-between-the-x-clipboards" target="_blank" rel="noopener noreferrer">StackOverflow - Diff between X Clip</a></li>
<li><a href="https://freedesktop.org/wiki/Specifications/XDND/" target="_blank" rel="noopener noreferrer">XDND</a></li>
</ul>]]></content>
        <author>
            <name>Vianney Marticou</name>
            <uri>https://github.com/mrvym</uri>
        </author>
        <category label="Linux" term="Linux"/>
        <category label="Xorg" term="Xorg"/>
        <category label="Copy" term="Copy"/>
        <category label="Paste" term="Paste"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Le plus petit segfault]]></title>
        <id>https://blog.mrvym.dev/le-plus-petit-segfault</id>
        <link href="https://blog.mrvym.dev/le-plus-petit-segfault"/>
        <updated>2025-01-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Coder le plus petit segfault du monde ! Et creusez dans le fonctionnement du 'main'.]]></summary>
        <content type="html"><![CDATA[<p>Dans cet article, on va voir comment créer un code qui crash le plus efficacement possible.<br>
<!-- -->Cela veut dire comprendre ce qu'est un segfault, comment marche la fonction <code>main</code>, ainsi que le code exécuté avant.</p>
<p>Une magnifique occasion de faire de l'assembleur !</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="sans-plus-attendre-voici-notre-premier-exemple-">Sans plus attendre, voici notre premier exemple :<a href="https://blog.mrvym.dev/le-plus-petit-segfault#sans-plus-attendre-voici-notre-premier-exemple-" class="hash-link" aria-label="Lien direct vers Sans plus attendre, voici notre premier exemple :" title="Lien direct vers Sans plus attendre, voici notre premier exemple :" translate="no">​</a></h3>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">main</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre></div></div>
<p>Ce code compile très bien :</p>
<blockquote>
<p><code>gcc main.c -o main</code></p>
</blockquote>
<p>et produit cet output :</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ ./main</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain">    </span><span class="token number">20677</span><span class="token plain"> segmentation fault </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">core dumped</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">  ./main</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="un-segfault">Un segfault<a href="https://blog.mrvym.dev/le-plus-petit-segfault#un-segfault" class="hash-link" aria-label="Lien direct vers Un segfault" title="Lien direct vers Un segfault" translate="no">​</a></h3>
<p>Je pense que c’est le bon moment pour répondre à cette question : c’est quoi un segfault ?</p>
<p>Un <strong>segfault</strong> ou "segmentation fault" est une erreur de segmentation. On l’obtient lorsque notre programme essaye de lire un pointeur qui ne nous appartient pas.<br>
<!-- -->Au lancement du programme, l’OS lui attribue une certaine quantité de mémoire, et il n’a pas le droit d’en sortir.</p>
<p>C’est une sécurité pour empêcher des programmes d’accéder à des zones mémoire non autorisées.</p>
<p>Quand l’OS (ou plus précisément, le MMU) détecte que le programme tente d’accéder à une mémoire non autorisée, il génère cette "fault".</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="on-dump-des-objets">On dump des objets<a href="https://blog.mrvym.dev/le-plus-petit-segfault#on-dump-des-objets" class="hash-link" aria-label="Lien direct vers On dump des objets" title="Lien direct vers On dump des objets" translate="no">​</a></h3>
<p>Pour mieux comprendre le fonctionnement du programme, on va aller voir le code machine.<br>
<!-- -->Le flag <code>-t</code> nous permet de récupérer juste la liste des symboles :</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ objdump </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-t</span><span class="token plain"> ./main</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># &lt;-- truncate --&gt; </span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">0000000000004000  w      .data	0000000000000000              data_start</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">0000000000004000 g       .data	0000000000000000              __data_start</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">0000000000001020 g     F .text	0000000000000026              _start</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">0000000000004010 g       .bss	0000000000000000              __bss_start</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">0000000000004014 g     O .bss	0000000000000004              main</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># &lt;-- truncate --&gt; </span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">0000000000001000 g     F .init	0000000000000000              .hidden _init</span><br></span></code></pre></div></div>
<p>On remarque que le symbole <code>main</code> est dans le segment <code>.bss</code> et pas dans <code>.text</code>.</p>
<p><img decoding="async" loading="lazy" alt="Segments in ELF file" src="https://blog.mrvym.dev/assets/images/segment-c-code-268215d718030f25a84a60138bb336b8.png" width="1770" height="972" class="img_ev3q"></p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="segment-bss-">Segment <strong>bss</strong> :<a href="https://blog.mrvym.dev/le-plus-petit-segfault#segment-bss-" class="hash-link" aria-label="Lien direct vers segment-bss-" title="Lien direct vers segment-bss-" translate="no">​</a></h4>
<blockquote>
<p>Le segment <code>.bss</code> (Block Starting Symbol) contient les variables statiques allouées.</p>
</blockquote>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="segment-text-">Segment <strong>text</strong> :<a href="https://blog.mrvym.dev/le-plus-petit-segfault#segment-text-" class="hash-link" aria-label="Lien direct vers segment-text-" title="Lien direct vers segment-text-" translate="no">​</a></h4>
<blockquote>
<p>Le segment <code>.text</code> contient les instructions exécutables du programme.</p>
</blockquote>
<p>On se rend compte que notre code ne déclare pas une fonction, mais bien une variable. La variable étant globale, le compilateur crée un symbole pour elle.<br>
<!-- -->Cela se vérifie très simplement en rajoutant une variable <code>test</code> dans notre code :</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">0000000000004018 g     O .bss	0000000000000004              </span><span class="token builtin class-name" style="color:rgb(189, 147, 249)">test</span><br></span></code></pre></div></div>
<p>En effet, le nom <code>main</code> n’est pas un keyword spécifique en C. C’est juste un nom de fonction arbitraire qui est appelé au lancement du programme.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="pour-les-québécois">Pour les Québécois<a href="https://blog.mrvym.dev/le-plus-petit-segfault#pour-les-qu%C3%A9b%C3%A9cois" class="hash-link" aria-label="Lien direct vers Pour les Québécois" title="Lien direct vers Pour les Québécois" translate="no">​</a></h3>
<p>Pour les puristes d’entre vous, il est tout à fait possible de ne pas inclure une fonction <code>main</code> dans votre code.<br>
<!-- -->Il suffit d’écrire votre propre fonction <code>_start</code> et de demander à GCC de ne pas linker la sienne :</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">include</span><span class="token macro property"> </span><span class="token macro property string" style="color:rgb(255, 121, 198)">&lt;stdio.h&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">include</span><span class="token macro property"> </span><span class="token macro property string" style="color:rgb(255, 121, 198)">&lt;stdlib.h&gt;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">principale</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">puts</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Hey là, ça marche-tu?"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">_start</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> ret </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">principale</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">exit</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">ret</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<blockquote>
<p><code>$ gcc principale.c -o principale -nostartfiles</code></p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="lancement-du-programme">Lancement du programme<a href="https://blog.mrvym.dev/le-plus-petit-segfault#lancement-du-programme" class="hash-link" aria-label="Lien direct vers Lancement du programme" title="Lien direct vers Lancement du programme" translate="no">​</a></h3>
<p>Mais au fait, qui call la fonction <code>main</code> ?</p>
<p>Pour répondre à cette question, regardons le code assembleur de notre programme, en particulier la fonction <code>_start</code>.<br>
<!-- -->Au passage, on remarque que son symbole est bien dans le segment <code>.text</code>.</p>
<p>Voici une version simplifiée du code (la fonction complète est assez complexe) :</p>
<div class="language-nasm codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-nasm codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token label function" style="color:rgb(80, 250, 123)">_start:</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    xor </span><span class="token operator">%</span><span class="token register variable" style="color:rgb(189, 147, 249);font-style:italic">ebp</span><span class="token plain">, </span><span class="token operator">%</span><span class="token register variable" style="color:rgb(189, 147, 249);font-style:italic">ebp</span><span class="token plain">            </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    mov (</span><span class="token operator">%</span><span class="token register variable" style="color:rgb(189, 147, 249);font-style:italic">rsp</span><span class="token plain">), </span><span class="token operator">%</span><span class="token register variable" style="color:rgb(189, 147, 249);font-style:italic">edi</span><span class="token plain">          </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    lea </span><span class="token number">8</span><span class="token plain">(</span><span class="token operator">%</span><span class="token register variable" style="color:rgb(189, 147, 249);font-style:italic">rsp</span><span class="token plain">), </span><span class="token operator">%</span><span class="token register variable" style="color:rgb(189, 147, 249);font-style:italic">rsi</span><span class="token plain">         </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    lea </span><span class="token number">16</span><span class="token plain">(</span><span class="token operator">%</span><span class="token register variable" style="color:rgb(189, 147, 249);font-style:italic">rsp</span><span class="token plain">,</span><span class="token operator">%</span><span class="token register variable" style="color:rgb(189, 147, 249);font-style:italic">rdi</span><span class="token plain">,</span><span class="token number">8</span><span class="token plain">), </span><span class="token operator">%</span><span class="token register variable" style="color:rgb(189, 147, 249);font-style:italic">rdx</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    xor </span><span class="token operator">%</span><span class="token register variable" style="color:rgb(189, 147, 249);font-style:italic">eax</span><span class="token plain">, </span><span class="token operator">%</span><span class="token register variable" style="color:rgb(189, 147, 249);font-style:italic">eax</span><span class="token plain">            </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    call main                 </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    mov </span><span class="token operator">%</span><span class="token register variable" style="color:rgb(189, 147, 249);font-style:italic">eax</span><span class="token plain">, </span><span class="token operator">%</span><span class="token register variable" style="color:rgb(189, 147, 249);font-style:italic">edi</span><span class="token plain">    </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    xor </span><span class="token operator">%</span><span class="token register variable" style="color:rgb(189, 147, 249);font-style:italic">eax</span><span class="token plain">, </span><span class="token operator">%</span><span class="token register variable" style="color:rgb(189, 147, 249);font-style:italic">eax</span><span class="token plain">   </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    call _exit      </span><br></span></code></pre></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="étapes-de-_start-">Étapes de <code>_start</code> :<a href="https://blog.mrvym.dev/le-plus-petit-segfault#%C3%A9tapes-de-_start-" class="hash-link" aria-label="Lien direct vers étapes-de-_start-" title="Lien direct vers étapes-de-_start-" translate="no">​</a></h4>
<ul>
<li>On marque la fin de la stack frame :<br>
<code>xor %ebp, %ebp</code></li>
<li>On initialise <code>argc</code> :<br>
<code>mov (%rsp), %edi</code></li>
<li>On initialise <code>argv</code> :<br>
<code>lea 8(%rsp), %rsi</code></li>
<li>On initialise <code>envp</code> :<br>
<code>lea 16(%rsp,%rdi,8), %rdx</code></li>
<li>On set un code retour initialisé à 0 (compatibilité) :<br>
<code>xor %eax, %eax</code></li>
<li>On call <code>main(argc, argv, envp)</code> :<br>
<code>call main</code></li>
<li>On call la fonction <code>_exit</code> avec le code retour :<br>
<code>mov %eax, %edi</code><br>
<code>call _exit</code></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="envp-">Envp ??<a href="https://blog.mrvym.dev/le-plus-petit-segfault#envp-" class="hash-link" aria-label="Lien direct vers Envp ??" title="Lien direct vers Envp ??" translate="no">​</a></h3>
<p>Le vrai prototype de la fonction <code>main</code> a 3 arguments :</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">main</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> argc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">char</span><span class="token operator">*</span><span class="token plain"> argv</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">char</span><span class="token operator">*</span><span class="token plain"> envp</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre></div></div>
<blockquote>
<p>Oui, j’ai découvert le vrai prototype en analysant le reverse de <code>_start</code>.</p>
</blockquote>
<p>Comme son nom l’indique, <code>envp</code> correspond aux variables d’environnement du shell.<br>
<!-- -->Si on ne vous a jamais montré ça, c’est parce que ce n’est pas portable (même si toutes les machines actuelles le supportent).</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="encore-plus-petit">Encore plus petit<a href="https://blog.mrvym.dev/le-plus-petit-segfault#encore-plus-petit" class="hash-link" aria-label="Lien direct vers Encore plus petit" title="Lien direct vers Encore plus petit" translate="no">​</a></h3>
<p>Et oui, si vous avez bien suivi, il est maintenant possible de segfault encore plus vite. Il suffit que le segfault soit directement dans la fonction <code>_start</code>, sans passer par <code>main</code>.</p>
<p>Voici un exemple minimaliste (vide) :</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ </span><span class="token function" style="color:rgb(80, 250, 123)">touch</span><span class="token plain"> main.c</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">/usr/bin/ld: warning: cannot </span><span class="token function" style="color:rgb(80, 250, 123)">find</span><span class="token plain"> entry symbol _start</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> defaulting to 0000000000001000</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ gcc </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> main main.c </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-nostartfiles</span><br></span></code></pre></div></div>
<p>Nous avons certes un warning, mais ça compile.<br>
<!-- -->Un <code>objdump</code> montre qu’il n’y a presque rien dans ce fichier et que le symbole <code>_start</code> n’est pas défini :</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ objdump </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-t</span><span class="token plain"> ./main</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token operator">&lt;</span><span class="token plain">-- truncate --</span><span class="token operator">&gt;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">0000000000000000         *UND*	0000000000000000 _start</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="scrt1o-ça-sort-doù-">Scrt1.o, ça sort d'où ?<a href="https://blog.mrvym.dev/le-plus-petit-segfault#scrt1o-%C3%A7a-sort-do%C3%B9-" class="hash-link" aria-label="Lien direct vers Scrt1.o, ça sort d'où ?" title="Lien direct vers Scrt1.o, ça sort d'où ?" translate="no">​</a></h2>
<p>Alors hormis le fait que j'ai lu la doc de GCC, comment est-ce que je sais que <code>Scrt1.o</code> existe ?<br>
<!-- -->Vous connaissez le <code>-v</code> ? Eh oui, on peut très bien activer le debug / verbose sur GCC.</p>
<p>Personne ne le fait parce qu'il faut avoir un sacré melon pour considérer que GCC fait mal son travail (sauf moi).</p>
<p>En activant ce flag, on se retrouve avec pas mal de variables d'env qui sont print, mais pas que. On trouve notamment cette ligne dans laquelle on voit l'include des fichiers <code>.o</code> :</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/collect2 </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-plugin</span><span class="token plain"> /usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/liblto_plugin.so </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    -plugin-opt</span><span class="token operator">=</span><span class="token plain">/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/lto-wrapper </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    -plugin-opt</span><span class="token operator">=</span><span class="token plain">-fresolution</span><span class="token operator">=</span><span class="token plain">/tmp/ccEcycpv.res </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    -plugin-opt</span><span class="token operator">=</span><span class="token plain">-pass-through</span><span class="token operator">=</span><span class="token plain">-lgcc </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    -plugin-opt</span><span class="token operator">=</span><span class="token plain">-pass-through</span><span class="token operator">=</span><span class="token plain">-lgcc_s </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    -plugin-opt</span><span class="token operator">=</span><span class="token plain">-pass-through</span><span class="token operator">=</span><span class="token plain">-lc </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    -plugin-opt</span><span class="token operator">=</span><span class="token plain">-pass-through</span><span class="token operator">=</span><span class="token plain">-lgcc </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    -plugin-opt</span><span class="token operator">=</span><span class="token plain">-pass-through</span><span class="token operator">=</span><span class="token plain">-lgcc_s </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    --build-id --eh-frame-hdr --hash-style</span><span class="token operator">=</span><span class="token plain">gnu </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-m</span><span class="token plain"> elf_x86_64 </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    -dynamic-linker /lib64/ld-linux-x86-64.so.2 </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-pie</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-o</span><span class="token plain"> main </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    /usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/lib/Scrt1.o </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    /usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/lib/crti.o </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    /usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/crtbeginS.o </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    -L/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1 </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    -L/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/lib -L/lib/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/lib -L/usr/lib/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/lib </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    -L/usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain"> /tmp/cciOyF1Z.o </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-lgcc</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    --push-state </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    --as-needed </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-lgcc_s</span><span class="token plain"> --pop-state </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-lc</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-lgcc</span><span class="token plain"> --push-state --as-needed </span><span class="token parameter variable" style="color:rgb(189, 147, 249);font-style:italic">-lgcc_s</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    --pop-state /usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/crtendS.o </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    /usr/lib/gcc/x86_64-pc-linux-gnu/14.2.1/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/</span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">/lib/crtn.o</span><br></span></code></pre></div></div>
<p>On remarque beaucoup de flags, on peut essayer d'analyser rapidement leur effet.</p>
<ul>
<li>Les amateurs de CTF, vous aurez remarqué le flag <code>-pie</code>, qui permet d'activer l'Address Space Layout Randomization (ASLR).</li>
<li><code>-lgcc</code> : eh oui, votre programme C compile avec la librairie dynamique GCC.<br>
<!-- -->Vous pouvez éviter ça en compilant avec <code>-nostdlib</code>. Je ne vois pas bien l'intérêt, mais c'est un choix.</li>
<li><code>-m elf_x86_64</code> : c'est ici que GCC spécifie l'architecture de la machine cible.<br>
<!-- -->C'est possible de modifier cette machine cible, cela s'appelle la cross compilation (mais j'en ferai un article spécifique).</li>
</ul>
<p>On trouve aussi le fichier <code>Scrt1.o</code>, qui contient le point d'entrée (<code>_start</code>) de l'exécutable. Les fichiers <code>crti.o</code> et <code>crtbeginS.o</code>, eux, fournissent des routines nécessaires à l’initialisation des fonctions globales et statiques.<br>
<!-- -->On pourra citer les fonctions <code>_init</code> et <code>_fini</code>.</p>
<p>Source :</p>
<ul>
<li><a href="https://www.embecosm.com/appnotes/ean9/html/ch05s02.html" target="_blank" rel="noopener noreferrer">The C Runtime Initialization, crt0.o</a></li>
<li><a href="https://www.linuxquestions.org/questions/programming-9/_start-_init-and-frame_dummy-functions-810257/" target="_blank" rel="noopener noreferrer">Linux Questions - Forums</a></li>
<li><a href="https://stackoverflow.com/questions/29694564/what-is-the-use-of-start-in-c" target="_blank" rel="noopener noreferrer">Stackoverflow - _start in C</a></li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="bonus">Bonus<a href="https://blog.mrvym.dev/le-plus-petit-segfault#bonus" class="hash-link" aria-label="Lien direct vers Bonus" title="Lien direct vers Bonus" translate="no">​</a></h3>
<p>Pour les <strong>chads</strong> ! Voici le code complet de la fonction <code>_start</code>.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Details</summary><div><div class="collapsibleContent_i85q"><div class="language-asm codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-asm codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">0000000000001020 &lt;_start&gt;:</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1020:	f3 0f 1e fa          	endbr64</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1024:	31 ed                	xor    %ebp,%ebp</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1026:	49 89 d1             	mov    %rdx,%r9</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1029:	5e                   	pop    %rsi</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    102a:	48 89 e2             	mov    %rsp,%rdx</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    102d:	48 83 e4 f0          	and    $0xfffffffffffffff0,%rsp</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1031:	50                   	push   %rax</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1032:	54                   	push   %rsp</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1033:	45 31 c0             	xor    %r8d,%r8d</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1036:	31 c9                	xor    %ecx,%ecx</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1038:	48 8d 3d d5 2f 00 00 	lea    0x2fd5(%rip),%rdi        # 4014 &lt;main&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    103f:	ff 15 7b 2f 00 00    	call   *0x2f7b(%rip)        # 3fc0 &lt;__libc_start_main@GLIBC_2.34&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1045:	f4                   	hlt</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1046:	66 2e 0f 1f 84 00 00 	cs nopw 0x0(%rax,%rax,1)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    104d:	00 00 00</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1050:	48 8d 3d b9 2f 00 00 	lea    0x2fb9(%rip),%rdi        # 4010 &lt;__TMC_END__&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1057:	48 8d 05 b2 2f 00 00 	lea    0x2fb2(%rip),%rax        # 4010 &lt;__TMC_END__&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    105e:	48 39 f8             	cmp    %rdi,%rax</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1061:	74 15                	je     1078 &lt;_start+0x58&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1063:	48 8b 05 5e 2f 00 00 	mov    0x2f5e(%rip),%rax        # 3fc8 &lt;_ITM_deregisterTMCloneTable@Base&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    106a:	48 85 c0             	test   %rax,%rax</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    106d:	74 09                	je     1078 &lt;_start+0x58&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    106f:	ff e0                	jmp    *%rax</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1071:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1078:	c3                   	ret</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1079:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1080:	48 8d 3d 89 2f 00 00 	lea    0x2f89(%rip),%rdi        # 4010 &lt;__TMC_END__&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1087:	48 8d 35 82 2f 00 00 	lea    0x2f82(%rip),%rsi        # 4010 &lt;__TMC_END__&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    108e:	48 29 fe             	sub    %rdi,%rsi</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1091:	48 89 f0             	mov    %rsi,%rax</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1094:	48 c1 ee 3f          	shr    $0x3f,%rsi</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1098:	48 c1 f8 03          	sar    $0x3,%rax</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    109c:	48 01 c6             	add    %rax,%rsi</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    109f:	48 d1 fe             	sar    $1,%rsi</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10a2:	74 14                	je     10b8 &lt;_start+0x98&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10a4:	48 8b 05 2d 2f 00 00 	mov    0x2f2d(%rip),%rax        # 3fd8 &lt;_ITM_registerTMCloneTable@Base&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10ab:	48 85 c0             	test   %rax,%rax</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10ae:	74 08                	je     10b8 &lt;_start+0x98&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10b0:	ff e0                	jmp    *%rax</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10b2:	66 0f 1f 44 00 00    	nopw   0x0(%rax,%rax,1)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10b8:	c3                   	ret</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10b9:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10c0:	f3 0f 1e fa          	endbr64</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10c4:	80 3d 45 2f 00 00 00 	cmpb   $0x0,0x2f45(%rip)        # 4010 &lt;__TMC_END__&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10cb:	75 33                	jne    1100 &lt;_start+0xe0&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10cd:	55                   	push   %rbp</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10ce:	48 83 3d 0a 2f 00 00 	cmpq   $0x0,0x2f0a(%rip)        # 3fe0 &lt;__cxa_finalize@GLIBC_2.2.5&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10d5:	00</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10d6:	48 89 e5             	mov    %rsp,%rbp</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10d9:	74 0d                	je     10e8 &lt;_start+0xc8&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10db:	48 8b 3d 26 2f 00 00 	mov    0x2f26(%rip),%rdi        # 4008 &lt;__dso_handle&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10e2:	ff 15 f8 2e 00 00    	call   *0x2ef8(%rip)        # 3fe0 &lt;__cxa_finalize@GLIBC_2.2.5&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10e8:	e8 63 ff ff ff       	call   1050 &lt;_start+0x30&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10ed:	c6 05 1c 2f 00 00 01 	movb   $0x1,0x2f1c(%rip)        # 4010 &lt;__TMC_END__&gt;</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10f4:	5d                   	pop    %rbp</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10f5:	c3                   	ret</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10f6:	66 2e 0f 1f 84 00 00 	cs nopw 0x0(%rax,%rax,1)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    10fd:	00 00 00</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1100:	c3                   	ret</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1101:	66 66 2e 0f 1f 84 00 	data16 cs nopw 0x0(%rax,%rax,1)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1108:	00 00 00 00</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    110c:	0f 1f 40 00          	nopl   0x0(%rax)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1110:	f3 0f 1e fa          	endbr64</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    1114:	e9 67 ff ff ff       	jmp    1080 &lt;_start+0x60&gt;</span><br></span></code></pre></div></div></div></div></details>]]></content>
        <author>
            <name>Vianney Marticou</name>
            <uri>https://github.com/mrvym</uri>
        </author>
        <category label="C Language" term="C Language"/>
        <category label="segv" term="segv"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tester c'est tricher, compiler c'est douter]]></title>
        <id>https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter</id>
        <link href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter"/>
        <updated>2025-01-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Dans cet article, nous allons voir le concept de Continuous Integration (CI), son intérêt et ses inconvénients et une démonstration.]]></summary>
        <content type="html"><![CDATA[<p>Dans cet article, nous allons voir le concept de Continuous Integration (CI), son intérêt et ses inconvénients et une démonstration.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="histoire">Histoire<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#histoire" class="hash-link" aria-label="Lien direct vers Histoire" title="Lien direct vers Histoire" translate="no">​</a></h2>
<p>Mais d'abord, comme à mon habitude, un petit point histoire.</p>
<blockquote>
<p>En 1999, Kent Beck a approfondi le sujet dans son premier livre sur l'Extreme Programming. En 2001, CruiseControl, l'un des premiers outils open-source de CI, a vu le jour.</p>
</blockquote>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="mais-why-">Mais why ?<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#mais-why-" class="hash-link" aria-label="Lien direct vers Mais why ?" title="Lien direct vers Mais why ?" translate="no">​</a></h2>
<p>Le but d'une CI est de faire des tests automatisés à chaque commit. Cela garantit que le code reste fonctionnel en permanence. On appelle cela une Continuous Integration car, à chaque modification, le code est vérifié pour s'assurer qu'il n'y a pas de régressions.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="avantages">Avantages<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#avantages" class="hash-link" aria-label="Lien direct vers Avantages" title="Lien direct vers Avantages" translate="no">​</a></h3>
<ul>
<li><strong>Détection précoce des erreurs</strong> : Les problèmes sont identifiés rapidement, ce qui permet de réagir sans attendre.</li>
<li><strong>Amélioration de la qualité</strong> : En testant systématiquement, on garantit un code plus robuste.</li>
<li><strong>Gain de temps</strong> : Les pipelines automatisés réduisent la nécessité de tests manuels répétitifs.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="inconvénients">Inconvénients<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#inconv%C3%A9nients" class="hash-link" aria-label="Lien direct vers Inconvénients" title="Lien direct vers Inconvénients" translate="no">​</a></h3>
<ul>
<li><strong>Coût initial</strong> : Mettre en place une CI peut demander des efforts et des compétences initiales importantes.</li>
<li><strong>Temps d’exécution</strong> : Les pipelines complexes peuvent rallonger le temps avant qu'un développeur puisse valider son code.</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="fonctionnement">Fonctionnement<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#fonctionnement" class="hash-link" aria-label="Lien direct vers Fonctionnement" title="Lien direct vers Fonctionnement" translate="no">​</a></h2>
<p>Avant de voir le fonctionnement, un petit lexique :</p>
<ul>
<li><strong>Jobs</strong> : Une instance d'un conteneur (souvent Docker) qui exécute un script. Cela peut inclure des commandes, des tests ou des actions simples comme un <code>echo</code>.</li>
<li><strong>Pipeline</strong> : Une série de jobs organisés de manière séquentielle ou parallèle. Chaque commit déclenche cette série pour valider les changements.</li>
</ul>
<p>Le principe est simple : chaque job retourne un code de statut (succès ou échec). Si un job échoue, la pipeline s’arrête ou ignore les étapes suivantes selon la configuration.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="trêve-de-blabla">Trêve de blabla<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#tr%C3%AAve-de-blabla" class="hash-link" aria-label="Lien direct vers Trêve de blabla" title="Lien direct vers Trêve de blabla" translate="no">​</a></h2>
<p>Nous allons utiliser un exemple basé sur GitLab CI. On la configure via un fichier <code>.gitlab-ci.yml</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="basique-simple-simple-basique">Basique, simple, simple, basique<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#basique-simple-simple-basique" class="hash-link" aria-label="Lien direct vers Basique, simple, simple, basique" title="Lien direct vers Basique, simple, simple, basique" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> bookworm</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">slim</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">latest</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">myjobname</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> make</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="les-flags">Les flags<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#les-flags" class="hash-link" aria-label="Lien direct vers Les flags" title="Lien direct vers Les flags" translate="no">​</a></h3>
<p>Pour ajouter des flags de compilation, deux approches sont possibles :</p>
<ol>
<li>Via une règle dans le Makefile.</li>
<li>En passant les flags directement dans la commande CI.</li>
</ol>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">myjobname_hard</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> CFLAGS="</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">Wall </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">Werror" make</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># ou</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> make compile_flags</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="tests-avec-criterion-et-flags">Tests avec Criterion et flags<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#tests-avec-criterion-et-flags" class="hash-link" aria-label="Lien direct vers Tests avec Criterion et flags" title="Lien direct vers Tests avec Criterion et flags" translate="no">​</a></h3>
<p>Criterion est une bibliothèque de tests unitaires en C.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="où-est-passé-criterion-">Où est passé Criterion ?<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#o%C3%B9-est-pass%C3%A9-criterion-" class="hash-link" aria-label="Lien direct vers Où est passé Criterion ?" title="Lien direct vers Où est passé Criterion ?" translate="no">​</a></h4>
<p>Avant d’exécuter des tests avec Criterion, il est souvent nécessaire d'installer Criterion, eh oui !</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">before_script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> apt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">get update </span><span class="token important">&amp;&amp;</span><span class="token plain"> apt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">get install </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">y libcriterion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">dev</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> ./configure</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> make test</span><br></span></code></pre></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="multistaging">Multistaging<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#multistaging" class="hash-link" aria-label="Lien direct vers Multistaging" title="Lien direct vers Multistaging" translate="no">​</a></h4>
<p>Diviser les tests unitaires et fonctionnels en plusieurs stages garantit :</p>
<ul>
<li>une bonne organisation</li>
<li>une meilleure visibilité des résultats</li>
</ul>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">stages</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> build</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> test</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">build</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">stage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> build</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> make all</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">test-unit</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">stage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> test</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> make unit</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">test</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">test-functional</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">stage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> test</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> make functional</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">test</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="tu-tes-fait-clang-">Tu t'es fait clang ?<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#tu-tes-fait-clang-" class="hash-link" aria-label="Lien direct vers Tu t'es fait clang ?" title="Lien direct vers Tu t'es fait clang ?" translate="no">​</a></h3>
<p>Le formatage du code est super important pour maintenir une base de code propre.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">clang_format</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">stage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> format</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">before_script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> apt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">get </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">qq update </span><span class="token important">&amp;&amp;</span><span class="token plain"> apt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">get </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">qq install </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">y clang</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">format autotools</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">dev autoconf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">archive gcovr libcriterion</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">dev</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> clang</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">format </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">i $(find src/ </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">type f </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">name "</span><span class="token important">*.c")</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">dry</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">run </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">Werror</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="cache">Cache<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#cache" class="hash-link" aria-label="Lien direct vers Cache" title="Lien direct vers Cache" translate="no">​</a></h3>
<p>Dans certains cas, c'est utile de mettre en cache des fichiers ou dossiers pour éviter de les recharger à chaque pipeline.<br>
<!-- -->Un exemple courant est le dossier <code>node_modules/</code> en JavaScript.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">cache</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">paths</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> node_modules/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">install</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> npm install</span><br></span></code></pre></div></div>
<p>Bien entendu, vous pouvez nettoyer le cache au besoin avec une option supplémentaire dans la configuration de pipeline.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="artefacts">Artefacts<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#artefacts" class="hash-link" aria-label="Lien direct vers Artefacts" title="Lien direct vers Artefacts" translate="no">​</a></h3>
<p>Les artefacts sont les fichiers générés par la CI qui peuvent être partagés entre jobs ou téléchargés.<br>
<!-- -->Par exemple, les rapports de tests ou de couverture.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">artifacts</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">paths</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> build/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> reports/</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="coverage-de-tests">Coverage de tests<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#coverage-de-tests" class="hash-link" aria-label="Lien direct vers Coverage de tests" title="Lien direct vers Coverage de tests" translate="no">​</a></h3>
<p>On peut mesurer la couverture de tests en intégrant des outils comme gcovr ou Cobertura dans votre pipeline CI.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">test-coverage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">stage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> test</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> gcovr </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">html </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">html</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">details </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">o coverage.html</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">artifacts</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">paths</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> coverage.html</span><br></span></code></pre></div></div>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="rapporteur">Rapporteur<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#rapporteur" class="hash-link" aria-label="Lien direct vers Rapporteur" title="Lien direct vers Rapporteur" translate="no">​</a></h4>
<p>Ce bloc vous permet d'intégrer le coverage report dans votre Merge Request, vous pourrez ainsi voir le code qui n'est pas couvert mais aussi votre pourcentage de coverage.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">coverage-report</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)"># do coverage</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">coverage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> /^TOTAL.</span><span class="token important">*\s+(\d+\%)$/</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">artifacts</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> coverage.xml</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">expire_in</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> 2 days</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token key atrule">reports</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token key atrule">coverage_report</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">coverage_format</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> cobertura</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token key atrule">path</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> coverage.xml</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="environnement-custom">Environnement custom<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#environnement-custom" class="hash-link" aria-label="Lien direct vers Environnement custom" title="Lien direct vers Environnement custom" translate="no">​</a></h3>
<p>Vous pouvez préciser l’environnement de base pour votre CI en sélectionnant une image Docker spécifique.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> gcc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">latest</span><br></span></code></pre></div></div>
<p>En utilisant un peu ce que l'on vient de voir, ça donnerait quelque chose comme ça :</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> gcc</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">stages</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> format</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> build</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> test</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> clean</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">clang-format</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">stage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> format</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> clang</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">format </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">i $(find src/ </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">type f </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">name "</span><span class="token important">*.c")</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">dry</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">run </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">Werror</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">build</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">stage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> build</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> autoreconf </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">install</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> ./configure</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> make all</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token key atrule">test-unit</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">stage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> test</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> autoreconf </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">install</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> ./configure</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> make unit</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">test</span><br></span></code></pre></div></div>
<blockquote>
<p>Attention aux <code>.h</code> et il manque des <code>before_script</code>.</p>
</blockquote>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="petit-bonus">Petit Bonus<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#petit-bonus" class="hash-link" aria-label="Lien direct vers Petit Bonus" title="Lien direct vers Petit Bonus" translate="no">​</a></h3>
<p>On peut aussi vérifier les trash-files pour s’assurer que le <code>make clean</code> fait bien son travail.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token key atrule">trash-file</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">stage</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> clean</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">needs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">before_script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> apt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">get </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">qq update </span><span class="token important">&amp;&amp;</span><span class="token plain"> apt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">get </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">qq install </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain">y tree</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token key atrule">script</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> tree </span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"> /tmp/REF</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> make </span><span class="token important">&amp;&amp;</span><span class="token plain"> make clean</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> tree </span><span class="token punctuation" style="color:rgb(248, 248, 242)">&gt;</span><span class="token plain"> /tmp/TEST</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">-</span><span class="token plain"> diff /tmp/REF /tmp/TEST</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="conclusion">Conclusion<a href="https://blog.mrvym.dev/tester-cest-tricher-compiler-c-est-douter#conclusion" class="hash-link" aria-label="Lien direct vers Conclusion" title="Lien direct vers Conclusion" translate="no">​</a></h2>
<p>La Continuous Integration est un outil extrêmement puissant. Il peut parfois être difficile à mettre en place, mais les gains sont immenses.</p>]]></content>
        <author>
            <name>Vianney Marticou</name>
            <uri>https://github.com/mrvym</uri>
        </author>
        <category label="git" term="git"/>
        <category label="CI" term="CI"/>
        <category label="C Language" term="C Language"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Introduction à Terraform avec Proxmox]]></title>
        <id>https://blog.mrvym.dev/intro-terraform-proxmox</id>
        <link href="https://blog.mrvym.dev/intro-terraform-proxmox"/>
        <updated>2024-12-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Le but de Terraform est de déployer une infrastructure ou une entité de manière idempotente. Cela signifie que l’on doit pouvoir relancer le script 100 fois et obtenir le même résultat à chaque exécution.]]></summary>
        <content type="html"><![CDATA[<p>Le but de Terraform est de déployer une infrastructure ou une entité de manière <strong>idempotente</strong>. Cela signifie que l’on doit pouvoir relancer le script 100 fois et obtenir le même résultat à chaque exécution.<br>
<!-- -->Pour cela, nous utilisons un <strong>provider</strong>, qui est essentiellement une bibliothèque permettant de se connecter à notre serveur.</p>
<p>Dans ce cas pratique, nous allons utiliser <strong>Proxmox</strong> et <strong>BPG</strong>. Il existe deux principaux providers pour Proxmox :</p>
<ul>
<li>
<p><strong><a href="https://registry.terraform.io/providers/Telmate/proxmox/latest/docs" target="_blank" rel="noopener noreferrer">Telmate</a></strong><br>
<!-- -->C’est une bibliothèque qui permet de déployer très simplement des VMs et des LXCs.<br>
<!-- -->Inconvénient : elle n’implémente pas de fonctionnalités avancées. Cependant, elle est fréquemment mise à jour.</p>
</li>
<li>
<p><strong><a href="https://registry.terraform.io/providers/bpg/proxmox/latest/docs" target="_blank" rel="noopener noreferrer">Bpg</a></strong><br>
<!-- -->Cette bibliothèque est légèrement plus complexe à prendre en main, mais elle est bien plus puissante.</p>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="organisation-et-structure-dun-projet-terraform">Organisation et Structure d'un Projet Terraform<a href="https://blog.mrvym.dev/intro-terraform-proxmox#organisation-et-structure-dun-projet-terraform" class="hash-link" aria-label="Lien direct vers Organisation et Structure d'un Projet Terraform" title="Lien direct vers Organisation et Structure d'un Projet Terraform" translate="no">​</a></h2>
<p>Afin que vous puissiez mieux comprendre le projet, voici son architecture&nbsp;:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── main.tf</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── provider.tf</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── variable.tf</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">└── terraform.auto.tfvars</span><br></span></code></pre></div></div>
<p>Vous pouvez ajouter ou segmenter le projet en autant de fichiers <code>.tf</code> que nécessaire. Par exemple, nous aurions pu avoir un fichier pour les VMs et un autre pour les LXCs.</p>
<ul>
<li>Les fichiers se terminant par <code>.tfvars</code> servent à définir des variables. Lorsqu’ils commencent par <code>auto</code>, ils sont automatiquement chargés par Terraform.</li>
<li>Le fichier <code>variable.tf</code> permet de créer des variables sans les instancier.</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="petit-point-vocabulaire">Petit point Vocabulaire<a href="https://blog.mrvym.dev/intro-terraform-proxmox#petit-point-vocabulaire" class="hash-link" aria-label="Lien direct vers Petit point Vocabulaire" title="Lien direct vers Petit point Vocabulaire" translate="no">​</a></h3>
<p>Dans cette article, nous allons utiliser le terme de LXC et de VM. Je vais faire un petit point dessus.</p>
<ul>
<li>
<p><strong><code>LXC</code></strong> ou <strong><code>LinuX Container</code></strong> : ce sont des environnements virtualisés qui tourne sur le <code>kernel</code> de l'hôte mais qui ne peuvent pas discuter ensemble. Cela permet de segmenter nos services sans trop perde en performance.</p>
</li>
<li>
<p><strong><code>VM</code></strong> ou <strong><code>Virtual Machine</code></strong> : comme son nom l'indique, on simule l'intégralité d'une machine. On perd en performance mais on gagne en sécurité et en fonctionnalité car un LXC n'a pas tout les privilèges.</p>
</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="choisir-et-configurer-un-provider-proxmox">Choisir et Configurer un Provider Proxmox<a href="https://blog.mrvym.dev/intro-terraform-proxmox#choisir-et-configurer-un-provider-proxmox" class="hash-link" aria-label="Lien direct vers Choisir et Configurer un Provider Proxmox" title="Lien direct vers Choisir et Configurer un Provider Proxmox" translate="no">​</a></h2>
<p>Avant tout, nous devons installer le <strong>provider</strong> (la bibliothèque). Bien entendu, nous fixons une version minimale :</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">terraform {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  required_providers {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    proxmox = {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      source  = "bpg/proxmox"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      version = "&gt;= 0.3.0"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  required_version = "&gt;= 0.14"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre></div></div>
<p>Une fois la bibliothèque ajoutée, nous déclarons un provider nommé "proxmox", en fournissant les informations nécessaires :</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">provider "proxmox" {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  endpoint = "https://${var.proxmox_endpoint}:8006"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  api_token = var.api_token_secret</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  insecure = true # car un certificat TLS auto-signé est utilisé</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  ssh {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    agent = true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    username = terraform</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="les-variables-dans-terraform">Les Variables dans Terraform<a href="https://blog.mrvym.dev/intro-terraform-proxmox#les-variables-dans-terraform" class="hash-link" aria-label="Lien direct vers Les Variables dans Terraform" title="Lien direct vers Les Variables dans Terraform" translate="no">​</a></h2>
<p>Si vous êtes attentif, vous avez remarqué que nous utilisons l’objet <code>var.api_token_secret</code> dans le bloc du provider. Cette chaîne de caractères est définie dans le fichier <code>terraform.auto.tfvars</code>.</p>
<p>À la manière d’un fichier <code>.env</code>, ce fichier contient des valeurs sensibles et <strong>ne doit pas être poussé sur le dépôt git</strong> :</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"># terraform.auto.tfvars</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">api_token_secret = "terraform-prov@pve!terraform=TOKEN"</span><br></span></code></pre></div></div>
<p>Dans le fichier <code>variable.tf</code>, nous définissons les variables et leur type.<br>
<!-- -->Voici les principaux types disponibles :</p>
<ul>
<li><strong>number</strong></li>
<li><strong>string</strong></li>
<li><strong>list()</strong> (ex. : <code>list(string)</code>)</li>
<li><strong>object</strong></li>
<li><strong>map</strong></li>
</ul>
<p>Exemple&nbsp;:</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"># variable.tf</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">variable "api_token_secret" {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  description = "Secret token to connect Proxmox API"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  type        = string</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">variable "proxmox_endpoint" {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  description = "The domain name of the Proxmox instance"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  type        = string</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  default     = "proxmox.mysite.fr"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="les-images-et-les-templates">Les Images et les Templates<a href="https://blog.mrvym.dev/intro-terraform-proxmox#les-images-et-les-templates" class="hash-link" aria-label="Lien direct vers Les Images et les Templates" title="Lien direct vers Les Images et les Templates" translate="no">​</a></h2>
<p>Pour démarrer nos entités, nous devons leur fournir un système d’exploitation.<br>
<!-- -->Nous téléchargeons automatiquement un fichier de template pour le LXC et un ISO avec <strong>cloud-init</strong> pour la VM.</p>
<blockquote>
<p>Si vous ne connaissez pas <strong>cloud-init</strong>, c’est une méthode permettant d’instancier des machines sans passer par l’installateur de l’OS.</p>
</blockquote>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">resource "proxmox_virtual_environment_download_file" "ubuntu_22-04_lxc" {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  content_type = "vztmpl"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  datastore_id = "local"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  node_name    = var.target_node</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  url          = "http://download.proxmox.com/images/system/ubuntu-22.04-standard_22.04-1_amd64.tar.zst"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">resource "proxmox_virtual_environment_download_file" "ubuntu_22-04_img" {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  content_type = "iso"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  datastore_id = "local"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  node_name    = var.target_node</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  url          = "https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="on-crée-un-réseau-virtuel">On crée un Réseau Virtuel<a href="https://blog.mrvym.dev/intro-terraform-proxmox#on-cr%C3%A9e-un-r%C3%A9seau-virtuel" class="hash-link" aria-label="Lien direct vers On crée un Réseau Virtuel" title="Lien direct vers On crée un Réseau Virtuel" translate="no">​</a></h2>
<p>Si nous avons envie que nos ressources discutent entre elles, il nous faut un réseau.</p>
<p>Pour créer un adaptateur virtuel, il suffit d’appeler la ressource <code>proxmox_virtual_environment_network_linux_bridge</code> et de lui donner un nom :</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">resource "proxmox_virtual_environment_network_linux_bridge" "internal_network" {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  node_name = var.target_node</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  name      = "vmbr5"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  comment   = "Internal Network"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="votre-premier-container">Votre premier Container<a href="https://blog.mrvym.dev/intro-terraform-proxmox#votre-premier-container" class="hash-link" aria-label="Lien direct vers Votre premier Container" title="Lien direct vers Votre premier Container" translate="no">​</a></h2>
<p>Passons aux choses concrètes en instanciant un <strong>LXC</strong>. Pour cela, nous créons une ressource <code>proxmox_virtual_environment_container</code>.</p>
<p>Avec l’IaC, tout peut être configuré : le disque, la RAM, le serveur DNS, etc.</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">resource "proxmox_virtual_environment_container" "first_lxc" {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  description   = "Managed by Terraform - Mr.VyM"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  node_name     = var.target_node</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  start_on_boot = true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  started       = true</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  vm_id = 101</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  cpu {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    architecture = "amd64"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    cores        = var.core_nb</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  disk {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    datastore_id = "storage"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    size         = var.disk_size</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  memory {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    dedicated = var.memory_size</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    swap      = 0</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  operating_system {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    template_file_id = proxmox_virtual_environment_download_file.ubuntu_22-04_lxc.id</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    type             = "ubuntu"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  initialization {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    hostname = "mycontainer"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    dns {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      servers = ["1.1.1.1", "1.0.0.1"]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ip_config {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      ipv4 {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        address = "192.168.10.2/24"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        gateway = "192.168.10.1"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    user_account {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      keys     = ["keys 1", "keys 2"]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      password = var.lxc_password</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  network_interface {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    bridge = proxmox_virtual_environment_network_linux_bridge.internal_network.name</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    name   = "eth0"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="et-maintenant-une-vm">Et maintenant une VM<a href="https://blog.mrvym.dev/intro-terraform-proxmox#et-maintenant-une-vm" class="hash-link" aria-label="Lien direct vers Et maintenant une VM" title="Lien direct vers Et maintenant une VM" translate="no">​</a></h2>
<p>Créer une VM suit le même pattern que pour un LXC, avec quelques différences :</p>
<div class="language-hcl codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-hcl codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">resource "proxmox_virtual_environment_vm" "vm_template" {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  description = "Managed by Terraform - Mr.VyM"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  node_name   = var.target_node</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  name        = "MyDummyVM"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  vm_id       = 102</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  cpu {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    cores = var.core_nb</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    type  = "x86-64-v2-AES"  # recommandé pour les CPU modernes</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  memory {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    dedicated = var.memory_size</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    floating  = var.memory_size # active le ballooning</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  disk {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    datastore_id = "local"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    file_id      = proxmox_virtual_environment_download_file.ubuntu_22-04_img.id</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    interface    = "scsi0"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    size         = var.disk_size</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  initialization {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ip_config {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      ipv4 {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        address = "${var.base_subnet}.3/24"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        gateway = "${var.base_subnet}.1"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    user_account {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      keys     = ["keys 1", "keys 2"]</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      password = var.vm_password </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      username = "mrvym"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    datastore_id = "local"</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  network_device {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    bridge = proxmox_virtual_environment_network_linux_bridge.internal_network.name</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  operating_system {</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    type = "l26" # Linux Kernel</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  }</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">}</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="on-check-et-ca-part-en-prod">On check et ca part en Prod<a href="https://blog.mrvym.dev/intro-terraform-proxmox#on-check-et-ca-part-en-prod" class="hash-link" aria-label="Lien direct vers On check et ca part en Prod" title="Lien direct vers On check et ca part en Prod" translate="no">​</a></h2>
<p>Enfin, nous déployons le tout avec les commandes suivantes :</p>
<ul>
<li>
<p><strong><code>terraform init</code></strong><br>
<!-- -->Initialise Terraform, télécharge les providers et crée les fichiers <code>terraform.state</code> et <code>terraform.lock</code>. Ces fichiers stockent l’état des entités sur le serveur.<br>
<!-- -->Si ces fichiers sont absents, Terraform recrée les ressources, ce qui pourrait entraîner leur suppression et recréation.</p>
</li>
<li>
<p><strong><code>terraform fmt</code></strong><br>
<!-- -->Formate le code pour garantir sa propreté.</p>
</li>
<li>
<p><strong><code>terraform plan</code></strong><br>
<!-- -->Vérifie les actions que Terraform s’apprête à exécuter.</p>
</li>
<li>
<p><strong><code>terraform apply</code></strong><br>
<!-- -->Applique les modifications.</p>
</li>
</ul>
<blockquote>
<p>Ecrit pour l'<strong><code>Avent of Tech</code></strong> de la <a href="https://dev.to/ject" target="_blank" rel="noopener noreferrer">JECT</a></p>
</blockquote>]]></content>
        <author>
            <name>Vianney Marticou</name>
            <uri>https://github.com/mrvym</uri>
        </author>
        <category label="terraform" term="terraform"/>
        <category label="proxmox" term="proxmox"/>
        <category label="devops" term="devops"/>
        <category label="hcl" term="hcl"/>
        <category label="BPG" term="BPG"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Disque dur : SAS, SATA, SCSI ou IDE ?]]></title>
        <id>https://blog.mrvym.dev/disque-dur-sas-sata-scsi-ide</id>
        <link href="https://blog.mrvym.dev/disque-dur-sas-sata-scsi-ide"/>
        <updated>2024-11-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Notre but dans cet article est de mieux comprendre le concept des interfaces matérielles / programmation, des couches physiques et des jeux de commandes, et plus simplement des systèmes de stockage qui nous entourent.]]></summary>
        <content type="html"><![CDATA[<p>Notre but dans cet article est de mieux comprendre le concept des interfaces matérielles / programmation, des couches physiques et des jeux de commandes, et plus simplement des systèmes de stockage qui nous entourent.</p>
<p>Mais d'abord, un "rapide" récapitulatif de l'état actuel de nos périphériques de stockage :</p>
<table><thead><tr><th>Norme de stockage</th><th>Interface matérielle</th><th>Couche physique</th><th>Jeux de commandes</th></tr></thead><tbody><tr><td>PATA</td><td>IDE (Integrated Drive Electronics)</td><td>Connecteur 40/44 broches, câble parallèle</td><td>ACS (ATA Command Set)</td></tr><tr><td>SATA</td><td>SATA (Serial ATA)</td><td>Connecteur SATA, câble série</td><td>ACS (ATA Command Set)</td></tr><tr><td>SAS (Serial Attached SCSI)</td><td>SCSI (Small Computer System Interface)</td><td>Connecteur SAS, câble série</td><td>SCSI (Small Computer System Interface)</td></tr><tr><td>NVMe (Non-Volatile Memory Express)</td><td>PCIe (Peripheral Component Interconnect Express)</td><td>Bus PCIe</td><td>AHCI (Advanced Host Controller Interface)</td></tr></tbody></table>
<p>Si vous vous demandez, oui, les constructeurs ont pris un malin plaisir à utiliser le même nom entre l'interface et la norme.</p>
<p>--
Avant de commencer, un point vocabulaire</p>
<blockquote>
<p>Couche Physique : C'est le cable et le connecteur.</p>
</blockquote>
<blockquote>
<p>Interface Materielle : C'est la maniere de communiquer, attention ne pas confondre avec le "language".</p>
</blockquote>
<blockquote>
<p>Jeu de commandes : C'est le language utilisé.</p>
</blockquote>
<p>Pour faire une analogie, si vous etes un humain (j'espere <!-- -->🤔<!-- -->), la couche physique c'est vos cordes vocales, l'interface materielle, c'est la maniere de faire vibrer vos cordes et le jeu de commandes, c'est le language utilisé.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="norme-de-stockage">Norme de stockage<a href="https://blog.mrvym.dev/disque-dur-sas-sata-scsi-ide#norme-de-stockage" class="hash-link" aria-label="Lien direct vers Norme de stockage" title="Lien direct vers Norme de stockage" translate="no">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ata">ATA<a href="https://blog.mrvym.dev/disque-dur-sas-sata-scsi-ide#ata" class="hash-link" aria-label="Lien direct vers ATA" title="Lien direct vers ATA" translate="no">​</a></h3>
<blockquote>
<p>Date : 1986<br>
<!-- -->Qui : Western Digital</p>
</blockquote>
<p>ATA signifie <strong>Advanced Technology Attachment</strong>.</p>
<p>C'est le véritable concurrent du protocole SCSI. C'est aussi un ensemble de normes avec l'interface matérielle (IDE), la couche physique (PATA ou bien SATA) et les jeux de commandes (ACS).</p>
<p>C'est une version plus low-cost de SCSI, qui avait pour but de réutiliser des éléments de ce dernier mais en simplifiant le connecteur (la couche physique) et le jeu d'instruction.</p>
<p>Contrairement au SAS, cette norme est en semi-duplex, ce qui signifie qu'elle ne peut exécuter qu'une seule action simultanément : soit lire, soit écrire.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="sas">SAS<a href="https://blog.mrvym.dev/disque-dur-sas-sata-scsi-ide#sas" class="hash-link" aria-label="Lien direct vers SAS" title="Lien direct vers SAS" translate="no">​</a></h3>
<blockquote>
<p>Date : 1980<br>
<!-- -->Qui : Shugart / NCR Corporation</p>
</blockquote>
<p>C'est un ensemble de normes qui s'applique sur les couches physiques et les jeux de commandes.</p>
<p>Nous devons revenir dans les années 80, à cette époque, il n'y a pas des milliers de façons de communiquer avec un périphérique de stockage. L'un d'entre eux est le protocole <strong>SCSI</strong> (Small Computer System Interface).</p>
<p>C'est un protocole propriétaire mais très performant pour son temps. Son grand avantage est le fait de déporter la logique dans le périphérique, contrairement à ses concurrents qui utilisent allègrement la puissance de l'ordinateur. Et dans les années 80, on n'avait pas encore la puissance de calcul, ce protocole a donc été particulièrement apprécié par l'industrie.</p>
<p>De plus, la norme a l'avantage de pouvoir écrire en duplex, c'est-à-dire lire et écrire des données simultanément.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="interface-matérielle">Interface matérielle<a href="https://blog.mrvym.dev/disque-dur-sas-sata-scsi-ide#interface-mat%C3%A9rielle" class="hash-link" aria-label="Lien direct vers Interface matérielle" title="Lien direct vers Interface matérielle" translate="no">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ide">IDE<a href="https://blog.mrvym.dev/disque-dur-sas-sata-scsi-ide#ide" class="hash-link" aria-label="Lien direct vers IDE" title="Lien direct vers IDE" translate="no">​</a></h3>
<p>IDE est une norme qui intègre le contrôleur de disque directement sur le disque dur lui-même. Avant IDE, les contrôleurs de disque étaient séparés, ce qui compliquait la configuration et limitait la compatibilité.<br>
<!-- -->Cela signifie qu'un disque dur est dit compatible IDE s'il possède une puce IDE.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="sata">SATA<a href="https://blog.mrvym.dev/disque-dur-sas-sata-scsi-ide#sata" class="hash-link" aria-label="Lien direct vers SATA" title="Lien direct vers SATA" translate="no">​</a></h3>
<p>C'est une ré-implémentation de l'interface matérielle parallèle en série (Serial ATA).</p>
<blockquote>
<p>Qu'est-ce qu'un port parallèle ?<br>
<!-- -->Contrairement au port série, un port parallèle peut transférer un ensemble de 8 bits à la fois sur huit fils différents.</p>
</blockquote>
<p>Pour vous donner une idée de l'interface matérielle / couche physique.
<img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/si132dwg6anuqybjfeal.png" alt="PATA Pin-out" class="img_ev3q"></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="pcie">PCIe<a href="https://blog.mrvym.dev/disque-dur-sas-sata-scsi-ide#pcie" class="hash-link" aria-label="Lien direct vers PCIe" title="Lien direct vers PCIe" translate="no">​</a></h3>
<p>L'interface matérielle PCIe (Peripheral Component Interconnect Express) est une interface de communication utilisée principalement pour connecter des périphériques internes tels que des cartes graphiques, des cartes réseau et d'autres cartes d'extension.</p>
<p>Elle utilise un bus série, ce qui signifie que les données sont transmises bit par bit sur une seule ligne, contrairement aux anciennes interfaces parallèles.</p>
<p>PCIe fonctionne avec des connecteurs spécifiques et des voies de transmission (lanes) qui permettent des transferts de données très rapides.</p>
<p>Les cartes PCIe sont insérées dans des slots PCIe sur la carte mère, et l'interface est disponible en différentes versions (x1, x4, x8, x16) en fonction du nombre de voies utilisées, offrant ainsi une bande passante ajustée aux besoins des périphériques.</p>
<p>PCIe est largement utilisé dans les systèmes modernes en raison de sa vitesse de transmission élevée, de sa flexibilité et de sa capacité à évoluer pour prendre en charge des dispositifs nécessitant des débits importants.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="couche-physique">Couche physique<a href="https://blog.mrvym.dev/disque-dur-sas-sata-scsi-ide#couche-physique" class="hash-link" aria-label="Lien direct vers Couche physique" title="Lien direct vers Couche physique" translate="no">​</a></h2>
<p>Globalement, c'est la partie la plus simple de l'article.<br>
<!-- -->(Enfin, en électronique, ce n'est jamais simple).</p>
<p>Une couche physique, cela signifie que c'est la norme qui régit la façon de réaliser le câble et le connecteur (cf Illustration du Pin-out)</p>
<p>Une nappe IDE
<img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fu04kfy2js7vjn27lbpg.jpg" alt="Nappe IDE" class="img_ev3q">
Dans notre cas, c'est un câble dit "IDE".<br>
<!-- -->Ce genre de câble est la version parallèle, il contient 80 fils, ce qui permet de connecter deux appareils à la carte mère. Le premier sera appelé "master" et le deuxième "slave".</p>
<p><img decoding="async" loading="lazy" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/10bq0ctd4sh4ettg1514.png" alt="Master Slave PATA" class="img_ev3q">
Mais je ne vais pas détailler les différents câbles qui existent.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="jeux-de-commandes">Jeux de commandes<a href="https://blog.mrvym.dev/disque-dur-sas-sata-scsi-ide#jeux-de-commandes" class="hash-link" aria-label="Lien direct vers Jeux de commandes" title="Lien direct vers Jeux de commandes" translate="no">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="acs-commandes">ACS (Commandes)<a href="https://blog.mrvym.dev/disque-dur-sas-sata-scsi-ide#acs-commandes" class="hash-link" aria-label="Lien direct vers ACS (Commandes)" title="Lien direct vers ACS (Commandes)" translate="no">​</a></h3>
<blockquote>
<p>Date : années 80<br>
<!-- -->Qui : Shugart / NCR Corporation</p>
</blockquote>
<p>Le <strong>ATA Command Set</strong> (ACS) est la liste des commandes que le système peut envoyer au périphérique.<br>
<!-- -->On pourrait citer comme exemples :</p>
<ul>
<li>WRITE_SECTOR</li>
<li>SLEEP</li>
<li>PACKET</li>
<li>IDENTIFY PACKET DEVICE</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="scsi">SCSI<a href="https://blog.mrvym.dev/disque-dur-sas-sata-scsi-ide#scsi" class="hash-link" aria-label="Lien direct vers SCSI" title="Lien direct vers SCSI" translate="no">​</a></h3>
<p>ACS étant un détournement du jeu de SCSI, on retrouve de grandes similitudes entre les deux jeux. Cependant, on peut les différencier en creusant un peu, notamment en ce qui concerne les rapports d'erreurs.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="ahci">AHCI<a href="https://blog.mrvym.dev/disque-dur-sas-sata-scsi-ide#ahci" class="hash-link" aria-label="Lien direct vers AHCI" title="Lien direct vers AHCI" translate="no">​</a></h3>
<p><strong>AHCI</strong> (Advanced Host Controller Interface) permet une communication optimisée entre le système d'exploitation et les périphériques de stockage, en offrant des fonctionnalités avancées comme le contrôle de file d'attente (pour améliorer les lectures/écritures simultanées) et le mode <strong>NCQ</strong> (Native Command Queuing), qui permet au disque de réorganiser les commandes d'entrée/sortie pour une performance maximale.</p>
<p>Ce jeu de commandes facilite également des fonctionnalités telles que la gestion de l'alimentation et le <strong>hot-plug</strong> (permettre l'ajout et le retrait de périphériques sans éteindre le système).</p>
<p>AHCI a été conçu pour améliorer les performances et la gestion des périphériques de stockage SATA en optimisant l'utilisation des ressources et la vitesse des transferts.</p>
<h1>Conclusion / Performance</h1>
<p>Nous n'avons toujours pas parlé de la partie performance de ces différences, donc voici le mot de la fin.</p>
<table><thead><tr><th>Interface</th><th>Vitesse max (Gb/s)</th><th>Type de connexion</th><th>Utilisation principale</th></tr></thead><tbody><tr><td><strong>SATA III</strong></td><td>6 Gb/s</td><td>Série</td><td>SSD et HDD domestiques</td></tr><tr><td><strong>SAS</strong></td><td>22,5 Gb/s</td><td>Série</td><td>Disques professionnels et serveurs</td></tr><tr><td><strong>PCIe 5.0</strong></td><td>32 Gb/s par ligne</td><td>Série</td><td>SSD NVMe internes</td></tr><tr><td><strong>NVMe</strong></td><td>Dépend de PCIe</td><td>PCIe</td><td>SSD haute performance</td></tr><tr><td><strong>U.2</strong></td><td>Selon PCIe (16-32 Gb/s)</td><td>PCIe et NVMe</td><td>Serveurs et stations de travail</td></tr><tr><td><strong>M.2</strong></td><td>Selon PCIe (16-32 Gb/s)</td><td>PCIe ou SATA</td><td>Ordinateurs portables et de bureau</td></tr><tr><td><strong>Thunderbolt 3/4</strong></td><td>40 Gb/s</td><td>Série (USB-C)</td><td>Stockage externe rapide</td></tr><tr><td><strong>USB 4</strong></td><td>40 Gb/s</td><td>Série (USB-C)</td><td>Stockage externe polyvalent</td></tr></tbody></table>]]></content>
        <author>
            <name>Vianney Marticou</name>
            <uri>https://github.com/mrvym</uri>
        </author>
        <category label="SSD" term="SSD"/>
        <category label="SAS" term="SAS"/>
        <category label="Hardware" term="Hardware"/>
        <category label="Storage" term="Storage"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[#define INC(a) INC(a+1)]]></title>
        <id>https://blog.mrvym.dev/define-inc-a-inc-a+1</id>
        <link href="https://blog.mrvym.dev/define-inc-a-inc-a+1"/>
        <updated>2024-08-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Le but de cet article est de vous faire découvrir le magnifique univers des macros en C.]]></summary>
        <content type="html"><![CDATA[<p>Le but de cet article est de vous faire découvrir le magnifique univers des macros en C.</p>
<p>En C, les lignes qui commencent par un # sont interprétées par le compilateur lors de la compilation des fichiers sources. On les appelle des directives du préprocesseur. Les macros en font partie.</p>
<p>Petit point historique :</p>
<blockquote>
<p>Les macros en langage C ont été introduites avec la première norme du langage C, appelée ANSI C (ou C89),
qui a été standardisée par l'<a href="https://www.ansi.org/" target="_blank" rel="noopener noreferrer">American National Standards Institute</a> (ANSI) en 1989.</p>
<p>Cependant, avant cette standardisation, les macros faisaient déjà partie du langage C classique (ou K&amp;R C) utilisé dans les années 1970.
Le compilateur C original, développé par Dennis Ritchie pour le système d'exploitation UNIX, incluait déjà une forme rudimentaire de macros via le préprocesseur, permettant des définitions avec #define.</p>
</blockquote>
<h1>Define</h1>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name">SENS_DE_LA_VIE</span><span class="token macro property"> </span><span class="token macro property expression number">3.14</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">printf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"%f\n"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> SENS_DE_LA_VIE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre></div></div>
<p>Le <code>define</code> a un fonctionnement assez simple à comprendre : le compilateur remplace toutes les occurrences dans le code par la valeur définie. Il fonctionne avec la syntaxe suivante <code>#define &lt;MACRO_NAME&gt; &lt;value&gt;</code>. On a pour convention de mettre le nom en majuscule, la valeur quant à elle est optionnelle.</p>
<p>Un peu comme un "Ctrl-f et remplacer".</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="mama-la-macro">Mama, la macro<a href="https://blog.mrvym.dev/define-inc-a-inc-a+1#mama-la-macro" class="hash-link" aria-label="Lien direct vers Mama, la macro" title="Lien direct vers Mama, la macro" translate="no">​</a></h2>
<p>On peut utiliser les <code>define</code> pour définir des fonctions que l'on pourra utiliser dans notre code.</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name function" style="color:rgb(80, 250, 123)">INC</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> a</span><span class="token macro property expression operator">++</span><span class="token macro property expression"> </span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name function" style="color:rgb(80, 250, 123)">MULTI_LINE</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression">b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> a </span><span class="token macro property expression operator">=</span><span class="token macro property expression"> b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token macro property expression"> </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">                        </span><span class="token macro property expression">b </span><span class="token macro property expression operator">=</span><span class="token macro property expression"> </span><span class="token macro property expression number">0</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token macro property expression"> </span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">INC</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">my_variable</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">MULTI_LINE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">my_variable</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> foobar</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Je souligne le fait qu'il peut ne pas y avoir de ';' en fin de ligne </span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Cela donnera  </span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">my_variable</span><span class="token operator">++</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">my_variable </span><span class="token operator">=</span><span class="token plain"> foobar</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">foobar </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="if-or-not-if">If or not if<a href="https://blog.mrvym.dev/define-inc-a-inc-a+1#if-or-not-if" class="hash-link" aria-label="Lien direct vers If or not if" title="Lien direct vers If or not if" translate="no">​</a></h2>
<p>Nous pouvons déclarer des macros de manière conditionnelle.
Si un nom est déjà défini alors on exécute le bout de code suivant.</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">ifdef</span><span class="token macro property"> </span><span class="token macro property expression">DEBUG</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Je souligne qu'il est rarement conseillé d'utiliser des printf() en debug</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// et que nous avons brisé la règle du nom des macros en MAJ.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name">return</span><span class="token macro property"> </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">printf</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property string" style="color:rgb(255, 121, 198)">"(%s:%d)\n"</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> __FUNCTION__</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> </span><span class="token macro property expression constant" style="color:rgb(189, 147, 249)">__LINE__</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token macro property expression">  </span><span class="token macro property expression keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">endif</span><span class="token macro property"> </span><span class="token macro property comment" style="color:rgb(98, 114, 164)">/* ! DEBUG */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">main</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>Dans ce cas, j'utilise un <code>#ifndef</code>, mais il existe aussi :</p>
<ul>
<li><code>#ifdef</code></li>
<li><code>#if</code></li>
<li><code>#else</code></li>
<li><code>#elif</code></li>
</ul>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token macro property"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">X </span><span class="token macro property expression operator">==</span><span class="token macro property expression"> </span><span class="token macro property expression number">1</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name">Y</span><span class="token macro property"> </span><span class="token macro property expression number">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">elif</span><span class="token macro property"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">X </span><span class="token macro property expression operator">==</span><span class="token macro property expression"> </span><span class="token macro property expression number">2</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name">Y</span><span class="token macro property"> </span><span class="token macro property string" style="color:rgb(255, 121, 198)">"Ami de la bonne blague, bonjour !"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name">Y</span><span class="token macro property"> </span><span class="token macro property expression constant" style="color:rgb(189, 147, 249)">NULL</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">endif</span><span class="token macro property"> </span><span class="token macro property comment" style="color:rgb(98, 114, 164)">/* ! X */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">main</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token macro property"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">X </span><span class="token macro property expression operator">==</span><span class="token macro property expression"> </span><span class="token macro property expression number">1</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">printf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"%d\n"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Y</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token macro property"> </span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">printf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"%s\n"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> Y</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">endif</span><span class="token macro property"> </span><span class="token macro property comment" style="color:rgb(98, 114, 164)">/* ! X */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>On aime bien signaler avec un commentaire en bloc la fin des <code>#if</code>. C'est une convention qui permet de mieux se repérer dans le code.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="macros-prédéfinies">Macros prédéfinies<a href="https://blog.mrvym.dev/define-inc-a-inc-a+1#macros-pr%C3%A9d%C3%A9finies" class="hash-link" aria-label="Lien direct vers Macros prédéfinies" title="Lien direct vers Macros prédéfinies" translate="no">​</a></h2>
<p>Vous avez pu voir dans l'exemple précédent que j'utilisais les mots-clés <code>__FUNCTION__</code> et <code>__LINE__</code>.
Comme vous pouvez vous en douter, ce sont des macros que le compilateur va remplacer par la bonne valeur.</p>
<p>Il existe une liste de macros prédéfinies <a href="https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html" target="_blank" rel="noopener noreferrer">Common Predifined</a>.</p>
<p>À noter qu'il existe des macros dites <a href="https://gcc.gnu.org/onlinedocs/cpp/System-specific-Predefined-Macros.html" target="_blank" rel="noopener noreferrer">System specific</a>.</p>
<p>Petite liste non exhaustive :</p>
<ul>
<li><code>__DATE__</code> : Jan 14 2012</li>
<li><code>__GNUC__</code> : Version majeure de GCC</li>
<li><code>__TIME__</code> : 15:12:18</li>
<li><code>__INCLUDE_LEVEL__</code> : La profondeur des includes en commençant par 0</li>
<li><code>__BASE_FILE__</code> : Le nom du fichier actuel</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="vers-linfini-et-au-delà-des-arguments">Vers l'infini et au-delà des arguments<a href="https://blog.mrvym.dev/define-inc-a-inc-a+1#vers-linfini-et-au-del%C3%A0-des-arguments" class="hash-link" aria-label="Lien direct vers Vers l'infini et au-delà des arguments" title="Lien direct vers Vers l'infini et au-delà des arguments" translate="no">​</a></h2>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// Ici, l'opérateur ## est l'opérateur de concaténation</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name function" style="color:rgb(80, 250, 123)">DEBUG_PRNTF</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">fmt</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">printf</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property string" style="color:rgb(255, 121, 198)">"LOG"</span><span class="token macro property"> </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">##</span><span class="token macro property"> </span><span class="token macro property expression">fmt</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> __VA_ARGS__</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre></div></div>
<p>Ici, on peut voir que l'on génère des macros variadiques, surtout utiles lors de la création de logs.
(Même si ce n'est pas une bonne idée de faire des logs avec des <code>printf</code>.)</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="x-macro">X-Macro<a href="https://blog.mrvym.dev/define-inc-a-inc-a+1#x-macro" class="hash-link" aria-label="Lien direct vers X-Macro" title="Lien direct vers X-Macro" translate="no">​</a></h2>
<p>Pour cela, nous allons devoir créer un fichier externe, souvent nommé en <code>*.def</code> bien qu'il n'existe pas de convention.</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)">// color.def</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">X</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">NC</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"\e[0m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"No Color"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0x000000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">X</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">BLACK</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"\e[0;30m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Black"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0x000000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">X</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">GRAY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"\e[1;30m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Gray"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0x808080</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">X</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">RED</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"\e[0;31m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Red"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0xFF0000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">X</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">LIGHT_RED</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"\e[1;31m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Light Red"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0xFF8080</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">X</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">GREEN</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"\e[0;32m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Green"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0x00FF00</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">X</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">LIGHT_GREEN</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"\e[1;32m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Light Green"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0x80FF80</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">X</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">BROWN</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"\e[0;33m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Brown"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0xA52A2A</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">X</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">YELLOW</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"\e[1;33m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Yellow"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0xFFFF00</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">X</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">BLUE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"\e[0;34m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Blue"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0x0000FF</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">X</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">LIGHT_BLUE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"\e[1;34m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Light Blue"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0xADD8E6</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">X</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">PURPLE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"\e[0;35m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Purple"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0x800080</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">X</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">LIGHT_PURPLE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"\e[1;35m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Light Purple"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0xEE82EE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">X</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">CYAN</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"\e[0;36m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Cyan"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0x00FFFF</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">X</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">LIGHT_CYAN</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"\e[1;36m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Light Cyan"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0xE0FFFF</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">X</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">LIGHT_GRAY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"\e[0;37m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Light Gray"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0xD3D3D3</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">X</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">WHITE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"\e[1;37m"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"White"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">0xFFFFFF</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">typedef</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">struct</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">char</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain">name</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain">        </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">char</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain">ansi_code</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain">  </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">char</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain">description</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">unsigned</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> rgb</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain">      </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> Color</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name function" style="color:rgb(80, 250, 123)">X</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">NAME</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> ANSI</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> DESC</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> RGB</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token macro property expression"> #NAME</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> ANSI</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> DESC</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> RGB </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">Color colors</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">include</span><span class="token macro property"> </span><span class="token macro property string" style="color:rgb(255, 121, 198)">"color.def"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">undef</span><span class="token macro property"> </span><span class="token macro property expression">X</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name function" style="color:rgb(80, 250, 123)">X</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">NAME</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> ANSI</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> DESC</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> RGB</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">printf</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property string" style="color:rgb(255, 121, 198)">"%s (%s) = %s\n"</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> #NAME</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> DESC</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> #RGB</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">print_colors</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token comment" style="color:rgb(98, 114, 164)">// Bien entendu, on pourrait itérer sur la structure créée mais c'est une illustration</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">include</span><span class="token macro property"> </span><span class="token macro property string" style="color:rgb(255, 121, 198)">"color.def"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">undef</span><span class="token macro property"> </span><span class="token macro property expression">X</span><br></span></code></pre></div></div>
<p>Ce genre de macro est extrêmement utile. Je dois reconnaître qu'on la retrouve rarement dans un code source, mais elle permet de modifier le fonctionnement du programme sans pour autant devoir modifier le code source. Fun fact, elle est souvent utilisée dans la création de kernels. Elle permet de générer les structures globales comme l'IDT et la GDT.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="les-problèmes">Les problèmes<a href="https://blog.mrvym.dev/define-inc-a-inc-a+1#les-probl%C3%A8mes" class="hash-link" aria-label="Lien direct vers Les problèmes" title="Lien direct vers Les problèmes" translate="no">​</a></h2>
<p><strong><strong>Attention</strong></strong> : Petite mise au point d'abord, les macros sont des outils formidables mais il faut faire attention. Vous ne devez surtout pas utiliser ce genre de macro :</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name function" style="color:rgb(80, 250, 123)">MIN</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression">b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">a </span><span class="token macro property expression operator">&lt;</span><span class="token macro property expression"> b </span><span class="token macro property expression operator">?</span><span class="token macro property expression"> a </span><span class="token macro property expression operator">:</span><span class="token macro property expression"> b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>Prenons un exemple : <code>MIN(2 + 5, fibo(25))</code></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="problème-n1">Problème n°1<a href="https://blog.mrvym.dev/define-inc-a-inc-a+1#probl%C3%A8me-n1" class="hash-link" aria-label="Lien direct vers Problème n°1" title="Lien direct vers Problème n°1" translate="no">​</a></h3>
<p><code>MIN(2 + 5, fibo(25))</code> =&gt; <code>(2 + 5 &lt; fibo(25) ? 2 + 5 : fibo(25))</code></p>
<p>Ici le problème est la priorité de calcul. Le compilateur va d'abord effectuer la comparaison puis l'addition, donc 2 + (1). On corrige cela par l'ajout de parenthèses en utilisant les arguments des macros.</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name function" style="color:rgb(80, 250, 123)">MIN</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression">b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression operator">&lt;</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression operator">?</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression operator">:</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>Comme vous ne savez jamais ce que vos utilisateurs vont passer en paramètre, mettez toujours des parenthèses sur les arguments.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="problème-n2">Problème n°2<a href="https://blog.mrvym.dev/define-inc-a-inc-a+1#probl%C3%A8me-n2" class="hash-link" aria-label="Lien direct vers Problème n°2" title="Lien direct vers Problème n°2" translate="no">​</a></h3>
<p><code>MIN(2 + 5, fibo(25))</code> =&gt; <code>(2 + 5 &lt; fibo(25) ? 2 + 5 : fibo(25))</code></p>
<p>On remarque que le compilateur fait un remplacement bête et méchant, ce qui veut dire que l'on va calculer deux fois <code>fibo(25)</code>. Je vous laisse imaginer si c'est une implémentation récursive.</p>
<p>Pour fixer ce problème, nous déclarons une variable intermédiaire avant le <code>if</code>.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="macros-utiles">Macros utiles<a href="https://blog.mrvym.dev/define-inc-a-inc-a+1#macros-utiles" class="hash-link" aria-label="Lien direct vers Macros utiles" title="Lien direct vers Macros utiles" translate="no">​</a></h2>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name function" style="color:rgb(80, 250, 123)">MIN</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression">                                                              </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">    </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token macro property expression">                                                                         </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">        </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">__typeof__</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> _a </span><span class="token macro property expression operator">=</span><span class="token macro property expression"> a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token macro property expression">                                                  </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">        </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">__typeof__</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> _b </span><span class="token macro property expression operator">=</span><span class="token macro property expression"> b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token macro property expression">                                                  </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">        </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">_a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression operator">&gt;</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">_b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression operator">?</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">_b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression operator">:</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">_a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token macro property expression">                                             </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">    </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name function" style="color:rgb(80, 250, 123)">ABS</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression">                                                                 </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">    </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token macro property expression">                                                                         </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">        </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">__typeof__</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> _a </span><span class="token macro property expression operator">=</span><span class="token macro property expression"> a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token macro property expression">                                                  </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">        </span><span class="token macro property expression number">0</span><span class="token macro property expression"> </span><span class="token macro property expression operator">&lt;</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">_a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression operator">?</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">_a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression operator">:</span><span class="token macro property expression"> </span><span class="token macro property expression operator">-</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">_a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token macro property expression">                                               </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">    </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name function" style="color:rgb(80, 250, 123)">MAX</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression">                                                              </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">    </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token macro property expression">                                                                         </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">        </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">__typeof__</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> _a </span><span class="token macro property expression operator">=</span><span class="token macro property expression"> a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token macro property expression">                                                  </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">        </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">__typeof__</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> _b </span><span class="token macro property expression operator">=</span><span class="token macro property expression"> b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token macro property expression">                                                  </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">        </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">_a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression operator">&lt;</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">_b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression operator">?</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">_b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression operator">:</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">_a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token macro property expression">                                             </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">    </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name function" style="color:rgb(80, 250, 123)">CLAMP</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> x</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">MAX</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">a</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">MIN</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">x</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> b</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">// Pour les tableaux uniquement</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name function" style="color:rgb(80, 250, 123)">COUNT_OF</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">arr</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression keyword" style="color:rgb(189, 147, 249);font-style:italic">sizeof</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">arr</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression operator">/</span><span class="token macro property expression"> </span><span class="token macro property expression keyword" style="color:rgb(189, 147, 249);font-style:italic">sizeof</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">arr</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token macro property expression number">0</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="là-on-samuse">Là, on s'amuse<a href="https://blog.mrvym.dev/define-inc-a-inc-a+1#l%C3%A0-on-samuse" class="hash-link" aria-label="Lien direct vers Là, on s'amuse" title="Lien direct vers Là, on s'amuse" translate="no">​</a></h2>
<p>Ici, c'est du code purement overkill juste pour le fun. Je ne vous conseille pas forcément d'utiliser ces macros dans votre code.
Je me fais juste plaisir (faut bien dans la vie).</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="un-auto-free">Un auto free<a href="https://blog.mrvym.dev/define-inc-a-inc-a+1#un-auto-free" class="hash-link" aria-label="Lien direct vers Un auto free" title="Lien direct vers Un auto free" translate="no">​</a></h3>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name function" style="color:rgb(80, 250, 123)">DEFER</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">free_call</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression keyword" style="color:rgb(189, 147, 249);font-style:italic">__attribute__</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">cleanup</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">free_call</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">auto_free</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain">ptr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token operator">*</span><span class="token operator">*</span><span class="token plain">p </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token operator">*</span><span class="token operator">*</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">ptr</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">*</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">free</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token operator">*</span><span class="token plain">p</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token operator">*</span><span class="token plain">p </span><span class="token operator">=</span><span class="token plain"> </span><span class="token constant" style="color:rgb(189, 147, 249)">NULL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">main</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token function" style="color:rgb(80, 250, 123)">DEFER</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">auto_free</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">char</span><span class="token operator">*</span><span class="token plain"> buffer </span><span class="token operator">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">malloc</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">  </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<p>Je vous laisse tester avec un petit <code>-fsanitize=address</code>. C'est vraiment une dinguerie. On pourrait même voir une amélioration de la fonction auto_free qui prend en paramètre une chaîne de caractères du nom de notre structure pour faire un switch.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="get-time">Get time<a href="https://blog.mrvym.dev/define-inc-a-inc-a+1#get-time" class="hash-link" aria-label="Lien direct vers Get time" title="Lien direct vers Get time" translate="no">​</a></h3>
<p>Fonction plus chill où l'on calcule juste le temps d'exécution de notre fonction. Très utile pour faire du benchmark.</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name function" style="color:rgb(80, 250, 123)">MEASURE_TIME</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">block</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token macro property expression">                                </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">    </span><span class="token macro property expression class-name">clock_t</span><span class="token macro property expression"> start_time </span><span class="token macro property expression operator">=</span><span class="token macro property expression"> </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">clock</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token macro property expression">                            </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">    </span><span class="token macro property expression">block                                                    </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">    </span><span class="token macro property expression class-name">clock_t</span><span class="token macro property expression"> end_time </span><span class="token macro property expression operator">=</span><span class="token macro property expression"> </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">clock</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token macro property expression">                              </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">    </span><span class="token macro property expression keyword" style="color:rgb(189, 147, 249);font-style:italic">double</span><span class="token macro property expression"> elapsed </span><span class="token macro property expression operator">=</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression keyword" style="color:rgb(189, 147, 249);font-style:italic">double</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">end_time </span><span class="token macro property expression operator">-</span><span class="token macro property expression"> start_time</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression operator">/</span><span class="token macro property expression"> CLOCKS_PER_SEC </span><span class="token macro property expression operator">*</span><span class="token macro property expression"> </span><span class="token macro property expression number">1000.0</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token macro property expression"> </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">    </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">printf</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property string" style="color:rgb(255, 121, 198)">"Execution time: %.3f ms\n"</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> elapsed</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token macro property expression">            </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property"></span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="define-error">Define Error<a href="https://blog.mrvym.dev/define-inc-a-inc-a+1#define-error" class="hash-link" aria-label="Lien direct vers Define Error" title="Lien direct vers Define Error" translate="no">​</a></h3>
<p>Petite X-macro qui prend une macro en argument et qui l'expand.</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name function" style="color:rgb(80, 250, 123)">ERROR_LIST</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">X</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression">          </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">    </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">X</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">ERROR_FILE_NOT_FOUND</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> </span><span class="token macro property string" style="color:rgb(255, 121, 198)">"File not found"</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression">    </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">    </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">X</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">ERROR_INVALID_INPUT</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> </span><span class="token macro property string" style="color:rgb(255, 121, 198)">"Invalid input"</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression">      </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">    </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">X</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">ERROR_OUT_OF_MEMORY</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> </span><span class="token macro property string" style="color:rgb(255, 121, 198)">"Out of memory"</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression">      </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">    </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">X</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">ERROR_UNKNOWN</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> </span><span class="token macro property string" style="color:rgb(255, 121, 198)">"Unknown error"</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name function" style="color:rgb(80, 250, 123)">DEFINE_ERROR_ENUM</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">code</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> message</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> code</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">enum</span><span class="token plain"> </span><span class="token class-name">ErrorCode</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token function" style="color:rgb(80, 250, 123)">ERROR_LIST</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">DEFINE_ERROR_ENUM</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name function" style="color:rgb(80, 250, 123)">DEFINE_ERROR_STRING</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">code</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> message</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression keyword" style="color:rgb(189, 147, 249);font-style:italic">case</span><span class="token macro property expression"> code</span><span class="token macro property expression operator">:</span><span class="token macro property expression"> </span><span class="token macro property expression keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token macro property expression"> message</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">const</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">char</span><span class="token operator">*</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">get_error_message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">enum</span><span class="token plain"> </span><span class="token class-name">ErrorCode</span><span class="token plain"> error_code</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">switch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">error_code</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token function" style="color:rgb(80, 250, 123)">ERROR_LIST</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">DEFINE_ERROR_STRING</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">default</span><span class="token operator">:</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"Unrecognized error"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">enum</span><span class="token plain"> </span><span class="token class-name">ErrorCode</span><span class="token plain"> error </span><span class="token operator">=</span><span class="token plain"> ERROR_OUT_OF_MEMORY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">printf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"Error: %s\n"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">get_error_message</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="génération-de-tests-automatisés">Génération de tests automatisés<a href="https://blog.mrvym.dev/define-inc-a-inc-a+1#g%C3%A9n%C3%A9ration-de-tests-automatis%C3%A9s" class="hash-link" aria-label="Lien direct vers Génération de tests automatisés" title="Lien direct vers Génération de tests automatisés" translate="no">​</a></h3>
<p>Ici, on génère carrément des fonctions entières avec une macro, parce que le C n'a aucune limite. Moi aussi <!-- -->👀</p>
<div class="language-c codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-c codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token macro property directive-hash">#</span><span class="token macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">define</span><span class="token macro property"> </span><span class="token macro property macro-name function" style="color:rgb(80, 250, 123)">GENERATE_TEST_FUNC</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">func</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> test_value</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> wanted_value</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">    </span><span class="token macro property expression keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token macro property expression"> test_</span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">##</span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">func</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token macro property expression"> </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">        </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">printf</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property string" style="color:rgb(255, 121, 198)">"Test de "</span><span class="token macro property"> </span><span class="token macro property expression macro property directive-hash">#</span><span class="token macro property expression macro property directive keyword" style="color:rgb(189, 147, 249);font-style:italic">func</span><span class="token macro property expression macro property"> </span><span class="token macro property string" style="color:rgb(255, 121, 198)">" avec valeur %d : "</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token macro property expression"> test_value</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token macro property expression"> </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">        </span><span class="token macro property expression keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">func</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property expression">test_value</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token macro property expression"> </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">            </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">printf</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property string" style="color:rgb(255, 121, 198)">"Succès\n"</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token macro property expression"> </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">        </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token macro property expression"> </span><span class="token macro property expression keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token macro property expression"> </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token macro property expression"> </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">            </span><span class="token macro property expression function" style="color:rgb(80, 250, 123)">printf</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token macro property string" style="color:rgb(255, 121, 198)">"Échec\n"</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token macro property expression"> </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">        </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token macro property expression"> </span><span class="token macro property punctuation" style="color:rgb(248, 248, 242)">\</span><span class="token macro property"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token macro property">    </span><span class="token macro property expression punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/* ... */</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">GENERATE_TEST_FUNC</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">fibo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">10</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">55</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token function" style="color:rgb(80, 250, 123)">test_fibo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="rtfm">RTFM<a href="https://blog.mrvym.dev/define-inc-a-inc-a+1#rtfm" class="hash-link" aria-label="Lien direct vers RTFM" title="Lien direct vers RTFM" translate="no">​</a></h2>
<p>Il est maintenant l'heure de conclure. Nous avons vu plein de choses très cool. Et si jamais vous êtes tentés, libre à vous de découvrir les macros par vous-même.
Donc, conclusion : <strong>RTFM</strong>.</p>
<blockquote>
<p>PS : Pour ce qui est du titre, les macros ne sont pas récursives, elles ne s'expandent qu'avec une profondeur de 1.</p>
</blockquote>]]></content>
        <author>
            <name>Vianney Marticou</name>
            <uri>https://github.com/mrvym</uri>
        </author>
        <category label="define" term="define"/>
        <category label="C Language" term="C Language"/>
        <category label="macro" term="macro"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Le Merveilleux Monde de Make]]></title>
        <id>https://blog.mrvym.dev/le-merveilleux-monde-de-make</id>
        <link href="https://blog.mrvym.dev/le-merveilleux-monde-de-make"/>
        <updated>2024-03-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Les Makefiles constituent un outil essentiel dans le développement de logiciels que ce soit en C/C++ ou autre. Ils permettent une gestion efficace des projets en automatisant le processus de compilation, de nettoyage et de tests.]]></summary>
        <content type="html"><![CDATA[<p>Les Makefiles constituent un outil essentiel dans le développement de logiciels que ce soit en C/C++ ou autre. Ils permettent une gestion efficace des projets en automatisant le processus de compilation, de nettoyage et de tests.</p>
<p>Dans cet article, nous explorerons les bonnes pratiques pour la création et l'utilisation de Makefiles dans des projets C quelque soit leurs complexités.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="make-ca-sert-a-quoi-">Make, ca sert a quoi ?<a href="https://blog.mrvym.dev/le-merveilleux-monde-de-make#make-ca-sert-a-quoi-" class="hash-link" aria-label="Lien direct vers Make, ca sert a quoi ?" title="Lien direct vers Make, ca sert a quoi ?" translate="no">​</a></h3>
<p>Make est un programme qui a pour but de générer des fichier. Il permet de générer des pdfs, des exécutables et bien plus.</p>
<blockquote>
<p>Dans les années 1970, la compilation des programmes devient de plus en plus longue et complexe, nécessitant de nombreuses étapes interdépendantes. La plupart des systèmes alors utilisés reposent sur des script shell, nécessitant de répéter toutes les étapes lors de la moindre correction. C'est dans ce contexte que Make fut développé par le docteur Stuart Feldman en 1977. En gérant les dépendances entre fichiers sources et fichiers compilés, Make permet de ne compiler que ce qui est nécessaire à la suite de la modification d'un fichier source.</p>
</blockquote>
<p>Il existe un makefile par défaut, qui définit un grand nombre de règles afin de générer la plupart des fichiers avec lesquels, vous serez amené a travailler.</p>
<p>Pour voir ce makefile, par défaut : <code>make -p</code></p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="hello-world">Hello World<a href="https://blog.mrvym.dev/le-merveilleux-monde-de-make#hello-world" class="hash-link" aria-label="Lien direct vers Hello World" title="Lien direct vers Hello World" translate="no">​</a></h3>
<p>Pour débuter, nous allons prendre un cas très simple celui d'un fichier source unique, dans le même dossier que notre makefile.</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token builtin class-name" style="color:rgb(189, 147, 249)">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">└── main.c </span><br></span></code></pre></div></div>
<p>Dans ce cas, il existe 2 facons de faire.</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">$ </span><span class="token function" style="color:rgb(80, 250, 123)">make</span><span class="token plain"> main </span><span class="token comment" style="color:rgb(98, 114, 164)"># Je souligne l'absence du .c</span><br></span></code></pre></div></div>
<p>Dans cette commande, nous demandons a make de créer le fichier <code>main</code>. Mais comment sait-il qu'il doit utiliser le fichier main.c pour faire notre binaire ? Cela est défini dans les règles par défaut.</p>
<p>Nous pouvons aussi creer un fichier <code>Makefile</code></p>
<div class="language-makefile= codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile= codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain"># Makefile</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">my_compilation_rule: </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    gcc main.c</span><br></span></code></pre></div></div>
<p>Une fois, le fichier crée, il suffit d'exécuter la commande <code>make</code> (qui, par défaut, exécute la première règle du fichier).
Nous pouvons aussi mettre en argument le nom de la règle que nous voulons exécuter <code>make my_compilation_rule</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="plus-on-est-de-fou-plus-on-rit">Plus on est de fou, plus on rit<a href="https://blog.mrvym.dev/le-merveilleux-monde-de-make#plus-on-est-de-fou-plus-on-rit" class="hash-link" aria-label="Lien direct vers Plus on est de fou, plus on rit" title="Lien direct vers Plus on est de fou, plus on rit" translate="no">​</a></h3>
<p>Notre projet grossit, nous avons maintenant un deuxième fichier source.</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token builtin class-name" style="color:rgb(189, 147, 249)">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── foo.c</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── foo.h</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">└── main.c </span><br></span></code></pre></div></div>
<p>Dans l'objectif de faire un makefile propre, nous allons déclarer une variable OBJ qui contiendra nos différents fichiers. On en profite pour déclarer un variable CC pour notre compilateur.</p>
<div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># makefile</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">CC </span><span class="token operator">=</span><span class="token plain"> gcc</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">OBJ </span><span class="token operator">=</span><span class="token plain"> main.o foo.o</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Cette variable sera utilisée dans la règle implicite qui compile les .o  </span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">CFLAGS </span><span class="token operator">=</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># My C Flags for the compiler</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">LDFLAGS </span><span class="token operator">=</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># My linker flags</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">TARGET </span><span class="token operator">=</span><span class="token plain"> a.out</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token target symbol" style="color:rgb(248, 248, 242)">all</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">OBJ</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">	</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">CC</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">OBJ</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> -o </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">TARGET</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">LDFLAGS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>Cette fois-ci, nous avons ajouter des dépendances à notre règle <code>all</code>. Maintenant, make sait qu'il faut d'abord faire les fichiers .o avant de pouvoir faire le linkage de tous les fichiers en un binaire.</p>
<div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># makefile</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">SRC </span><span class="token operator">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">wildcard</span><span class="token plain"> *.c</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># main.c foo.c</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">OBJ </span><span class="token operator">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">SRC</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain">.c</span><span class="token operator">=</span><span class="token plain">.o</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)"># main.o foo.o</span><br></span></code></pre></div></div>
<p>Dans ce makefile, nous avons choisi de ne pas récupérer, à la main, les différents fichiers source. Nous récupérons automatiquement les fichiers source via la fonction <code>wildcard</code>. Cette fonction agit comme le globbing d'un shell. Dans cette example, elle récupère tous les fichiers terminant par <code>.c</code>.</p>
<p>Nous les convertissons en <code>.o</code> via cette syntax <code>$(NAME:old=new)</code> qui n'est rien de moins qu'un replace. La suite de notre makefile reste néanmoins la même chose.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="clean">Clean<a href="https://blog.mrvym.dev/le-merveilleux-monde-de-make#clean" class="hash-link" aria-label="Lien direct vers Clean" title="Lien direct vers Clean" translate="no">​</a></h3>
<p>Comme vous avez pu le remarquer, un makefile peut facilement générer un grand nombre de fichiers. C'est pour cela que nous allons créer une nouvelle règle dans notre makefile qui a pour but de supprimer tous les fichiers issus de la compilation.</p>
<div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># ...</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token target symbol" style="color:rgb(248, 248, 242)">clean</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">RM</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">OBJ</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">RM</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">TARGET</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>Pour les petits curieux qui se demandent ce que signifie la variable RM. C'est un simple alias avec la commande <code>rm -f</code>. Il faut savoir que cette variable peut très bien override. On peut très bien voir <code>RM = echo</code> ou bien <code>RM = mv to/path/</code> (à la place du remove), cela peut être très utile dans certains projets.</p>
<h4 class="anchor anchorWithStickyNavbar_LWe7" id="phony">Phony<a href="https://blog.mrvym.dev/le-merveilleux-monde-de-make#phony" class="hash-link" aria-label="Lien direct vers Phony" title="Lien direct vers Phony" translate="no">​</a></h4>
<p>Nous l'avons dit au début de cet article, mais make est un utilitaire qui permet de générer des fichiers. Mais que se passe-t-il, si l'on appelle la règle clean et qui existe un fichier <code>clean</code> dans notre dossier.</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">make: </span><span class="token string" style="color:rgb(255, 121, 198)">'clean'</span><span class="token plain"> is up to date.</span><br></span></code></pre></div></div>
<p>Pour éviter ce genre de problème, il faut spécifier dans notre makefile que notre règle n'a pas pour but de générer un fichier. Pour cela, nous utilisons le mot clé <code>phony</code>.</p>
<p>Il suffit d'écrire.</p>
<div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token builtin-target builtin" style="color:rgb(189, 147, 249)">.PHONY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> my_rule1 my_rule12 </span><span class="token comment" style="color:rgb(98, 114, 164)"># ... </span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="on-range-le-repo">On range le repo<a href="https://blog.mrvym.dev/le-merveilleux-monde-de-make#on-range-le-repo" class="hash-link" aria-label="Lien direct vers On range le repo" title="Lien direct vers On range le repo" translate="no">​</a></h3>
<p>Maintenant, que nous avons réussi à faire un makefile propre, nous allons pouvoir faire évoluer notre projet en mettant nos fichiers dans un dossier <code>src</code>.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── Makefile</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">└── src/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ├── foo.c</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ├── foo.h</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    └── main.c</span><br></span></code></pre></div></div>
<p>Pour cela, il nous suffit de rechercher la liste de nos .c dans le dossier src/ puis de les transformer en .o. On peut modifier le code que nous avons fait ci-dessus.</p>
<div class="language-makefile= codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile= codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">SRCDIR = src</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">SRC = $(wildcard $(SRCDIR)/*.c)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">OBJ = $(SRC:$(SRCDIR)/%.c=$(SRCDIR)/%.o)</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># qui est équivalent à</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"># OBJ = src/main.o \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">#       src/main.o</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="where-gdb-">Where GDB ?<a href="https://blog.mrvym.dev/le-merveilleux-monde-de-make#where-gdb-" class="hash-link" aria-label="Lien direct vers Where GDB ?" title="Lien direct vers Where GDB ?" translate="no">​</a></h3>
<p>Il peut être utile d'avoir un règle debug, afin de ne pas avoir à mettre un <code>-g</code> dans nos CFLAGS par défaut.</p>
<p>Pour cela, il suffit de :</p>
<div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token target symbol" style="color:rgb(248, 248, 242)">debug</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> CFLAGS </span><span class="token operator">+=</span><span class="token plain"> -g</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token target symbol" style="color:rgb(248, 248, 242)">debug</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> all</span><br></span></code></pre></div></div>
<p>On remarque que la règle debug n'a pas de corps. Elle se contente d'ajouter un flag et d'appeler notre règle <code>all</code>.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="tester-cest-tricher">Tester, c'est tricher<a href="https://blog.mrvym.dev/le-merveilleux-monde-de-make#tester-cest-tricher" class="hash-link" aria-label="Lien direct vers Tester, c'est tricher" title="Lien direct vers Tester, c'est tricher" translate="no">​</a></h3>
<p>Pour cet article, nous allons voir comment faire un Makefile pour une test suite criterion.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── Makefile</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── src/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">...</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">└── tests/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    └── foo_test.c</span><br></span></code></pre></div></div>
<p>Pour pouvoir lancer, nos tests, il va falloir que l'on trouve les fichiers source du dossier <code>tests</code>, puis linker tous nos fichiers en excluant le fichier main.o.</p>
<div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">TEST_DIR </span><span class="token operator">=</span><span class="token plain"> tests</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">SRC_TEST </span><span class="token operator">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">wildcard</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">TEST_DIR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">/*.c</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">OBJ_TEST </span><span class="token operator">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">SRC</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">TEST_DIR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">/%.c</span><span class="token operator">=</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">TEST_DIR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">/%.o</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># ... </span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token target symbol" style="color:rgb(248, 248, 242)">check</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">filter-out</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">SRC_DIR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">/main.o, </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">OBJ</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">OBJ_TEST</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">CC</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$^</span><span class="token plain"> -o </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">TARGET</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">LDFLAGS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>On remarque que le fichier main.o est exclus en utilisant la fonction <code>filter-out</code>. On voit aussi l'appel d'une variable pour le moment inconnu. Il en existe un grand nombre.</p>
<ul>
<li>
<p><code>$^</code>  : La liste des dépendances de la règle</p>
</li>
<li>
<p><code>$&lt;</code> : Le nom de la première dépendance</p>
</li>
<li>
<p><code>$@</code> : Le nom de la règle</p>
</li>
</ul>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="on-teste-les-tests">On teste les tests<a href="https://blog.mrvym.dev/le-merveilleux-monde-de-make#on-teste-les-tests" class="hash-link" aria-label="Lien direct vers On teste les tests" title="Lien direct vers On teste les tests" translate="no">​</a></h3>
<p>Si l'on parle de test, nous devons forcément parler de coverage. Pour cela rien de plus simple, nous ajoutons les flags a nos variables puis exécutons <code>GCOVR</code></p>
<div class="language-makefile= codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile= codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">coverage: CFLAGS += -fPIC --coverage</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">coverage: LDFLAGS += -lgcov -lcriterion</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">coverage: check</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">gcovr --print-summary</span><br></span></code></pre></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="like-a-pro">Like a pro<a href="https://blog.mrvym.dev/le-merveilleux-monde-de-make#like-a-pro" class="hash-link" aria-label="Lien direct vers Like a pro" title="Lien direct vers Like a pro" translate="no">​</a></h3>
<p>La création d'un dossier build est la cerise sur le gâteau. Elle permet au développeur de faire <code>rm -rf build/</code> pour faire un clean.</p>
<p>Pour cela, nous allons devoir modifier notre variable <code>OBJ</code> et nous allons devoir créer un règle pour la compilation des .o. Nous ne pouvons plus utiliser les règles implicite.</p>
<div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">BUILD_DIR </span><span class="token operator">=</span><span class="token plain"> build</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">OBJ </span><span class="token operator">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">SRC</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">SRC_DIR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">/%.c</span><span class="token operator">=</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">BUILD_DIR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">/%.o</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Compilation des fichiers source</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token target symbol variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token target symbol" style="color:rgb(248, 248, 242)">(BUILD_DIR)/%.o</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">SRC_DIR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">/%.c </span><span class="token operator">|</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">BUILD_DIR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">CC</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">CFLAGS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> -c </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$&lt;</span><span class="token plain"> -o </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$@</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Creer le repertoire de build</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token target symbol variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token target symbol" style="color:rgb(248, 248, 242)">(BUILD_DIR)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">mkdir -p </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">BUILD_DIR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>Alors on remarque que cette fois-ci, nous n'avons pas défini une règle, mais avec une variable. Nous avons même utilisé une sorte de regex pour la définir.</p>
<p>Nous avons aussi dû mettre un prérequis en plus, la règle $(build_dir). Le fait de mettre un <code>|</code> signifie qu'il doit d'abord vérifier qu'il est nécessaire de faire cette règle.</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="bonus">Bonus<a href="https://blog.mrvym.dev/le-merveilleux-monde-de-make#bonus" class="hash-link" aria-label="Lien direct vers Bonus" title="Lien direct vers Bonus" translate="no">​</a></h2>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="bibliothèque-statique">Bibliothèque statique<a href="https://blog.mrvym.dev/le-merveilleux-monde-de-make#biblioth%C3%A8que-statique" class="hash-link" aria-label="Lien direct vers Bibliothèque statique" title="Lien direct vers Bibliothèque statique" translate="no">​</a></h3>
<p>Pour créer une bibliothèque statique à partir des fichiers source, vous pouvez ajouter des règles au Makefile :</p>
<div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">LIB_TARGET </span><span class="token operator">=</span><span class="token plain"> libmylib.a</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">LIB_OBJS </span><span class="token operator">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">filter-out</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">BUILD_DIR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">/main.o, </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">OBJS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token target symbol variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token target symbol" style="color:rgb(248, 248, 242)">(LIB_TARGET)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">LIB_OBJS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">ar rcs </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$@</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$^</span><br></span></code></pre></div></div>
<p>Une fois, la librairie crée, vous pourrez simplement la link avec votre binaire.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="makefile-récursif">Makefile récursif<a href="https://blog.mrvym.dev/le-merveilleux-monde-de-make#makefile-r%C3%A9cursif" class="hash-link" aria-label="Lien direct vers Makefile récursif" title="Lien direct vers Makefile récursif" translate="no">​</a></h3>
<p>Si votre projet comporte des sous-modules, vous pouvez utiliser un Makefile récursif. Imaginons un projet avec la structure suivante.</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token builtin class-name" style="color:rgb(189, 147, 249)">.</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── Makefile</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">└── src/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ├── features1/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        └── Makefile</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ├── features2/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        └── Makefile</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ├── features3/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        └── Makefile</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ├── features4/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        └── Makefile</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    ├── main.c</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    └── Makefile</span><br></span></code></pre></div></div>
<p>Pour cela, il y a deux approches possibles. La première serait de faire un seul makefile à la racine de notre projet et faire un find de nos fichiers .c. Nous verrons comment faire par la suite.</p>
<p>La deuxième, c'est de faire une structure récursif via le Makefile suivant.</p>
<div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># src/makefile </span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">SUBDIRS </span><span class="token operator">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">wildcard</span><span class="token plain"> */.</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token builtin-target builtin" style="color:rgb(189, 147, 249)">.PHONY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> subdirs </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">SUBDIRS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token target symbol" style="color:rgb(248, 248, 242)">subdirs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">SUBDIRS</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token target symbol variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token target symbol" style="color:rgb(248, 248, 242)">(SUBDIRS)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">MAKE</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> -C </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$@</span><br></span></code></pre></div></div>
<p>Avec ce fichier, nous allons pouvoir mettre un makefile dans chaque dossier features et lui et lui seul gérera la compilation de la features. Ils seront appelés par le <code>src/Makefile</code> via la règles subdirs.</p>
<div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Makefile</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">export</span><span class="token plain"> CFLAGS </span><span class="token operator">=</span><span class="token plain"> -Wall -Werror -pedantic</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># ...</span><br></span></code></pre></div></div>
<p>N'oubliez pas d'export vos variables dans votre Makefile afin qu´elle s'applique sur les Makefiles suivants.</p>
<p>Ce genre d'architecture nécessite, la plupart du temps, de la combiner avec la création de librairie statique.</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="répertoires-infinis">Répertoires infinis<a href="https://blog.mrvym.dev/le-merveilleux-monde-de-make#r%C3%A9pertoires-infinis" class="hash-link" aria-label="Lien direct vers Répertoires infinis" title="Lien direct vers Répertoires infinis" translate="no">​</a></h3>
<p>Nous avons vu comment utiliser la fonction <code>wildcard</code> mais comment faire pour recuperer l'intégralité de nos fichiers sources ?</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">├── Makefile</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">└── src/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">    └── foo/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">        └── bar/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(248, 248, 242)">..</span><span class="token plain">.</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                └── foobar/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                    └── barfoo/</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">                        └── here.c</span><br></span></code></pre></div></div>
<p>La prise en charge des répertoires "infinis" peut se faire via des règles génériques ou bien par l'intermédiaire d'un sub-shell.</p>
<p>Par exemple :</p>
<div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Attention, il faut que votre systeme possede la command find</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">SRC </span><span class="token operator">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">shell</span><span class="token plain"> find </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">SRC_DIR</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> -name </span><span class="token string" style="color:rgb(255, 121, 198)">"*.c"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>ou bien</p>
<div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Je laisse les plus aventureux d'entre vous dechiffrer ce code</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">rwildcard </span><span class="token operator">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">foreach</span><span class="token plain"> d, </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">wildcard</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">1</span><span class="token operator">:=</span><span class="token plain">/*</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">, </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">call</span><span class="token plain"> rwildcard,</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$d,$2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">filter</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">subst</span><span class="token plain"> *,%,</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain">,</span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$d</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">SRC </span><span class="token operator">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">rwildcard src,*.c</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre></div></div>
<p>ou encore</p>
<div class="language-makefile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#F8F8F2;--prism-background-color:#282A36"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-makefile codeBlock_bY9V thin-scrollbar" style="color:#F8F8F2;background-color:#282A36"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#F8F8F2"><span class="token plain">SRC </span><span class="token operator">=</span><span class="token plain"> </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">wildcard</span><span class="token plain"> src/*.c</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">wildcard</span><span class="token plain"> src/*/*.c</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> \</span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token comment" style="color:rgb(98, 114, 164)"># ... # </span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain">      </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">$</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token function" style="color:rgb(80, 250, 123)">wildcard</span><span class="token plain"> src/*/*/*/*/*/*/*/*/*/*/.c</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># S'il vous plait, ne faites pas ca </span><br></span></code></pre></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="-make-conclusion">$ make conclusion<a href="https://blog.mrvym.dev/le-merveilleux-monde-de-make#-make-conclusion" class="hash-link" aria-label="Lien direct vers $ make conclusion" title="Lien direct vers $ make conclusion" translate="no">​</a></h2>
<p>En conclusion, l'utilisation judicieuse des Makefiles est cruciale pour la gestion efficace de projets. Il permet d'économiser énormément de temps lors du processus de développement. Ce n'est pas pour rien que la quasi-intégralité de l'industrie utilise cet outil.</p>
<p>Cette article n'étant bien entendu, pas exhaustif, je vous invite à vous renseigner par vous meme afin de découvrir les autres fonctionnalités de cet outil.</p>]]></content>
        <author>
            <name>Vianney Marticou</name>
            <uri>https://github.com/mrvym</uri>
        </author>
        <category label="make" term="make"/>
        <category label="C Language" term="C Language"/>
        <category label="c++" term="c++"/>
        <category label="criterion" term="criterion"/>
    </entry>
</feed>