% 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} % \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 -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 - \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 \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 \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 }] Mettre à jour un paquet \item[\texttt{opkg install }] Installer un paquet \item[\texttt{opkg remove }] 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 -e \end{lstlisting} La sortie est assez velue, il vaut mieux l'ouvrir dans un éditeur comme: \begin{lstlisting}[style=shell] $ bitbake -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 -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 -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 \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}