% Copyright (C) 2018 TANSORIER.
% Permission is granted to copy, distribute and/or modify this document
% under the terms of the GNU Free Documentation License, Version 1.3
% or any later version published by the Free Software Foundation;
% with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
% A copy of the license is included in the section entitled "GNU
% Free Documentation License".
% https://www.gnu.org/licenses/fdl-1.3.html
% compress option to have horyzontal circle
\documentclass [compress] { beamer}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Thèmes suppélmentaires
\useoutertheme [] { miniframes} % barre menu du haut
\setbeamertemplate { frametitle} [default] % replace le titre à la bonne place
\useinnertheme { rounded} % arrondi les angles
\setbeamertemplate { footline} [text line]{
\textcolor { gray} { %
\parbox { \linewidth } { \vspace * { -8pt} Smile ECS\hfill \insertshortauthor \hfill \insertpagenumber /\inserttotalframenumber } }
}
\beamertemplatenavigationsymbolsempty
% Language
\usepackage [french] { babel}
\usepackage [utf8] { inputenc}
\usepackage [T1] { fontenc}
% Display Table Of Content spécific for smilebeamer
% Force to get empty
\AtBeginSection [] { }
\AtBeginSubsection [] { }
%{
% \begin{frame}<beamer>
% \frametitle{Plan}
% \tableofcontents[currentsection]
% \end{frame}
%}
% Change color of definiton block
\AtBeginEnvironment { definition} { %
\setbeamercolor { block title} { use=example text,fg=example text.fg,bg=example text.fg!20!bg}
\setbeamercolor { block body} { parent=normal text,use=block title,bg=block title.bg!50!bg}
}
% caption size reduce
\usepackage { caption}
\setbeamerfont { caption} { size=\scriptsize }
% code coloration
\usepackage { listings}
% L'option "[fragile]" doit être rajouté au frame pour pouvoir utiliser correctement
% la police verbatim
\usepackage { color}
\lstset {
breaklines=true,
tabsize=4,
backgroundcolor=\color [RGB] { 49,54,59} ,
basicstyle=\footnotesize \ttfamily \color { white} ,
commentstyle=\itshape \color [RGB] { 0,136,136} ,
morecomment=[l]{ \# } ,
morekeywords={ *,\$ ,\{ ,\} } ,
stringstyle=\itshape \color [RGB] { 218,116,0} ,
showstringspaces=false,
frame=LTBR,
}
\lstdefinestyle { shell} {
basicstyle=\fontsize { 7pt} { 7pt} \ttfamily \color { white} ,
language=bash,
keywords={ \$ } ,
keywordstyle=\bfseries \color [RGB] { 66,198,66} ,
literate=
{ ├} { { \smash { \raisebox { -1ex} { \rule { 1pt} { \baselineskip } } } \raisebox { 0.5ex} { \rule { 1ex} { 1pt} } } } 1
{ ─} { { \raisebox { 0.5ex} { \rule { 1.5ex} { 1pt} } } } 1
{ │} { { \smash { \raisebox { -1ex} { \rule { 1pt} { \baselineskip } } } \raisebox { 0.5ex} { \rule { 1ex} { 0pt} } } } 1
{ └} { { \smash { \raisebox { 0.5ex} { \rule { 1pt} { \dimexpr \baselineskip -1.5ex} } } \raisebox { 0.5ex} { \rule { 1ex} { 1pt} } } } 1
}
\lstdefinestyle { bitbake} {
language=bash,
alsoletter=-,
morekeywords={ \$ ,\{ ,\} } ,
morekeywords={ BBFILES,BBFILE_ COLLECTIONS,BBFILE_ PATTERN_ meetup,BBFILE_ PRIORITY_ meetup,%
BBLAYERS,MACHINE,DISTRO,LAYERDEPENDS_ meta-python,DISTRO_ FEATURES_ remove,%
DISTRO_ FEATURES_ append,VIRTUAL-RUNTIME_ init_ manager,require,DISTRO_ NAME,%
DISTRO_ VERSION,DISTRO_ FEATURES_ DEFAULT,DISTRO_ FEATURES_ LIBC,PACKAGE_ CLASSES,%
POKY_ DEFAULT_ DISTRO_ FEATURES,DISTRO_ FEATURES,IMAGE_ FEATURES,IMAGE_ INSTALL,BBPATH} ,
keywordstyle=\bfseries \color [RGB] { 152,251,152} ,
}
% pour les schemas
\usepackage { tikz}
\usepackage { tikz}
% Pour utiliser des colonnes
\usepackage { multicol}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\title [Yocto] { Yocto - \texttt { devtool} - et autres… \\ \textbf { Comment développer efficacement sous Yocto} }
\author [Mickaël Tansorier] { Mickaël Tansorier}
\date [Mars 2018] { Présentation des outils et commandes pratique pour travailler sous Yocto}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin { document}
%\tableofcontents[subsectionstyle=hide]
% *******************************
% **** PAGE DE GARDE ****
% *******************************
\begin { frame}
\titlepage
\end { frame}
% *******************************
% **** INTRODUCTION ****
% *******************************
\begin { frame}
\underline { Objectif de la présentation}
\begin { itemize}
\item Présenter rapidement Yocto
\item Présenter des outils utiles
\begin { itemize}
\item \texttt { devtool}
\item \texttt { opkg}
\item \texttt { …}
\end { itemize}
\end { itemize}
\end { frame}
\begin { frame} { Plan}
\tableofcontents [hideallsubsections]
\end { frame}
% *******************************
% **** PRÉSENTATION ****
% *******************************
\section { Présentation rapide de Yocto}
\begin { frame} { Présentation de Yocto}
\tableofcontents [currentsection,hideallsubsections]
\end { frame}
\begin { frame} { Présentation de Yocto}
\begin { center}
\includegraphics [width=0.7\textwidth] { logos/yocto-project-transp.png}
\end { center}
\end { frame}
\begin { frame} { D'où vient ce nom ?}
\begin { definition}
Yocto est un préfixe représentant 10\textsuperscript { -24} unités (SI)
\end { definition}
\end { frame}
\begin { frame}
\begin { block} { Qu'est ce qu'est vraiment Yocto ?}
Yocto est un outil qui répond au besoin de générer une distribution
\textbf { Linux embarqué} pour un matériel \textbf { dédié} .
\end { block}
\end { frame}
\begin { frame}
Yocto utilise le principe de \texttt { MACHINE} et de \texttt { DISTRO} qui sent à la différenciation de l’ \textbf { architecture matérielle} de l’ \textbf { application logicielle} de la cible
\begin { itemize}
\item \texttt { MACHINE} : définit l’ architecture matérielle
\item \texttt { DISTRO} : définit la distribution à générer
\end { itemize}
Il dispose de plusieurs outils très pratique pour le développement:
\begin { itemize}
\item \texttt { devtool}
\item \texttt { ipk} /\texttt { opkg}
\end { itemize}
\end { frame}
\begin { frame}
\tikzstyle { recette} = [draw, fill=orange!70, rectangle, minimum height=2.5em, minimum width=10em,rounded corners=5pt]
\tikzstyle { cadre} = [rectangle, draw, minimum height=12em, minimum width=8.5em, fill=orange!70]
\begin { center}
\begin { tikzpicture} [node distance=1.2cm]
% Yocto
\node [draw,rectangle,minimum height=8cm, minimum width=10cm, fill=orange!70, label={[anchor=north] north:Yocto} ] (YOCTO) { } ;
% Bitbake
\node [draw,rectangle, minimum height=2.5em, minimum width=8cm,rounded corners=5pt, fill=blue!40, yshift=2.8cm] (bitbake) { BITBAKE} ;
% Layers
\node [draw,rectangle, minimum height=2.5cm, minimum width=3cm,rounded corners=5pt, fill=green!70!black!70, yshift=0.7cm, xshift=-2cm, label={[anchor=north] north:LAYER A} ] (layer-A) { } ;
\node [draw,rectangle, right of=layer-A, minimum height=2.5cm, minimum width=3cm,rounded corners=5pt, fill=green!70!black!70, xshift=2.6cm, label={[anchor=north] north:LAYER B} ] (layer-B) { } ;
\node [draw,rectangle, below of=layer-A, minimum height=2.5cm, minimum width=3cm,rounded corners=5pt, fill=green!70!black!70, yshift=-1.8cm, label={[anchor=north] north:LAYER C} ] (layer-C) { } ;
\node [draw,rectangle, below of=layer-B, minimum height=2.5cm, minimum width=3cm,rounded corners=5pt, fill=green!70!black!70, yshift=-1.8cm, label={[anchor=north] north:LAYER D} ] (layer-D) { } ;
% Recettes
\node [draw,rectangle, below of=layer-A, fill=red!80!black!70, xshift=0cm, yshift=1.6cm] (rectte-A1) { RECETTE A1} ;
\node [draw,rectangle, below of=rectte-A1, fill=red!80!black!70, yshift=0.6cm] (rectte-A2) { RECETTE A2} ;
\node [draw,rectangle, below of=rectte-A2, fill=red!80!black!70, yshift=0.6cm] (rectte-A3) { RECETTE A3} ;
\node [draw,rectangle, below of=layer-B, fill=red!80!black!70, xshift=0cm, yshift=1.6cm] (rectte-B1) { RECETTE B1} ;
\node [draw,rectangle, below of=rectte-B1, fill=red!80!black!70, yshift=0.6cm] (rectte-B2) { RECETTE B2} ;
\node [draw,rectangle, below of=rectte-B2, fill=red!80!black!70, yshift=0.6cm] (rectte-B3) { RECETTE B3} ;
\node [draw,rectangle, below of=layer-C, fill=red!80!black!70, xshift=0cm, yshift=1.6cm] (rectte-C1) { RECETTE C1} ;
\node [draw,rectangle, below of=rectte-C1, fill=red!80!black!70, yshift=0.6cm] (rectte-C2) { RECETTE C2} ;
\node [draw,rectangle, below of=rectte-C2, fill=red!80!black!70, yshift=0.6cm] (rectte-C3) { RECETTE C3} ;
\node [draw,rectangle, below of=layer-D, fill=red!80!black!70, xshift=0cm, yshift=1.6cm] (rectte-D1) { RECETTE D1} ;
\node [draw,rectangle, below of=rectte-D1, fill=red!80!black!70, yshift=0.6cm] (rectte-D2) { RECETTE D2} ;
\node [draw,rectangle, below of=rectte-D2, fill=red!80!black!70, yshift=0.6cm] (rectte-D3) { RECETTE D3} ;
\end { tikzpicture}
\end { center}
\end { frame}
%
% **** LE COEUR ****
%
\subsection { Le coeur}
\begin { frame}
\begin { center}
\textcolor { orange} { \huge { Avant de passer aux recettes, qui fait le travail dans Yocto ?} }
\end { center}
\end { frame}
\begin { frame} { bitbake}
\begin { block} { bitbake c'est quoi ?}
\begin { itemize}
\item Un moteur d'exécution de tâches écrite en Python
\item Fonctionne en ligne de commande
\item Exécute automatiquement les tâches nécessaires à la fabrication de la cible fournie
\end { itemize}
\end { block}
\end { frame}
\begin { frame} { bitbake}
\tikzstyle { block} = [draw, fill=orange!70, rectangle, minimum height=2.5em, minimum width=10em,rounded corners=5pt]
\tikzstyle { arrow} = [thick,->,>=stealth]
\begin { center}
\begin { tikzpicture} [node distance=1.2cm]
\node [block, fill=green!60!black!50] (read) { LECTURE RECETTE} ;
\node [block, below of=read] (fetch) { FETCH} ;
\node [block, below of=fetch] (unpack) { UNPACK} ;
\node [block, below of=unpack] (patch) { PATCH} ;
\node [block, below of=patch] (configure) { CONFIGURE} ;
\node [block, right of=configure, xshift=3cm] (compile) { COMPILE} ;
\node [block, above of=compile] (install) { INSTALL} ;
\node [block, above of=install] (package) { PACKAGE} ;
\node [block, above of=package, fill=green!60!black!50] (rootfs) { ROOFS} ;
\draw [arrow] (read) -- (fetch);
\draw [arrow] (fetch) -- (unpack);
\draw [arrow] (unpack) -- (patch);
\draw [arrow] (patch) -- (configure);
\draw [arrow] (configure) -- (compile);
\draw [arrow] (compile) -- (install);
\draw [arrow] (install) -- (package);
\draw [arrow] (package) -- (rootfs);
\end { tikzpicture}
\end { center}
\textcolor { gray} { \tiny { Pour avoir les vrais étapes d'une recette: \texttt { bitbake <recette> -c listtasks} } }
\end { frame}
\subsection { recette}
\begin { frame} { recette}
\begin { block} { À quoi ça ressemble une recette ?}
\includegraphics [width=\textwidth] { images/recette-yocto.png}
\end { block}
\end { frame}
% *******************************
% **** OUTILS DEVTOOL ****
% *******************************
\section { \texttt { devtool} }
\begin { frame} { \texttt { devtool} }
\tableofcontents [currentsection,hideallsubsections]
\end { frame}
\begin { frame} { \texttt { devtool} }
\begin { center}
\textcolor { orange} { \huge { Exemple de l'utilisation de l'outil \texttt { devtool} } }
\end { center}
\end { frame}
\subsection { Les commandes de base}
\begin { frame}
\texttt { devtool} est un outils très utiles lorsque l'on souhaite créer, développer ou modifier une recette et ses sources.\newline
\newline
Les commandes de base:
\begin { description}
\item [\texttt{devtool add}] Ajoute un nouveau software à construire
\item [\texttt{devtool modify}] Génère un environnement pour modifier les sources d'une recette
\item [\texttt{devtool upgrade}] Met à jour une recette existante
\item [\texttt{devtool reset}] Arrête le contexte de développement
\end { description}
\end { frame}
\begin { frame}
Les sources peuvent provenir de plusieurs endroits différent
\begin { center}
\includegraphics [width=1\textwidth] { images/devtool-add-src.png}
\end { center}
\end { frame}
\begin { frame}
De même pour modifier une recette
\begin { center}
\includegraphics [width=1\textwidth] { images/devtool-modify-src.png}
\end { center}
\end { frame}
\subsection { Le comportement de \texttt { devtool} }
\begin { frame} [fragile]
Dès lors \texttt { devtool} créer un layer spécial (\texttt { workspace} ) qui prend la priorité maximal sur les autres layers.
\begin { lstlisting} [style=shell,breaklines=false,xleftmargin=-16px,xrightmargin=-16px]
$ bitbake - layers show - layers
NOTE: Starting bitbake server...
layer path priority
=========================================================================
meta /home/[...]/meta 5
meta-poky /home/[...]/meta-poky 5
meta-yocto-bsp /home/[...]/meta-yocto-bsp 5
workspace /home/[...]/build/workspace 99
meta-raspberrypi /home/[...]/build/../meta-raspberrypi 9
meta-python /home/[...]/build/../meta-openembedded/meta-python 7
meta-oe /home/[...]/build/../meta-openembedded/meta-oe 6
meta-meetup /home/[...]/build/../meta-meetup 10
\end { lstlisting}
\end { frame}
\begin { frame} [fragile]
Dans ce layer on retrouve
\begin { itemize}
\item les sources mis sous git et patché
\item un bbappend de la recette
\end { itemize}
\begin { lstlisting} [style=shell]
$ cd $ POKY/build/workspace/
$ tree - L 2
.
├── appends
│ └── weston_ 2.0.0.bbappend
├── conf
│ └── layer.conf
├── README
└── sources
└── weston
\end { lstlisting}
\end { frame}
\subsection { Exemple pratique}
\begin { frame}
\begin { center}
\textcolor { orange} { \huge { Exemple pratique avec la recette \texttt { weston} } }
\end { center}
\end { frame}
\begin { frame} [fragile]
Modification avec \texttt { devtool} des sources de weston
\begin { lstlisting} [style=shell]
$ devtool modify weston
$ cd $ POKY/build/workspace/sources/weston/
$ vim libweston / compositor - wayland.c + 1655
\end { lstlisting}
Ajout du patch "Fix an uninitialized variable"
% https://github.com/wayland-project/weston/commit/6b2fb180d99bb9d6deaddb1cdf735422d4dd5b93
\begin { lstlisting} [escapeinside={ <@} { @>} ]
@@ -1652,6 +1652,7 @@ input_ handle_ axis(void *data, struct wl_ pointer *pointer,
weston_ event.axis = axis;
weston_ event.value = wl_ fixed_ to_ double(value);
<@\textcolor { green!80!black} { \texttt { +\, \, \, \, weston\_ event.has\_ discrete = false;} } @>
if (axis == WL_ POINTER_ AXIS_ VERTICAL_ SCROLL & &
input->vert.has_ discrete) {
\end { lstlisting}
\end { frame}
\begin { frame} [fragile]
Les étapes:
\begin { enumerate}
\item Faire la modification
\item Tester normalement
\item Commiter
\item Appliquer la modification sous forme de patch
\begin { lstlisting} [style=shell]
$ devtool update - recipe weston
[...]
NOTE: Adding new patch 0001-Fix-an-uninitialized-variable.patch
NOTE: Updating recipe weston_ 2.0.0.bb
\end { lstlisting}
\item Ajouter la modification dans son layer
% L'ajout d'un bbappend dans meta-meetup
% Supprimer l'ajout de meta/recipes-graphics/wayland/weston_2.0.0.bb
% Le déplacement du patch dans meta-meetup
\item Arrêter devtool
\begin { lstlisting} [style=shell]
$ devtool reset weston
\end { lstlisting}
\end { enumerate}
\end { frame}
\begin { frame} [fragile]
Dans le cas où vous modifiez déjà une recette avec un bbappend, je vous conseil d'extraire les patchs à la main:
\begin { lstlisting} [style=shell]
$ cd $ POKY/build/workspace/sources/weston/
$ git format patch - <nb _ patch>
\end { lstlisting}
Il ne reste plus qu'a copier ces patch dans la recette et d'ajouter dans le bbappend avec:
\begin { lstlisting} [style=shell]
FILESEXTRAPATHS_ prepend := "$ { THISDIR } / $ { PN} :"
SRC_ URI += "file://000X-mon-patch.patch"
\end { lstlisting}
\end { frame}
\subsection { Déployer directement vos modifications sur cible}
\begin { frame}
\begin { center}
\textcolor { orange} { \huge { Exemple pour deployer directement ses modifications sur cible} }
\end { center}
\end { frame}
\begin { frame} [fragile]
Après modification de source avec devtool il est possible de déployer ces modification directement sur une cible avec:
\begin { lstlisting} [style=shell]
$ devtool deploy - target <recette> <user@cible>
\end { lstlisting}
La cible doit disposer d'un serveur ssh. \newline
\newline
Attention, devtool n'envoit pas un paquet mais le résultat de la recette, donc pas besoin d'un \texttt { package-management} sur cible.\\
Une fois votre mise au point terminée vous pouvez supprimer tous les fichiers ajoutés par votre recette la commande:
\begin { lstlisting} [style=shell]
$ devtool undeploy - target <recette> <user@cible>
\end { lstlisting}
\end { frame}
% *******************************
% **** OUTILS OPKG et IPK ****
% *******************************
\section { \texttt { opkg} et \texttt { ipk} }
\begin { frame}
\tableofcontents [currentsection,hideallsubsections]
\end { frame}
\begin { frame}
\begin { center}
\textcolor { orange} { \huge { Exemple de l'utilisation des l'outils \texttt { opkg} et \texttt { ipk} } }
\end { center}
\end { frame}
\subsection { \texttt { opkg} un gestionnaire de paquets}
\begin { frame} { \texttt { opkg} est un gestionnaire de paquets}
\texttt { opkg} est gestionnaire de paquet tout comme apt l'est pour les distribution hérité de Debian.\newline
\newline
Les commandes de base:
\begin { description}
\item [\texttt{opkg update}] Mettre à jour la list des paquets
\item [\texttt{opkg upgrade <pkgs>}] Mettre à jour un paquet
\item [\texttt{opkg install <pkgs|url>}] Installer un paquet
\item [\texttt{opkg remove <pkgs>}] Supprimer un paquet
\end { description}
\end { frame}
\subsection { Créer son propre serveur de paquet}
\begin { frame} [fragile]{ Créer son propre serveur \texttt { opkg} }
Pour créer son serveur opkg il suffit d'avoir un sereur http.\newline
On peut le crée simplement avec python en remplaçant les variable par leur valeur :
\begin { lstlisting} [style=shell]
$ cd $ { POKY} /build/tmp/deploy/ipk
$ $ { NATIVE_ SDK_ BINS} /usr/bin/python-native/python -m SimpleHTTPServer $ { IPK _ SERVER _ PORT }
\end { lstlisting}
Avec python3:
\begin { lstlisting} [style=shell]
$ cd $ { POKY} /build/tmp/deploy/ipk
$ $ { NATIVE_ SDK_ BINS} /usr/bin/python-native/python3 -m http.server $ { IPK _ SERVER _ PORT }
\end { lstlisting}
\end { frame}
\begin { frame} [fragile]{ Définir le serveur \texttt { opkg} sur cible}
Ajouter ces lignes dans le fichier \texttt { opkg.conf} en remplaçant les variable correspondante par leur valeur:
\begin { lstlisting} [style=shell,xleftmargin=-18px,xrightmargin=-18px]
src/gz all http://ipk-server:$ { IPK _ SERVER _ PORT } / all
src/gz $ { MACHINE _ ARCH } http: / / ipk - server: $ { IPK_ SERVER_ PORT} /$ { MACHINE _ ARCH }
src/gz $ { MACHINE _ SOCARCH } http: / / ipk - server: $ { IPK_ SERVER_ PORT} /$ { MACHINE _ SOCARCH }
src/gz $ { TUNE _ PKGARCH } http: / / ipk - server: $ { IPK_ SERVER_ PORT} /$ { TUNE _ PKGARCH }
\end { lstlisting}
\textcolor { gray} { \tiny { Recette opkg} }
\newline
Ajouter dans \texttt { /etc/hosts} le serveur:
\begin { lstlisting} [style=shell]
$ { IP _ HOST } ipk - server
\end { lstlisting}
\textcolor { gray} { \tiny { Recette netbase} }
\end { frame}
% *******************************
% **** OUTILS DIVERS ****
% *******************************
\section { Outils et commandes diverses}
\begin { frame}
\tableofcontents [currentsection,hideallsubsections]
\end { frame}
\begin { frame}
\begin { center}
\textcolor { orange} { \huge { Quelques outils et commandes diverses qui peuvent intéresser} }
\end { center}
\end { frame}
\subsection { La plus puissante option}
\begin { frame} [fragile]{ environnement}
Pour connaitre l'état de n'importe quelle recette et quelle variable est compléter par quel fichier de recette, l'option \texttt { -e} est le plus puissant.\newline
\begin { lstlisting} [style=shell]
$ bitbake <recipe> - e
\end { lstlisting}
La sortie est assez velue, il vaut mieux l'ouvrir dans un éditeur comme:
\begin { lstlisting} [style=shell]
$ bitbake <recipe> - e | vim -
\end { lstlisting}
\end { frame}
\subsection { devshell}
\begin { frame} [fragile]{ environnement}
Si vous souhaitez tester des commandes dans un environnement de cross compilation, l'option \texttt { devshell} est l'outils qu'il faut:
\begin { lstlisting} [style=shell]
$ bitbake <recipe> - c devshell
\end { lstlisting}
\end { frame}
\subsection { defconfig}
\begin { frame} [fragile]{ defconfig}
Ajouter un fichier de configuration.\newline
\newline
Pour la plupart des paquets la gestion de yocto reconnais les defconfig. Il faut ajouter dans un bbappend pour dans une recette maitrisé:
\begin { lstlisting} [style=shell]
FILESEXTRAPATHS:prepend := "$ { THISDIR } / $ { PN} :"
SRC_ URI += "file://defconfig"
\end { lstlisting}
\end { frame}
\begin { frame} [fragile]{ savedefconfig}
Ajouter une option de configuration à un paquet facilement.\newline
\newline
Ceci fonctionne si vous avez le defconfig dans votre layer.
\begin { enumerate}
\item Ajouter une config
\begin { lstlisting} [style=shell]
$ bitbake linux - fslc - c menuconfig
\end { lstlisting}
\item Tester
\item Générer le nouveau defconfig
\begin { lstlisting} [style=shell]
$ bitbake linux - fslc - c savedefconfig
\end { lstlisting}
\item Remplacer le defconfig par sa génération
\end { enumerate}
\end { frame}
\begin { frame} [fragile]{ diffconfig}
Ajouter une option de configuration à un paquet facilement.
\begin { enumerate}
\item Ajouter une config
\begin { lstlisting} [style=shell]
$ bitbake linux - fslc - c menuconfig
\end { lstlisting}
\item Tester
\item Extraire la configuration et ses dépendances mutualisé
\begin { lstlisting} [style=shell]
$ bitbake linux - fslc - c diffconfig
linux-fslc-4.10-r0 do_ diffconfig: Config fragment has been dumped into:
/home/user/yocto/build/tmp/work/archi/linux-fslc/4.10-r0/fragment.cfg
\end { lstlisting}
\item Ajouter le fragment à la recette
\begin { lstlisting} [style=shell]
FILESEXTRAPATHS_ prepend := "$ { THISDIR } / $ { PN} :"
SRC_ URI += "file://myfragment.cfg"
\end { lstlisting}
\textcolor { gray} { \tiny { Après la génération du diffconfig il faut ajouter l'option à la recette car elle est retiré du config} }
\end { enumerate}
\end { frame}
\subsection { Compiler le plus loin possible}
\begin { frame} [fragile]{ Compilation}
Si vous souhaitez compiler une image le plus loin possible après une erreur:
\begin { lstlisting} [style=shell]
$ bitbake <image> - k
\end { lstlisting}
\end { frame}
\subsection { oe-pkgdata-util}
\begin { frame} [fragile]{ Quel parquet embarque quoi comme ficher}
Lister les fichier contenue dans un paquet:
\begin { lstlisting} [style=shell]
$ oe - pkgdata - util list - pkg - files <recipe>
\end { lstlisting}
Trouver quel paquet fournis quel fichier:
\begin { lstlisting} [style=shell]
$ oe - pkgdata - util find - path / etc / opkg / pokg.conf
\end { lstlisting}
\end { frame}
\subsection { buildhistory}
\begin { frame} [fragile]{ buildhistory}
Buildhistory fourni un ensemble de détails sur le contenue des paquets, leur dépendances, et leur inclusion dans une image.\newline
\newline
Ajouter dans \texttt { conf/local.conf} :
\begin { lstlisting} [style=shell]
INHERIT += "buildhistory"
BUILDHISTORY_ COMMIT = "1"
\end { lstlisting}
Le résultat se situe dans le dossier de build dans \texttt { buildhistory} .
\end { frame}
\subsection { autocompletion}
\begin { frame} [fragile]{ Autocompletion}
Pour faciliter le développement l'autocompletion est plus confortable.\newline
\newline
Il existe des projets, mais qui date un peut...
\url { https://github.com/sergioprado/bitbake-bash-completion}
\url { https://github.com/lukaszgard/bitbake-completion} \newline
\newline
Il faut copier les fichier dans:
\begin { lstlisting} [style=shell]
/etc/bash_ completion.d/
\end { lstlisting}
Suivez les instructions des dépôts.
\end { frame}
% *******************************
% **** CONCLUSION ****
% *******************************
\section * { Questions}
\begin { frame} { Sources}
Ce document à été rédigé à partir des sources suivantes:\newline
\begin { itemize}
\item \url { www.yoctoproject.org}
\item \url { www.linuxembedded.fr}
\item \url { https://openwrt.org/docs/guide-user/additional-software/opkg}
\end { itemize}
\end { frame}
\begin { frame}
\centering
\textcolor { orange} { \huge { Merci de votre attention !} }
\textcolor [RGB] { 99,153,253} { Quetions ?}
\includegraphics [width=0.5\textwidth] { logos/smile-logo.png}
Mickaël Tansorier
\url { mickael.tansorier@smile.fr}
\url { mickael@tansorier.fr}
\vfill
\textcolor { gray} { \tiny { GNU Free Documentation License, Version 1.3} }
\end { frame}
\end { document}