|
|
% 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}
|