% $Id$
\documentclass[blends,slideColor,colorBG,pdf,ps2pdf]{prosper}
\usepackage[frenchb]{babel}
\usepackage[T1]{fontenc}
%\usepackage{multicol}
\usepackage{moreverb}


\title{RPM et politique de packaging}
\subtitle{Adapter un rpm à sa distribution}
\author{Olivier Thauvin}
\email{olivier.thauvin@aerov.jussieu.fr}
%%\institution{
%%  \includegraphics*[height=0.3\textheight]{gnutux.eps}
%%}

\NoFrenchBabelItemize

\begin{document}
\maketitle

\part{Introduction}

\begin{slide}{Plan}
\end{slide}

\part{RPM rappel}

\overlays{2}{
\begin{slide}{RPM: Rpm Package Manager}
Qu'est ce ?
\begin{itemize}
    \item un ensemble d'outils
    \item un format d'archive (.rpm)
    \item des fichiers au format rpm
\end{itemize}
\bigskip

\FromSlide{2}
Rôle:
\begin{itemize}
\item installer
\item inventorier
\item controler
%\item faciliter l'installation des logiciels
%\item suivi des version (evr)
%\item assurer que l'environnement est compatible avec le logiciel
%\item assurer l'intégrité du système
\end{itemize}
\end{slide}
}

\begin{slide}{le paquet}
Un fichier .rpm contenant:
\begin{itemize}
\item{entête} les informations sur le rpm
    \begin{itemize}
    \item des informations pratiques sur le logiciel (nom, version, url, \ldots)
    \item sur la fabrication du rpm
    \item une liste de dépendances
    \item la liste des fichiers contenus
    \item l'historique du paquet (changelog)
    \end{itemize}
\item une archive contenant les fichiers 
\end{itemize}
\end{slide}

\begin{slide}{faire un rpm}
\begin{center}
\includegraphics*[height=1\textheight]{rpm-building}
\end{center}
\end{slide}

\begin{slide}{le fichier spec}
Il décrit:
\begin{itemize}
\item le (ou les) rpm(s) produit(s)
\item le moyen de compiler le logiciel
\end{itemize}
\bigskip
Il est composé de sections:
\begin{itemize}
\item En-tête, \%description
\item \%package
\item \%prep, \%build, \%install, \%check
\item \%files
\item \%verify, \%pre, \%preun, \%post, \%postun, \%posttrans, \ldots
\item \%changelog
\end{itemize}
\end{slide}

\begin{slide}{specfile: exemple}
\begin{small}
\verbatiminput{simple.spec}
\bigskip
\begin{verbatim}
$ rpm -ba simple.spec
Ecrit: /home/users/olivier/RPM/SRPMS/simple-1-1.src.rpm
\o/
\end{verbatim}
\end{small}
\end{slide}

\begin{slide}{les macros}
Variable propres à rpm.

Origine:
\begin{tabular}{|l|l|}
\hline
localisation&fournisseur\\
\hline
\hline
fichiers macros systèmes&rpm\\
\hline
fichiers macros systèmes&distribution\\
\hline
\verb+~/.rpmmacros+&utilisateur\\
\hline
fichier spec&packager\\
\hline
\end{tabular}

\bigskip
Elles fournissent des valeurs ou des fonctions.
\end{slide}

\part{Politique: généralité}

\overlays{2}{
\begin{slide}{Pourquoi définir une politique}
\begin{itemize}
\item homogénéité
\item factorisation du travail
\item qualité
\item faciliter le travail
\end{itemize}
\bigskip
Bref, c'est bien (tm)
\bigskip

\FromSlide{2}
Elle doit être:
\begin{itemize}
\item justifiée
\item expliquée
\item discutée
\item documentée
\item approuvée
\end{itemize}
\end{slide}
}

\begin{slide}{Root est méchant}
On ne construit pas sous root,\\
On ne construit pas sous root,\\
Et on ne construit pas sous root.\\
\bigskip

Risques :
\begin{itemize}
\item polluer son système
\item passer à coté d'erreurs
\item compromission, corruption du système
\item c'est impossible sur la machine de compilation finale
\item ça donne des boutons
%\item ça rend impuissant
\end{itemize}
\end{slide}

\begin{slide}{ne pas changer la config}
L'environnement de rpm fourni adapte les rpms les uns aux autres.

On trouve notamment:
\begin{itemize}
\item les chemins par défaut
\item la génération des dépendences
\item post-installation
\end{itemize}
\end{slide}

\begin{slide}{Règles de base résumées}
\begin{itemize}
\item se documenter
\item demander aux gens habitués à faire des packages pour leur distribution
\item comprendre plutôt que contourner
\item un package bien fait pour une distribution est souvent incompatible
avec les autres
\item faire intégrer son paquet dans la distribution
(ça ne vaut pas que pour rpm)
\end{itemize}
\end{slide}

\part{cas concret: Mandriva}

\overlays{2}{
\begin{slide}{Configuration utilisateur}
\begin{itemize}
\item definir son environnement rpm
\item définir le packager tag
\end{itemize}

\FromSlide{2}
.rpmmacros:
\bigskip
\begin{small}
\listinginput[5]{1}{rpmmacros}
\end{small}
\end{slide}
}

\overlays{2}{
\begin{slide}{mkrel}
Problématique des backport:

\begin{tabular}{|l|l|c|l|}
\hline
&cooker&&stable\\
\hline
\hline
sans&1mdv&==&1mdv\\
\hline
avec&1mdk&>&0.1.20060mdk\\
&1mdv2007.0&>&1mdv2006.0\\
\hline
\end{tabular}
\bigskip
\FromSlide{2}

Release: 1mdk

devient:

Release: \%mkrel 1

\end{slide}
}

\begin{slide}{chemin des fichiers}
\begin{itemize}
\item Prefix a une signification particulière, ne pas l'utiliser
\item respecter les emplacements standards
\item préférer les macros
\item /usr/local est réservé aux logiciels installé sans rpm
\end{itemize}
\end{slide}

\begin{slide}{chemin standard}
\bigskip
\begin{small}
\begin{tabular}{|l|l|l|}
\hline
chemin&macro&usage\\
\hline
\hline
/usr&\%\_prefix&chemin général\\
\hline
/etc&\%\_sysconfdir&configuration\\
\hline
/usr/bin&\%\_bindir&application\\
\hline
/usr/sbin&\%\_sbindir&app. pour root\\
\hline
/usr/lib&\%\_libdir&librairies\\
/usr/lib64&&\\
\hline
/usr/share&\%\_datadir&données\\
\hline
/usr/share/man&\%\_mandir&pages de man\\
\hline
\end{tabular}
\end{small}
\end{slide}

\begin{slide}{compilation et installation}
Compilation du soft:

\begin{itemize}
\item utiliser les bonne options (\%optflags)
\item faire attention aux chemins
\item installer les fichiers dans \%buildroot
\end{itemize}
\bigskip
Cas simple avec autotools

{\scriptsize\begin{verbatim}
%build
%configure
%make

%install
%makeinstall_std
\end{verbatim}
}
\end{slide}

\begin{slide}{extraits de spec}
Example d'un cas compliqué:

{\tiny\begin{verbatim}
export CFLAGS="%optflags"
./configure \
    --prefix %_prefix \
    --bindir %_bindir \
    --libdir %_libdir
# parallèle make don't work
make

%install
make install DEST=%buildroot

#installation d'un fichier:
cat > %buildroot%_sysconfdir/%name.cfg <<EOF
blabla
EOF
\end{verbatim}%
}

\end{slide}

\overlays{3}{
\begin{slide}{intégrer les fichiers dans le paquet}
\begin{itemstep}
\item tout les fichiers doivent être listés
\item utiliser les macros
\item les répertoires propres au logiciels doivent être intégrés
\end{itemstep}
\end{slide}
}

\overlays{3}{
\begin{slide}{intégrer les fichiers dans le paquet}
\begin{itemstep}
\item les fichier de configuration ne doivent pas être remplacés

{\scriptsize%
\%config(noreplace) \%\_sysconfdir/foo
}

\item les documentation sont intégrées avec \%doc
{\scriptsize%
\%doc README \ldots
}

\item utiliser \%find\_lang pour les traductions

{\scriptsize%
\%install\\
\%find\_lang \%name\\
\ldots\\
\%files -f \%name.lang\\
}

\end{itemstep}
\end{slide}
}

\begin{slide}{les dépendences}
Pour les paquets binaires: rien à faire en général

Pour les sources:
\begin{itemize}
\item identiques pour toutes les architectures
\item suffisants pour builder les paquets
\item non redondants
\end{itemize}
\bigskip
Exemple:
\begin{verbatim}
BuildRequires: libfoo-devel
\end{verbatim}
\end{slide}

\begin{slide}{libidification}
But:
\begin{itemize}
\item avoir plusieur versions de la librairie\\
Nomage des paquet en utilisant le numéro majeur
\item avoir plusieur architectures\\
Nomage en incluant un prefix
\end{itemize}
\bigskip
{\begin{center}
\scriptsize
\begin{tabular}{|c|c|c|}
\hline
majeur:&0&1\\
\hline
32bits&libfoo0&libfoo1\\
&lib/foo.so.0&lib/foo.so.1\\
\hline
64bits&lib64foo0&lib64foo1\\
&lib64/foo.so.0&lib64/foo.so.1\\
\hline
\end{tabular}
\end{center}
}

\end{slide}

\begin{slide}{libidification: dans la pratique}

\begin{verbatim}
%define major 0
#similar to %_lib%name%major
%define libname %name %major
\end{verbatim}
\ldots
\begin{verbatim}
%package -n %libname
Provide: lib%name = %version-%release
\end{verbatim}
\ldots
\begin{verbatim}
%files -n %libname
%defattr(-, root, root, -)
%_libdir/*.so.*
\end{verbatim}
\end{slide}

\part{conclusion}

\begin{slide}{rpmlint}
Outil pour vérifier que les paquets sont conformes à la politique
\begin{itemize}
\item maintenu par le merveilleux Michaël Scherer
\item disponible sur \url{http://rpmlint.zarb.org/}
\end{itemize}
\bigskip
{\tiny
\begin{verbatim}
$ rpmlint -i rpm-mandriva-setup-1.24-1mdv2007.0.i586.rpm
E: rpm-mandriva-setup no-binary
The package should be of the noarch architecture because it
doesn't contain any binaries.

E: rpm-mandriva-setup only-non-binary-in-usr-lib
There are only non binary files in /usr/lib so they should
be in /usr/share.

\end{verbatim}
}
\end{slide}

\begin{slide}{The End}
Ce document sera là: {\scriptsize\url{http://forge.ipsl.jussieu.fr/docipsl/}}.

Le rpmhowto de mandriva: {\scriptsize\url{http://qa.mandriva.com/twiki/bin/view/Main/RpmHowTo}}.

\bigskip
Merci:
\begin{itemize}
\item Guillaume Rousse
\item Benoit Audouard
\item Eric Villard
\item CNRS/ISPL pour l'hébergement
\end{itemize}

\bigskip
Questions ?

\end{slide}
\end{document}
