\documentclass{beamer}   % beamer class
% \usepackage{beamerthemePaloAlto}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{hyperref}   % links
\usepackage{verbatim}   % verbatim environment
\usepackage{fancyvrb}   % better verbatim
\usepackage{color}      % colors
\usepackage{graphics}   % images

\useinnertheme[shadow=true]{rounded}      % use rounded buttons and menus
\useoutertheme[hideothersubsections]{sidebar}   % use sidebar, hide other subsections in sidebar
% \usecolortheme{wolverine}
% \usecolortheme{lily}
% \usecolortheme{seahorse}

\setbeamertemplate{items}[circle]    % use circle in itemize-list
\setbeamertemplate{sections/subsections in toc}[circle]  % use circle for sections and subsection in toc
\setbeamertemplate{navigation symbols}{}  %% do not use navigation symbols

% some color definition:
\definecolor{uu-darkbrown1}{rgb}{0.83,0.68,0.36} 
\definecolor{uu-darkbrown2}{rgb}{0.20,0.11,0.03} 
\definecolor{uu-middlebrown1}{rgb}{0.58,0.39,0.02} 
\definecolor{uu-lightbrown1}{rgb}{0.91,0.83,0.66} 
\definecolor{uu-lightbrown2}{rgb}{1.00,0.92,0.73} 

% set colors:
\setbeamercolor*{sidebar}{fg=black,bg=uu-lightbrown1}
\setbeamercolor*{palette sidebar quaternary}{fg=uu-darkbrown2}

\setbeamercolor*{frametitle}{fg=white,bg=uu-darkbrown1}
\setbeamercolor*{titlelike}{fg=white,bg=uu-darkbrown1}

\setbeamercolor*{section in sidebar}{fg=white,bg=uu-middlebrown1}
\setbeamercolor*{section in sidebar shaded}{fg=uu-middlebrown1}

\setbeamercolor*{subsection in sidebar}{fg=uu-lightbrown2,bg=uu-middlebrown1}
\setbeamercolor*{subsection in sidebar shaded}{fg=uu-middlebrown1}

\setbeamercolor*{section in toc}{fg=uu-middlebrown1}

% \setbeamercolor*{navigation symbols}{fg=uu-darkbrown1}

\setbeamercolor{item}{fg=uu-middlebrown1}
\setbeamercolor{normal text}{fg=uu-darkbrown2}
\setbeamercolor*{itemize item}{fg=uu-darkbrown2}

\logo{\includegraphics[scale=0.5]{uu-logo.png}}   % use ubuntuusers-logo

\title{Eine Einführung ins Kompilieren}
\author{Dominik Wagenführ}
\date{3. März 2007}

\DefineVerbatimEnvironment{CommandBox}{Verbatim}{frame=single,commandchars=\\\{\},formatcom=\tiny}

\begin{document}

\begin{frame}
\titlepage
\tiny{Anmerkung: Diese Folien basieren auf dem Artikel "`\href{http://wiki.ubuntuusers.de/Programme kompilieren}{Programme kompilieren}"' aus dem ubuntuusers-Wiki.}
\end{frame}

\begin{frame}
\frametitle{Übersicht}
\tableofcontents[hideallsubsections]
\end{frame}

\section{Motivation}
\begin{frame}
\frametitle{Motivation}
Wieso sollte man ein Programm kompilieren wollen?

\pause

\begin{itemize}
\item Update-Politik von Canonical (nur Sicherheitsupdates, keine Programmupdates)
\pause
\item fehlerhafte Programme (Beispiel: Beep Media Player)
\pause
\item neue Programme, die nicht in den Quellen existieren
\end{itemize}
\end{frame}

\section{Werkzeuge}
\begin{frame}
\frametitle{Werkzeuge}
Welche Werkzeuge und Programme benötigt man zum Kompilieren?

\pause

\begin{itemize}
\item \textbf{build-essential}: u.a. C- und C++-Compiler
\pause
\item \textbf{checkinstall}: Erstellung von einfachen Paketen
\pause
\item Alternative: \textbf{dh-make} und \textbf{fakeroot}
\end{itemize}
\end{frame}

\section{Der legendäre Dreisatz}
\subsection{Grundlagen}
\begin{frame}[fragile]
\frametitle{Der legendäre Dreisatz - Grundlagen}

Der Standarddreisatz ist:

\begin{CommandBox}
./configure
make
sudo make install
\end{CommandBox}

\pause

Unter Ubuntu besser:

\begin{CommandBox}
./configure
make
sudo checkinstall
\end{CommandBox}

\end{frame}

\subsection{configure}
\begin{frame}[fragile]
\frametitle{Der legendäre Dreisatz - \texttt{configure}}

\texttt{configure} konfiguriert das Programm:

\pause

\begin{itemize}
\item überprüft Installation von Abhängigkeiten
\pause
\item erstellt Makefiles für \texttt{make}
\pause
\item ggf. Optimierung für bestimmte Rechnerarchitekturen
\end{itemize}

\pause

Eine Übersicht aller Optionen gibt es mit
\begin{CommandBox}
./configure --help	
\end{CommandBox}

\pause

Den Installationspfad stellt man z.B. mittels
\begin{CommandBox}
./configure --prefix=/usr/local	
\end{CommandBox}
um.

\end{frame}

\subsection{make}
\begin{frame}
\frametitle{Der legendäre Dreisatz - \texttt{make}}

\texttt{make} kompiliert den Programmcode:

\pause
\begin{itemize}
\item Abarbeitung der Makefiles
\pause
\item in der Regel rekursives Durchlaufen der Verzeichnisse
\pause
\item dauert meistens 'ne kleine Weile ;)
\end{itemize}
\end{frame}

\subsection{checkinstall}
\begin{frame}[fragile]
\frametitle{Der legendäre Dreisatz - \texttt{checkinstall}}

\texttt{sudo checkinstall} erstellt ein Ubuntu-Paket und installiert es.

\pause
\begin{itemize}
\item Die Fragen können meistens alle mit "\textit{Return}" bestätigt werden.
\pause
\item In der Übersicht überprüfen, ob Programmname und Versionsangabe stimmen.
\pause
\item \underline{Wichtig:} Unter Ubuntu Dapper Drake 6.06 LTS ist das Paket fehlerhaft und sollte aus den
\href{http://wiki.ubuntuusers.de/Paketquellen}{Dapper-Backports} aktualisiert werden!
\end{itemize}

\pause

Der Vorteil von \texttt{checkinstall} ist, daß aus so gut wie jedem Installationsskript ein Ubuntu-Paket erstellt werden kann:

\pause

\begin{CommandBox}
sudo checkinstall ./install.sh \pause
sudo checkinstall python ./install.py install	
\end{CommandBox}

\end{frame}

\section{Problem\-lösungen}
\subsection{configure}
\begin{frame}[fragile]
\frametitle{Problemlösungen - \texttt{configure}}

Die meisten Fehlermeldungen erhält man bei \texttt{./configure}.\newline

\pause

Beispiel 1:
\begin{CommandBox}
checking for ALSA... configure: WARNING: Package alsa was not found in the pkg-config
search path. Perhaps you should add the directory containing `alsa.pc' to the
PKG_CONFIG_PATH environment variable
No package 'alsa' found 
\end{CommandBox}

Was ist zu tun?
\pause

\begin{itemize}
\item Es fehlt die Datei \textbf{alsa.pc}.
\pause
\item Paketsuche auf \href{http://packages.ubuntu.com}{http://packages.ubuntu.com}.
\pause
\item Suchfeld ''\textit{Search the contents of packages}'': alsa.pc
\pause
\item Ergebnis: \textbf{libdevel/libasound2-dev}
\pause
\item Das letzte davon ist der gesuchte Paketname: \textbf{libasound2-dev}.
\end{itemize}

\end{frame}

\begin{frame}[fragile]
\frametitle{Problemlösungen - \texttt{configure}}

Die meisten Fehlermeldungen erhält man bei \texttt{./configure}.\newline

Beispiel 2:
\begin{CommandBox}
configure: error: Library requirements (gtk+-2.0 >= 2.4.0 glib-2.0 >= 2.4.0
atk >= 1.0 pango >= 1.0 libglade-2.0 >= 2.4.0) not met; consider adjusting the
PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so
pkg-config can find them.
\end{CommandBox}

Was ist zu tun?
\pause

\begin{itemize}
\item Es fehlen diverse Pakete, z.B \textbf{glib-2.0}.
\pause
\item Man benötigt meist irgendwas mit \textbf{lib} am Anfang und \textbf{-dev} am Ende.
\pause
\item Entweder wieder Paketsuche, diesmal mit ''\textit{Search package directories}'' oder per
\begin{CommandBox}
apt-cache search --names-only libglib 2.0 dev
\end{CommandBox}
\pause
\item Ergebnis:
\begin{CommandBox}
libglib2.0-dev - Development files for the GLib library
\end{CommandBox}
\end{itemize}

\end{frame}

\begin{frame}[fragile]
\frametitle{Problemlösungen - \texttt{configure}}

Die meisten Fehlermeldungen erhält man bei \texttt{./configure}.\newline

Beispiel 3:
\begin{CommandBox}
checking for xmms-config... no
checking for XMMS - version >= 1.2.4... no
configure: WARNING: *** XMMS >= 1.2.4 not installed - please install first *** 
\end{CommandBox}

Was ist zu tun?
\pause

\begin{itemize}
\item Es fehlt das Programm/Paket \textbf{xmms}.
\pause
\item Einfach nachinstallieren. :) Dabei aber auf die korrekte Version achten!
\end{itemize}

\end{frame}

\subsection{make}
\begin{frame}[fragile]
\frametitle{Problemlösungen - \texttt{make}}

\texttt{make} meldet Fehler, wenn \texttt{./configure} fehlt oder schlecht erstellt wurde.\newline

Beispiel 1:
\begin{CommandBox}
/usr/bin/ld: cannot find -lXtst 
\end{CommandBox}

Was ist zu tun?
\pause

\begin{itemize}
\item Der Linker \textbf{ld} vermisst eine Library (Bibliotek) namens \textbf{xtst}.
\pause
\item Suche wieder per Paketsuche oder
\begin{CommandBox}
apt-cache search --names-only lib xtst dev
\end{CommandBox}
\pause
\item Ergebnis:
\begin{CommandBox}
libxtst-dev - X11 Record extension library (development headers)
\end{CommandBox}
\end{itemize}

\end{frame}

\begin{frame}[fragile]
\frametitle{Problemlösungen - \texttt{make}}

\texttt{make} meldet Fehler, wenn \texttt{./configure} fehlt oder schlecht erstellt wurde.\newline

Beispiel 2:

Mehrere Fehlermeldungen und ganz oben

\begin{CommandBox}
dephine.h:27:26: Fehler: ClanLib/core.h: No such file or directory
\end{CommandBox}

Was ist zu tun?
\pause

\begin{itemize}
\item Das Programm vermisst eine Header-Datei \textbf{core.h} im Ordner \textbf{ClanLib} (meist unter \textbf{/usr/include}).
\pause
\item Paketsuche im Suchfeld ''\textit{Search the contents of packages}'': ClanLib/core.h
\pause
\item Ergebnis: \textbf{libdevel/libclanlib-dev}
\end{itemize}

\end{frame}

\subsection{checkinstall}
\begin{frame}[fragile]
\frametitle{Problemlösungen - \texttt{sudo checkinstall}}

sudo checkinstall meldet eigentlich selten Fehler. \pause Wenn doch, sieht man am Ende sowas wie 

\begin{CommandBox}
Installing Debian package... FAILED!
*** Failed to install the package
Do you want to see the log file?  [y]:
\end{CommandBox}

Wenn man Return drückt, liest man...

\end{frame}

\begin{frame}[fragile]
\frametitle{Problemlösungen - \texttt{sudo checkinstall}}

Beispiel 1:

\begin{CommandBox}
dpkg: Fehler beim Bearbeiten von gwenhywfar_2.5.4-1_i386.deb (--install):
 versuche "/usr/share/locale/de/LC_MESSAGES/gwenhywfar.mo" zu überschreiben,
 welches auch in Paket libgwenhywfar-data ist
dpkg-deb: Unterprozess paste getötet mit Signal (Broken pipe) 
\end{CommandBox}

\pause

In dem Fall versucht man ein Paket zu installieren, welches Daten aus einem anderen Paket überschreiben will. Hier muss man
ggf. ein altes Paket vorher erst deinstallieren.

\end{frame}

\begin{frame}[fragile]
\frametitle{Problemlösungen - \texttt{sudo checkinstall}}

Beispiel 2:

\begin{CommandBox}
dpkg: Status-Datenbank-Bereich ist von einem anderen Prozess gesperrt
\end{CommandBox}

\pause

Das kommt dann, wenn man vergessen hat, Synaptic, Adept oder aptitude zu schließen bzw. wenn apt-get noch läuft.
Also Programm schließen nicht vergessen! :)

\end{frame}




\section{Andere Methoden}
\begin{frame}
\frametitle{Andere Methoden zum Kompilieren}

Es gibt noch andere Methoden, ein Programm zu kompilieren bzw. ein Paket zu erstellen:

\begin{itemize}
\item \texttt{./configure}, \texttt{make}, \texttt{checkinstall}
\pause
\item \texttt{dh\_make} und \texttt{fakeroot debian/rules binary}
\pause
\item \texttt{fakeroot apt-get --build source Paketname}
\pause
\item \texttt{dpkg-buildpackage}
\end{itemize}

\end{frame}

\section{Beispiele}
\begin{frame}
\frametitle{Beispiele}

Drei kleine Beispiele zum Testen:
\begin{itemize}
\item<2->Epiphany
\item<3->Blobby Volley 2
\item<4->Pioneers
\end{itemize}
\vspace{0.5cm}

Siehe Terminal. :)
\end{frame}

\section{Abschluss}
\begin{frame}
\frametitle{Abschluss}
\begin{center}

Hinweis:\newline

\begin{Large}
Es ist nicht immer so einfach!	
\end{Large}

\end{center}
\end{frame}

\begin{frame}
\frametitle{Abschluss}
\begin{center}
Vielen Dank für Eure Aufmerksamkeit und bei Fragen stehe ich Euch gerne zur Verfügung! :)
\end{center}
\vspace{2cm}
\tiny{Anmerkung: Dieser Vortrag wurde mit der Beamer-Klasse von {}\LaTeX{} erstellt.}
\end{frame}

	
\end{document}
