{"id":6622,"date":"2024-09-17T05:00:15","date_gmt":"2024-09-17T04:00:15","guid":{"rendered":"https:\/\/www.blaess.fr\/christophe\/?p=6622"},"modified":"2024-11-13T15:24:01","modified_gmt":"2024-11-13T14:24:01","slug":"les-variables-principales-de-bitbake-1-les-variables-globales","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2024\/09\/17\/les-variables-principales-de-bitbake-1-les-variables-globales\/","title":{"rendered":"Les variables principales de Bitbake &#8211; 1 &#8211; Les variables globales"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignright size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"300\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2024\/08\/bitbake-variables-01.png\" alt=\"Variables de Bitbake\" class=\"wp-image-6771\" style=\"width:300px\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2024\/08\/bitbake-variables-01.png 400w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2024\/08\/bitbake-variables-01-300x225.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/figure><\/div>\n\n\n<p>Lorsqu&rsquo;on effectue un <em>build<\/em> pour Yocto Project, l&rsquo;outil <code>bitbake<\/code> parcourt des fichiers de configuration que nous avons pu examiner dans l&rsquo;<strong><a href=\"https:\/\/www.blaess.fr\/christophe\/2024\/09\/03\/les-fichiers-parcourus-par-bitbake\/\" data-type=\"post\" data-id=\"6232\">article pr\u00e9c\u00e9dent<\/a><\/strong>. Pendant ce parcours, un nombre important de variables sont remplies.<\/p>\n\n\n\n<p>Il est facile de retrouver dans<strong><a href=\"https:\/\/docs.yoctoproject.org\/dev\/singleindex.html#variables-glossary\" data-type=\"link\" data-id=\"https:\/\/docs.yoctoproject.org\/dev\/singleindex.html#variables-glossary\" target=\"_blank\" rel=\"noreferrer noopener nofollow\"> la documentation de Yocto Project<\/a><\/strong> la signification d&rsquo;une variable, mais l&rsquo;op\u00e9ration inverse n&rsquo;est pas toujours facile&nbsp;: <mark style=\"background-color:#ffff80\" class=\"has-inline-color\">trouver quelle variable remplir pour r\u00e9pondre \u00e0 un probl\u00e8me donn\u00e9<\/mark>.<\/p>\n\n\n\n<p>C&rsquo;est la question \u00e0 laquelle j&rsquo;ai essay\u00e9 de r\u00e9pondre dans cette s\u00e9rie d&rsquo;articles, en commen\u00e7ant par <mark style=\"background-color:#ffff80\" class=\"has-inline-color\">les variables globales<\/mark>, dont le contenu est disponible durant tout le <em>build<\/em>. Le prochain article traitera des variables d\u00e9finies dans les contextes de recette.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h1 class=\"wp-block-heading\">Sommaire<\/h1>\n\n\n\n<p>J&rsquo;ai limit\u00e9 ma liste aux variables les plus courantes. J&rsquo;ai pris comme r\u00e9f\u00e9rence celles que je me souviens avoir configur\u00e9 \u00e0 plusieurs reprises durant les derniers mois.<\/p>\n\n\n\n<p>J&rsquo;ai class\u00e9 arbitrairement les variables en fonction des usages suivants&nbsp;:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong><a href=\"#performances-pendant-le-build\" data-type=\"internal\" data-id=\"#performances-pendant-le-build\">Performances pendant le build<\/a><\/strong><\/li>\n\n\n\n<li><strong><a href=\"#erreurs-et-incompatibilites-de-recettes\">Erreurs et incompatibilit\u00e9s de recettes<\/a><\/strong><\/li>\n\n\n\n<li><strong><a href=\"#specificites-du-build\">Sp\u00e9cificit\u00e9s du <em>build<\/em><\/a><\/strong><\/li>\n\n\n\n<li><strong><a href=\"#toolchain-et-sdk\">Toolchain et SDK<\/a><\/strong><\/li>\n\n\n\n<li><strong><a href=\"#support-materiel\">Support mat\u00e9riel<\/a><\/strong><\/li>\n\n\n\n<li><strong><a href=\"#image-binaire-et-partitionnement\">Image binaire et partitionnement<\/a><\/strong><\/li>\n\n\n\n<li><strong><a href=\"#distro-choix-et-fonctionnalites\">Distro, choix et fonctionnalit\u00e9s<\/a><\/strong><\/li>\n\n\n\n<li><a href=\"#image-et-fonctionnalites-d-image\"><strong>Image et fonctionnalit\u00e9s d&rsquo;image<\/strong><\/a><\/li>\n\n\n\n<li><strong><a href=\"#caracteristiques-des-layers\">Caract\u00e9ristiques des <em>layers<\/em><\/a><\/strong><\/li>\n<\/ol>\n\n\n\n<p><\/p>\n\n\n\n<p>La plupart des variables globales de Yocto peuvent \u00eatre renseign\u00e9es indiff\u00e9remment dans plusieurs fichiers. J&rsquo;ai indiqu\u00e9 entre parenth\u00e8ses les fichiers dans lesquels leurs configurations me semblaient avoir le plus de sens. Quand je mentionne \u00ab\u00a0<code>site.conf<\/code> ou <code>local.conf<\/code>\u00a0\u00bb la variable peut \u00e9ventuellement \u00eatre d\u00e9finie dans les deux fichiers, l&rsquo;un ayant pr\u00e9c\u00e9dence sur l&rsquo;autre par le jeu des op\u00e9rateurs <code>=<\/code> et <code>?=<\/code>.<\/p>\n\n\n\n<p>Petit rappel de l&rsquo;<strong><a href=\"https:\/\/www.blaess.fr\/christophe\/2024\/09\/03\/les-fichiers-parcourus-par-bitbake\/\" data-type=\"post\" data-id=\"6232\">article pr\u00e9c\u00e9dent<\/a><\/strong> concernant les fichiers <code>${BUILDDIR}\/conf\/site.conf<\/code> et <code>${BUILDDIR}\/conf\/local.conf<\/code> que nous rencontrerons dans la description de nombreuses variables&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><strong>site.conf<\/strong><\/code> n&rsquo;existe pas par d\u00e9faut, c&rsquo;est \u00e0 nous de le cr\u00e9er. Il est lu en premier et sert \u00e0 configurer des \u00e9l\u00e9ments concernant la machine sur laquelle on fait le <em>build<\/em>. Il est propre au d\u00e9veloppeur et \u00e0 son poste de travail.<\/li>\n\n\n\n<li><code><strong>local.conf<\/strong><\/code> fournit les informations principales sur le <em>build<\/em> \u00e0 r\u00e9aliser. Contrairement \u00e0 <code>site.conf<\/code>, ce fichier est habituellement partag\u00e9 entre les d\u00e9veloppeurs qui souhaitent reproduire le <em>build<\/em> sur leurs diff\u00e9rentes machines.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-text-align-center\"><br>&#8211;<br><\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"performances-pendant-le-build\">1 &#8211; Performances pendant le <em>build<\/em><\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Limitation de la consommation de ressources<\/h2>\n\n\n\n<p>Durant la production d\u2019un <em>build<\/em>, <code>bitbake<\/code> est assez gourmand en ressources. Si l\u2019ordinateur utilis\u00e9 pour cette production est utilis\u00e9 simultan\u00e9ment pour d\u2019autres t\u00e2ches (d\u00e9veloppement, visioconf\u00e9rence, navigation web, lecture de vid\u00e9os, etc.) il peut \u00eatre utile de limiter la charge CPU par exemple de <code>bitbake<\/code>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">BB_NUMBER_THREADS<\/mark><\/strong><\/code> (<code>site.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: nombre de jobs simultan\u00e9s lanc\u00e9s par <code>bitbake<\/code> pendant le <em>build<\/em>. Par d\u00e9faut <code>bitbake<\/code> lance simultan\u00e9ment autant de jobs &#8212; <code>do_fetch()<\/code>, <code>do_unpack()<\/code>, <code>do_configure()<\/code>, <code>do_compile()<\/code>, <code>do_install()<\/code>, <code>do_package()<\/code>, etc &#8212; qu&rsquo;il y a de c\u0153urs de CPU disponibles. Diminuer un peu cette valeur pour garder quelques c\u0153urs en r\u00e9serve peut \u00eatre souhaitable pour conserver une certaine fluidit\u00e9 du syst\u00e8me.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">PARALLEL_MAKE<\/mark><\/strong><\/code> (<code>site.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: lors des \u00e9tapes <code>do_compile()<\/code>, <code>bitbake<\/code> appelle la commande <code>make<\/code> avec l&rsquo;option <code>-j &lt;<em>n<\/em>&gt;<\/code> pour lui indiquer de parall\u00e9liser la compilation, <em>n<\/em> \u00e9tant \u00e9gal au nombre de c\u0153urs de CPU. Ceci signifie qu&rsquo;on risque de se retrouver avec <em>n<\/em> jobs de compilation (si on n&rsquo;a pas modifi\u00e9 <code>BB_NUMBER_THREADS<\/code>), chacun lan\u00e7ant <em>n<\/em> t\u00e2ches. Soit <em>n\u00b2<\/em> compilations simultan\u00e9es. Outre le ralentissement du syst\u00e8me, le risque est alors le manque de m\u00e9moire et l&rsquo;\u00e9chec du <em>build<\/em>. Ne pas h\u00e9siter \u00e0 limiter <code>PARALLEL_MAKE<\/code> si on a beaucoup de c\u0153urs de CPU et une quantit\u00e9 de RAM pas tr\u00e8s \u00e9lev\u00e9e.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">BB_NUMBER_PARSE_THREADS<\/mark><\/strong><\/code> (<code>site.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: avant de commencer les compilations, <code>bitbake<\/code> passe du temps \u00e0 parcourir et charger en m\u00e9moire tous les fichiers de configuration que nous avons vus dans l&rsquo;<strong><a href=\"https:\/\/www.blaess.fr\/christophe\/2024\/09\/03\/les-fichiers-parcourus-par-bitbake\/\" data-type=\"post\" data-id=\"6232\">article pr\u00e9c\u00e9dent<\/a><\/strong>, toutes les recettes, tous les fichiers <code>.bbappend<\/code>, etc. Cette \u00e9tape est \u00e9galement assez gourmande en ressources, et il peut \u00eatre int\u00e9ressant de r\u00e9duire un peu le nombre de <em>threads<\/em> actifs (donc la charge CPU et les acc\u00e8s disques simultan\u00e9s).<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>Les t\u00e2ches lanc\u00e9es par <code>bitbake<\/code> \u00e9tant en concurrence avec les autres t\u00e2ches du syst\u00e8me, on peut aussi jouer sur leurs priorit\u00e9s&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><mark style=\"background-color:#ffff80\" class=\"has-inline-color\"><code><strong>BB_TASK_NICE_LEVEL<\/strong><\/code> et <code><strong>BB_TASK_IONICE_LEVEL<\/strong><\/code><\/mark> (<code>site.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: Les valeurs de <em>nice<\/em> et d&rsquo;<em>ionice<\/em> correspondent \u00e0 des niveaux de priorit\u00e9s invers\u00e9s respectivement pour l&rsquo;acc\u00e8s au CPU et pour les acc\u00e8s au syst\u00e8me de fichier. Plus la valeur est basse, plus la priorit\u00e9 est \u00e9lev\u00e9e. Les valeurs de <em>nice<\/em> \u00e9voluent entre <code>0<\/code> (par d\u00e9faut) et <code>+19<\/code>. Pour <em>ionice<\/em> l&rsquo;intervalle est de <code>0<\/code> (d\u00e9faut) \u00e0 <code>7<\/code> ; je n&rsquo;ai toutefois jamais remarqu\u00e9 d&rsquo;effet sensible pour ce dernier param\u00e8tre.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>Lorsqu&rsquo;on souhaite limiter l&rsquo;impact du <em>build<\/em> sur le syst\u00e8me h\u00f4te, il est possible de jouer aussi sur d&rsquo;autres param\u00e8tres, de niveaux plus \u00e9lev\u00e9s&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><mark style=\"background-color:#ffff80\" class=\"has-inline-color\"><code><strong>BB_PRESSURE_MAX_CPU<\/strong><\/code>, <code><strong>BB_PRESSURE_MAX_IO<\/strong><\/code> et <code><strong>BB_PRESSURE_MAX_MEMORY<\/strong><\/code><\/mark> (<code>site.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: le noyau Linux fournit dans ses fichiers <code>\/proc\/pressure\/cpu<\/code>, <code>\/proc\/pressure\/io<\/code> et <code>\/proc\/pressure\/memory<\/code> une appr\u00e9ciation de la charge moyenne qu&rsquo;il a subi durant les 10 derni\u00e8res secondes, la derni\u00e8re minute et les 5 derni\u00e8res minutes. On peut indiquer dans ces variables, les seuils au-del\u00e0 desquels <code>bitbake<\/code> cesse temporairement de lancer de nouvelles t\u00e2ches. Les valeurs sont dans l&rsquo;intervalle 0 &#8211; 1.000.000 mais il n&rsquo;est pas simple d&rsquo;estimer leurs niveaux de charge effective. \u00c0 titre d&rsquo;exemple voici les trois valeurs pendant un build Yocto&nbsp;:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;~]$ <strong>cat  \/proc\/pressure\/cpu <\/strong>\nsome avg10=80.54 avg60=70.09 avg300=70.38 total=677633725\nfull avg10=0.00 avg60=0.00 avg300=0.00 total=0\n\n&#91;~]$ <strong>cat  \/proc\/pressure\/io <\/strong>\nsome avg10=0.00 avg60=0.00 avg300=0.28 total=31380922\nfull avg10=0.00 avg60=0.00 avg300=0.12 total=24911970\n\n&#91;~]$ <strong>cat  \/proc\/pressure\/memory <\/strong>\nsome avg10=0.00 avg60=0.00 avg300=0.00 total=251014\nfull avg10=0.00 avg60=0.00 avg300=0.00 total=215441<\/code><\/pre>\n\n\n\n<p>Pour en savoir plus, voir l&rsquo;article \u00ab\u00a0<em><a href=\"https:\/\/docs.kernel.org\/accounting\/psi.html\" target=\"_blank\" rel=\"noreferrer noopener nofollow\"><strong>Pressure Stall Information<\/strong><\/a><\/em>\u00a0\u00bb dans la documentation du <em>kernel<\/em>.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Acc\u00e9l\u00e9ration du <em>build<\/em><\/h2>\n\n\n\n<p>\u00c0 l&rsquo;inverse de la probl\u00e9matique pr\u00e9c\u00e9dente, on peut vouloir acc\u00e9l\u00e9rer autant que possible le <em>build<\/em> pour attendre moins longtemps la disponibilit\u00e9 de l&rsquo;image produite. Pour cela, un moyen tr\u00e8s efficace est de partager entre les diff\u00e9rents <em>builds<\/em> que l&rsquo;on peut r\u00e9aliser sur notre syst\u00e8me le maximum de r\u00e9sultats interm\u00e9diaires. Nous pouvons jouer facilement sur l&#8217;emplacement de deux r\u00e9pertoires&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">DL_DIR<\/mark><\/strong><\/code> (<code>site.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: cette variable contient le chemin o\u00f9 les fichiers sources des packages sont stock\u00e9s apr\u00e8s t\u00e9l\u00e9chargement &#8211; \u00e9tape <code>do_fetch()<\/code> &#8211; et avant d\u00e9compression &#8211; \u00e9tape <code>do_unpack()<\/code>. Les noms des fichiers incluant bien les num\u00e9ros de version voire les niveaux de r\u00e9vision, il est tout \u00e0 fait possible de partager ce r\u00e9pertoire entre diff\u00e9rents <em>builds<\/em> pour acc\u00e9l\u00e9rer sensiblement le t\u00e9l\u00e9chargement des packages sources.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">SSTATE_DIR<\/mark><\/strong><\/code> (<code>site.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: le r\u00e9pertoire <em>shared state cache<\/em> contient des fichiers interm\u00e9diaires de la compilation (par exemple fichiers objets ou ex\u00e9cutables pas encore install\u00e9s). Le partage est \u00e9galement possible entre diff\u00e9rents <em>builds<\/em>, ce qui permet d&rsquo;\u00e9viter de r\u00e9p\u00e9ter plusieurs fois les m\u00eames op\u00e9rations.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>\u00c0 titre d&rsquo;exemple, pour mes formations \u00ab\u00a0<strong><mark style=\"background-color:#c7efdb\" class=\"has-inline-color\"><span style=\"text-decoration: underline;\"><a href=\"https:\/\/www.logilin.fr\/formation-linux-embarque-avec-yocto-project.php\">Linux embarqu\u00e9 avec Yocto Project<\/a><\/span><\/mark><\/strong>\u00a0\u00bb et \u00ab\u00a0<strong><mark style=\"background-color:#c7efdb\" class=\"has-inline-color\"><span style=\"text-decoration: underline;\"><a href=\"https:\/\/www.logilin.fr\/formation-yocto-project-avance.php\">Yocto Project avanc\u00e9<\/a><\/span><\/mark><\/strong>\u00ab\u00a0, je r\u00e9alise un <em>build<\/em> complet la veille de la session (ce qui dure plusieurs heures), je sauvegarde les r\u00e9pertoires <code>dowloads\/<\/code> et <code>sstate-cache\/<\/code> et j&rsquo;efface toute le reste. Puis le jour de la formation je les copie sur les r\u00e9pertoires de travail des participants, ce qui fait qu&rsquo;apr\u00e8s configuration correcte (en jouant sur <code> DL_DIR<\/code> et <code>SSTATE_CACHE<\/code>) notre premier <em>build<\/em> dure 5 \u00e0 10 minutes au lieu de plusieurs heures.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Une autre solution pour acc\u00e9l\u00e9rer le <em>build<\/em> est de partager ces r\u00e9pertoires entre plusieurs machines du m\u00eame sous-r\u00e9seau.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><mark style=\"background-color:#ffff80\" class=\"has-inline-color\"><code><strong>PREMIRRORS<\/strong><\/code> et <code><strong>MIRRORS<\/strong><\/code><\/mark> (<code>site.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: contiennent des chemins de recherche suppl\u00e9mentaires pour les packages sources. Dans l&rsquo;ordre <code>bitbake<\/code> consulte&nbsp;:\n<ul class=\"wp-block-list\">\n<li>le chemin mentionn\u00e9 dans <code>DL_DIR<\/code>,<\/li>\n\n\n\n<li>les emplacements dans <code>PREMIRRORS<\/code>,<\/li>\n\n\n\n<li>les URL indiqu\u00e9es dans <code>SRC_URI<\/code>,<\/li>\n\n\n\n<li>les emplacements indiqu\u00e9s dans <code>MIRRORS<\/code>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">SSTATE_MIRRORS<\/mark><\/strong><\/code> (<code>site.conf<\/code> et <code>local.conf<\/code>) joue pour le <em>shared state cache<\/em> le m\u00eame r\u00f4le que <code>MIRRORS<\/code>. Cette mise en \u0153uvre est un petit peu plus compliqu\u00e9e car diff\u00e9rentes machines peuvent utiliser diff\u00e9rentes versions de Yocto Project, et diff\u00e9rentes versions du compilateur ou de la LibC.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">BB_NO_NETWORK<\/mark><\/strong><\/code> (<code>site.conf<\/code> et <code>local.conf<\/code>) interdit l&rsquo;usage du r\u00e9seau pour t\u00e9l\u00e9charger les sources. Cette approche est un  peu drastique, on lui pr\u00e9f\u00e8re souvent l&rsquo;option suivante&nbsp;: <\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">BB_ALLOWED_NETWORKS<\/mark><\/strong><\/code> (<code>site.conf<\/code> et <code>local.conf<\/code>) contient la liste des r\u00e9seaux autoris\u00e9s. C&rsquo;est un moyen efficace de forcer l&rsquo;utilisation d&rsquo;un miroir par exemple.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>Une derni\u00e8re approche &#8211; beaucoup plus limit\u00e9e dans ses effets &#8211; est de r\u00e9duire la quantit\u00e9 de compilations n\u00e9cessaires&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">ASSUME_PROVIDED<\/mark><\/strong><\/code> (<code>site.conf<\/code> et <code>local.conf<\/code>) contient une liste de packages qu&rsquo;il n&rsquo;est pas n\u00e9cessaire de recompiler et qu&rsquo;on peut consid\u00e9rer comme d\u00e9j\u00e0 pr\u00e9sents sur la machine h\u00f4te. Cela repr\u00e9sente surtout des outils du SDK et influe donc sur le temps de la premi\u00e8re compilation.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-text-align-center\"><br>&#8211;<br><\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"erreurs-et-incompatibilites-de-recettes\">2 &#8211; Erreurs et incompatibilit\u00e9s de recettes<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">D\u00e9clenchement des erreurs<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">BB_DANGLINGAPPENDS_WARNONLY<\/mark><\/strong><\/code> (<code>local.conf<\/code>) est une variable que je mets souvent \u00e0 \u00ab\u00a01\u00a0\u00bb durant mes <em>builds<\/em>. Elle indique que si un fichier <code>.bbappend<\/code> est trouv\u00e9 lors du <em>parsing<\/em> initial des recettes, mais qu&rsquo;il ne s&rsquo;applique sur aucun fichier <code>.bb<\/code> pr\u00e9sent, <code>bitbake<\/code> doit simplement afficher un avertissement et non d\u00e9clencher une erreur de compilation. C&rsquo;est une situation courante, du moins pendant la phase de mise au point o\u00f9 l&rsquo;on h\u00e9rite de fichiers <code>.bbappend<\/code> d&rsquo;un projet pr\u00e9c\u00e9dent, qui ne s&rsquo;appliquent pas sur les recettes des <em>layers<\/em> actuellement pr\u00e9sents.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">ALLOW_EMPTY:&lt;<em>recipe-name<\/em>&gt;<\/mark><\/strong> (local.conf<\/code> ou <code>&lt;<em>recipe-name<\/em>&gt;.bb<\/code>) en mettant cette variable \u00e0 \u00ab\u00a01\u00a0\u00bb on demande \u00e0 <code>bitbake<\/code> de cr\u00e9er un package vide m\u00eame si la recette ne produit pas de fichiers. C&rsquo;est un moyen d&rsquo;\u00e9viter des erreurs si une recette (hors de notre contr\u00f4le) a une d\u00e9pendance <em>runtime<\/em> vers <code>&lt;<em>recipe-name<\/em>&gt;<\/code>.<\/li>\n\n\n\n<li><mark style=\"background-color:#ffff80\" class=\"has-inline-color\"><code><strong>BB_DISKMON_DIRS<\/strong><\/code> et <code><strong>BB_DISKMON_WARNINTERVAL<\/strong><\/code><\/mark> (<code>site.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: cette variable contient une liste de comportements \u00e0 adopter quand la place disponible sur un disque de stockage diminue. Un comportement est une suite de trois ou quatre \u00e9l\u00e9ments s\u00e9par\u00e9s par des virgules&nbsp;: le type d&rsquo;action \u00e0 effectuer (par ordre croissant de criticit\u00e9&nbsp;: <code>WARN<\/code>, <code>STOPTASKS<\/code> ou <code>HALT<\/code>), le r\u00e9pertoire concern\u00e9 par le monitoring (notamment <code>${TMPDIR}<\/code> qui est la base de l&rsquo;arborescence des fichiers de sortie de <code>bitbake<\/code>), la place libre minimale et \u00e9ventuellement le nombre minimum d&rsquo;<em>i-nodes<\/em> disponibles suffix\u00e9s par les multiplicateurs <code>K<\/code>, <code>M<\/code> ou <code>G<\/code>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"filtrage-des-recettes\">Filtrage des recettes<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">BBMASK<\/mark><\/strong><\/code> (<code>local.conf<\/code>) d\u00e9crit une liste de recettes dont <code>bitbake<\/code> ne doit <span style=\"text-decoration: underline;\">pas<\/span> tenir compte. C&rsquo;est comme si l&rsquo;on supprimait les fichiers <code>.bb<\/code> et <code>.bbappend<\/code> correspondant (alors qu&rsquo;ils sont bien pr\u00e9sents dans un <em>layer<\/em> qu&rsquo;on a t\u00e9l\u00e9charg\u00e9).<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">BAD_RECOMMENDATIONS<\/mark><\/strong><\/code> (<code>local.conf<\/code>)&nbsp;: liste de recettes \u00e0 ne pas installer sur la cible si elles sont seulement mentionn\u00e9es dans la liste <code>RRECOMMENDS<\/code> d&rsquo;une autre recette. Si une recette est explicitement indiqu\u00e9e dans <code>IMAGE_INSTALL<\/code> ou dans une <code>RDEPENDS<\/code>, elle sera install\u00e9e normalement m\u00eame si elle est indiqu\u00e9e dans cette variable.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">SKIP_RECIPE<\/mark><\/strong><\/code> (<code>local.conf<\/code> ou <code>${DISTRO}.conf<\/code>)&nbsp;: table de recettes \u00e0 ne pas compiler accompagn\u00e9es des raisons justifiant ce choix. Le format est <code><strong>SKIP_RECIPE[&lt;recipe-name&gt;]=\"&lt;reason&gt;\"<\/strong><\/code>.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">INCOMPATIBLE_LICENSE<\/mark><\/strong><\/code> (<code>local.conf<\/code>)&nbsp;: liste de noms de licences incompatibles avec le <em>build<\/em> que nous souhaitons r\u00e9aliser. Il s&rsquo;agit souvent d&rsquo;exclure les packages sous licence GPLv3 et d\u00e9riv\u00e9es quand on pr\u00e9pare un syst\u00e8me dot\u00e9 de fonctionnalit\u00e9s de type <em>secure boot<\/em> o\u00f9 l&rsquo;utilisateur ne peut pas remplacer les packages par des versions modifi\u00e9es, m\u00eame s&rsquo;il a bien acc\u00e8s aux sources. Les licences concern\u00e9es sont g\u00e9n\u00e9ralement&nbsp;: <code>GPL-3.0*<\/code>, <code> LGPL-3.0*<\/code> et <code>AGPL-3.0*<\/code>.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">INCOMPATIBLE_LICENSE_EXCEPTIONS<\/mark><\/strong><\/code> (<code>local.conf<\/code>)&nbsp;: liste de couples <em>package:licence<\/em> \u00e0 installer m\u00eame si la licence est dans <code>INCOMPATIBLE_LICENSE<\/code>. Surtout utilis\u00e9 pendant la phase de mise au point avec des outils de d\u00e9veloppement ou de d\u00e9bogage (<code>nano:GPL-3.0-only<\/code> et <code>gdbserver:GPL-3.0-only<\/code> par exemple)<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">LICENSE_FLAGS_ACCEPTED<\/mark><\/strong><\/code> (<code>local.conf<\/code>)&nbsp;: liste de licences sp\u00e9cifiques (g\u00e9n\u00e9ralement propri\u00e9taires) qu&rsquo;il faut accepter explicitement pour pouvoir compiler les recettes du projet.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-text-align-center\"><br>&#8211;<br><\/p>\n\n\n\n<p><mark style=\"background-color:#ffff80\" class=\"has-inline-color\"><\/mark><\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"specificites-du-build\">3- Sp\u00e9cificit\u00e9s du <em>build<\/em><\/h1>\n\n\n\n<p>Les variables rentrant dans cette cat\u00e9gorie sont un peu disparates. Il s&rsquo;agit de param\u00e9trer le comportement du <em>build<\/em>. <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">BUILDNAME<\/mark><\/strong><\/code> (<code>local.conf<\/code>) le contenu de cette variable est int\u00e9gr\u00e9 dans les noms des fichiers produits en fin de compilation. Par d\u00e9faut c&rsquo;est le <em>time stamp<\/em> (horodatage) du d\u00e9but du <em>build<\/em>.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">PACKAGE_CLASSES<\/mark><\/strong><\/code> (<code>local.conf<\/code>)&nbsp;: contient <code>package_rpm<\/code>, <code>package_deb<\/code> ou <code>package_ipk<\/code> suivant le format d\u00e9sir\u00e9 pour stocker les paquets binaires avant leur installation sur l&rsquo;image finale. <\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">BBLAYERS<\/mark><\/strong><\/code> (<code>bblayers.conf<\/code>) la liste des emplacements des <em>layers<\/em> \u00e0 parcourir pour rechercher les recettes disponibles. Cette variable est stock\u00e9e normalement dans <code>conf\/bblayers.conf<\/code> (le premier fichier parcouru par <code>bitbake<\/code>). On la manipule avec la commande <code>bitbake-layers<\/code>.<\/li>\n\n\n\n<li><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">OE_TERMINAL<\/mark><\/strong> (<code>site.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: cette variable indique quel type de terminal <code>bitbake<\/code> doit invoquer lorsqu&rsquo;on effectue des op\u00e9rations comme <code>menuconfig<\/code> ou <code>devshell<\/code>. Il est parfois n\u00e9cessaire de modifier la valeur quand on est connect\u00e9 \u00e0 distance (par SSH) \u00e0 la machine de <em>build<\/em> pour indiquer <code>screen<\/code> par exemple.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">EXTERNALSRC:pn-&lt;<em>recipe-name<\/em>&gt;<\/mark><\/strong><\/code> (avec <code>INHERIT += \"externalsrc\"<\/code> dans <code>local.conf<\/code>) ou <code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">EXTERNALSRC<\/mark><\/strong><\/code> (avec <code>inherit externalsrc<\/code> dans <code>&lt;<em>recipe-name<\/em>&gt;.bb<\/code>)&nbsp;: permet de pr\u00e9ciser le chemin local des sources \u00e0 utiliser pour compiler le package sans les t\u00e9l\u00e9charger. Surtout utilis\u00e9 par l&rsquo;interm\u00e9diaire de la commande <code>devtool modify &lt;<em>package<\/em>&gt;<\/code> pour pr\u00e9parer un <em>patch<\/em> sur le package.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-text-align-center\"><br>&#8211;<br><\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"toolchain-et-sdk\">4 &#8211; Toolchain et SDK<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">SDKMACHINE<\/mark><\/strong><\/code> (<code>local.conf<\/code>)&nbsp;: cette variable contient le type de machine pour laquelle le SDK (que l&rsquo;on extrait avec l&rsquo;option <code>-c populate_sdk<\/code> de <code>bitbake<\/code>) est compil\u00e9. Par d\u00e9faut <code>SDKMACHINE<\/code> (machine sur laquelle on utilisera le SDK) est \u00e9gale \u00e0 <code>BUILD_ARCH<\/code> (machine sur laquelle on compile le SDK). La valeur la plus courante est <code>x86_64<\/code>. Si <code>SDKMACHINE<\/code> et <code>BUILD_ARCH<\/code> sont diff\u00e9rentes on parle d&rsquo;une situation de \u00ab\u00a0<em>cross canadian toolchain<\/em>\u00a0\u00bb .<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">SDK_VENDOR<\/mark><\/strong><\/code> (<code>${SDKMACHINE}.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: les outils de compilation du SDK seront nomm\u00e9s avec le sch\u00e9ma <code>${TARGET_ARCH}-<strong>${SDK_VENDOR}<\/strong>-${TARGET_OS}-&lt;toolname&gt;<\/code>, par exemple <code>arm-<strong>poky<\/strong>-linux-gnueabi-gcc<\/code>. Par d\u00e9faut la valeur est <code>poky<\/code>.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">TARGET_ARCH<\/mark><\/strong><\/code> et <code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">TUNE_ARCH<\/mark><\/strong><\/code> (<code>${MACHINE}.conf<\/code>) l&rsquo;architecture de la cible (<code>arm<\/code>, <code>x86_64<\/code>, <code>riscv<\/code>, etc.)<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">TARGET_OS<\/mark><\/strong><\/code> (<code>${SDKMACHINE}.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: contient le nom de l&rsquo;OS de la cible&nbsp;: <code>linux<\/code>, <code>linux-gnueabi<\/code>, <code>linux-musl<\/code>, <code>linux-musleabi<\/code>.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-text-align-center\"><br>&#8211;<br><\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"support-materiel\">5 &#8211; Support mat\u00e9riel<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">MACHINE<\/mark><\/strong><\/code> (<code>local.conf<\/code>)&nbsp;: cette variable contient le nom de la plateforme mat\u00e9rielle supportant le syst\u00e8me. Une fois le fichier <code>local.conf<\/code> lu, <code>bitbake<\/code> recherche un fichier <code>${MACHINE}.conf<\/code> en parcourant &#8211; par ordre de priorit\u00e9 croissante &#8211; les sous-r\u00e9pertoires <code>conf\/machine\/<\/code> des <em>layers<\/em> indiqu\u00e9s dans <code>${BBLAYERS}<\/code>.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">MACHINEOVERRIDES<\/mark><\/strong><\/code> (<code>local.conf<\/code> ou <code>${MACHINE}.conf<\/code>)&nbsp;: liste d&rsquo;<em>overrides<\/em> correspondant \u00e0 la machine s\u00e9lectionn\u00e9e. Par d\u00e9faut il s&rsquo;agit simplement du contenu de <code>${MACHINE}<\/code> toutefois il est possible de l&rsquo;\u00e9tendre pour s&rsquo;assurer qu&rsquo;un <em>override<\/em> est bien pr\u00e9sent dans la liste <code>${COMPATIBLE_MACHINE}<\/code> d&rsquo;une recette (g\u00e9n\u00e9ralement celle du <em>kernel<\/em>).<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">MACHINE_FEATURES<\/mark><\/strong><\/code> (<code>local.conf<\/code> ou <code>${MACHINE}.conf<\/code>)&nbsp;: liste des fonctionnalit\u00e9s <em>hardware<\/em> support\u00e9es par la cible. Cette liste est normalement renseign\u00e9e dans la description de la cible et amend\u00e9e (en supprimant des fonctionnalit\u00e9s) dans <code>local.conf<\/code>. La liste des fonctionnalit\u00e9s support\u00e9es par Yocto Project est d\u00e9crite ici&nbsp;: <a href=\"https:\/\/docs.yoctoproject.org\/dev\/singleindex.html#ref-features-machine\" target=\"_blank\" rel=\"noreferrer noopener nofollow\"><strong>https:\/\/docs.yoctoproject.org\/dev\/singleindex.html#ref-features-machine<\/strong><\/a>.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">PREFERRED_PROVIDER_virtual\/kernel<\/mark><\/strong><\/code>, <code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">PREFERRED_PROVIDER_virtual\/bootloader<\/mark><\/strong><\/code> , <code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">PREFERRED_PROVIDER_virtual\/egl<\/mark><\/strong><\/code>, etc. (<code>${MACHINE}.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: le choix de la recette \u00e0 utiliser pour compiler, le noyau Linux, le <em>bootloader<\/em>, la biblioth\u00e8que graphique, etc.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">PREFERRED_VERSION_<em>&lt;package<\/em>&gt;<\/mark><\/strong><\/code> (<code>${MACHINE}.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: le num\u00e9ro de version choisi pour la recette <code><em>&lt;package<\/em>&gt;<\/code> indiqu\u00e9e dans un <code>PREFERRED_PROVIDER_virtual\/<\/code> ci-dessus.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">SERIAL_CONSOLES<\/mark><\/strong><\/code> (<code>${MACHINE}.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: liste des consoles s\u00e9ries sur lesquelles d\u00e9marrer une terminal <code>getty<\/code>.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">KERNEL_MODULE_AUTOLOAD<\/mark><\/strong><\/code> (<code>${MACHINE}.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: liste de modules noyau \u00e0 charger automatiquement au <em>boot<\/em>.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>D&rsquo;autres options de configuration du support mat\u00e9riel sont pr\u00e9sentes dans les recettes du <em>kernel<\/em> et du <em>bootloader<\/em> que nous verrons dans le prochain article.<\/p>\n\n\n\n<p class=\"has-text-align-center\"><br>&#8211;<br><\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"image-binaire-et-partitionnement\">6 &#8211; Image binaire et partitionnement<\/h1>\n\n\n\n<p>Le terme \u00ab\u00a0image\u00a0\u00bb fait ici r\u00e9f\u00e9rence au fichier-image binaire obtenu \u00e0 la fin de <em>build<\/em>, et que l&rsquo;on copie sur le support de stockage de la cible.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">WKS_FILE<\/mark><\/strong><\/code> ou <code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">WKS_FILES<\/mark><\/strong><\/code> (<code>${MACHINE}.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: nom du fichier de description du partitionnement de l&rsquo;image finale. Ce fichier est recherch\u00e9 dans les sous-r\u00e9pertoires <code>wic\/<\/code> des diff\u00e9rents <em>layers<\/em>. La variable <code>WKS_FILES<\/code> contient une liste de fichiers <code>.wks<\/code>, seul le premier trouv\u00e9 en parcourant les <em>layers<\/em> par ordre croissant de priorit\u00e9 est pris en consid\u00e9ration.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">IMAGE_NAME<\/mark><\/strong><\/code> (<code>local.conf<\/code>)&nbsp;: nom du fichier d&rsquo;image binaire. Par d\u00e9faut il s&rsquo;agit d&rsquo;une s\u00e9quence \u00ab\u00a0<code>${IMAGE_BASENAME}${IMAGE_MACHINE_SUFFIX}${IMAGE_VERSION_SUFFIX}<\/code>\u00a0\u00bb mais on peut \u00eatre amen\u00e9 \u00e0 modifier ce nom, surtout lorsque l&rsquo;image est ensuite copi\u00e9e automatiquement (via des scripts) sur la cible de test.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">IMAGE_FSTYPES<\/mark><\/strong><\/code> (<code>${MACHINE}.conf<\/code> ou <code>local.conf<\/code>) contient la liste des formats de fichiers de sortie attendus (g\u00e9n\u00e9ralement <code>tar.xz<\/code> et  <code>wic<\/code>). La liste compl\u00e8te des formats disponibles se trouve ici&nbsp;: <strong><a href=\"https:\/\/docs.yoctoproject.org\/dev\/singleindex.html#term-IMAGE_TYPES\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">https:\/\/docs.yoctoproject.org\/dev\/singleindex.html#term-IMAGE_TYPES<\/a><\/strong>.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">IMAGE_BOOT_FILES<\/mark><\/strong><\/code> (<code>${MACHINE}.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: liste des fichiers \u00e0 installer sur la partition de <em>boot<\/em>. Les fichiers sont recherch\u00e9s dans le r\u00e9pertoire <code>${DEPLOY_DIR_IMAGE}<\/code>. En g\u00e9n\u00e9ral ce sont les fichiers du <em>bootloader<\/em> et \u00e9ventuellement le <em>kernel<\/em> et le <em>device tree<\/em>.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">IMAGE_ROOTFS_EXTRA_SPACE<\/mark><\/strong><\/code> (<code>${MACHINE}.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: espace m\u00e9moire suppl\u00e9mentaire \u00e0 ajouter dans l&rsquo;image binaire une fois copi\u00e9 le <em>rootfs<\/em>. L&rsquo;unit\u00e9 utilis\u00e9 est le kilo-octet.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-text-align-center\"><br>&#8211;<br><\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"distro-choix-et-fonctionnalites\">7 &#8211; Distro, choix et fonctionnalit\u00e9s<\/h1>\n\n\n\n<p>Une <strong>distro<\/strong> est un ensemble de param\u00e8tres de configuration qui s\u00e9lectionnent des packages et les configurent pour r\u00e9pondre \u00e0 certains besoins.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">DISTRO<\/mark><\/strong><\/code> (<code>local.conf<\/code>)&nbsp;: contient le nom de la distro utilis\u00e9 pour le <em>build<\/em>. Ce nom doit correspondre \u00e0 un fichier <code>${DISTRO}.conf<\/code> se trouvant dans un sous-r\u00e9pertoire <code>conf\/distro\/<\/code> d&rsquo;un <em>layer<\/em>. Par d\u00e9faut <code>DISTRO<\/code> vaut \u00ab\u00a0<code>poky<\/code>\u00a0\u00bb et le fichier de description est <code>poky\/meta-poky\/conf\/distro\/poky.conf<\/code>.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">DISTRO<\/mark><\/strong><\/code> (<code>${DISTRO}.conf<\/code>)&nbsp;: dans le fichier de configuration, la variable <code>DISTRO<\/code> contient le nom cours de la distribution, par exemple \u00ab\u00a0<code>poky<\/code>\u00ab\u00a0<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">DISTRO_NAME<\/mark><\/strong><\/code> (<code>${DISTRO}.conf<\/code>)&nbsp;: nom complet de la distribution, par exemple \u00ab\u00a0<code>Poky (Yocto Project Reference Distro)<\/code>\u00a0\u00bb <\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">DISTRO_VERSION<\/mark><\/strong><\/code> (<code>${DISTRO}.conf<\/code>)&nbsp;: num\u00e9ro de version de la distribution.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">DISTRO_FEATURES<\/mark><\/strong><\/code> (<code>${DISTRO}.conf<\/code> ou <code>local.conf<\/code>  )&nbsp;: liste de fonctionnalit\u00e9s de haut-niveau propos\u00e9es par la distribution. Une recette peut adopter certains comportement en fonction de la pr\u00e9sence ou de l&rsquo;absence d&rsquo;une fonctionnalit\u00e9 dans cette liste.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">INIT_MANAGER<\/mark><\/strong><\/code> (<code>${DISTRO}.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: choix du m\u00e9canisme d&rsquo;initialisation apr\u00e8s le <em>boot<\/em> du <em>kernel<\/em>. Par d\u00e9faut <code>sysvinit<\/code>, peut \u00eatre remplac\u00e9 par <code>systemd<\/code> ou <code>mdev-busybox<\/code>, <\/li>\n\n\n\n<li><mark style=\"background-color:#ffff80\" class=\"has-inline-color\"><code><strong>REQUIRED_DISTRO_FEATURES<\/strong><\/code>, <code><strong>ANY_OF_DISTRO_FEATURES<\/strong><\/code>, <code><strong>CONFLICT_DISTRO_FEATURES<\/strong><\/code><\/mark> : ces variables sont utilis\u00e9es dans le contexte d&rsquo;une recette. Nous les verrons dans le prochain article.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">DISTROOVERRIDES<\/mark><\/strong><\/code> (<code>${DISTRO}.conf<\/code>)&nbsp;: liste (dont le s\u00e9parateur est le deux-points \u00ab\u00a0<code>:<\/code>\u00a0\u00bb ) des <em>overrides<\/em> d\u00e9finis par la distribution. Le contenu de cette variable est ajout\u00e9 \u00e0 la variable globale <code>OVERRIDES<\/code>. En fin de <em>parsing<\/em> des recettes, une variable \u00ab\u00a0<code>foo<\/code>\u00a0\u00bb sera remplac\u00e9e par le contenu de la variable \u00ab\u00a0<code>foo:bar<\/code>\u00a0\u00bb si la cha\u00eene \u00ab\u00a0<code>bar<\/code>\u00a0\u00bb est dans la liste des <code>OVERRIDES<\/code>.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">TCLIBC<\/mark><\/strong><\/code> (<code>${DISTRO}.conf<\/code> ou <code>local.conf<\/code>)&nbsp;: choix de la biblioth\u00e8que C (utilis\u00e9e par tous les processus de l&rsquo;espace utilisateur pour invoquer des appels-syst\u00e8me), par d\u00e9faut c&rsquo;est <code>glibc<\/code>, mais on peut pr\u00e9f\u00e9rer <code>musl<\/code>, <code>newlib<\/code> ou  <code>baremetal<\/code>.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-text-align-center\"><br>&#8211;<br><\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"image-et-fonctionnalites-d-image\">8 &#8211; Image et fonctionnalit\u00e9s d\u2019image<\/h1>\n\n\n\n<p>La notion d&rsquo;<strong>image<\/strong> correspond ici \u00e0 la s\u00e9lection des packages et au param\u00e9trage que l&rsquo;on retrouvera dans l&rsquo;arborescence du <em>root filesystem<\/em>, et donc dans le fichier d&rsquo;image binaire tel que nous l&rsquo;avons vu au <a href=\"#image-binaire-et-partitionnement\" data-type=\"internal\" data-id=\"#image-binaire-et-partitionnement\">paragraphe 6<\/a>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">IMAGE_BASENAME<\/mark><\/strong><\/code> : d\u00e9finie automatiquement \u00e0 partir du nom de la recette d&rsquo;image qui doit se trouver dans un sous-r\u00e9pertoire <code>recipes-*\/images\/<\/code> d&rsquo;un <em>layer<\/em>.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">IMAGE_INSTALL<\/mark><\/strong><\/code> (<code>${IMAGE_BASENAME}.bb<\/code>, <code>local.conf<\/code>)&nbsp;: liste des packages et des groupes de packages \u00e0 installer sur la cible. Cette variable doit \u00eatre configur\u00e9e en utilisant \u00ab\u00a0<code>:append<\/code>\u00a0\u00bb et non pas <code>\"+=<\/code>\u00a0\u00bb pour des raisons de d\u00e9finition de contenu par d\u00e9faut.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">IMAGE_FEATURES<\/mark><\/strong><\/code> (<code>${IMAGE_BASENAME}.bb<\/code>)&nbsp;:  fonctionnalit\u00e9s de haut-niveau permettant d&rsquo;installer et configurer de multiples packages. On trouve une liste des fonctionnalit\u00e9s disponibles ici&nbsp;: <a href=\"https:\/\/docs.yoctoproject.org\/dev\/singleindex.html#ref-features-image\"><strong>https:\/\/docs.yoctoproject.org\/dev\/singleindex.html#ref-features-image<\/strong><\/a>.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">EXTRA_IMAGE_FEATURES<\/mark><\/strong><\/code> (<code>local.conf<\/code>)&nbsp;: liste de fonctionnalit\u00e9s compl\u00e9mentaires \u00e0 ajouter \u00e0 <code>IMAGE_FEATURES<\/code>.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">EXTRA_USERS_PARAMS<\/mark><\/strong><\/code> (dans <code>${IMAGE_BASENAME}.bb<\/code> avec la clause <code>inherit extrausers<\/code>, ou dans <code>local.conf<\/code> avec la ligne <code>INHERIT += \"extrausers\"<\/code>)&nbsp;: liste (dont le s\u00e9parateur est le point-virgule) de commandes pour ajouter (<code>useraddd<\/code>, <code>groupadd<\/code>), supprimer (<code>userdel<\/code>, <code>groupdel<\/code>), ou modifier (<code>usermod<\/code>, <code>groupmod<\/code>) des utilisateurs ou des groupes d&rsquo;utilisateurs.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-text-align-center\"><br>&#8211;<br><\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"caracteristiques-des-layers\">9 &#8211; Caract\u00e9ristiques des <em>layers<\/em><\/h1>\n\n\n\n<p>Les variables mentionn\u00e9es ici sont renseign\u00e9es dans les fichiers <code>conf\/layer.conf<\/code> de chaque <em>layer<\/em>. Les <em>layers<\/em> sont list\u00e9s dans la variable <code>BBLAYERS<\/code> de <code>conf\/bblayers.conf<\/code>.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">BBFILES<\/mark><\/strong><\/code> (<code>layer.conf<\/code>)&nbsp;: liste de motifs du shell listant tous les fichiers de recette (<code>*.bb)<\/code> et d&rsquo;extension (<code>*.bbappend<\/code>) \u00e0 charger. Chaque fichier <code>layer.conf<\/code> parcouru \u00e9tend cette liste globale.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">BBPATH<\/mark><\/strong><\/code> (<code>layer.conf<\/code>)&nbsp;: emplacements des diff\u00e9rents <em>layers<\/em> list\u00e9s sous forme de <em>path<\/em> (le s\u00e9parateur est un deux-points) alors que <code>BBLAYERS<\/code> contient une liste dont le s\u00e9parateur est une espace.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">BBFILE_COLLECTIONS<\/mark><\/strong><\/code> (<code>layer.conf<\/code>)&nbsp;: liste des <em>layers<\/em> repr\u00e9sent\u00e9s par des identifiants uniques. L&rsquo;identifiant d&rsquo;un <em>layer<\/em> est fourni dans <code>layer.conf<\/code>, c&rsquo;est souvent le nom qui suit le pr\u00e9fixe <code>meta-<\/code> du r\u00e9pertoire l&rsquo;abritant.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">BBFILE_PRIORITY_<em>layer-id<\/em><\/mark><\/strong><\/code> (<code>layer.conf<\/code>)&nbsp;: la priorit\u00e9 du <em>layer<\/em> dont l&rsquo;identifiant est <code>layer-id<\/code>. Les <em>layers<\/em> sont parcourus par ordre de priorit\u00e9 croissante. Il est conseill\u00e9 d&rsquo;utiliser une priorit\u00e9 inf\u00e9rieure \u00e0 99, car c&rsquo;est celle utilis\u00e9 pour le layer <code>workspace<\/code> de <code>devtool<\/code>, employ\u00e9 pendant la mise au point du syst\u00e8me.<\/li>\n\n\n\n<li><code><strong><mark style=\"background-color:#ffff80\" class=\"has-inline-color\">LAYERSERIES_COMPAT_<em>layer-id<\/em><\/mark><\/strong><\/code> (<code>layer.conf<\/code>)&nbsp;: liste des versions (<em>code name<\/em>) de Poky avec laquelle le layer est compatible.<\/li>\n<\/ul>\n\n\n\n<p class=\"has-text-align-center\"><br>&#8211;<br><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Conclusion<\/h1>\n\n\n\n<p>Nous avons vu ici une petite partie des variables globales utilis\u00e9es par <code>bitbake<\/code>. Ce sont celles qu&rsquo;on utilise le plus couramment. <br>Dans le prochain article, nous examinerons les variables sp\u00e9cifiques aux contextes des recettes.<\/p>\n\n\n\n<p class=\"has-text-align-center\">&#8211;<\/p>\n\n\n\n<p>Pour en savoir plus et mettre en pratique, n&rsquo;h\u00e9sitez \u00e0 participer \u00e0 une session de formation \u00ab\u00a0<strong><a href=\"https:\/\/www.logilin.fr\/formation-linux-embarque-avec-yocto-project.php\">Linux embarqu\u00e9 avec Yocto Project<\/a><\/strong>\u00a0\u00bb ou \u00ab\u00a0<strong><a href=\"https:\/\/www.logilin.fr\/formation-yocto-project-avance.php\">Yocto Project avanc\u00e9<\/a><\/strong>\u00a0\u00bb que j&rsquo;anime chez Logilin.<br><\/p>\n\n\n\n<p class=\"has-text-align-center\">&#8211;<\/p>\n\n\n\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Lorsqu&rsquo;on effectue un build pour Yocto Project, l&rsquo;outil bitbake parcourt des fichiers de configuration que nous avons pu examiner dans l&rsquo;article pr&eacute;c&eacute;dent. Pendant ce parcours, un nombre important de variables sont remplies. Il est facile de retrouver dans la documentation de Yocto Project la signification d&rsquo;une variable, mais l&rsquo;op&eacute;ration inverse n&rsquo;est pas toujours facile&nbsp;: trouver [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,8,21],"tags":[],"class_list":["post-6622","post","type-post","status-publish","format-standard","hentry","category-embarque","category-linux-2","category-yocto-project"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/6622","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/comments?post=6622"}],"version-history":[{"count":84,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/6622\/revisions"}],"predecessor-version":[{"id":6977,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/6622\/revisions\/6977"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=6622"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=6622"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=6622"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}