% 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]{smilebeamer}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% 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}{
  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} - Ansible \\ \textbf{La dernière recette de ma grand-mère}}

\author[Mickaël Tansorier]{Mickaël Tansorier}

\date[Mars 2018]{Présenstation sur le fonctionnement de Yocto et d'outils pratiques.}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}
%\tableofcontents[subsectionstyle=hide]

% *******************************
% ****     PAGE DE GARDE     ****
% *******************************

\begin{frame}
\titlepage
\end{frame}


% *******************************
% ****      INTRODUCTION     ****
% *******************************

\section{Introduction}

\begin{frame}
\underline{Objectif de la présentation}
\begin{itemize}
	\item Présenter Yocto
	\item Démonstration concrète sur Rapsberry Pi
	\item Présentation d'outils utiles
	\begin{itemize}
		\item \texttt{devtool}
		\item \texttt{Ansible}
	\end{itemize}
\end{itemize}
\end{frame}


\begin{frame}{Plan}
\tableofcontents[hideallsubsections]
\end{frame}


\subsection{Historique}

\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}
\begin{block}{Pourquoi Yocto existe ?}
	Ce projet s'est basé sur l'outil \textbf{OpenEmbedded} pour voir le jour.\newline{}\\
	En effet il y avait une volonté de pouvoir moduler les applications sur
	\textbf{différents matériels} sans avoir à investir dans un nouveau développement.
	\newline{}\\
	Des développeurs et la Fondation Linux se sont unis pour proposer	une 
	mécanique qui fasse abstraction du matériel, et ainsi rendre réutilisables
	les développements déjà effectués.\newline{}\\
	\textbf{Depuis 2010 ce projet continue sa route !}
\end{block}
\end{frame}


% *******************************
% ****     PRÉSENTATION      ****
% *******************************
\section{Présentation 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}{Pas si vite …}
Avant tout, un peut de contexte.\newline
\newline
\begin{itemize}
	\item Est-ce que Yocto est le seul outils qui existe ?
	\item Qu'est-ce qu'il a de plus que les autres ?
	\item Comment c'est architecturé ?
\end{itemize}
\end{frame}

%
% **** ALTERNATIVES ****
%
\subsection{Alternatives à Yocto}

\begin{frame}
D’autres outils permettent de créer des distributions Linux pour les systèmes embarqués.
\begin{columns}[t]
	\begin{column}{0.33\textwidth}
	\begin{exampleblock}{Buildroot}
		\includegraphics[width=\textwidth]{logos/buildroot.png}
		Buildroot est un outil qui ressemble à un jeu de makefile, capable de générer tous les éléments pour démarrer un système sous Linux.
	\end{exampleblock} 
	\end{column}
	\begin{column}{0.33\textwidth}
	\begin{exampleblock}{Linux From Scratch}
		\includegraphics[width=\textwidth]{logos/linux_from_scratch-with_text.png}
		\newline
		\newline
		Linux from scratch est un projet qui décrit pas à pas les instructions pour construire un système Linux. Très instructif mais fastidieux !
	\end{exampleblock}  
	\end{column}
	\begin{column}{0.33\textwidth}
	\begin{exampleblock}{OpenWrt}
		\includegraphics[width=\textwidth]{logos/OpenWrt.png}
		\newline
		\newline
		\newline
		OpenWrt est un système libre et issu de Buildroot. Très orienté réseau, il offre la possibilité de gérer les paquets ipk.
	\end{exampleblock}   
	\end{column}
\end{columns} 
\end{frame}

%
% ****     LE PLUS DE YOCTO      ****
%
\subsection{Qu'est ce que Yocto a de plus ?}

\begin{frame}
Yocto et Buildroot sont deux outils très proches mais avec fonctionnalité qui diffères en fonction des besoins
\begin{center}
	\includegraphics[width=0.7\textwidth]{schemas/buildroot_vs_yocto.png}	
\end{center}
\end{frame}

\begin{frame}
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}
Une \textbf{communauté} active
\begin{itemize}
	\item Nouvelle version tous les 6 mois
	\item 1 version de dev, 3 stables, le reste en communauté
	\item Channel IRC actif
\end{itemize}
De la \textbf{documentation} bien fournie
\begin{itemize}
	\item Doc classique
	\item Vidéo
\end{itemize}
Des \textbf{outils} puissants
\begin{itemize}
	\item \texttt{devtool}
	\item \texttt{ipk}/\texttt{opkg}
\end{itemize}
\end{frame}

%
% ****     LE PLUS DE YOCTO      ****
%
\subsection{Configuration et Évolution}

\begin{frame}
\begin{itemize}
	\item Yocto est gourmand en ressources, une configuration minimale de 50Go de disque dur, un CPU à 1,6GHz et 8Go de RAM est recommandée.

	\item Plusieurs distributions Linux supportent Yocto : Ubuntu, Fedora, Debian, OpenSuse, CentOS.

	\item Le projet Yocto produit une nouvelle version majeure tous les 6 mois environ.

	\item Elle porte généralement un nom associé à un numéro de version.
ex : Morty (2.2), Pyro (2.3), Rocko (2.4), Sumo (2.5), ...
\end{itemize}
\end{frame}


\subsection{Le squelette}
\begin{frame}{Workflow}
\includegraphics[width=\textwidth]{schemas/yocto_workflow.png}
\end{frame}

\begin{frame}
\tikzstyle{recette} = [draw, fill=smileOrange!70, rectangle, minimum height=2.5em, minimum width=10em,rounded corners=5pt]
\tikzstyle{cadre} = [rectangle, draw, minimum height=12em, minimum width=8.5em, fill=smileOrange!70]
\begin{center}
\begin{tikzpicture}[node distance=1.2cm]
% Yocto
\node[draw,rectangle,minimum height=8cm, minimum width=10cm, fill=smileOrange!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=0.3cm, 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=0.3cm, 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=0.3cm, 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=0.3cm, 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}

\begin{frame}
Quelques layers générique communautaire
\begin{itemize}
	\item meta
	\item meta-openembedded
	\begin{itemize}
		\item meta-oe
		\item meta-networking
		\item meta-python
		\item meta-gnome
	\end{itemize}
	\item meta-poky
\end{itemize}
D'autre plus spécifique
\begin{itemize}
	\item meta-raspberrypi
	\item meta-intel
	\item meta-xfce
	\item meta-qt5
\end{itemize}
\end{frame}


%
% ****     LE COEUR      ****
%
\subsection{Le coeur}

\begin{frame}
\begin{center}
\textcolor{smileOrange}{\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=smileOrange!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}
\end{frame}

\begin{frame}{recette}
\begin{block}{À quoi ça ressemble une recette ?}
\includegraphics[width=\textwidth]{images/recette-yocto.png}
\end{block}
\end{frame}

%
% ****     CHOISIR UNE IMAGE      ****
%
\subsection{Se choisir une image}

\begin{frame}
\begin{center}
\textcolor{smileOrange}{\huge{Comment crée son image spécifique pour une carte donnée ?}}
\end{center}
\end{frame}

\begin{frame}
Yocto à la particularité de bien séparer la \textbf{distribution} de l'\textbf{architecture matériel}.
\newline \\
Les architectures matériel
\begin{itemize}
	\item ARM
	\item x86
	\item x86-64
	\item PowerPC
	\item MIPS
\end{itemize}
Les cartes associés
\begin{itemize}
	\item Raspberry Pi (différent versions)
	\item Beaglebone
	\item intel-core2-32
\end{itemize}
\textcolor{gray}{\tiny{Les différents BSP sont répertoriés sur le site de yoctoproject : \url{https://www.yoctoproject.org/downloads/bsps}}}
\end{frame}

\begin{frame}[fragile]
Le paramétrage de la \texttt{DISTRO} et de la \texttt{MACHINE} se fait en local.
\newline \\
\texttt{\$POKY/build/conf/local.conf}
\begin{lstlisting}[style=bitbake]
# This sets the default machine to be qemux86 if no other machine is selected:
MACHINE ??= "qemux86"
# Default distro:
DISTRO ?= "poky"

# Mes parametres
MACHINE = "raspberrypi3-64"
DISTRO = "distromeetup"
\end{lstlisting}
\end{frame}


% *******************************
% ****    TP RASPBERRY PI    ****
% *******************************
\section{TP Rapsberry Pi}

\begin{frame}{TP Raspberry Pi}
\tableofcontents[currentsection,hideallsubsections]
\end{frame}

\begin{frame}{TP Raspberry Pi}
\begin{center}
\includegraphics[width=0.9\textwidth]{logos/yocto_plus_raspberry_pi.png}
\end{center}
\end{frame}

\subsection{Installer l'environnement Yocto}
\begin{frame}
Les étapes:
\begin{enumerate}
	\item Installer l'environnement de développement
	\item Construire une distribution générique
	\item Créer sa propre distribution
	\item Tester son image
\end{enumerate}
\end{frame}

\begin{frame}[fragile]
On se base sur la dernière version de Yocto stable disponible, c'est à dire \texttt{rocko} qui est sortie en octobre 2017. \textcolor{gray}{\tiny{(la prochaine est en avril 2018)}}
\begin{lstlisting}[style=shell]
$ git clone git://git.yoctoproject.org/poky -b rocko
$ cd poky
$ git clone git://git.yoctoproject.org/meta-raspberrypi -b rocko
$ git clone git://git.openembedded.org/meta-openembedded -b rocko
\end{lstlisting}
\end{frame}

\subsection{Construire une distribution générique}
\begin{frame}[fragile]
Pour construire son image il faut d'abord:
\begin{itemize}
	\item Sourcer l'environnement pour bitbake
		\begin{lstlisting}[style=shell]
$ . oe-init-build-env
		\end{lstlisting}
		Cela nous créer un dossier \texttt{build} dans lequel tout va se passer.
	\item Paramétré la \texttt{MACHINE} et la \texttt{DISTRO}\newline
		Ces variables sont écrites dans le fichier \texttt{local.conf}.
\end{itemize}
\end{frame}

\begin{frame}[fragile]
Il reste plus qu'à modifier \texttt{\$POKY/build/conf/local.conf}
\begin{lstlisting}[style=bitbake]
# Mes parametres
MACHINE = "raspberrypi3-64"
\end{lstlisting}
et ajouter le layer manquant dans \texttt{\$POKY/build/conf/bblayers.conf}
\begin{lstlisting}[style=bitbake]
BBLAYERS += " \
    ${TOPDIR}/../meta-raspberrypi \
"
\end{lstlisting}
\textcolor{gray}{\tiny{Les chemains sont en général absolue comme: \texttt{/home/username/path/to/project/poky/meta-raspberrypi}}}\newline
Et enfin lancer la construction de l'image avec
\begin{lstlisting}[style=shell]
$ bitbake core-image-minimal
\end{lstlisting}
\end{frame}


\subsection{Yocto est intelligent}

\begin{frame}[fragile]
Yocto est là pour vous aider à construire votre image.\newline
En effet si l'on ne rajoute seulement \texttt{meta-raspberrypi} dans \texttt{bblayers.conf} on obtiens l'erreur suivante:
\begin{block}{meta-python}
\begin{lstlisting}[basicstyle=\footnotesize\ttfamily\color{red!80!black!60}]
ERROR: ParseError at /home/ubuntu/meetup/poky/meta-raspberrypi/recipes-devtools/python/rpio_0.10.0.bb:9: Could not inherit file classes/pypi.bbclass
\end{lstlisting}
Il faut donc rajouter \texttt{meta-openembedded/meta-python}
\end{block}
\begin{block}{meta-oe}
\begin{lstlisting}[basicstyle=\footnotesize\ttfamily\color{red!80!black!60}]
ERROR: Layer 'meta-python' depends on layer 'openembedded-layer', but this layer is not enabled in your configuration
\end{lstlisting}
De plus dans \texttt{meta-python/conf/layer.conf} on a
\begin{lstlisting}[style=bitbake]
LAYERDEPENDS_meta-python = "core openembedded-layer"
\end{lstlisting}
\end{block}
\end{frame}

\begin{frame}[fragile]
Il faut donc rajouter les layers qui vont bien dans \texttt{bblayers.conf}
\begin{lstlisting}[style=bitbake,escapeinside={<@}{@>}]
BBLAYERS += " \
    ${TOPDIR}/../meta-raspberrypi \
    <@\textit{\texttt{\textcolor{green!80!black}{\$\{TOPDIR\}/../meta-openembedded/meta-python}}}@> \
    <@\textit{\texttt{\textcolor{green!80!black}{\$\{TOPDIR\}/../meta-openembedded/meta-oe}}}@> \
"
\end{lstlisting}
\textcolor{gray}{On peut maintenant construire et tester une image}
\end{frame}


\subsection{Créer sa propre distribution}
%https://www.yoctoproject.org/docs/2.5/mega-manual/mega-manual.html#enabling-wayland-in-an-image
\begin{frame}
\begin{center}
\textcolor{smileOrange}{\huge{Étape suivante:}}
\end{center}
\begin{center}
\textcolor{smileOrange}{\huge{Créer sa propre distribution}}
\end{center}
\end{frame}

\begin{frame}[fragile]
Pour créer sa propre distribution il est préférable de créer son propre layer
\begin{lstlisting}[style=shell]
$ cd $POKY
$ mkdir -p meta-meetup/conf
\end{lstlisting}

Il faut déclarer la layer avec \texttt{./conf/layer.conf}
\begin{lstlisting}[style=bitbake]
# We have a conf and classes directory, add to BBPATH
BBPATH .= ":${LAYERDIR}"

# We have recipes-* directories, add to BBFILES
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
            ${LAYERDIR}/recipes-*/*/*.bbappend"

BBFILE_COLLECTIONS += "meetup"
BBFILE_PATTERN_meetup = "^${LAYERDIR}/"
BBFILE_PRIORITY_meetup = "10"
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
Il faut maintenant l'ajouter dans \texttt{\$POKY/build/conf/bblayers.conf}
\begin{lstlisting}[style=bitbake,escapeinside={<@}{@>}]
BBLAYERS += " \
    ${TOPDIR}/../meta-raspberrypi \
    ${TOPDIR}/../meta-openembedded/meta-python \
    ${TOPDIR}/../meta-openembedded/meta-oe \
    <@\textit{\texttt{\textcolor{green!80!black}{\$\{TOPDIR\}/../meta-meetup}}}@> \
"
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
Créer sa distro avec \texttt{./conf/distro/distromeetup.conf}
\begin{lstlisting}[style=bitbake]
# Distribution base sur poky
require conf/distro/poky.conf

DISTRO = "distromeetup"
DISTRO_NAME = "Distro meetup example"
DISTRO_VERSION = "0.1"

# Ajout d'option pour la distribution
DISTRO_FEATURES_append = " systemd"
VIRTUAL-RUNTIME_init_manager = "systemd"

# Utilisation seulement du paquetage ipk
PACKAGE_CLASSES = "package_ipk"
\end{lstlisting}

Si on souhaite utiliser la nouvelle distribution il faut ajouter dans \texttt{\$POKY/build/conf/local.conf}
\begin{lstlisting}[style=bitbake]
MACHINE = "raspberrypi3-64"
DISTRO = "distromeetup"
\end{lstlisting}
\end{frame}

\begin{frame}
\begin{center}
\textcolor{smileOrange}{\huge{Créer son image et choisir ce que l'on met dedans ?}}
\end{center}
\end{frame}

\begin{frame}[fragile]
	Par defaut la distro héritant de poky contiens
	\begin{lstlisting}[style=bitbake]
DISTRO_FEATURES = "${DISTRO_FEATURES_DEFAULT} ${DISTRO_FEATURES_LIBC} ${POKY_DEFAULT_DISTRO_FEATURES}"
	\end{lstlisting}
	
\end{frame}

\begin{frame}[fragile]
	Avec dans chaques variables
	\begin{lstlisting}[style=bitbake]
DISTRO_FEATURES_DEFAULT="acl alsa argp bluetooth ext2 irda largefile pcmcia usbgadget us      bhost wifi xattr nfs zeroconf pci 3g nfc x11"
	
DISTRO_FEATURES_LIBC="ipv4 ipv6 libc-backtrace libc-big-macros libc-bsd libc-cxx-tests l      ibc-catgets libc-charsets libc-crypt libc-crypt-ufc libc-db-aliases libc-envz libc-fcvt libc-fmtmsg libc-fstab libc-ftraverse libc-getlogin libc-idn libc-inet-anl libc-libm libc-locales libc-locale-code libc-memusage libc-nis libc-nsswitch libc-rcmd libc-rtld-debug libc-spawn libc-streams libc-sunrpc libc-utmp libc-utmpx libc-wordexp libc-posix-clang-wchar libc-posix-regexp libc-posix-regexp-glibc libc-posix-wchar-io"
	
POKY_DEFAULT_DISTRO_FEATURES="largefile opengl ptest multiarch wayland vulkan"
	\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
Créer son image \texttt{./recipes-image/rapsberrypi/myrpi.bb}
\begin{lstlisting}[style=bitbake]
require recipes-graphics/images/core-image-weston.bb
IMAGE_FEATURES += " 
    ssh-server-openssh \
"
IMAGE_INSTALL += " \
    setkey \
"
\end{lstlisting}
{\color[RGB]{232,120,0}\texttt{ssh-server-openssh}} permet d'avoir accès à la carte en ssh
{\color[RGB]{232,120,0}\texttt{setkey}} nouvelle recette permettant de passer qwerty en bépo
\end{frame}

\begin{frame}
\begin{center}
\huge{Testons notre image !}
\includegraphics[width=1\textwidth]{images/weston-desktop.png}
\end{center}
\end{frame}


% *******************************
% ****    OUTILS DEVTOOL    ****
% *******************************
\section{\texttt{devtool}}

\begin{frame}{\texttt{devtool}}
\tableofcontents[currentsection,hideallsubsections]
\end{frame}

\begin{frame}{\texttt{devtool}}
\begin{center}
\textcolor{smileOrange}{\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'un composant
	\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=-18px,xrightmargin=-18px]
$ 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{smileOrange}{\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
\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}



% *******************************
% ****     OUTILS ANSIBLE    ****
% *******************************
\section{Ansible}

\begin{frame}{Ansible}
\tableofcontents[currentsection,hideallsubsections]
\end{frame}

\begin{frame}
\begin{center}
\includegraphics[width=0.3\textwidth]{logos/Ansible.png}
\end{center}
\begin{center}
\textcolor{smileOrange}{\huge{Utiliser Ansible pour mettre en place un environnement Yocto}}
\end{center}
\end{frame}

\subsection{C'est quoi Ansible ?}

\begin{frame}
\begin{definition}
Ansible est un logiciel destiné à la configuration et la gestion de parc informatique.
\end{definition}
Il permet de :
\begin{itemize}
	\item déployer des logiciels
	\item gérer des configurations
	\item lancer des tâches
\end{itemize}
Pour:
\begin{itemize}
	\item une machine donnée
	\item plusieurs machines
\end{itemize}
\end{frame}

\begin{frame}
Un des avantage est qu'il utilise des fichiers de configuration au format YAML.\newline
\newline
Le format YAML est:
\begin{itemize}
	\item humainement lisibles
	\item plus facile à géré que certain autres formats %comme XML
\end{itemize}
\end{frame}

\subsection{Exemple simple de syntaxe}

\begin{frame}[fragile]
Défénition des cibles dans \texttt{/etc/ansible/hosts}
\begin{lstlisting}
192.0.2.50
linuxembedded.exemple.fr
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
Pour lancer un programme à distance on peux soit spécifier
\begin{itemize}
	\item tout les hôtes
	\item un hôte particulier
\end{itemize}
\begin{lstlisting}[style=shell]
$ ansible all -a "/bin/ping 8.8.8.8 -c1"
$ ansible linuxembedded.exemple.fr -a "/bin/ping 8.8.8.8 -c1"
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
Ansible fournit un ensemble de modules qui permettent de lancer des actions spécifiques à distance.
\begin{lstlisting}[style=shell]
$ ansible all -m ping
<address_ip> | SUCCESS => {
 "changed": false, 
 "ping": "pong"
}
\end{lstlisting}
\textcolor{gray}{\tiny{Attention au faux amis, ici ping se connecte à un hôte, teste l’utilisabilité de python puis de renvoie le résultat pong en cas de succès}}
\end{frame}

\subsection{Le playbook}

\begin{frame}
\begin{center}
\textcolor{smileOrange}{\huge{Les actions multiples – le principe de playbook}}
\end{center}
\end{frame}

\begin{frame}[fragile]
Pour effectuer plusieurs actions en une seule commande on utilise un playbook
\begin{lstlisting}[style=shell]
$ ansible-playbook mon-fichier.yml
\end{lstlisting}
\end{frame}

\begin{frame}
\begin{center}
\textcolor{smileOrange}{\huge{La syntaxe YAML}}
\end{center}
\end{frame}

\begin{frame}
\begin{exampleblock}{YAML}
Le standard YAML a été créé en 2001 et est utilisé dans divers projets.
\end{exampleblock}
Un fichier YAML est formé de:
\begin{itemize}
	\item variables
	\item dictionnaires \textcolor{gray}{(clé/valeur)}
	\item listes
\end{itemize}
\end{frame}

\begin{frame}[fragile]{Les variables}
Déclaration
\begin{lstlisting}[style=shell]
vars:
  base_path: /mon/path
\end{lstlisting}
Accès à la varible
\begin{lstlisting}[style=shell]
{{ base_path }}
\end{lstlisting}
Il est conseillé d'entourer la varible de guillemets
\begin{lstlisting}[style=shell]
app_path: "{{ base_path }}/app"
\end{lstlisting}
Passer les variables en ligne de commande avec l'option
\begin{lstlisting}[style=shell]
--extra-vars "base_path=/mon/path/"
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]{Les dictionnaires}
Les dictionnaires sont définis sous la forme \textit{\texttt{clé: valeur}}.
\begin{lstlisting}[style=bitbake]
# Information sur une personne
 martin:
   nom: Martin Devloper
   travail: Developer
   niveau: Experimente
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]{Les listes}
Les listes sont définies avec \textit{\texttt{-\textcolor{gray}{␣}}}, un tiret suivi d’un espace.
\begin{lstlisting}[style=bitbake]
# Une liste de fruits
 - Pomme
 - Orange
 - Framboise
 - Mangue
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]{Mélanger les syntaxes}
D’autres choses plus complexes sont possibles en mélangeant les différentes syntaxes:
\begin{lstlisting}[style=bitbake]
# Liste de plusieurs employes
- martin:
  nom: Martin D'vloper
  travail: Developer
  competences:
    - python
    - perl

- tabitha:
  nom: Tabitha Bitumen
  travail: Developer
  competences:
    - lisp
    - fortran
\end{lstlisting}
\end{frame}


\begin{frame}[fragile]{Les modules}
Les modules lut par Ansible sont déclaré sous la forme \textit{\texttt{clé: valeur}}.\newline
Voici une liste non exhaustive de types de modules disponibles :
\begin{multicols}{2}
\begin{itemize}
	\item git
	\item patch
	\item get\_url
	\item shell
	\item copy
	\item service
	\item apt
	\item yum
	\item lxc\_container
	\item make
\end{itemize}
\end{multicols}
\end{frame}


\begin{frame}[fragile]{Exemple}
Le module \texttt{git} utilise de sous-options
\begin{lstlisting}[style=bitbake]
# Exemple d'un telechargement de source git
- git:
  repo: 'https://git.yoctoproject.org/git/poky'
  version: krogoth
  dest: /home/user/poky
\end{lstlisting}
D'autres sous-options:
\begin{itemize}
	\item \texttt{update: yes}
	\item \texttt{archive: /path/to/archive.zip}
	\item ...
\end{itemize}
\end{frame}

\begin{frame}[fragile]{Module particulier: hosts}
Ce module est obligatoire.\newline
Il fait référence aux hôtes dans \texttt{/etc/ansible/hosts}.
\begin{lstlisting}[style=bitbake]
- hosts: all
  remote_user: root
\end{lstlisting}
\end{frame}

\subsection{Ansible avec Yocto}

\begin{frame}
\begin{center}
\textcolor{smileOrange}{\huge{Comment utilisé Ansible pour déployer un environnement de développement pour Yocto ?}}
\end{center}
\end{frame}

\begin{frame}[fragile]{Définir l'hôte}
On utilise le \texttt{hosts} local
\begin{lstlisting}[style=bitbake]
- hosts: 127.0.0.1
  connection: local
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]{Répertoire de travail}
Pour centraliser les sources on utilise un variable \texttt{TOP\_SRCDIR}.\newline
Elle sera passé en paramètre de la commande Ansible.
\begin{lstlisting}[style=shell]
--extra-vars "TOP_SRCDIR=<path_to_top_srcdir>"
\end{lstlisting}
Ce qui donnera:
\begin{lstlisting}[style=bitbake]
- name: "Get poky"
  git:
    repo: https://git.yoctoproject.org/git/poky
    version: krogoth
    dest: "{{TOP_SRCDIR}}"
\end{lstlisting}
\end{frame}

\subsection{Exemple complet}
\begin{frame}[fragile]
\begin{lstlisting}[style=bitbake,basicstyle=\tiny\ttfamily\color{white}]
- name: "Mon Projet"
  hosts: 127.0.0.1
  connection: local
  tasks:

  - name: "Get poky"
    git:
      repo: https://git.yoctoproject.org/git/poky
      version: krogoth
      dest: "{{TOP_SRCDIR}}"
      update: no

  - name: "Patch poky krogoth"
    patch:
      src: ../0001-qemu-Add-space-to-fix-concatenated-SRC_URI.patch
      basedir: "{{TOP_SRCDIR}}"
      strip: 1

  - name: "Copy hooks into poky"
    copy:
      src: /path/to/hooks/commit-msg
      dest: "{{TOP_SRCDIR}}/.git/hooks/commit-msg"
      mode: 755

  - name: "Get toolchain"
    get_url:
      url: http://192.168.2.200/src/toolchain/toolchain-M2.1.tgz
      checksum: md5:31a70bd7f7b74724af915a88fbe64f3d
      dest: "{{TOP_SRCDIR}}"

  - name: "Untar toolchain"
    shell: tar xzf {{TOP_SRCDIR}}/toolchain-M2.1.tgz -C {{TOP_SRCDIR}}/sdk/prebuilts/gcc/
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]{Lancer}
Pour lancer le projet:
\begin{lstlisting}[style=shell]
$ ansible-playbook mon-fichier.yml --extra-vars "TOP_SRCDIR=/home/user/mon-projet/"
\end{lstlisting}

\begin{lstlisting}[style=shell,basicstyle=\tiny\ttfamily\color{white}]
$ tree poky
poky/
.
├──  bitbake
├──  build
├──  documentation
├──  LICENSE
├──  meta
├──  meta-poky
├──  meta-selftest
├──  meta-skeleton
├──  meta-yocto
├──  meta-yocto-bsp
├──  oe-init-build-env
├──  oe-init-build-env-memres
├──  README
├──  README.hardware
├──  sdk
├──  scripts
└──  toolchain-M2.1.tgz
\end{lstlisting}
\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{www.ansible.com}
	\item \url{http://fabienlahouderepro.blogspot.fr/2017/03/building-weston-image-with-yocto-for.html}
\end{itemize}
\end{frame}

\begin{frame}
\centering
\textcolor{smileOrange}{\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}
