<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Oops I bug it again · J. Mejia Blog</title>
        <link>https://your-docusaurus-site.example.com/blog</link>
        <description>Oops I bug it again · J. Mejia Blog</description>
        <lastBuildDate>Thu, 01 May 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>© 2026 Jairo R. Mejia Aponte</copyright>
        <item>
            <title><![CDATA[Why you should use devtool on Yocto]]></title>
            <link>https://your-docusaurus-site.example.com/blog/why-you-should-use-devtool-on-yocto</link>
            <guid>https://your-docusaurus-site.example.com/blog/why-you-should-use-devtool-on-yocto</guid>
            <pubDate>Thu, 01 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Stop reinventing the wheel — devtool makes cross-compilation development easy.]]></description>
            <content:encoded><![CDATA[<p>I am a little bit amazed that I have to write this article in my blog, but I started a new project a few months ago and I was speechless of how they worked on yocto. So here I will briefly explain why <code>devtool</code> exists and all the things that you could do with it.</p>
<p>When I started in this new project, the developers on the project desired to use a container 'solution' to <em>test and develop</em> their code, because "developing new application and testing it in Yocto was really difficult". I was triggered by this statement because it was completely false. Since the beginning Yocto offers <code>recipetool</code> and nowadays <code>devtool</code> to make the development of new applications easy to have a cross-compilation application that just works in the <code>MACHINE</code> that you set.</p>
<p>I remember when I made my training on Bootlin that the trainer said "Yocto is one of those tools that allow you do anything, even the wrong thing". At that time and I just laughed, but now I understand better what they meant. For all newbies in Yocto I <strong>highly recommend</strong> reading the documentation, because it is really well written and it explains a lot of the things that you could do with Yocto without reinventing the wheel.</p>
<p>One of those things is the creation of recipes based on git repositories 'automatically' and test your code. The Yocto developers created <code>devtool</code> a python script that allows us to use the bitbake context to create, modify, upgrade and deploy a specific recipe. This tool ease the development of new application on Yocto environments and present the opportunity to deploy your custom solution on a already-running machine.</p>
<p>The <code>--help</code> of the <code>devtool</code> already give us an idea what else can be do with the tool. As you can see, there are plenty options to choose. However, I personally thing the most valuable are: <code>add</code>, <code>modify</code>, <code>build</code> and <code>deploy-target</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"><div class="token-line" style="color:#F8F8F2"><span class="token plain">devtool --help</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">NOTE: Starting bitbake server...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">usage: devtool [--basepath BASEPATH] [--bbpath BBPATH] </span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">       [-d] [-q] [--color COLOR] [-h] &lt;subcommand&gt; ...</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">OpenEmbedded development tool</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">options:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --basepath BASEPATH   Base directory of SDK / build directory</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --bbpath BBPATH       Explicitly specify the BBPATH</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  -d, --debug           Enable debug output</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  -q, --quiet           Print only errors</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  --color COLOR         Colorize output (where COLOR is auto, always, never)</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  -h, --help            show this help message and exit</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">subcommands:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  Beginning work on a recipe:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    add                   Add a new recipe</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    modify                Modify the source for an existing recipe</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    upgrade               Upgrade an existing recipe</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  Getting information:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    status                Show workspace status</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    search                Search available recipes</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    latest-version        Report the latest version of an existing recipe</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    check-upgrade-status  Report upgradability for multiple (or all) recipes</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  Working on a recipe in the workspace:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    build                 Build a recipe</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    ide-sdk               Setup the SDK and configure the IDE</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    rename                Rename a recipe file in the workspace</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    edit-recipe           Edit a recipe file</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    find-recipe           Find a recipe file</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    configure-help        Get help on configure script options</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    update-recipe         Apply changes from external source tree to recipe</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    reset                 Remove a recipe from your workspace</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    finish                Finish working on a recipe in your workspace</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">  Advanced:</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    create-workspace      Set up workspace in an alternative location</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    extract               Extract the source for an existing recipe</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    sync                  Synchronize the source tree for an existing recipe</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    export                Export workspace into a tar archive</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    menuconfig            Alter build-time configuration for a recipe</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">    import                Import exported tar archive into workspace</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">Use devtool &lt;subcommand&gt; --help to get help on a specific command</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<p>In the blog <a class="" href="https://your-docusaurus-site.example.com/docs/yocto/how-to-use-devtool-to-create-and-test-apps">How to use devtool to create and test applications on Yocto</a>, I will explain the benefits of working directly with yocto for creating custom libraries and how you can test your code on the machine by using the approach used on the Yocto community to test their images. See you there 👋🏻</p>]]></content:encoded>
            <category>cross-compilation</category>
            <category>yocto</category>
            <category>linux</category>
        </item>
        <item>
            <title><![CDATA[Five things you need to know about working with Yocto]]></title>
            <link>https://your-docusaurus-site.example.com/blog/five-things-you-need-to-know-about-working-with-yocto</link>
            <guid>https://your-docusaurus-site.example.com/blog/five-things-you-need-to-know-about-working-with-yocto</guid>
            <pubDate>Tue, 01 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Building Linux systems is still tough, but Yocto and Buildroot simplify it a lot. The problems of building a Linux embedded device from scratch and why these tools change the game.]]></description>
            <content:encoded><![CDATA[<figure class="cover_q2Bu"><img class="image_GyGI" src="https://your-docusaurus-site.example.com/assets/images/cover-82b08bf967377ff315d66264a9952d42.png" alt="Five things you need to know about working with Yocto" loading="lazy"><figcaption class="caption_SA1v"><details class="details_AFYK"><summary class="summary_RNPd"><svg class="icon_XoxU" viewBox="0 0 24 24" width="1em" height="1em" aria-hidden="true" focusable="false"><path fill="currentColor" d="M12 2.5l1.6 4.3a5 5 0 0 0 2.9 2.9l4.3 1.6-4.3 1.6a5 5 0 0 0-2.9 2.9L12 21.1l-1.6-4.3a5 5 0 0 0-2.9-2.9L3.2 12.3l4.3-1.6a5 5 0 0 0 2.9-2.9L12 2.5z"></path><path fill="currentColor" d="M18.5 2.5l.7 1.9a2.2 2.2 0 0 0 1.3 1.3l1.9.7-1.9.7a2.2 2.2 0 0 0-1.3 1.3l-.7 1.9-.7-1.9a2.2 2.2 0 0 0-1.3-1.3l-1.9-.7 1.9-.7a2.2 2.2 0 0 0 1.3-1.3l.7-1.9z"></path></svg><span>AI Generated with <!-- -->Gemini Nano Banana Pro</span></summary><p class="prompt_jraa"><button type="button" class="copyButton_LKEl" aria-label="Copy prompt" title="Copy prompt"><span class="copyButtonIcons_BOGJ" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_HSu1"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_iwpk"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button>Isometric flat-vector illustration, flat-shaded with crisp solid fills and bold clean silhouettes, modern editorial tech style. A minimalist microchip sits as an independent base platform on the ground plane; resting on top of it is a stack of flat rectangular blocks piled one on top of another like layers of a built system. Small flat fragment pieces float inward from the sides and converge to complete the single topmost block of the stack, snapping into place like assembling tiles. Blue-dominant palette derived from deep navy (#0b1120), blue (#3b82f6, #60a5fa) and pale blue (#dbeafe), with cyan (#06b6d4) as a minority accent (~10-25% of the frame) glowing on the converging fragments and chip contacts. Background is a soft deep-navy duotone gradient with generous negative space. Clear focal hierarchy centered on the block stack. Absolutely no text, no letters, no numbers, no words, no labels, no logos, no faces, no UI, no penguins. 16:9 aspect ratio.</p></details></figcaption></figure><p>When you started with Yocto for the first time. It could be overwhelm to not know what to expect. I remember when I started working with Yocto my first thought was: "This is very cool, but also extremely complex". I spent a good amount of time with my developer leader and myself until I grasp a good amount of knowledge about this tool. In this blog, I want to summarize five things that you need to know before working with Yocto.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="makefile-and-yocto">Makefile and Yocto<a href="https://your-docusaurus-site.example.com/blog/five-things-you-need-to-know-about-working-with-yocto#makefile-and-yocto" class="hash-link" aria-label="Direct link to Makefile and Yocto" title="Direct link to Makefile and Yocto" translate="no">​</a></h2>
<p>I think this help me a lot to understand what Yocto does and how:</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Core concept:</div><div class="admonitionContent_BuS1"><p>Yocto is to a custom Linux distribution what Makefile is to a C/C++ executable.</p></div></div>
<p>This for me is the golden concept to understand. With yocto you have syntax divide into different sub-topics that we are going to discuss later, but in general is a series of steps to build and create a custom Linux distribution to play on a Embedded device, exactly as Makefile is a series of task that could depend one of another that creates at the end an ELF file.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="recipes-and-bitbake">Recipes and Bitbake<a href="https://your-docusaurus-site.example.com/blog/five-things-you-need-to-know-about-working-with-yocto#recipes-and-bitbake" class="hash-link" aria-label="Direct link to Recipes and Bitbake" title="Direct link to Recipes and Bitbake" translate="no">​</a></h2>
<p>When you get the naming of Yocto, you start going into the direction of understand everything quicker. What is a recipe? is just a set of instructions to prepare a dish. A recipe in yocto is exactly that, it is a set of instructions, but instead of preparing a dish, we prepare <strong>packages</strong>. Bitbake is the tool that we used to <em>bake</em> the recipes, hence the name! 🍳</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>A recipe produces <strong>more than one package</strong>. This is a normal misconception on how Yocto works.</p></div></div>
<p>The recipe will create the main package named after the recipe name with all elements the application needs to work (configuration files, ELF file, systemd/SysV file, etc), but also creates dev or doc packages and this can be also added to the image if necessary.</p>
<p>Dev packages for example are used when this particular recipe is require as dependency for another one. Imagine in this case a shared library. For that matter, the dev packages has all the include files <code>*.h/*.hpp</code> that are only needed it on build time. The main package in this case will have the <code>*.so</code> files that will be required while running the image.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="the-layer-model">The layer model<a href="https://your-docusaurus-site.example.com/blog/five-things-you-need-to-know-about-working-with-yocto#the-layer-model" class="hash-link" aria-label="Direct link to The layer model" title="Direct link to The layer model" translate="no">​</a></h2>
<p>One of the big advantages of working with Yocto and also the root of a lot of bugs on misuse are the layer concept. This concept was designed for collaboration and customization. A layer is nothing else as a container of recipes. The layer has to has an specific format to be recognize as layer for Bitbake engine, but in general is just a set of recipes.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="why-collaboration">Why collaboration?<a href="https://your-docusaurus-site.example.com/blog/five-things-you-need-to-know-about-working-with-yocto#why-collaboration" class="hash-link" aria-label="Direct link to Why collaboration?" title="Direct link to Why collaboration?" translate="no">​</a></h3>
<p>As industry standard for custom linux distribution, there are many companies working together to create those layers. A layer could be a core element of the project like <code>openembedded-core</code>, which contains all important metadata to make a minimal build. Or specific layers like <code>meta-virtualization</code> which is recipes to support building Xen, LVM associated packages.</p>
<p>All of the above-mentioned layers and way more are open-source license and you use it as a base to create your own custom distribution. If you don't need virtualization on your Embedded device, you just don't add it. There are many well-maintained layers on the community.</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>tip</div><div class="admonitionContent_BuS1"><p>If you maintain your custom distribution with an up-to-date yocto release, you leverage the maintenance burden on the community layers. So you are no longer in charged of updating every single piece of open-source software that you used, you update the yocto release and all the releases and tools that you used are automatically updated.</p></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="why-customization">Why customization?<a href="https://your-docusaurus-site.example.com/blog/five-things-you-need-to-know-about-working-with-yocto#why-customization" class="hash-link" aria-label="Direct link to Why customization?" title="Direct link to Why customization?" translate="no">​</a></h3>
<p>One of the design decisions on the layer model is that every layer has a priority. As you may anticipate, the lower priority layers are the community-layers that you are using and on top of it, your layers. In your layer you develop your own applications or you customize something from the community recipe of an open source project.</p>
<p>As an example, when I was working on a NTP server/client for our Embedded device, I decided to go with <code>chrony</code>. However, the default package configuration of <code>chrony</code> in the community layer was not enough for me, so I create an append of the recipe and change the package configuration.</p>
<p>Because of structure of layering includes our customize layer, the append recipe is merge with the original one and I got a package that has the configuration that I desired. This is why the customization is one of the biggest gains on working with Yocto. If in the future we need to add an extra configuration package to <code>chrony</code> or even de-feature a particular configuration, we can easily do it by changing the append recipe <strong>without</strong> ever changing the original community-layer recipe that we based upon.</p>
<div class="theme-admonition theme-admonition-danger admonition_xJq3 alert alert--danger"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"></path></svg></span>danger</div><div class="admonitionContent_BuS1"><p>You should <strong>never</strong> change open-source layers, unless you are thinking of contributing to it. You must always create your own layers. Otherwise, you lose the possibility to upgrade easily.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="the-environment-of-bitbake-and-gcc">The environment of Bitbake and gcc<a href="https://your-docusaurus-site.example.com/blog/five-things-you-need-to-know-about-working-with-yocto#the-environment-of-bitbake-and-gcc" class="hash-link" aria-label="Direct link to The environment of Bitbake and gcc" title="Direct link to The environment of Bitbake and gcc" translate="no">​</a></h2>
<p>For those who were already involved on cross-compilation before, it is easier to grasp the concept of the bitbake environment. We basically cannot use th compiler of our computer (normally a x86 architecture) to create ELF files for a Embedded device that are normally RISC architectures, like ARM processors.</p>
<p>For this particular reason the reality is that Yocto creates a environment where everything is set to build an image for that specific machine with an architecture type. The sourcing of the environment is essential, it is the first thing that you need to do to have all variables require by bitbake to work properly.</p>
<p>Once you source the environment you get the <code>bitbake</code> command line and all their helpers (<code>devtool</code>, <code>oe-*</code>, etc). One of the first things that we will be building with Yocto is actually the right compiler depending on the <code>MACHINE</code> variable that you set. The community core layer already provides <em>machines</em> so that you could based upon them to create your own.</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>tip</div><div class="admonitionContent_BuS1"><p>The bitbake weak assignment variables cannot be changed from the command line as you would do with weak assignment variables on a Makefile. The only variable that allows is <code>MACHINE</code> (as far as I know), which is a very special type of variable. This is really useful so that you don't have to create different environment to build different machine type images.</p><p>For the rest of the variables you need to add it to <code>BB_ENV_PASSTHROUGH_ADDITIONS</code>. For more details look into the official documentation <a href="https://docs.yoctoproject.org/bitbake/2.18/bitbake-user-manual/bitbake-user-manual-ref-variables.html#term-BB_ENV_PASSTHROUGH_ADDITIONS" target="_blank" rel="noopener noreferrer" class="">here</a></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"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># QEMU ARM 64 bits machine</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">MACHINE</span><span class="token operator">=</span><span class="token plain">qemu-arm64 bitbake image-core</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># Real custom hardware of ARM 64 bits machine</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(189, 147, 249);font-style:italic">MACHINE</span><span class="token operator">=</span><span class="token plain">awesome-arm64 bitbake image-core</span><br></div></code></pre></div></div></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="final-tips-on-yocto">Final tips on Yocto<a href="https://your-docusaurus-site.example.com/blog/five-things-you-need-to-know-about-working-with-yocto#final-tips-on-yocto" class="hash-link" aria-label="Direct link to Final tips on Yocto" title="Direct link to Final tips on Yocto" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="start-your-recipe-image-simple">Start your recipe image simple<a href="https://your-docusaurus-site.example.com/blog/five-things-you-need-to-know-about-working-with-yocto#start-your-recipe-image-simple" class="hash-link" aria-label="Direct link to Start your recipe image simple" title="Direct link to Start your recipe image simple" translate="no">​</a></h3>
<p>The biggest advantage of creating your own custom GNU/Linux image is of course you control what goes inside and the size of it. Start as small as possible and add the things that you will actually need. Use the built-in variables to control the size of the rootfs as much as possible.</p>
<p>As any other package made with Yocto, the final image is also a recipe. You basically starts with the following file:</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"><div class="token-line" style="color:#F8F8F2"><span class="token comment" style="color:rgb(98, 114, 164)"># Build a simple, minimal root filesystem.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># This recipe is a simplified form of core-image-minimal.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">SUMMARY </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"A simple, minimal image"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">inherit core-image</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">IMAGE_INSTALL </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"packagegroup-core-boot dropbear"</span><br></div></code></pre></div></div>
<p>Once you have this starting image you start adding what you actually need inside of it. This image uses <code>dropbear</code> for SSH because it is smaller than <code>openssh</code>, but this is also available in the community-layers.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="use-qemu-machine-as-much-as-possible">Use QEMU machine as much as possible<a href="https://your-docusaurus-site.example.com/blog/five-things-you-need-to-know-about-working-with-yocto#use-qemu-machine-as-much-as-possible" class="hash-link" aria-label="Direct link to Use QEMU machine as much as possible" title="Direct link to Use QEMU machine as much as possible" translate="no">​</a></h3>
<p>Everything what you can do in software without intervening in hardware is a gain. However, as always, there are trade-offs. I spent a hard-time trying to convince the Product Owner of the new product that I was developing that having a container-software testing for a particular part of our embedded project was causing more harm than good. But, don't get me wrong, test in software as much as possible and leave the hardware testing (more expensive, more time-consuming) for future stage of your project.</p>
<p>For that particular reason, QEMU machines for ARM 32 and 64 bits are available from the beginning in Yocto. You just need to start with the image recipe that I put you above and start building your project stone by stone.</p>
<p>Using QEMU brings another big win, which is the possibility to create a CI-CD pipeline on purely software elements to verify how well or bad behaves your system. This is a complex topic and I will maybe create a tutorial in the future for it.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="my-dos-and-donts-lemmas">My Dos and Don'ts Lemmas<a href="https://your-docusaurus-site.example.com/blog/five-things-you-need-to-know-about-working-with-yocto#my-dos-and-donts-lemmas" class="hash-link" aria-label="Direct link to My Dos and Don'ts Lemmas" title="Direct link to My Dos and Don'ts Lemmas" translate="no">​</a></h3>
<p>This is the list of things that I wish to know before going on a full-time job working with Yocto as building tool. This tips aims to reduce the burden of maintaining a Yocto project and making your life easier as developer and any newcomer to the project.</p>
<table><thead><tr><th><strong>The Dos and Don'ts</strong></th><th style="text-align:center"><strong>Explanation</strong></th></tr></thead><tbody><tr><td>Use <code>DEPENDS</code>, <code>RDEPENDS</code> to have the dependency graph in your favor</td><td style="text-align:center">If you define the <em>dependencies</em> of your recipes correctly, you will have several advantages over a messy development. On one side,  the bitbake engine will build more things in parallel aka less time of building an image. On the other hand it is clear from the recipe itself what is needed it to build that specific piece of software.</td></tr><tr><td>Define in your image recipe <strong>only</strong> your  top-level applications</td><td style="text-align:center">If you have a clear dependency graph. You should only include in the <code>IMAGE_INSTALL</code> variable the top-level applications, the dependency graph will  bring the rest of the things that are necessary to build that image</td></tr><tr><td>Use <code>packagegroup</code> when possible</td><td style="text-align:center">If you see two or more top-level applications that are related to each other, but they don't have any real dependency, the best option is to use a packagegroup recipe.  It is a very simple recipe that wraps top-level application into one place. This again helps you to organize your development better. This make it also easier to share between different image recipes, when you know that certain things goes together.</td></tr><tr><td>Use the established variables (ex. <code>SUMMARY</code>, <code>DESCRIPTION</code>) and comments (<code>#</code>) on recipes to document your recipes</td><td style="text-align:center">The Yocto recipes should be the first location of your documentation. Having a basic, yet sufficient documentation to every recipe that you made is a huge gain. The newbies on a embedded project starts on the building tool. If the building tool, in our case Yocto recipes, are well documented, you don't need to go to source code to understand the overall structure of the project. The goal is that from the image recipe, I should get already a grasp of the most important components of the image and how they interact to each other</td></tr><tr><td>Use the packages of your recipe in your favor</td><td style="text-align:center">By default, a recipe produces several packages, some of those packages are there to be used by you as you prefer. Take those into your advantage, if you follow the guideline principles of the packages, you can use the whole infrastructure of Yocto to test your application for example. This is the case of the <code>ptest</code> package for example.</td></tr><tr><td>Read documentation and understand your tool</td><td style="text-align:center">Your first instinct may be to develop your own thing because it is faster, specially now with AI. But the reality is that the Yocto project is a very established and old open-source project. There are several things that has been already solved that you could leverage on. Just to give you an example the <code>ptest</code> package. If you want to test if your application is working as expected and you create a tool to verify it, you can use the ptest structure. If you follow it, you can use the testing framework of yocto to verify the correctness of your image. Don't need to reinvent the wheel, just adapt what you need to the requirements that <code>ptest</code> has and you are go to go.</td></tr><tr><td>Don't overengineer your layers</td><td style="text-align:center">When I got my training on Yocto, the person in charge said <em>"You only need one custom layer"</em>. That sticks really hard in my brain because at now, the project that I worked has +30 layers... Yes, you hear me well. There is really not need of that many, even with the amount of people who works on the project, I really think we could reduce that number a lot. You should focus on a few, but really high-quality layers that bring everything what you need.</td></tr><tr><td>Use <code>bitbake-getvar</code> to expand variables</td><td style="text-align:center">Understanding what exactly the bitbake engine is giving you a certain result is not always easy. The layer model that allows customization and collaboration, also creates some hidden concepts that could create bugs. Every time that I need to know exactly what the bitbake engine is saying, I use that tool. I knew the tool by pure luck, when I was attending the Yocto training. My colleagues were amazed of it, because the only alternative before was to print the whole bitbake environment</td></tr><tr><td>Create Architectural Decision Record (ADR)s for your Yocto structure and make everyone follow it</td><td style="text-align:center">On the same training that I already mentioned, I got these amazing phrase <em>"Yocto is like CMake, it is very easy to do the wrong thing work"</em>. Yocto has many possibilities and several ways of doing exactly the same thing. That's why is so important that everyone follows the same principles. If there are established decisions on how to react on certain common scenarios, you will have a healthy project that could escalate quickly. If not, you will spend several hours (believe me...) refactoring the mess of other people that never wanted to learn how to use the tool.</td></tr></tbody></table>
<hr>
<p>Okay this was longer that I expected to be honest, but I just wish to have such ideas before starting with Yocto. Starting on Embedded devices with Yocto as a building tool is a really cool experience and I wish this give you an idea why this tool may seem so complex at the beginning, but afterwards it will just make sense. Thank you for your time, if you want to add something, I would love to see you in the comments!</p>]]></content:encoded>
            <category>cross-compilation</category>
            <category>yocto</category>
            <category>linux</category>
        </item>
        <item>
            <title><![CDATA[Why you need to use pkgconfig for your own libraries]]></title>
            <link>https://your-docusaurus-site.example.com/blog/Why-you-need-to-use-pkgconfig-for-your-own-libs</link>
            <guid>https://your-docusaurus-site.example.com/blog/Why-you-need-to-use-pkgconfig-for-your-own-libs</guid>
            <pubDate>Thu, 27 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[A better way to manage compiler and linker flags across projects.]]></description>
            <content:encoded><![CDATA[<p>While working on various embedded projects, I often ran into the same issue with handling custom-developed libraries. Each <code>Makefile</code> or <code>CMakeLists.txt</code> manages the compiler and linker flags for these libraries individually. But what happens when you have ten applications using that library and you need to make a breaking change? You have to update the build script for all ten applications. As you can imagine, in large projects, this is a nightmare. In this blog, you will see a better way to handle this using <code>pkgconfig</code>.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>If you are looking for the <em>how</em> and not the <em>why</em>, look my tutorial on: <br>
<a class="" href="https://your-docusaurus-site.example.com/docs/linux/how-to-use-pkgconfig">How to use <code>pkgconfig</code> for your custom-libraries</a></p></div></div>
<p>Let's start with an example of a library <code>foo</code>. This library is a C++ code that wants to be used in several places. This will not only handle internal process communication throughout <code>zmq</code>, but also it used a custom-logging library <code>foo-log</code> and another common library called <code>foo-common</code>. This maybe a huge library, but it is perfect as an example. If we make a search in the ELF file, we find out what we talked about, we have some standard library dependencies (not an issue) and our custom libraries.</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"><div class="token-line" style="color:#F8F8F2"><span class="token plain">readelf -d libfoo.so | grep NEEDED</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> 0x0000000000000001 (NEEDED)      Shared library: [libzmq.so.5]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> 0x0000000000000001 (NEEDED)      Shared library: [libsystemd.so.0]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> 0x0000000000000001 (NEEDED)      Shared library: [libfoo-common.so.1]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> 0x0000000000000001 (NEEDED)      Shared library: [libfoo-log.so.1]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> 0x0000000000000001 (NEEDED)      Shared library: [libstdc++.so.6]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> 0x0000000000000001 (NEEDED)      Shared library: [libgcc_s.so.1]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> 0x0000000000000001 (NEEDED)      Shared library: [libc.so.6]</span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"> 0x0000000000000001 (NEEDED)      Shared library: [ld-linux-aarch64.so.1]</span><br></div></code></pre></div></div>
<p>Now let's image that we have several C++ applications where we would use that library. This may not happen in several software projects, but in Embedded Development, you are very likely to use not only one binary that solves all, but rather several processes that are acting as daemon in user-space. In all my projects, there has been always at least a custom-library that looks like that. For our example, if we want to call the <code>foo</code> library, our <code>CMakeLists.txt</code> could look something 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"><div class="token-line" style="color:#F8F8F2"><span class="token plain">add_executable</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">app-foo </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">${MY_SOURCES}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">target_link_libraries</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">app-foo foo foo-common foo-log</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></div></code></pre></div></div>
<p>Since our custom <code>foo</code> library uses the other two libraries, every time that we want to create an application, we need to add those extra library flags. The problem arises when we upgrade the <code>foo</code> library. Maybe, we found out that we need to secure some user input and we require some encryption algorithms. So now the library requires also <code>libcrypto.so</code>. This will immediately breaks all build scripts. Our project will no longer build and we have to do maintaining work on those build scripts. To avoid this technical debt (at least one, right?), we use a very old but reliable tool <code>pkgconfig</code>.</p>
<p>The whole idea behind <code>pkgconfig</code> is that the maintainer of the library is in charged of updating the require compiler and linker flags to avoid this situation that I mentioned before. Using <code>pkgconfig</code> in this case, we now just ask for the package of the custom-library and it is the same library that tell us, which libraries we required to build our application without problem.</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"><div class="token-line" style="color:#F8F8F2"><span class="token plain">find_package</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">PkgConfig REQUIRED</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">pkg_check_modules</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">FOO REQUIRED IMPORTED_TARGET foo</span><span class="token operator">&gt;=</span><span class="token number">1.0</span><span class="token plain">.0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)"># same lines as before</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">add_executable</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">app-foo </span><span class="token variable" style="color:rgb(189, 147, 249);font-style:italic">${MY_SOURCES}</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#F8F8F2"><span class="token plain">target_link_libraries</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">app-foo PkgConfig::FOO</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></div></code></pre></div></div>
<p>With this new approach we decrease substantially the technical debt of our build scripts. We no longer need to worry whether the shared library will add or remove compiler or linker flags because we handle everything inside of the <code>pkgconfig</code> file, which is part of the source code of the custom-library. Even if the library is install in a non-default path for a library, using the information in the <code>pkgconfig</code> file, our build script will able to give the right information to the compiler and the linker.</p>
<p>Now hat you understand why this is necessary, let's deep into the <a class="" href="https://your-docusaurus-site.example.com/docs/linux/how-to-use-pkgconfig">implementation of a <code>pkgconfig</code> for your custom-library</a>. See you there 👋🏻</p>]]></content:encoded>
            <category>cross-compilation</category>
            <category>yocto</category>
            <category>linux</category>
        </item>
        <item>
            <title><![CDATA[My developer setup and some hidden terminal gems]]></title>
            <link>https://your-docusaurus-site.example.com/blog/My-developer-setup-and-some-hidden-terminal-gems</link>
            <guid>https://your-docusaurus-site.example.com/blog/My-developer-setup-and-some-hidden-terminal-gems</guid>
            <pubDate>Thu, 20 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Open-source tools I use daily while developing embedded systems on Linux.]]></description>
            <content:encoded><![CDATA[<figure class="cover_q2Bu"><img class="image_GyGI" src="https://your-docusaurus-site.example.com/assets/images/cover-hidden-gems-f68e0598d0f8461de400542adc8502f9.png" alt="My developer setup and some hidden terminal gems" loading="lazy"><figcaption class="caption_SA1v"><details class="details_AFYK"><summary class="summary_RNPd"><svg class="icon_XoxU" viewBox="0 0 24 24" width="1em" height="1em" aria-hidden="true" focusable="false"><path fill="currentColor" d="M12 2.5l1.6 4.3a5 5 0 0 0 2.9 2.9l4.3 1.6-4.3 1.6a5 5 0 0 0-2.9 2.9L12 21.1l-1.6-4.3a5 5 0 0 0-2.9-2.9L3.2 12.3l4.3-1.6a5 5 0 0 0 2.9-2.9L12 2.5z"></path><path fill="currentColor" d="M18.5 2.5l.7 1.9a2.2 2.2 0 0 0 1.3 1.3l1.9.7-1.9.7a2.2 2.2 0 0 0-1.3 1.3l-.7 1.9-.7-1.9a2.2 2.2 0 0 0-1.3-1.3l-1.9-.7 1.9-.7a2.2 2.2 0 0 0 1.3-1.3l.7-1.9z"></path></svg><span>AI Generated with <!-- -->Gemini Nano Banana Pro</span></summary><p class="prompt_jraa"><button type="button" class="copyButton_LKEl" aria-label="Copy prompt" title="Copy prompt"><span class="copyButtonIcons_BOGJ" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_HSu1"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_iwpk"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button>Isometric flat-vector illustration, flat-shaded with crisp geometric shapes and no outlines-as-glow. A central isometric terminal window sits as the clear hero on a raised platform — a bold, blocky command-line box that dominates the frame. Four or five simplified flat tool-blocks (abstract chunky glyphs — a small gear, a stack of plates, a magnifier lens, a file card) sit around the edges and feed inward along clean isometric conduits/paths that all converge into the central terminal. Blue-dominant palette derived from deep navy (#0b1120), blue (#3b82f6, #60a5fa) and pale blue (#dbeafe) for the terminal and platform, with cyan (#06b6d4) as a minority accent (~15% of the frame) lighting the converging paths and a few glyph highlights. Soft blue-navy gradient background with gentle negative space around the platform. Clear focal hierarchy: the terminal reads first, the converging tools second. Absolutely no text, no letters, no numbers, no words, no labels. No brand logos. No faces. Simple flat icons or symbols are allowed. 16:9 aspect ratio.</p></details></figcaption></figure><p>In this blog, I will discuss some of the amazing open-source tools that I used on my daily basis while developing Embedded systems on Linux. I will mention why I find it useful and how you can install it and test it by yourself.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="faster-editors-over-fancy-ides">Faster editors over fancy IDEs<a href="https://your-docusaurus-site.example.com/blog/My-developer-setup-and-some-hidden-terminal-gems#faster-editors-over-fancy-ides" class="hash-link" aria-label="Direct link to Faster editors over fancy IDEs" title="Direct link to Faster editors over fancy IDEs" translate="no">​</a></h2>
<p>I know that this may be controversy, but I am not a fan of IDEs. I understand the value, I see some advantages but most of the time an Editor with some good capabilities works as good as a super powerful (and very expensive) IDE. For my personal projects and my work I used VS Code and NVIM. You may considered both normal editors but with the right amount of extensions/plugins, you will have the speed and performance of a text editor with some of the most important features of an IDE.</p>
<p>I considered myself as a primary developer on VS Code, but having a terminal text editor came with a lot of advantages and overall you could use it in almost everywhere. Besides, being a superset of <code>vi</code> is the best. I was in the past always a <code>nano</code> user, I find it more friendly. I think until this date, the most voted question of StackOverflow is how to exit <code>vi</code> 🤣. However, you cannot denied <code>vi</code> is <strong>everywhere</strong> and I love that, so I made the switch from Nano. I love how fast it is and how easily you could search for hundred of items without seeing any lag whatsoever.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="vscode-extensions">VSCode extensions<a href="https://your-docusaurus-site.example.com/blog/My-developer-setup-and-some-hidden-terminal-gems#vscode-extensions" class="hash-link" aria-label="Direct link to VSCode extensions" title="Direct link to VSCode extensions" translate="no">​</a></h3>
<p>The VSCode extensions depends a lot what you developed and there are an enormous amount of blogs telling you the best extensions. I always said, you should use what it works better for you. Some of the less known extensions that I used are:</p>
<ul>
<li class="">autoDocstring and Doxygen Documentation generator to create documentation with <code>sphinx</code> and <code>doxygen</code></li>
<li class="">Shellcheck to integrate the amazing terminal tool <code>shellcheck</code> for bash static analysis into VS Code</li>
<li class="">Advance-new-file to create files and directories easily anywhere in the workspace</li>
<li class="">Better Jinja and Better YAML Formatter when working with Jinja templates and YAML files</li>
</ul>
<p>The rest of my extensions are really well-known and I don't see the value to put it all here. I have C/C++, Python, PHP, Javascript and Web-development extensions to make my life easier when dealing with the different parts of my projects.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="kickstartnvim">Kickstart.nvim<a href="https://your-docusaurus-site.example.com/blog/My-developer-setup-and-some-hidden-terminal-gems#kickstartnvim" class="hash-link" aria-label="Direct link to Kickstart.nvim" title="Direct link to Kickstart.nvim" translate="no">​</a></h3>
<p>I was a happy <code>vim</code> user, I had a few plugins, a basic theme and I thought that was enough. Until I came across to a YouTube video that change everything, the first two minutes of that video are epic, I will not spoiled, you have to go to see by yourself: <a href="https://www.youtube.com/watch?v=m8C0Cq9Uv9o" target="_blank" rel="noopener noreferrer" class="">The Only Video You Need to Get Started with Neovim</a>. Since then I am up-to-date to the last version of <code>nvim</code> and loving everything new what come with the change. The Kickstart.nvim is exactly that, a starting place to create your experience with <code>nvim</code>. I personally recommend to play with it, because the developers of the configuration file really put some effort to make <code>nvim</code> amazing from the beginning and explain everything really well.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="a-theme-to-rule-them-all">A Theme to rule them all<a href="https://your-docusaurus-site.example.com/blog/My-developer-setup-and-some-hidden-terminal-gems#a-theme-to-rule-them-all" class="hash-link" aria-label="Direct link to A Theme to rule them all" title="Direct link to A Theme to rule them all" translate="no">​</a></h3>
<p>When I like something I keep using it until I find something better, I have used a lot of different themes for my NVIM and VS Code. However there was one for me that it is just perfect and that's <strong>Tokyo Night</strong>. This theme is well known when you search for themes, it is very popular and it exists in a range of different editors and IDEs and that's make it perfect for me, because there is a version for VSCode and NVIM. I came across with it and since then I never look back. I love how it looks. I forked the original extension in VSCode to make it more perfect for C++ and some changes for YANG. If you are interested, let me know 😎.</p>
<p>I don't use icons on NVIM, I like to maintain it as clean as possible, but for VSCode I have tested a lot and I just love my last finding <em>Bearded Icons</em>.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="terminal-essentials">Terminal essentials<a href="https://your-docusaurus-site.example.com/blog/My-developer-setup-and-some-hidden-terminal-gems#terminal-essentials" class="hash-link" aria-label="Direct link to Terminal essentials" title="Direct link to Terminal essentials" translate="no">​</a></h2>
<p>Most on my work is on terminal, the building process of Yocto projects is quite heavy, so I rely a lot on the building server of the company for the builds. That's why I have been searching for tools that make my life easier, I will explain briefly all of them and tell you why I used it.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="zsh"><code>zsh</code><a href="https://your-docusaurus-site.example.com/blog/My-developer-setup-and-some-hidden-terminal-gems#zsh" class="hash-link" aria-label="Direct link to zsh" title="Direct link to zsh" translate="no">​</a></h3>
<p>I have to say, I have not find any reason to use <code>bash</code> over <code>zsh</code> in your desktop, if you want to debate please leave a comment. But, there are so many advantages in <code>zsh</code> and a lot of people working to make it even better. My setup is easy: zsh with <a href="https://ohmyz.sh/" target="_blank" rel="noopener noreferrer" class="">Oh-My-Zsh</a> as based and <a href="https://github.com/romkatv/powerlevel10k" target="_blank" rel="noopener noreferrer" class="">PowerLevel10K</a>. The last one is sadly no longer actively maintained, but the customization is crazy and I love how my shell looks like. I even added it to the build server 😅</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="tmux"><code>tmux</code><a href="https://your-docusaurus-site.example.com/blog/My-developer-setup-and-some-hidden-terminal-gems#tmux" class="hash-link" aria-label="Direct link to tmux" title="Direct link to tmux" translate="no">​</a></h3>
<p>If you work on terminal and you don't use <code>tmux</code>, you need to learn it ASAP. It is a life changer for me. If you learn the basic shortcuts of tmux, you will feel like having a mouse is optional. It is crazy how my productivity has changed since I started using tmux. I used tmux a long time ago, but it was in my last job where I took my time to customize it to my needs. I used <a href="https://github.com/tmux-plugins/tpm" target="_blank" rel="noopener noreferrer" class="">tpm</a> as tmux plugin manager and also recommend <a href="https://tmuxp.git-pull.com/quickstart.html" target="_blank" rel="noopener noreferrer" class=""><code>tmuxp</code></a>. The last one is a terminal tool that allow you to create complex tmux sessions saved on a YAML file. Pressing a command that generates automatically all my windows and panes, it is just amazing. The best part is that is able to detect if the project exists by their name in the tmux server.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="terminal-gems">Terminal Gems<a href="https://your-docusaurus-site.example.com/blog/My-developer-setup-and-some-hidden-terminal-gems#terminal-gems" class="hash-link" aria-label="Direct link to Terminal Gems" title="Direct link to Terminal Gems" translate="no">​</a></h2>
<p>I came across another YouTube video looking for tools that you <em>need</em> in your setup. Most of the videos are always the same, they talked about the same tools that any developer have at least heard once. However, I saw this video <a href="https://www.youtube.com/watch?v=mmqDYw9C30I&amp;t=551s" target="_blank" rel="noopener noreferrer" class="">7 Amazing CLI Tools You Need To Try</a> from Josean, and it was really the first time that almost all tools were new to me and <strong>really</strong> useful. He explained really well the setup in his <a href="https://www.josean.com/posts/7-amazing-cli-tools" target="_blank" rel="noopener noreferrer" class="">website</a>, I will just mention why is that useful and let go check his tutorial.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="bat"><code>bat</code><a href="https://your-docusaurus-site.example.com/blog/My-developer-setup-and-some-hidden-terminal-gems#bat" class="hash-link" aria-label="Direct link to bat" title="Direct link to bat" translate="no">​</a></h3>
<p>This is an improvement over <code>cat</code>. It did not replace <code>cat</code> from my point of view, but when you want to see a file quickly but want a syntax highlight, <code>bat</code> is your friend. They even have a Tokyo Night theme 👀</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="eza"><code>eza</code><a href="https://your-docusaurus-site.example.com/blog/My-developer-setup-and-some-hidden-terminal-gems#eza" class="hash-link" aria-label="Direct link to eza" title="Direct link to eza" translate="no">​</a></h3>
<p>This is the same as <code>ls</code> but with icons and more useful colors. This is maybe the less useful <em>gem</em>, but I always like a better look 😅</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="zoxide"><code>zoxide</code><a href="https://your-docusaurus-site.example.com/blog/My-developer-setup-and-some-hidden-terminal-gems#zoxide" class="hash-link" aria-label="Direct link to zoxide" title="Direct link to zoxide" translate="no">​</a></h3>
<p>This is an improvement of <code>cd</code>. I don't like the name and I am really used to use <code>cd</code>, so I make an alias in my <code>.zshrc</code>. The idea is that it remembers the paths that you were using and <em>jump</em> into the directory.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fd"><code>fd</code><a href="https://your-docusaurus-site.example.com/blog/My-developer-setup-and-some-hidden-terminal-gems#fd" class="hash-link" aria-label="Direct link to fd" title="Direct link to fd" translate="no">​</a></h3>
<p>This is a better version of <code>find</code>. This tools allow different new features that are useful for the last and most cool of the <em>gems</em>. Something that I really like is that it can ignore the folders and files in your <code>.gitignore</code>. This is specially useful in my setup, where the whole build process of yocto is enormous and most of the time, I don't need to search there.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="delta"><code>delta</code><a href="https://your-docusaurus-site.example.com/blog/My-developer-setup-and-some-hidden-terminal-gems#delta" class="hash-link" aria-label="Direct link to delta" title="Direct link to delta" translate="no">​</a></h3>
<p>This tool is a pager used by <code>git</code> to display the <code>diff</code> in a project. Their setup is a little complicated but is well explained in the <a href="https://your-docusaurus-site.example.com/blog/My-developer-setup-and-some-hidden-terminal-gems#" class="">README</a> of the project.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="fzf"><code>fzf</code><a href="https://your-docusaurus-site.example.com/blog/My-developer-setup-and-some-hidden-terminal-gems#fzf" class="hash-link" aria-label="Direct link to fzf" title="Direct link to fzf" translate="no">​</a></h3>
<p>This is basically a fuzzy finder for your terminal. The best parts is that all the above mentioned tools works together with this one to create really cool stuff. It changes for good how you look for things. My selling point for this one was the fuzzy search on processes, I was speechless. Basically you put in you terminal <code>kill **</code> and press <kbd>Tab</kbd> and you will went in fuzzy search mode for all processes in your computer 🤩. You can use it with a lot of useful tools like <code>cd</code> and <code>find</code>. It makes your search for files and directories way more easy and <strong>fast</strong>. I was really impressed that this cool interfaces do not came with a performance cost (at least noticeable). I am never coming back to the <em>old ways</em>.</p>
<hr>
<p>That's it, I hope you find this useful and try to use this new cool terminal tools that I found it improves my way of work. See you the next time 🤟</p>]]></content:encoded>
            <category>open-source</category>
            <category>dev-setup</category>
            <category>linux</category>
        </item>
        <item>
            <title><![CDATA[Why I use Yocto over Buildroot as building tool]]></title>
            <link>https://your-docusaurus-site.example.com/blog/Why-I-use-Yocto-over-Buildroot</link>
            <guid>https://your-docusaurus-site.example.com/blog/Why-I-use-Yocto-over-Buildroot</guid>
            <pubDate>Thu, 20 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[As you may get for the title, I will just write why I think Yocto and OpenEmbedded is the right tool for building your custom Linux Embedded systems, even for personal projects.]]></description>
            <content:encoded><![CDATA[<figure class="cover_q2Bu"><img class="image_GyGI" src="https://your-docusaurus-site.example.com/assets/images/cover-yocto-as-building-tool-e63ecf7f3d1bbc8098740e77c733a084.png" alt="Why I use Yocto over Buildroot as building tool" loading="lazy"><figcaption class="caption_SA1v"><details class="details_AFYK"><summary class="summary_RNPd"><svg class="icon_XoxU" viewBox="0 0 24 24" width="1em" height="1em" aria-hidden="true" focusable="false"><path fill="currentColor" d="M12 2.5l1.6 4.3a5 5 0 0 0 2.9 2.9l4.3 1.6-4.3 1.6a5 5 0 0 0-2.9 2.9L12 21.1l-1.6-4.3a5 5 0 0 0-2.9-2.9L3.2 12.3l4.3-1.6a5 5 0 0 0 2.9-2.9L12 2.5z"></path><path fill="currentColor" d="M18.5 2.5l.7 1.9a2.2 2.2 0 0 0 1.3 1.3l1.9.7-1.9.7a2.2 2.2 0 0 0-1.3 1.3l-.7 1.9-.7-1.9a2.2 2.2 0 0 0-1.3-1.3l-1.9-.7 1.9-.7a2.2 2.2 0 0 0 1.3-1.3l.7-1.9z"></path></svg><span>AI Generated with <!-- -->Gemini Nano Banana Pro</span></summary><p class="prompt_jraa"><button type="button" class="copyButton_LKEl" aria-label="Copy prompt" title="Copy prompt"><span class="copyButtonIcons_BOGJ" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_HSu1"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_iwpk"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button>Isometric flat-vector illustration of a technical system built from stacked, slightly exploded horizontal layers — distinct blue slabs offset from one another so they read as separate, swappable pieces rather than one solid block. The shared lower layers branch upward into two differently assembled machine-like structures, making it clear the same base pieces compose more than one result. Flat shading, solid fills, crisp geometry, no outlines needed. Blue-dominant palette derived from deep navy (#0b1120), blue (#3b82f6, #60a5fa) and pale blue (#dbeafe), with cyan (#06b6d4) as a minority accent (~10–25% of the frame) highlighting the seams and connection points between layers. Soft blue-tinted background wash with gentle depth. Clear focal hierarchy centered on the branching stack. Absolutely no text, no letters, no numbers, no words, no labels, no logos, no faces, no UI. 16:9 aspect ratio.</p></details></figcaption></figure><p>Yet Another Opinion about Yocto vs Buildroot... If you ever come across to work with YANG, I hope you understand the reference. If you don't have a clue what I am talking about, don't worry, I have no clue of YANG and SNMP until a few months ago 😅. As you may get for the title, I will just write why I think Yocto and OpenEmbedded is the right tool for building your custom Linux Embedded systems, even for personal projects. Let's go into it 🤓</p>
<p>When you deep into building custom Linux systems, there is almost certain that you will get across the question: <em>Should I use Buildroot or Yocto-OE?</em>. You start digging into some forums and blogs like this one 😛 to see what other people with maybe more experience thinks of the topic. I certainly asked this same question during my training on Yocto to Luca Ceresoli, our very prepared trainer, which works as contributor to both projects.</p>
<p>He mentioned at that time something that surprise me. I commented that one of the reasons why I went to learn more in deep Yocto was because I saw a lot of job application in my field requiring to have some knowledge in the topic. I saw this as a sign that companies uses Yocto over Buildroot. I may fall into a confirmation bias, because he mentioned that on Bootlin, they advice Yocto and Buildroot projects almost equally and the reason why I may not see more mentions on Buildroot is because of his simplicity.</p>
<p>This is exactly the selling point of Buildroot. If you have ever compile a <code>C</code> code in your life, you will feel close at home with Buildroot. This tool uses a series of Makefiles to create the whole image of the product. This is really incredible because it makes a building custom linux OS more easy to grasp, it gives you the things that you may need and everything with a <code>.config</code>. Easy to understand and easy to modify.</p>
<p>Although I see a lot of value on simplify this process that could be really complicated, it does not give you a lot of room to play with. If you want to have different machines, you have to create a config for everyone of them, you cannot simply re-use things. You may not need to change the basic applications of your custom linux for all of it, so why don't we use the same? Because Buildroot creates an root filesystem as an image, you are unable to change or adapt the things, you have to modify the config, but they do not share configurations, even if you need the same thing.</p>
<p>On the other hand, yocto sells itself as a distribution building tool. It creates a sort of complex binary package system to create an image. Everything in yocto starting from the kernel is a package and the final process is to bring all those packages together and create the final root filesystem that you want. As you can see, it looks more complex and you will have a steep learning curve to understand how yocto works. But now, you are working by packages, should that means that you could interchange packages from one machine to the other if they based on the same processor? Well that's exactly the advantage.</p>
<p>Yocto works with layers and every layer has a priority. I will not going into details here, but it allows us to create an abstraction between those layers. This is perfect for projects with a lot of teams because you can divide the different parts of the project. This abstraction plays an important role because you could even abstract the whole hardware from the software part. Yocto will re-use everything what it could use to create new machines. This is exactly what I felt is really valuable of Yocto.</p>
<p>I think the complexity of Yocto pays off. They successfully creates abstractions using their layer concept, therefore vendor chips companies have been working closely with Yocto developers to create their own layer that implements their chips. Every single one of the big manufacture companies has their own layer where they create the <em>machine</em> configuration that you need to run your custom Linux OS.</p>
<p>I think at the end the support of vendors and Open Source Foundation is what it plays a big role for me to choose Yocto. When you are developing Embedded systems you have to think what is going to be available for the next 10 or 15 years. Once you sell a piece of hardware, depending on the sector, they will not upgrade for a long time, but they will ask for security updates, new software features and a long etc. So from a product perspective, you have to be prepared.</p>
<p>Another reason why I choose Yocto over Buildroot is because of their documentation. Let's be honest, we all hate to write documentation, I do not know the first developer who tells me: <em>"The part that I love from coding is to write the documentation"</em>. No, it did not happen and if it happens, you may check if coding is really what you like 🫢. Joke asides, the documentation of Yocto is amazing, I really do not have another word for that. It is the open source project with the best documentation that I have ever used and I have been a Linux and open source enthusiast for more than 10 years. They even have a section called <a href="https://docs.yoctoproject.org/what-i-wish-id-known.html" target="_blank" rel="noopener noreferrer" class="">What I wish to know before working with Yocto</a> and it really helps 🤯. They have <code>poky</code> an example distribution just that you understand how to build up your project. The documentation of Yocto has been on my bookmarks for around two years and every time that I visited the website I just find it incredible useful.</p>
<p>And that's it, you will find in this website some tutorials about my findings developing with Yocto. Things that I found useful to know and I will try to make it as understandable as possible because I know how hard it could be. So let's keep in touch, go check the tutorials section, I hope you find it interesting.</p>]]></content:encoded>
            <category>cross-compilation</category>
            <category>yocto</category>
            <category>linux</category>
        </item>
        <item>
            <title><![CDATA[Why you need to use Yocto or Buildroot in Linux embedded development ASAP]]></title>
            <link>https://your-docusaurus-site.example.com/blog/Why-you-need-to-use-yocto-or-buildroot-in-Linux-embedded-development-ASAP</link>
            <guid>https://your-docusaurus-site.example.com/blog/Why-you-need-to-use-yocto-or-buildroot-in-Linux-embedded-development-ASAP</guid>
            <pubDate>Mon, 17 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Building Linux systems is still tough, but Yocto and Buildroot simplify it a lot. In this blog, you will see the problems of building a Linux embedded device from scratch and why these tools changes the game for better.]]></description>
            <content:encoded><![CDATA[<figure class="cover_q2Bu"><img class="image_GyGI" src="https://your-docusaurus-site.example.com/assets/images/cover-121ac2c70945c1cfac85ecd842694259.png" alt="Why you need to use Yocto or Buildroot in Linux embedded development ASAP" loading="lazy"><figcaption class="caption_SA1v"><details class="details_AFYK"><summary class="summary_RNPd"><svg class="icon_XoxU" viewBox="0 0 24 24" width="1em" height="1em" aria-hidden="true" focusable="false"><path fill="currentColor" d="M12 2.5l1.6 4.3a5 5 0 0 0 2.9 2.9l4.3 1.6-4.3 1.6a5 5 0 0 0-2.9 2.9L12 21.1l-1.6-4.3a5 5 0 0 0-2.9-2.9L3.2 12.3l4.3-1.6a5 5 0 0 0 2.9-2.9L12 2.5z"></path><path fill="currentColor" d="M18.5 2.5l.7 1.9a2.2 2.2 0 0 0 1.3 1.3l1.9.7-1.9.7a2.2 2.2 0 0 0-1.3 1.3l-.7 1.9-.7-1.9a2.2 2.2 0 0 0-1.3-1.3l-1.9-.7 1.9-.7a2.2 2.2 0 0 0 1.3-1.3l.7-1.9z"></path></svg><span>AI Generated with <!-- -->Gemini Nano Banana Pro</span></summary><p class="prompt_jraa"><button type="button" class="copyButton_LKEl" aria-label="Copy prompt" title="Copy prompt"><span class="copyButtonIcons_BOGJ" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_HSu1"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_iwpk"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button>Clean flat vector illustration, modern editorial tech style: crisp solid shapes with bold silhouettes and minimal gradients. A left-to-right composition where a loose, overwhelming cluster of mismatched geometric pieces — blocks, cogs, connectors, small chip-like squares floating at chaotic angles — gradually resolves into a single clean, neatly stacked and aligned structure on the right. Blue-dominant palette derived from deep navy (#0b1120), blue (#3b82f6, #60a5fa) and pale blue (#dbeafe), freely using shades and gradients between them, with cyan (#06b6d4) as a minority accent (~10–25% of the frame) highlighting the ordered right-hand structure. Soft blue duotone-gradient background. Clear focal hierarchy with the chaotic-to-ordered flow as the single subject, legible at thumbnail size. The disorder should feel complex but not messy-ugly, and the ordered side should feel solid and manageable rather than empty. Absolutely no text, no letters, no numbers, no words, no labels. No brand logos. No faces. Simple flat icons or symbols are allowed. 16:9 aspect ratio.</p></details></figcaption></figure><p>Building Linux systems is still tough, but Yocto and Buildroot simplify it a lot. In this blog, you will see the problems of building a Linux embedded device from scratch and why these tools changes the game for better.</p>
<p>When I was looking my first embedded development lecture at the university in Colombia, I remember the overwhelming amount of things that you have to take into consideration just to compile a small hello-world <code>C</code> code in a soft-core processor for the FPGA that we had. So many information, even when it is useful, is really complicated to grasp and it scares a lot of people (a lot of my colleagues gave up on the subject). I considered myself a fast learner and there were things in that class that I understood until I have a similar lecture on my master.</p>
<p>Nowadays there are closed and open solutions to solve this kind of problems. If you want to play with a SoC FPGA kit now, Xilinx explains really well what you have to do to have a soft-core. Even the TU Dresden and some other German universities (like mine) use an open-source solution made by TU Dresden called <a href="https://spartanmc.de/?node=ec16&amp;page=license&amp;ln=en" target="_blank" rel="noopener noreferrer" class="">SpartanMC project</a> to reduce the complexity of this type of knowledge and give you a simple ready-to-use processor with the one you can play with.</p>
<p>Building a Linux system for an embedded device is also really complex. You can try (I certainly want to try) to build a Linux system for a different architecture as x86 from scratch. You not only have to think how are you going to compile everything (it is a different architecture 🤯), but you also need to think in the bootloader, the Linux kernel (networking, filesystem, task/memory management, etc), the C library that you want to use (there is more than one 🤯x2) and then finally you are in userspace. I love diagrams and this one explains really well the point.</p>
<img src="https://your-docusaurus-site.example.com/img/linux-sys-arch.svg" alt="Linux System Architecture" style="width:30rem;display:block;margin:0 auto;padding-bottom:1.5rem">
<p>Now that we are on userspace, are you sure that make it easier? Being users of a SO and almost everything (I talk to you Linux Bluetooth) works out of the box, we tend to forget how complex userspace really is. How do you know the C library version you are using is compatible with the latest version of <code>tar</code>? Do you want to work with <code>systemd</code> or are you old fashion and want <code>init.d</code> files?</p>
<p>Are you still with me? Even if you are an experienced Linux user, this is a lot of information and you could make it wrong easily. It would not be your fault, also not Linus Torvalds' or open-source community's fault. Complex problems means complex solution, even when we tried our best to avoid it.</p>
<p>That's why a lot of good developers with good intentions had created different building tools that makes this process less painful. Please do not get me wrong, it is still complex and you have to understand what is the role of almost everything, but now, you don't have to do it everything from scratch every time. You can create configuration files to define your machines and the best part, the chip vendors supports this open-source projects because it really decreases the difficulty to create new embedded devices. You don't have to worry about mismatch on versioning tools, because this building tools will throw you an early error if the versions are not compatible.</p>
<p>Sound better right? As you may understand for the title, there are two main projects working on this topic, both of them open-source projects, but they work fairly different. <a href="https://www.yoctoproject.org/" target="_blank" rel="noopener noreferrer" class="">The Yocto Project</a> which is founded directly by The Linux Foundation and <a href="https://buildroot.org/" target="_blank" rel="noopener noreferrer" class="">Buildroot</a>. You can find a lot (really a lot) discussions about why is one better over the other one. I will be giving my opinion is another blog too, but what you need to know now is that both tools solve <strong>a lot</strong> of problems:</p>
<ul>
<li class="">I want to support different devices with different hardware peripherals, but same kernel ☑️</li>
<li class="">I don't care about kernel space or hardware, I want to focus on userspace ☑️</li>
<li class="">My hardware design is really complex, I need to make a kernel almost from scratch, but then userspace is very basic ☑️</li>
<li class="">I don't want to deal with bootloader, I just want that works for my device ☑️</li>
</ul>
<p>As you see, I could give you a lot of examples why these tools solve a lot of problems. They allow you to go as customize as you want in certain area and leave the other ones as basic as possible to make you focus in what really matters for your development. You save a lot of time and money with it. I would not recommend nowadays to anyone a Linux embedded development from scratch, only for learning purposes.</p>
<p>Embedded development has come a long way. What used to be a mountain of complexity is now more like a manageable hill, thanks to both closed and open-source solutions. Sure, building a Linux system for an embedded device is still no walk in the park, but projects like Yocto and Buildroot have made it a lot more doable. These tools help streamline the process, ensure compatibility, and reduce errors, so you can focus more on creating cool stuff rather than fixing endless issues.</p>]]></content:encoded>
            <category>building-tools</category>
            <category>cross-compilation</category>
            <category>yocto</category>
            <category>buildroot</category>
        </item>
        <item>
            <title><![CDATA[Welcome to my blog]]></title>
            <link>https://your-docusaurus-site.example.com/blog/welcome-to-my-blog</link>
            <guid>https://your-docusaurus-site.example.com/blog/welcome-to-my-blog</guid>
            <pubDate>Sat, 01 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Hi! I am Jairo Mejia Aponte, I'm from Colombia and this maybe my forth tried to start a technical blog. I seem to never give enough time to my personal projects, but I am trying my best to make this one work. Let's start! 🤘🏽]]></description>
            <content:encoded><![CDATA[<p>Hi! I am Jairo Mejia Aponte, I'm from Colombia and this maybe my forth tried to start a technical blog. I seem to never give enough time to my personal projects, but I am trying my best to make this one work. Let's start! 🤘🏽</p>
<p>I am Embedded Software Engineer and am almost thirty years old 👴🏼. I did my bachelor in Electronic Engineer in the biggest public university of Colombia in Bogota, where I found a fascination for embedded development. When I was doing my internship in National Instruments Dresden, I found out that there were a sort gap of knowledge in embedded systems development.</p>
<p>From one side, people who knows a lot of hardware that knows a little how software works, and in the other side, people who knows a lot about software but no so much of hardware. This complicates at the end the deliver of good embedded products in several ways, like unrealistic business plans (my daily basis at work), not an effortless communication between the hardware and software team and so on. Having a knowledge of both worlds helps you understand several problems before they even happen.</p>
<p>I remember once a colleague telling me that he insisted the HW team leader to choose another WLAN module for the new devices. The module the HW team were testing, wouldn't fulfill the software requirements in their fullest and it will make the development a nightmare, because the module was well known in Linux community to be not very developer-friendly. They did not give my colleagues' opinion the weight it deserved, they keep developing everything for the WLAN module that SW team did not want. At the end the integration of that module was the most complicated and expensive of all modules for that hardware variant.</p>
<p>This kind of wrong decisions happen more often when non-technical people in management decided for something without hearing well (or understood) the technical teams, but as I show you in that story, it also happens when very technical people focus only in what it works for their team. That's also why I think the Product Owner (PO) must have technical background, but that's a story from another time.</p>
<p>My opinion in the knowledge gap may not be that far from a general perspective, because a similar explanation is in the <a href="https://www.tu-darmstadt.de/studieren/studieninteressierte/studienangebot_studiengaenge/studiengang_178880.en.jsp" target="_blank" rel="noopener noreferrer" class="">website</a> of my master in the Technische Univeristät Darmstadt, Germany where I defended my Master Thesis <em>Implementation of a Configurable HW Cache for Embedded Accelerators</em> on 2023. I focus my master degree on embedded and FPGA development.</p>
<p>Since then, I have been working on Embedded Development in my free time and also at work. In this small place of the Internet, you will find things that I found interesting about coding for embedded systems, personal opinions in topics regarding embedded development and also tutorials about things that were not easy to find while working (and debugging) on devices.</p>
<p>So thank you for reading me and I hope you are there for the next to come. Cheers! 🥂</p>]]></content:encoded>
            <category>know-me</category>
        </item>
    </channel>
</rss>