{"id":5961,"date":"2022-01-27T09:00:00","date_gmt":"2022-01-27T08:00:00","guid":{"rendered":"https:\/\/www.blaess.fr\/christophe\/?p=5961"},"modified":"2022-01-24T17:54:12","modified_gmt":"2022-01-24T16:54:12","slug":"yocto-cooker-3-3","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2022\/01\/27\/yocto-cooker-3-3\/","title":{"rendered":"Yocto Cooker (3\/3)"},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"alignright size-full\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2022\/01\/cooker-logo-small-size.png\"><img loading=\"lazy\" decoding=\"async\" width=\"128\" height=\"160\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2022\/01\/cooker-logo-small-size.png\" alt=\"\" class=\"wp-image-5898\"\/><\/a><\/figure><\/div>\n\n\n\n<p>Dans les <a href=\"https:\/\/www.blaess.fr\/christophe\/2022\/01\/13\/yocto-cooker-1-3\/\" data-type=\"post\" data-id=\"5897\">deux premiers articles<\/a> de cette s\u00e9rie, nous avons vu comment \u00e9crire un menu assez complet pour <strong><a href=\"https:\/\/github.com\/cpb-\/yocto-cooker\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"URL\" data-id=\"https:\/\/github.com\/cpb-\/yocto-cooker\">Yocto Cooker<\/a><\/strong> afin de produire des images pour diverses plateformes.<\/p>\n\n\n\n<p>Pour le moment nous n&rsquo;avons principalement utilis\u00e9 que l&rsquo;action <code>cooker cook<\/code>. Il est temps de voir les autres possibilit\u00e9s offertes par Yocto Cooker.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Sur la ligne de commande de <code>cooker<\/code> on peut fournir&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>une action qui indique le travail \u00e0 r\u00e9aliser (par exemple <code>cook<\/code> ou <code>clean<\/code>),<\/li><li>une ou plusieurs options qui pr\u00e9ciseront la mani\u00e8re de travailler (par exemple <code>-k<\/code>),<\/li><li>un ou plusieurs arguments suppl\u00e9mentaires, comme un nom de fichier-menu, ou une liste de <em>builds<\/em>.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Aide, version et d\u00e9bogage<\/h2>\n\n\n\n<p>Tout d&rsquo;abord il est possible d&rsquo;appeler <code>cooker<\/code> avec l&rsquo;option <code>-h<\/code> (ou <code>--help<\/code>) afin d&rsquo;avoir une liste des actions possibles.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>cooker -h<\/strong>\nusage: cooker &#91;-h] &#91;--debug] &#91;--version] &#91;-v] &#91;-n] {cook,init,update,generate,show,build,shell,clean} ...\n\npositional arguments:\n  {cook,init,update,generate,show,build,shell,clean}\n                        subcommands of Cooker\n    cook                prepare the directories and cook the menu\n    init                initialize the project-dir\n    update              update source layers\n    generate            generate build-configuration\n    show                show builds and targets information\n    build               build one or more configurations\n    shell               run an interactive shell ($SHELL) for the given build\n    clean               clean a previously build recipe\n\noptional arguments:\n  -h, --help            show this help message and exit\n  --debug               activate debug printing\n  --version             cooker version\n  -v, --verbose         activate verbose printing (of called subcommands)\n  -n, --dry-run         print what would have been done (without doing anything)<\/code><\/pre>\n\n\n\n<p>De m\u00eame si on choisit l&rsquo;action <code>cooker cook<\/code> par exemple, il est possible de lui adjoindre l&rsquo;option <code>-h<\/code> pour voir ses options sp\u00e9cifiques.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>cooker cook -h<\/strong>\nusage: cooker cook &#91;-h] &#91;-d] &#91;-k] &#91;-s] menu &#91;builds &#91;builds ...]]\n\npositional arguments:\n  menu             filename of the JSON menu\n  builds           build-configuration to build\n\noptional arguments:\n  -h, --help       show this help message and exit\n  -d, --download   download all sources needed for offline-build\n  -k, --keepgoing  Continue as much as possible after an error\n  -s, --sdk        build also the SDK<\/code><\/pre>\n\n\n\n<p>Il est \u00e9galement possible d&rsquo;utiliser l&rsquo;option <code>--version<\/code> de <code>cooker<\/code> pour consulter la version install\u00e9e&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>cooker  --version<\/strong>\n# 1.1.0<\/code><\/pre>\n\n\n\n<p>L&rsquo;option <code>-v<\/code> (ou <code>--verbose<\/code>) permettra d&rsquo;afficher des traces des actions de <code>cooker<\/code>. Enfin, l&rsquo;option <code>--debug<\/code> est encore plus volubile et d\u00e9taille toutes les activit\u00e9s de <code>cooker<\/code> y compris les succ\u00e8s et \u00e9checs de recherche de fichiers ou de param\u00e8tres.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Compilation d&rsquo;images<\/h2>\n\n\n\n<p>Le travail principal de <code>cooker<\/code> est de pr\u00e9parer l&rsquo;environnement n\u00e9cessaire (r\u00e9pertoires et fichiers), puis de r\u00e9aliser le menu qu&rsquo;on lui donne en utilisant les recettes des <em>layers<\/em> indiqu\u00e9s et en sous-traitant la compilation au cuisinier <code>bitbake<\/code>.<\/p>\n\n\n\n<p>Pour cela le plus simple est de lancer l&rsquo;action <code>cooker cook<\/code> ainsi&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>cooker  cook  menu-001.json<\/strong>\n&#91;...]\n\n$<\/code><\/pre>\n\n\n\n<p>comme nous l&rsquo;avons fait d\u00e8s le premier article.<\/p>\n\n\n\n<p>Il est possible de faire suivre le nom de menu d&rsquo;un ou plusieurs noms de <em>builds<\/em> pour limiter la compilation \u00e0 r\u00e9aliser.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ cooker cook menu-003.json  rpi4\n&#91;...]\n\n$<\/code><\/pre>\n\n\n\n<p>L&rsquo;action <code>cooker cook<\/code> accepte trois options pour ajuster son comportement&nbsp;:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Option \u00ab\u00a0<em>keepgoing<\/em>\u00ab\u00a0<\/h3>\n\n\n\n<p>L&rsquo;option <code>-k<\/code> (ou <code>--keepgoing<\/code>) de <code>cooker cook<\/code> demande \u00e0 <code>bitbake<\/code> de ne pas s&rsquo;arr\u00eater imm\u00e9diatement s&rsquo;il rencontre une erreur, mais de continuer le plus longtemps possible \u00e0 compiler des packages. Ceci est particuli\u00e8rement utile lorsqu&rsquo;on lance un <em>build<\/em> long pour la premi\u00e8re fois, et qu&rsquo;on laisse le syst\u00e8me compiler sans surveillance pendant plusieurs heures.<\/p>\n\n\n\n<p>Si pour une raison quelconque une compilation \u00e9choue, il est int\u00e9ressant de laisser <code>bitbake<\/code> continuer le plus longtemps possible sur les autres packages afin qu&rsquo;\u00e0 notre retour, il n&rsquo;y ait plus qu&rsquo;\u00e0 r\u00e9gler le probl\u00e8me rencontr\u00e9 et que le reste du syst\u00e8me soit d\u00e9j\u00e0 quasiment termin\u00e9.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Option \u00ab\u00a0<em>download<\/em>\u00ab\u00a0<\/h3>\n\n\n\n<p>L&rsquo;option <code>-d<\/code> (ou <code>--download<\/code>) de l&rsquo;action <code>cooker cook<\/code> demande \u00e0 bitbake de t\u00e9l\u00e9charger tous les packages sources n\u00e9cessaires puis de s&rsquo;arr\u00eater. Ainsi nous pourrons lancer les compilations ult\u00e9rieurement m\u00eame si notre machine de production n&rsquo;est plus reli\u00e9e \u00e0 Internet.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Option \u00ab\u00a0<em>sdk<\/em>\u00ab\u00a0<\/h3>\n\n\n\n<p>Si on ajoute l&rsquo;option <code>-s<\/code> (ou <code>--sdk<\/code>) sur la ligne de commande de <code>cooker cook<\/code>, Yocto Cooker demandera \u00e0 <code>bitbake<\/code> (apr\u00e8s avoir g\u00e9n\u00e9r\u00e9 l&rsquo;image standard) de compiler le <em>Software Development Kit<\/em> (SDK) c&rsquo;est \u00e0 dire un script shell auto-extractible comprenant la cha\u00eene de cross-compilation et l&rsquo;ensemble des <em>headers<\/em> des biblioth\u00e8ques install\u00e9es dans l&rsquo;image.<\/p>\n\n\n\n<p>Ceci permettra d&rsquo;installer (\u00e9ventuellement sur une machine diff\u00e9rente de celle de compilation) l&rsquo;environnement n\u00e9cessaire pour d\u00e9velopper le code m\u00e9tier applicatif.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sous-actions de <code>cooker cook<\/code><\/h2>\n\n\n\n<p>En r\u00e9alit\u00e9, l&rsquo;action <code>cooker cook<\/code> que nous avons utilis\u00e9e pour faire les compilations est une action-chapeau qui lance successivement quatre autres actions. Il est tout \u00e0 fait possible de lancer ces derni\u00e8res manuellement ou de ne relancer que celles n\u00e9cessaires pour un <em>rebuild<\/em>.<\/p>\n\n\n\n<p>Ces quatre actions lanc\u00e9es par <code>cooker cook<\/code> sont <code>cooker init<\/code>, <code>cooker update<\/code>, <code>cooker generate<\/code>, et <code>cooker build<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>cooker init<\/code><\/h3>\n\n\n\n<p>La commande <code>cooker init menu-001.json<\/code> initialise un fichier de configuration nomm\u00e9 <code>.cookerconfig<\/code> dans le r\u00e9pertoire courant.<\/p>\n\n\n\n<p>Ce fichier contient le nom du fichier-menu et les noms des sous-r\u00e9pertoires \u00e0 utiliser par la suite.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>cooker  init  menu-001.json<\/strong>\n\n$  <strong>cat .cookerconfig<\/strong>\n{\n    \"menu\": \"\/home\/cpb\/Lab\/cooker-article\/menu-001.json\",\n    \"layer-dir\": \"layers\",\n    \"build-dir\": \"builds\",\n    \"dl-dir\": \"downloads\"\n}<\/code><\/pre>\n\n\n\n<p>On peut lui passer des options pour modifier certains de ces dossiers&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>l&rsquo;option <code>-l<\/code> ou <code>--layer-dir<\/code> permet de pr\u00e9ciser le r\u00e9pertoire \u00e0 utiliser pour stocker les <em>layers<\/em>,<\/li><li>l&rsquo;option <code>-d<\/code> ou <code>--dl-dir<\/code> indique le r\u00e9pertoire de sauvegarde des fichiers sources t\u00e9l\u00e9charg\u00e9s,<\/li><li>l&rsquo;option <code>-b<\/code> ou <code>--build-dir<\/code> pr\u00e9cise le r\u00e9pertoire o\u00f9 cr\u00e9er les <em>builds<\/em> \u00e0 venir.<\/li><\/ul>\n\n\n\n<p>Si le fichier <code>.cookerconfig<\/code> existe d\u00e9j\u00e0, <code>cooker init<\/code> n&rsquo;a pas d&rsquo;effet sauf si on lui adjoint l&rsquo;option <code>-f<\/code> (ou <code>--force<\/code>).<\/p>\n\n\n\n<p>Il est g\u00e9n\u00e9ralement inutile de lancer manuellement <code>cooker init<\/code>, il est plus simple d&rsquo;utiliser <code>cooker cook<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>cooker update<\/code><\/h3>\n\n\n\n<p>La deuxi\u00e8me sous-action de <code>cooker cook<\/code> est <code>cooker update<\/code>, qui va t\u00e9l\u00e9charger les <em>layers<\/em> n\u00e9cessaires.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>cooker  update<\/strong>\n# Update layers in project directory\n# Downloading source from  git:\/\/git.yoctoproject.org\/poky\n# Updating source \/home\/cpb\/Lab\/cooker-article\/layers\/poky... \n\n$ <strong>ls<\/strong>\nlayers\/  menu-001.json\n\n$ <strong>ls layers\/<\/strong>\npoky\/<\/code><\/pre>\n\n\n\n<p>Le lancement manuel de <code>cooker update<\/code> peut se justfifier lorsqu&rsquo;on veut v\u00e9rifier si des layers personnels sont bien t\u00e9l\u00e9charg\u00e9s et install\u00e9s avant de lancer un <em>build<\/em> par exemple.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>cooker generate<\/code><\/h3>\n\n\n\n<p>La troisi\u00e8me sous-action de <code>cooker cook<\/code> est <code>cooker generate<\/code>. Elle pr\u00e9pare les r\u00e9pertoires de <em>build<\/em> du menu indiqu\u00e9 dans <code>.cookerconfig<\/code> avec les fichiers <code>local.conf<\/code> et <code>bblayers.conf<\/code> correspondant aux informations provenant du menu.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>cooker  generate<\/strong>\n# Generating dirs for all build-configurations\n\n$ <strong>ls<\/strong>\nbuilds  layers  menu-001.json\n\n$ <strong>ls  builds\/<\/strong>\nbuild-qemuarm\n\n$ <strong>ls  builds\/build-qemuarm\/<\/strong>\nconf\n\n$ <strong>ls  builds\/build-qemuarm\/conf\/<\/strong>\nbblayers.conf  local.conf  templateconf.cfg<\/code><\/pre>\n\n\n\n<p>Lancer manuellement <code>cooker generate<\/code> n&rsquo;a que peu d&rsquo;int\u00e9r\u00eat sauf pour valider le contenu d&rsquo;un fichier-menu fra\u00eechement modifi\u00e9.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><code>cooker build<\/code><\/h3>\n\n\n\n<p>Une fois les sous-actions <code>cooker init<\/code>, <code>cooker update<\/code> et cooker <code>generate<\/code> ex\u00e9cut\u00e9es, <code>cooker cook<\/code> lance la derni\u00e8re sous-action&nbsp;: <code>cooker build<\/code>.<\/p>\n\n\n\n<p>Celle-ci r\u00e9alise v\u00e9ritablement l&rsquo;ex\u00e9cution de <code>bitbake<\/code> pour produire les images.<\/p>\n\n\n\n<p>Lorsqu&rsquo;on est amen\u00e9 \u00e0 relancer un <em>build<\/em> plusieurs dizaines de fois par jour, il peut \u00eatre avantageux d&rsquo;ex\u00e9cuter directement <code>cooker build<\/code> (\u00e0 condition de ne pas avoir modifi\u00e9 le fichier-menu) plut\u00f4t que <code>cooker cook<\/code> car cela permettra de gagner quelques secondes \u00e0 quelques dizaines de secondes prises par les sous-actions pr\u00e9c\u00e9dentes.<\/p>\n\n\n\n<p>On peut noter que les options <code>--download<\/code>, <code>--keepgoing<\/code> et <code>--sdk<\/code> de l&rsquo;action <code>cooker cook<\/code> que nous avons d\u00e9crites plus haut sont en fait prises en compte par la sous-action <code>cooker build<\/code>.<\/p>\n\n\n\n<p>C&rsquo;est \u00e9galement la sous-action <code>cooker build<\/code> qui prend en argument le ou les noms des <em>builds<\/em> \u00e0 produire.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Nettoyage<\/h2>\n\n\n\n<p>Il est souvent n\u00e9cessaire d&rsquo;effacer le r\u00e9sultat de la compilation d&rsquo;une recette, par exemple lorsqu&rsquo;on a modifi\u00e9 les sources d&rsquo;un projet local avant de le recompiler. Ou encore pour forcer la recompilation compl\u00e8te du noyau apr\u00e8s modification de sa configuration.<\/p>\n\n\n\n<p>Pour cela nous disposons de la commande <code>cooker clean<\/code> que l&rsquo;on fait suivre du nom de la recette concern\u00e9e et \u00e9ventuellement du <em>build<\/em> ou des <em>builds<\/em><\/p>\n\n\n\n<p>En voici un exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>cooker  clean  virtual\/kernel  qemuarm<\/strong><\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Informations<\/h2>\n\n\n\n<p>La commande <code>cooker show<\/code> permet d&rsquo;obtenir des informations sur la configuration pr\u00e9par\u00e9e par Yocto Cooker, en d\u00e9taillant les param\u00e8tres extraits du fichier-menu.<\/p>\n\n\n\n<p>Cette commande accepte des options indiquant le contenu affich\u00e9, suivies \u00e9ventuellement d&rsquo;un ou plusieurs noms de <em>builds<\/em> pour limiter sa port\u00e9e.<\/p>\n\n\n\n<p>L&rsquo;option <code>-s<\/code> affiche la liste des sources \u00e0 t\u00e9l\u00e9charger, <code>-l<\/code> demande les listes des <em>layers<\/em> \u00e0 inclure pour chaque <em>build<\/em>, <code>-c<\/code> pr\u00e9sente les contenus sp\u00e9cifiques des fichiers <code>local.conf<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>cooker  show  -s<\/strong>\n# source URL: git:\/\/git.yoctoproject.org\/poky\n#   locally:  \/home\/cpb\/Lab\/cooker-article\/layers\/poky\n# build: qemuarm (bakes core-image-base)\n# build: root\n\n$ <strong>cooker  show  -l<\/strong>\n# build: qemuarm (bakes core-image-base)\n#  used layers\n#   - poky\/meta (\/home\/cpb\/Lab\/cooker-article\/layers\/poky\/meta)\n#   - poky\/meta-poky (\/home\/cpb\/Lab\/cooker-article\/layers\/poky\/meta-poky)\n#   - poky\/meta-yocto-bsp (\/home\/cpb\/Lab\/cooker-article\/layers\/poky\/meta-yocto-bsp)\n# build: root\n#  used layers\n#   - poky\/meta (\/home\/spb\/Lab\/cooker-article\/layers\/poky\/meta)\n#   - poky\/meta-poky (\/home\/cpb\/Lab\/cooker-article\/layers\/poky\/meta-poky)\n#   - poky\/meta-yocto-bsp (\/home\/cpb\/Lab\/cooker-article\/layers\/poky\/meta-yocto-bsp)\n\n$ <strong>cooker  show  -c<\/strong>\n# build: qemuarm (bakes core-image-base)\n#  local.conf entries\n#   - MACHINE = 'qemuarm' \n#   - IMAGE_FEATURES += 'empty-root-password' \n# build: root\n#  local.conf entries<\/code><\/pre>\n\n\n\n<p>Yocto Cooker regroupe les param\u00e8tres globaux, ceux qui sont h\u00e9rit\u00e9s par tous les <em>builds<\/em>, comme s&rsquo;ils appartenaient \u00e0 un <em>build<\/em> sp\u00e9cifique&nbsp;: <code>root<\/code>. Ceci permet d&rsquo;homog\u00e9n\u00e9iser la notion d&rsquo;h\u00e9ritage.<\/p>\n\n\n\n<p>L&rsquo;option <code>-t<\/code> affiche la liste des <em>builds<\/em> avec leurs h\u00e9ritages, <code>-b<\/code> indique les commandes ex\u00e9cut\u00e9es par <code>cooker<\/code> pour entrer dans les r\u00e9pertoires de <em>build<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>cooker  show  -t<\/strong>\n# build: qemuarm (bakes core-image-base)\n# builds ancestors: &#91;'root']\n# build: root\n\n$ <strong>cooker  show  -b<\/strong>\n# build: qemuarm (bakes core-image-base)\n#   . layers\/poky\/oe-init-build-env builds\/build-qemuarm\n# build: root\n# build root has no target<\/code><\/pre>\n\n\n\n<p>Enfin, l&rsquo;option <code>-a<\/code> affiche tous les \u00e9lements ci-dessus.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>cooker  show  -a<\/strong>\n# source URL: git:\/\/git.yoctoproject.org\/poky\n#   locally:  \/home\/cpb\/Lab\/cooker-article\/layers\/poky\n# build: qemuarm (bakes core-image-base)\n#  used layers\n#   - poky\/meta (\/home\/cpb\/Lab\/cooker-article\/layers\/poky\/meta)\n#   - poky\/meta-poky (\/home\/cpb\/Lab\/cooker-article\/layers\/poky\/meta-poky)\n#   - poky\/meta-yocto-bsp (\/home\/cpb\/Lab\/cooker-article\/layers\/poky\/meta-yocto-bsp)\n#  local.conf entries\n#   - MACHINE = 'qemuarm' \n#   - IMAGE_FEATURES += 'empty-root-password' \n#   . layers\/poky\/oe-init-build-env builds\/build-qemuarm\n# builds ancestors: &#91;'root']\n# build: root\n#  used layers\n#   - poky\/meta (\/home\/cpb\/Lab\/cooker-article\/layers\/poky\/meta)\n#   - poky\/meta-poky (\/home\/cpb\/Lab\/cooker-article\/layers\/poky\/meta-poky)\n#   - poky\/meta-yocto-bsp (\/home\/cpb\/Lab\/cooker-article\/layers\/poky\/meta-yocto-bsp)\n#  local.conf entries\n# build root has no target<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Acc\u00e8s au shell<\/h2>\n\n\n\n<p>Il peut \u00eatre parfois n\u00e9cessaire d&rsquo;acc\u00e9der au shell utilis\u00e9 pour lancer la commande <code>bitbake<\/code>. Ceci par exemple pour ex\u00e9cuter une commande comme <code>bitbake -c menuconfig busybox<\/code> ou pour lancer l&rsquo;\u00e9mulateur Qemu avec le script <code>runqemu<\/code> livr\u00e9 avec Poky comme nous l&rsquo;avions fait dans le premier article de cette s\u00e9rie.<\/p>\n\n\n\n<p>Il ne s&rsquo;agit pas uniquement de se placer dans le bon r\u00e9pertoire, il faut aussi que les variables d&rsquo;environnement soient correctement renseign\u00e9es avec les param\u00e8tres n\u00e9cessaires pour <code>bitbake<\/code>.<\/p>\n\n\n\n<p>Pour cela, Yocto Cooker nous propose une action <code>cooker shell<\/code> suivie du nom du <em>build<\/em> consid\u00e9r\u00e9.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>echo  $PATH<\/strong>\n\/home\/cpb\/.local\/bin:\/home\/cpb\/bin:\/usr\/local\/sbin:\/usr\/local\/bin:\/usr\/sbin:\/usr\/bin:\/sbin:\/bin:\/usr\/games:\/usr\/local\/games:\/snap\/bin\n\n$ <strong>echo  $BBPATH<\/strong>\n\n$ <strong>pwd<\/strong>\n\/home\/cpb\/Lab\/cooker-article\n\n$ <strong>cooker  shell  qemuarm<\/strong>\n\n### Shell environment set up for builds. ###\n\nYou can now run 'bitbake &lt;target&gt;'\n\nCommon targets are:\n    core-image-minimal\n    core-image-sato\n    meta-toolchain\n    meta-ide-support\n\nYou can also run generated qemu images with a command like 'runqemu qemux86'\n\nOther commonly useful commands are:\n - 'devtool' and 'recipetool' handle common recipe tasks\n - 'bitbake-layers' handles common layer tasks\n - 'oe-pkgdata-util' handles common target package tasks\n\n\n&#91;build-qemuarm]$<\/code><\/pre>\n\n\n\n<p>Dans ce nouveau shell de nouvelles variables d&rsquo;environnement sont disponibles, la variable <code>PATH<\/code> a \u00e9t\u00e9 modifi\u00e9e et nous avons \u00e9t\u00e9 d\u00e9plac\u00e9s dans le r\u00e9pertoire de compilation.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;build-qemuarm]$ <strong>echo  $BBPATH<\/strong>\n\/home\/cpb\/Lab\/cooker-article\/builds\/build-qemuarm\n\n&#91;build-qemuarm]$ <strong>echo  $PATH<\/strong>\n\/home\/cpb\/Lab\/cooker-article\/layers\/poky\/scripts:\/home\/cpb\/Lab\/cooker-article\/layers\/poky\/bitbake\/bin:\/home\/cpb\/.local\/bin:\/home\/cpb\/bin:\/usr\/local\/sbin:\/usr\/local\/bin:\/usr\/sbin:\/usr\/bin:\/sbin:\/bin:\/usr\/games:\/usr\/local\/games:\/snap\/bin\n\n&#91;build-qemuarm]$ <strong>pwd<\/strong>\n\/home\/cpb\/Lab\/cooker-article\/builds\/build-qemuarm<\/code><\/pre>\n\n\n\n<p>Il ne faut pas oublier de ressortir de ce shell pour retrouver l&rsquo;environnement et l&#8217;emplacement pr\u00e9c\u00e9dents.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;build-qemuarm]$ <strong>exit<\/strong>\nexit\n\n$ <\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Ex\u00e9cution \u00e0 vide<\/h2>\n\n\n\n<p>Il existe une option <code>--dry-run<\/code> qui peut \u00eatre pass\u00e9e \u00e0 <code>cooker cook<\/code> pour qu&rsquo;il s&rsquo;ex\u00e9cute \u00ab\u00a0\u00e0 blanc\u00a0\u00bb, sans effectuer aucune action r\u00e9elle, mais en \u00e9crivant sur sa sortie standard toutes les actions qu&rsquo;il aurait normalement r\u00e9alis\u00e9es.<\/p>\n\n\n\n<p>Il est int\u00e9ressant de rediriger cette sortie dans un fichier ainsi&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>cooker  --dry-run  cook  menu-001.json  &gt;  build-script<\/strong><\/code><\/pre>\n\n\n\n<p>Ce script peut \u00eatre analys\u00e9, pour v\u00e9rifier ce que ferait <code>cooker<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>cat  build-script<\/strong>\n# Update layers in project directory\n# Updating source \/home\/cpb\/Lab\/cooker-article\/layers\/poky... \ncd \/home\/cpb\/Lab\/cooker-article\/layers\/poky; git fetch; git checkout yocto-3.1.13 &gt;\/dev\/null 2&gt;&amp;1\ncd \/home\/cpb\/Lab\/cooker-article\/layers\/poky; git submodule update --recursive --init  &gt;\/dev\/null 2&gt;&amp;1\n# Generating dirs for all build-configurations\nmkdir \/home\/cpb\/Lab\/cooker-article\/builds\/build-qemuarm\nmkdir \/home\/cpb\/Lab\/cooker-article\/builds\/build-qemuarm\/conf\ncat &gt; \/home\/cpb\/Lab\/cooker-article\/builds\/build-qemuarm\/conf\/local.conf &lt;&lt;-EOF\n        # DO NOT EDIT! - This file is automatically created by cooker.\n\n\n        COOKER_LAYER_DIR = \"\\${TOPDIR}\/..\/..\/layers\"\n        DL_DIR = \"\\${TOPDIR}\/..\/..\/downloads\"\n        SSTATE_DIR = \"\\${TOPDIR}\/..\/..\/sstate-cache\"\n        MACHINE = 'qemuarm' \n        IMAGE_FEATURES += 'empty-root-password' \n        DISTRO ?= \"poky\"\n        PACKAGE_CLASSES ?= \"package_rpm\"\n        BB_DISKMON_DIRS ??= \"\\\n                STOPTASKS,\\${TMPDIR},1G,100K \\\n                STOPTASKS,\\${DL_DIR},1G,100K \\\n                STOPTASKS,\\${SSTATE_DIR},1G,100K \\\n                STOPTASKS,\/tmp,100M,100K \\\n                ABORT,\\${TMPDIR},100M,1K \\\n                ABORT,\\${DL_DIR},100M,1K \\\n                ABORT,\\${SSTATE_DIR},100M,1K \\\n                ABORT,\/tmp,10M,1K\"\n        CONF_VERSION = \"1\"\nEOF\ncat &gt; \/home\/cpb\/Lab\/cooker-article\/builds\/build-qemuarm\/conf\/bblayers.conf &lt;&lt;-EOF\n        # DO NOT EDIT! - This file is automatically created by cooker.\n\n\n        POKY_BBLAYERS_CONF_VERSION = \"2\"\n        BBPATH = \"${TOPDIR}\"\n        BBFILES ?= \"\"\n        BBLAYERS ?= \" \\\n                \\${TOPDIR}\/..\/..\/layers\/poky\/meta \\\n                \\${TOPDIR}\/..\/..\/layers\/poky\/meta-poky \\\n                \\${TOPDIR}\/..\/..\/layers\/poky\/meta-yocto-bsp \\\n        \"\n\nEOF\ncat &gt; \/home\/cpb\/Lab\/cooker-article\/builds\/build-qemuarm\/conf\/templateconf.cfg &lt;&lt;-EOF\n        meta-poky\/conf\n\nEOF\n# Building qemuarm (core-image-base)\nenv bash -c \"source \/home\/cpb\/Lab\/cooker-article\/layers\/poky\/oe-init-build-env \/home\/cpb\/Lab\/cooker-article\/builds\/build-qemuarm &amp;&amp; bitbake  core-image-base\"\n$ <\/code><\/pre>\n\n\n\n<p>Le script peut \u00e9galement \u00eatre lanc\u00e9 pour r\u00e9aliser le m\u00eame travail que <code>cooker cook<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>chmod  +x  build-script<\/strong>\n\n$ <strong>.\/build-script<\/strong><\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>Nous avons pu voir dans ces trois articles les diff\u00e9rentes possibilit\u00e9s offertes par Yocto Cooker. Il s&rsquo;agit d&rsquo;un projet encore en d\u00e9veloppement, de nouvelles fonctionnalit\u00e9s sont en cours de discussion et de mise au point.<\/p>\n\n\n\n<p>N&rsquo;h\u00e9sitez pas \u00e0 tester les <a href=\"https:\/\/github.com\/cpb-\/yocto-cooker\" target=\"_blank\" rel=\"noreferrer noopener\" data-type=\"URL\" data-id=\"https:\/\/github.com\/cpb-\/yocto-cooker\">nouvelles versions<\/a> de <code>cooker<\/code> ; tous les retours, les remarques et les suggestions sont les bienvenus&nbsp;!<\/p>\n\n\n\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>Dans les deux premiers articles de cette s&eacute;rie, nous avons vu comment &eacute;crire un menu assez complet pour Yocto Cooker afin de produire des images pour diverses plateformes. Pour le moment nous n&rsquo;avons principalement utilis&eacute; que l&rsquo;action cooker cook. Il est temps de voir les autres possibilit&eacute;s offertes par Yocto Cooker.<\/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-5961","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\/5961","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=5961"}],"version-history":[{"count":5,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/5961\/revisions"}],"predecessor-version":[{"id":5968,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/5961\/revisions\/5968"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=5961"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=5961"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=5961"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}