\input{configpres}

\lstset{language=c}

\title{ELBE example}
\maketitle


\subsection{What will be done?}

\begin{frame}
\frametitle{Goal}
\begin{itemize}
\item generate an ELBE buildenv
\item generate a software component and manage it with debian tools
\item build own software component inside the ELBE buildenv
\item include own application in target RFS
\item define a stripped target RFS
\end{itemize}
\end{frame}

\subsection{generate a buildenv}

\begin{frame}[fragile]
\frametitle{minimal XML file}
\begin{lstlisting}
<ns0:RootFileSystem
 xmlns:ns0="https://www.linutronix.de/projects/Elbe"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 created="2009-05-20T08:50:56" revision="6"
 xsi:schemaLocation="https://www.linutronix.de/projects/Elbe dbsfed.xsd">
  <project>
    <name>mini xml</name>
    <version>1</version>
    <description>
      optimal to use as buildenv
    </description>
    <buildtype>armel</buildtype>
    <mirror>
      <primary_host>ftp.debian.org</primary_host>
      <primary_path>/debian</primary_path>
      <primary_proto>http</primary_proto>
      <url-list>
        <url>
          <binary>http://debian.linutronix.de/elbe wheezy main</binary>
        </url>
      </url-list>
    </mirror>
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{minimal XML file}
\begin{lstlisting}
    <suite>wheezy</suite>
    <buildimage>
      <kinitrd>elbe-bootstrap</kinitrd>
      <pkg-list>
        <pkg>build-essential</pkg>
        <pkg>debhelper</pkg>
        <pkg>devscripts</pkg>
        <pkg>autotools-dev</pkg>
        <pkg>automake</pkg>
      </pkg-list>
    </buildimage>
  </project>
  <target>
    <hostname>mini</hostname>
    <domain>linutronix</domain>
    <passwd>foo</passwd>
    <finetuning>
    </finetuning>
    <pkg-list>
      <pkg>bash</pkg>
    </pkg-list>
  </target>
</ns0:RootFileSystem>
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{create and build mini.xml}
\begin{lstlisting}
$ elbe create --directory=./buildenv mini.xml
$ cd buildenv
$ make
\end{lstlisting}
\end{frame}

\subsection{build an own application}

\begin{frame}[fragile]
\frametitle{myapp.c}
\begin{lstlisting}
$ mkdir myapp
$ cd myapp
$ $EDITOR myapp.c
\end{lstlisting}
\begin{lstlisting}
#include <stdio.h>
#include <time.h>

int main (int argc, char **argv)
{
    while (1) {
        printf ("Hello ELBE\n");
        sleep (1);
    }

    return 0;
}
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{use autotools}
\begin{lstlisting}
$ $EDITOR Makefile.am
\end{lstlisting}
\begin{lstlisting}
bin_PROGRAMS = myapp
myapp_SOURCES = myapp.c
\end{lstlisting}
\begin{lstlisting}
$ autoscan
$ mv configure.scan configure.ac
$ rm autoscan.log
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle {use autotools}
\begin{lstlisting}
$ $EDITOR configure.ac
\end{lstlisting}
\begin{lstlisting}
#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
AC_INIT([myapp], [1.0], [manut@linutronix.de])
AM_INIT_AUTOMAKE([-Wall -Werror])
AC_CONFIG_SRCDIR([myapp.c])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile])

AC_OUTPUT
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{use autotools}
\begin{lstlisting}
$ touch NEWS README AUTHORS ChangeLog
$ $EDITOR autogen.sh
\end{lstlisting}
\begin{lstlisting}
#!/bin/bash
automake --add-missing
autoreconf -sif
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{use autotools}
\begin{lstlisting}
$ chmod +x autogen.sh
$ ls -lh
insgesamt 12K
-rw-r--r-- 1 local local   0 Jan  7 09:45 AUTHORS
-rwxr-xr-x 1 local local  28 Jan  7 09:24 autogen.sh
-rw-r--r-- 1 local local   0 Jan  7 09:45 ChangeLog
-rw-r--r-- 1 local local 496 Jan  7 09:20 configure.ac
-rw-r--r-- 1 local local  35 Jan  7 09:35 Makefile.am
-rw-r--r-- 1 local local 143 Jan  7 09:18 myapp.c
-rw-r--r-- 1 local local   0 Jan  7 09:45 NEWS
-rw-r--r-- 1 local local   0 Jan  7 09:45 README
# these files may be added to your vcs
$ ./autogen.sh
$ ./configure
$ make
$ ./myapp
Hello ELBE
Hello ELBE
Hello ELBE
^C
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{debianize myapp}
\begin{lstlisting}
$ dh_make -n -p myapp_1.0 -e manut@linutronix.de
$ cd debian
$ rm *.ex *.EX docs README* copyright
$ $EDITOR changelog
\end{lstlisting}
\begin{lstlisting}
myapp (1.0) stable; urgency=low

  * Initial Release.

 -- Manuel Traut <manut@linutronix.de>  Tue, 07 Jan 2014 10:20:20 +0100
\end{lstlisting}
\begin{lstlisting}
$ ls -lh
insgesamt 16K
-rw-r--r-- 1 local local 122 Jan  7 10:20 changelog
-rw-r--r-- 1 local local   2 Jan  7 10:20 compat
-rw-r--r-- 1 local local 517 Jan  7 10:20 control
-rwxr-xr-x 1 local local 135 Jan  7 10:20 rules
drwxr-xr-x 2 local local  19 Jan  7 10:20 source
# these files may be added to your vcs
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{debianize myapp}
\begin{lstlisting}
$ cd ..
$ $EDITOR Makefile.am
\end{lstlisting}
\begin{lstlisting}
bin_PROGRAMS = myapp
myapp_SOURCES = myapp.c

EXTRA_DIST = debian/changelog debian/compat debian/control debian/rules \
  debian/source/format
\end{lstlisting}
\begin{lstlisting}
$ dpkg-buildpackage
$ ls ..
myapp                     myapp_1.0_i386.deb
myapp_1.0.dsc             myapp_1.0.tar.gz
myapp_1.0_i386.changes
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{host myapp in a debian repository}
\begin{lstlisting}
$ cd ..
$ mkdir -p myrepo/conf
$ cd myrepo
$ $EDITOR conf/distributions
\end{lstlisting}
\begin{lstlisting}
Origin: myrepo
Label: myrepo
Suite: stable
Codename: wheezy
Update: - myremoterepo
Version:
Architectures: i386 amd64 source
Components: main
Description: my debian packages
\end{lstlisting}
\begin{lstlisting}
$ $EDITOR conf/updates
\end{lstlisting}
\begin{lstlisting}
Name: myremoterepo
Method: http://localhost/debian
Components: main
Architectures: i386 amd64 armel source
VerifyRelease: blindtrust
IgnoreRelease: yes
\end{lstlisting}
\end{frame}


\begin{frame}[fragile]
\frametitle{host myapp in a debian repository}
\begin{lstlisting}
$ reprepro include wheezy ../myapp_1.0_i386.changes
$ sudo mkdir /var/www/
$ sudo rsync -av --exclude=db --exclude=conf * /var/www/debian/
\end{lstlisting}
\end{frame}


\begin{frame}[fragile]
\frametitle{build debian package inside the buildenv}
\begin{lstlisting}
$ cd ../buildenv
$ make run-con
# login into buildenv
$ echo 'deb-src http://10.0.2.2/debian wheezy main' >> /etc/apt/sources.list
$ apt-get update
$ apt-get source myapp
$ cd myapp-1.0
$ ./autogen.sh
$ dpkg-buildpackage -b
$ scp ../myapp*.changes ../myapp*.deb 10.0.2.2:/tmp
$ dpkg -i ../myapp*.deb
\end{lstlisting}
\end{frame}


\begin{frame}[fragile]
\frametitle{add myapp armel package to the repo}
\begin{lstlisting}
$ cd ../myrepo
$ reprepro include wheezy /tmp/myapp_1.0_armel.changes
$ sudo rsync -av --exclude=db --exclude=conf * /var/www/debian/
\end{lstlisting}
\end{frame}


\subsection{include own application in target RFS}

\begin{frame}[fragile]
\frametitle{create target image and add myapp}
\begin{lstlisting}
$ cd ..
$ $EDIT mini.xml
\end{lstlisting}
\begin{lstlisting}
<ns0:RootFileSystem
 xmlns:ns0="https://www.linutronix.de/projects/Elbe"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 created="2009-05-20T08:50:56" revision="6"
 xsi:schemaLocation="https://www.linutronix.de/projects/Elbe dbsfed.xsd">
  <project>
    <name>mini xml</name>
    <version>1</version>
    <description>
      minimal target rfs including a simple app
      buildenv to build the simple app
    </description>
    <buildtype>armel</buildtype>
    <mirror>
      <primary_host>ftp.debian.org</primary_host>
      <primary_path>/debian</primary_path>
      <primary_proto>http</primary_proto>
      <url-list>
        <url>
          <binary>http://debian.linutronix.de/elbe wheezy main</binary>
        </url>
        <url>
          <binary>http://LOCALMACHINE/debian wheezy main</binary>
          <source>http://LOCALMACHINE/debian wheezy main</source>
        </url>
      </url-list>
    </mirror>
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{create target image and add myapp}
\begin{lstlisting}
    <suite>wheezy</suite>
    <buildimage>
      <kinitrd>elbe-bootstrap</kinitrd>
      <pkg-list>
        <pkg>build-essential</pkg>
        <pkg>debhelper</pkg>
        <pkg>devscripts</pkg>
        <pkg>autotools-dev</pkg>
        <pkg>automake</pkg>
      </pkg-list>
    </buildimage>
  </project>
  <target>
    <hostname>mini</hostname>
    <domain>linutronix</domain>
    <passwd>foo</passwd>
    <finetuning>
      <rm>var/cache/apt/archives/*.deb</rm>
    </finetuning>
    <pkg-list>
      <pkg>bash</pkg>
      <pkg>myapp</pkg>
    </pkg-list>
  </target>
</ns0:RootFileSystem>
\end{lstlisting}
\end{frame}

\subsection{define a striped target RFS}
\begin{frame}[fragile]
\frametitle{set elbe mode and define images}
\begin{lstlisting}
...
  <target>
    <hostname>mini</hostname>
    <domain>linutronix</domain>
    <passwd>foo</passwd>
    <console>ttyAMA0,115200</console>
    <package>
      <tar>
        <name>rootfs.tar.gz</name>
      </tar>
    </package>
    <images>
      <msdoshd>
        <name>my.img</name>
        <size>200MiB</size>
        <partition>
          <size>remain</size>
          <label>rfs</label>
        </partition>
      </msdoshd>
    </images>
    <fstab>
      <bylabel>
        <label>rfs</label>
        <mountpoint>/</mountpoint>
        <fs>
          <type>ext4</type>
          <tune2fs>-i 0</tune2fs>
        </fs>
      </bylabel>
    </fstab>
    <diet />
    <norecommend />
    <finetuning>
      <rm>var/cache/apt/archives/*.deb</rm>
      <command>echo "T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100" &gt;&gt; etc/inittab</command>
    </finetuning>
    <pkg-list>
      <pkg>bash</pkg>
      <pkg>myapp</pkg>
    </pkg-list>
  </target>
\end{lstlisting}
\end{frame}

\begin{frame}[fragile]
\frametitle{build target rfs}
\begin{lstlisting}
$ elbe create mini.xml --directory=./target
$ cd target
$ make

\input{tailpres}
