\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} mini xml 1 optimal to use as buildenv armel ftp.debian.org /debian http http://debian.linutronix.de/elbe wheezy main \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{minimal XML file} \begin{lstlisting} wheezy elbe-bootstrap build-essential debhelper devscripts autotools-dev automake mini linutronix foo bash \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 #include 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 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} mini xml 1 minimal target rfs including a simple app buildenv to build the simple app armel ftp.debian.org /debian http http://debian.linutronix.de/elbe wheezy main http://LOCALMACHINE/debian wheezy main http://LOCALMACHINE/debian wheezy main \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{create target image and add myapp} \begin{lstlisting} wheezy elbe-bootstrap build-essential debhelper devscripts autotools-dev automake mini linutronix foo var/cache/apt/archives/*.deb bash myapp \end{lstlisting} \end{frame} \subsection{define a striped target RFS} \begin{frame}[fragile] \frametitle{set elbe mode and define images} \begin{lstlisting} ... mini linutronix foo ttyAMA0,115200 rootfs.tar.gz my.img 200MiB remain / ext4 -i 0 var/cache/apt/archives/*.deb echo "T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100" >> etc/inittab bash myapp \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{build target rfs} \begin{lstlisting} $ elbe create mini.xml --directory=./target $ cd target $ make \input{tailpres}