preparing the new emdebian-rootfs source package

git-svn-id: http://emdebian.org/svn/current@5745 563faec7-e20c-0410-992a-a66f704d0ccd
main
codehelp 15 years ago
parent d11580a25f
commit 805d62ee59

@ -0,0 +1,14 @@
all:
install:
clean:
$(RM) *tar.gz.cdbs-config_list
$(RM) *.1 *.3
$(RM) doc/po4a.config
check:
test:

115
README

@ -0,0 +1,115 @@
Emdebian Bootstrapping
======================
Cross-building can get very confusing at times. The confusion only increases
when dealing with a chroot. This document tries to cover some of the reasons,
some of the problems and tries to provide some clarity, at least as far as how
chroots can be used in Emdebian.
There are multiple ways that Emdebian can relate to bootstrapping and chroots.
The most common method of using a chroot within Debian is pbuilder and the
pdebuild wrapper and this is the primary inspiration for using chroots in
Emdebian. Other methods revolve around QEMU or scratchbox and whilst this code
may be able to support such uses later, there are key differences in how and
why this method is separate.
EMDEBIAN PBUILDER CHROOT MODEL
==============================
The Debian pbuilder package exists to ensure package dependencies are complete
and to provide an environment to automate package building on all supported
Debian architectures without cluttering the build machine with every library
and dev package in the entire archive. This is particularly useful when
building GUI packages that can have two dozen dependencies or more. In
Emdebian, this separation between the build system packages and the chroot
packages becomes even more useful because cross-building often involves not
only installing the library and -dev package for the build architecture (e.g.
i386/amd64) but also building and installing the same library and -dev package
(with dependencies) in the TARGET architecture, e.g. arm, with apt-cross and
dpkg-cross. The chaos that could result from trying to upgrade the packages on
an Emdebian buildd system with a duplicate set of cross dependencies is truly
scary.
In the pbuilder model, an Emdebian chroot is the SAME architecture as the
buildd - i386 on i386 etc. This mimics how emdebian-tools normally work.
Packages are then downloaded, patched and cross-built for the target
architecture, just as outside the chroot. This model, the pbuilder model of an
emdebian chroot, concentrates on dependencies rather than the actual
cross-building process. Inside such a chroot, cache files are used as normal to
avoid having to run the cross-compiled code during the build.
The Emdebian chroot is similar in size to a normal Debian pbuilder chroot,
mainly because it is a full build environment, not an installation environment.
This directory contains my experiments with debootstrap, using this pbuilder
model, trying to make a complete Emdebian cross-building environment that can
be compressed to a base.tgz. Changes to the chroot can be discarded, just as
with pbuilder, allowing dependencies to be tested. The main benefit is that
packages can be built without having to install long chains of cross
dependencies via apt-cross or dpkg-cross on the main system. To me, it's the
only way to cross-build GUI suites like GPE against a background of changing
dependencies.
In the pbuilder model, Emdebian builds a chroot for the build architecture
(amd64/i386 etc.) - except that it will run emdebian-tools instead of pbuilder
to create the arm binaries (or whichever architecture is the dpkg-cross
default). I expect the same code to work for arm chroots on amd64 etc, but
mechanisms already exist for those so it's not the priority.
In order to make best use of the existing pbuilder code, these are shell scripts
whereas the rest of emdebian-tools uses perl.
DEPENDENCIES
------------
To emdebianise and cross-build packages, the chroot needs to install
emdebian-tools. This brings in the majority of dependencies to support building
Debian and Emdebian packages. This (current sample) code uses part of the
pbuilder source so that the eventual chroots behave as similarly as possible to
pbuilder and pdebuild in Debian. Therefore, the emdebian pbuilder chroot is NOT
designed or intended to be installed on any embedded device - it is intended for
cross-building packages for Emdebian only. See the SLIND installer for more
information or the emsandbox script in emdebian-tools.
empdebuild depends on pbuilder and installing emdebian-tools within a chroot
causes pbuilder to be installed inside the chroot. Whilst empdebuild and emsandbox
could be split out into a separate package to prevent pbuilder being needed inside
the chroot, there are corner cases where this can be useful providing sufficient
care is taken.
DIFFERENCES TO PBUILDER
-----------------------
1. emdebian-tools handles the 'installaptlines' subroutine.
2. emdebian-tools dependencies handle the installation of build-essential dpkg-dev
and apt that pbuilder normally does separately.
3. emdebian-tools handles the BUILDPLACE via debconf.
4. Other embootstrap options are hardcoded - BUILDRESULT is placed in BUILDPLACE,
APTCACHE also and APTCACHEHARDLINK is set to yes.
5. emdebian-tools provides the emdebianised source package and patches.
EMDEBIAN NATIVE CHROOT MODEL
============================
The same code should also be able to create a native chroot so that the
cross-built packages can be installed alongside each other for more testing.
These chroots have already been tested and instructions exist in the Wiki:
http://wiki.debian.org/EmDebian/CrossDebootstrap
Trying to cross-build inside scratchbox limits you to where scratchbox will
install which is only certain architectures. emdebian-tools is about
cross-building Debian packages using normal Debian tools on a normal Debian
system. Emdebian and emdebian-tools are designed to make building inside
scratchbox redundant because it simply isn't sufficiently flexible. A
scratchbox2 has been mooted but nothing has happened yet.
Cross-build using normal tools (maybe using the chroot as above) and then test
either on a native device or via scratchbox if you really have to.
An Emdebian native chroot would be an arm chroot running on an amd64 system -
indeed it would need to support creation of a chroot *for* any supported Debian
architecture and be able to create and run that chroot *on* any supported
Debian architecture.
This is only the first draft - if there are areas that need further clarification
or updating, please email the debian-embedded mailing list.

146
TODO

@ -0,0 +1,146 @@
TODO for bootstrap / pbuilder config.
(no particular order)
note: pbuilder bug - default mirror does not include deb-src version.
also: gnupg needs the user directory and to be run once for
dpkg-source! :-(
also need apt-get build-dep if using emchain
copy build log and built files out of jail/ before compressing
define parameters - inherit from pbuilderrc
These chroots have already been tested and instructions
exist in the Wiki. http://wiki.debian.org/EmDebian/CrossDebootstrap
dpkg filter to remove unneeded files:
1. /var/lib/dpkg/info/*.symbols
2. /var/lib/dpkg/available-old
3. /var/lib/dpkg/status-old
modify dpkg to drop /var/log/dpkg.log
or simply mount /var/log, /var/cache in RAM.
modify apt to remove unwanted files:
/var/cache/apt/(src)?pkgcache.bin
always run apt-get clean
always drop files in /var/lib/apt/lists/
Split out /usr/share/X11/locale/ (1.3Mb)
Drop /usr/lib/xorg/modules/libscanpci.so (2Mb)
X fails to start without:
/usr/lib/xorg/modules/libpcidata.so
(can the file size be reduced?)
Other candidates may be amongst:
100527
47296 /usr
30674 /usr/lib
29150 /var
25092 /var/cache
25049 /var/cache/apt
24576 /var/cache/apt/pkgcache.bin
18138 /lib
12007 /lib/modules
12005 /lib/modules/2.6.25.2-pxa270
11345 /lib/modules/2.6.25.2-pxa270/kernel
8224 /usr/share
7378 /usr/bin
6897 /lib/modules/2.6.25.2-pxa270/kernel/drivers
5822 /usr/lib/gconv
3747 /usr/lib/xorg
3745 /usr/lib/xorg/modules
3572 /var/lib
3358 /usr/lib/libgtk-x11-2.0.so.0.1200.3
2780 /var/lib/dpkg
2744 /sbin
2709 /lib/modules/2.6.25.2-pxa270/kernel/fs
2414 /usr/share/zoneinfo
2153 /var/lib/dpkg/info
2046 /lib/modules/2.6.25.2-pxa270/kernel/drivers/usb
1799 /lib/modules/2.6.25.2-pxa270/kernel/drivers/media
1733 /usr/share/fonts
1656 /usr/bin/Xorg
1490 /tmp
1430 /usr/share/X11
1381 /usr/share/X11/locale
1288 /lib/modules/2.6.25.2-pxa270/kernel/drivers/net
1179 /usr/lib/libcrypto.so.0.9.8
1160 /usr/share/fonts/X11
1150 /lib/libc-2.7.so
1122 /usr/lib/libxml2.so.2.6.32
1080 /bin
955 /lib/modules/2.6.25.2-pxa270/kernel/drivers/usb/serial
940 /lib/modules/2.6.25.2-pxa270/kernel/drivers/media/dvb
932 /usr/lib/xorg/modules/libpcidata.so
926 /usr/lib/libstdc++.so.6.0.10
913 /lib/modules/2.6.25.2-pxa270/kernel/net
904 /usr/lib/libX11.so.6.2.0
869 /usr/share/zoneinfo/right
846 /lib/modules/2.6.25.2-pxa270/kernel/drivers/media/video
842 /usr/bin/gpg
833 /usr/sbin
821 /usr/lib/libapt-pkg-libc6.6-6.so.4.6.0
755 /var/lib/apt
751 /var/lib/apt/lists
744 /bin/busybox
742 /tmp/bb-1.11
740 /tmp/busybox
740 /tmp/bb-1.11/busybox
731 /var/lib/apt/lists/buildd.emdebian.org_emdebian_dists_unstable_main_binary-arm_Packages
711 /usr/lib/libglib-2.0.so.0.1600.5
685 /lib/modules/2.6.25.2-pxa270/kernel/fs/nls
666 /lib/modules/2.6.25.2-pxa270/kernel/sound
662 /usr/share/zoneinfo/posix
662 /lib/libslang.so.2.1.3
==============================
Balloon todo list
-------------------
Add CONFIG_DISPLAY_TOPPOLY in kernel build.
$ grep perl usr/sbin/*
Binary file usr/sbin/chroot matches
usr/sbin/cleanup-info:#!/usr/bin/perl --
usr/sbin/dpkg-divert:#!/usr/bin/perl --
usr/sbin/dpkg-statoverride:#! /usr/bin/perl
Binary file usr/sbin/fbset matches
usr/sbin/install-info:#!/usr/bin/perl --
usr/sbin/mkboot: bootpart=$(perl -ne 'print $1 if /^\s*boot\s*=\s*(\S*)/' /etc/lilo.conf)
usr/sbin/pam_getenv:#!/usr/bin/perl -w
Binary file usr/sbin/rdate matches
Binary file usr/sbin/udhcpd matches
usr/sbin/update-alternatives:#!/usr/bin/perl --
(debianutils: /usr/sbin/mkboot)
$ grep perl usr/bin/* | grep -v Binary
usr/bin/chkdupexe:#!/usr/bin/perl -w
usr/bin/chkdupexe:# Distribute under gnu copyleft (included in perl package)
usr/bin/chkdupexe:# - Made it possible to run with perl -w
usr/bin/chkdupexe: die "NUTS! Personaly I think your perl or filesystem is broken.\n".
(util-linux)
Kernel command line: noinitrd root=/dev/mtdblock1 init=/linuxrc console=ttyS2,115200 rootfstype=yaffs2 cpufreq=59000-206400 machine_id=00000
balloon3_init_irq: chained handler installed - irq 126 automatically enabled
# grep oknodo /etc/init.d/S*
/etc/init.d/S10udev: if start-stop-daemon --stop --name udevd --quiet --oknodo --retry 5; then
/etc/init.d/S10udev: if start-stop-daemon --stop --name udevd --quiet --oknodo --retry 5; then
/etc/init.d/S10udev: if start-stop-daemon --stop --name udevd --quiet --oknodo --retry 5; then
--retry is also not supported.
mkdir /mnt/sda1
mkdir /mnt/sda2
Add initscripts to get mountpoint for udev.
drop install-info from dpkg

5
debian/changelog vendored

@ -0,0 +1,5 @@
emdebian-rootfs (1.8.0) unstable; urgency=low
* Initial split from emdebian-tools source package.
-- Neil Williams <codehelp@debian.org> Thu, 26 Mar 2009 21:59:13 +0000

1
debian/compat vendored

@ -0,0 +1 @@
5

49
debian/control vendored

@ -0,0 +1,49 @@
Source: emdebian-rootfs
Section: utils
Priority: extra
Maintainer: Neil Williams <codehelp@debian.org>
Uploaders: Wookey <wookey@debian.org>
Build-Depends: cdbs, debhelper (>= 5), po-debconf
Build-Depends-Indep: devscripts, docbook-xsl,
gnupg, libxml2-utils, po4a, xml-core, xsltproc
Standards-Version: 3.8.1
Homepage: http://www.emdebian.org/
Vcs-Browser: http://buildd.emdebian.org/svn/browser/current/
Vcs-Svn: http://buildd.emdebian.org/repos/current/
Package: emdebian-rootfs
Architecture: all
Depends: ${perl:Depends}, ${misc:Depends}, apt, apt-cross (>= 0.5.0),
binutils-multiarch, debootstrap (>= 1.0.4), dpkg-cross (>= 2.1.0),
devscripts, emdebian-archive-keyring, multistrap, pbuilder, sudo, ucf
libparse-debian-packages-perl, libemdebian-tools-perl
Replaces: emdebian-tools (<= 1.4.3)
Suggests: deb-gview, debian-xcontrol, screen | minicom
Description: emdebian root filesystem support
Scripts for preparing root filesystems of Emdebian for specific
machines and variants.
.
Root filesystem tarballs created with emsandbox need minimal
configuration on the embedded device before the first boot.
.
Supports customisation of package selection and of files created
within the root filesystem.
Package: multistrap
Section: admin
Architecture: all
Depends: ${perl:Depends}, ${misc:Depends}, apt,
libconfig-auto-perl, libparse-debian-packages-perl
Replaces: emdebian-rootfs (<= 1.6.0)
Description: multiple repository bootstrap based on apt
debootstrap replacement with multiple repository support
using apt to handle all dependency issues and conflicts.
.
Includes support for foreign architecture multistraps that need
only minimal configuration on the final device. Supports cleaning
up the generated bootstrap filesystem to remove downloaded packages
and hooks to modify the files in the bootstrap filesystem after
the packages have been unpacked but before being configured.
.
Unlike debootstrap, multistrap relies on working versions of
dpkg and apt outside the final filesystem.

35
debian/copyright vendored

@ -0,0 +1,35 @@
This package was downloaded from
http://buildd.emdebian.org/svn/browser/current/host/trunk/emdebian-tools/trunk/
Files: debian/*
Licence: GPL-3+
Copyright: 2006-2007 Neil Williams <codehelp@debian.org>
Files: *
Licence: GPL-3+
Copyright: Copyright 2006-2008 Neil Williams <codehelp@debian.org>
Copyright 2008 Hands.com Ltd <phil@hands.com>
Copyright 2006-2007 Wookey <wookey@debian.org>
Copyright 1998-2006 Craig Small <csmall@debian.org>
Copyright 1999-2003 Julian Gilbey <jdg@debian.org>
Copyright 2002,2003 Colin Walters <walters@debian.org>
Copyright 2001-2006 Junichi Uekawa <dancer@netfort.gr.jp>
Copyright 2001-2005 Anthony Towns <ajt@debian.org>
License:
This package is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
On Debian systems, the complete text of the GNU General
Public License can be found in `/usr/share/common-licenses/GPL-3'.

@ -0,0 +1,18 @@
emsandbox ./usr/sbin
embootstrap ./usr/share/emdebian-tools/
empbuilderlib ./usr/share/emdebian-tools/
emsecondstage ./usr/share/emdebian-tools/
update-rc.d ./usr/share/emdebian-tools/
emrootfslib ./usr/share/emdebian-tools/
emdebian.crossd ./usr/share/emdebian-tools/
emdebian.gtk ./usr/share/emdebian-tools/
emdebian.grip ./usr/share/emdebian-tools/
emdebian.gpe ./usr/share/emdebian-tools/
emdebian.coreutils ./usr/share/emdebian-tools/
doc/man/man1/emsandbox.1 ./usr/share/man/man1/
doc/man/man3/* ./usr/share/man/man3/
examples/packages.conf ./usr/share/emdebian-tools/examples/machine/default/
examples/setup.sh ./usr/share/emdebian-tools/examples/machine/default/
examples/config.sh ./usr/share/emdebian-tools/examples/machine/default/
examples/README ./usr/share/emdebian-tools/examples/
emdebian-rootfs ./etc/bash_completion.d/

@ -0,0 +1,35 @@
#! /bin/sh
# clear out the now unsupported emsandbox conf file.
set -e
case "$1" in
configure)
if [ -f '/etc/emsandbox.conf' ]; then
# Remove the configuration files
if [ -e /usr/bin/ucf ]; then
ucfr --purge emdebian-rootfs /etc/emsandbox.conf
ucf --purge /etc/emsandbox.conf
fi
rm /etc/emsandbox.conf
rm -f /etc/emsandbox.conf.ucf-old
rm -f /etc/emsandbox.conf.ucf-new
rm -f /etc/emsandbox.conf.ucf-dist
fi
;;
remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 1
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
exit 0

@ -0,0 +1,4 @@
em_multistrap ./usr/sbin/
multistrap ./usr/sbin/
doc/man/man1/em_multistrap.1 ./usr/share/man/man1/
bash/multistrap ./etc/bash_completion.d/

@ -0,0 +1 @@
/usr/share/man/man1/em_multistrap.1 /usr/share/man/man1/multistrap.1

16
debian/rules vendored

@ -0,0 +1,16 @@
#!/usr/bin/make -f
# Sample debian/rules that uses cdbs. Originally written by Robert Millan.
# This file is public domain.
include /usr/share/cdbs/1/class/makefile.mk
include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/rules/simple-patchsys.mk
install/emdebian-rootfs::
./doc/genmanpages
po4a --rm-backups doc/po4a.config
clean::
# debconf-updatepo
rm -rf doc/man/man1 doc/man/man3
rm -rf pod2htmd.tmp pod2htmi.tmp

@ -0,0 +1,112 @@
#!/bin/sh
set -e
# Copyright (C) 2006-2009 Neil Williams <codehelp@debian.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
wrap_langs () {
if [ -z "$LANGS" ]; then
echo "$1 $2" >> $CONFIG
else
echo "$1 $2 $3" >> $CONFIG
fi
}
if [ -f po4a.config ]; then
cd ../
fi
if [ -f ../po4a.config ]; then
cd ../../
fi
CONFIG="doc/po4a.config"
# calculate the langs, automatically.
LANGS=`ls po/*.po 2>/dev/null || true`
if [ ! -z "$LANGS" ]; then
LANGS=`ls po/*.po | sed -e 's/.*\/\(.*\)\.po/\1 /' || true`
fi
if [ ! -z "$LANGS" ]; then
# LANGS should not include the specification, just the root.
LANGS=`echo $LANGS | sed -e 's/_.*//'`
LANGS=`echo $LANGS | sed -e 's/@.*//'`
LANGS=`echo $LANGS | sed -e 's/\+.*//'`
echo "[po4a_langs] $LANGS" > $CONFIG
else
echo > $CONFIG
fi
wrap_langs "[po4a_paths]" "po/emdebian-rootfs.pot" "\$lang:po/\$lang.po"
# need to determine directory for the target package.
# rootfs only has empbuilderlib.3, emrootfslib.3 and emsandbox.1
for l in $LANGS; do
mkdir -p doc/html/$l/
mkdir -p doc/man/$l/man1/
mkdir -p doc/man/$l/man3/
done
mkdir -p doc/html/
mkdir -p doc/man/man3/
mkdir -p doc/man/man1/
echo "Checking emrootfslib for POSIX compatibility"
# doesn't expect a shell library, hence nuisance message
# about interpreter that just needs to be ignored.
checkbashisms emrootfslib
echo "Processing Docbook XML . . . "
for file in `ls doc/xml/*.xml`; do
xmllint --format "$file" --output "$file"
LOCAL=`basename $file`
wrap_langs "[type:xml]" "$file" "\$lang:doc/xml/\$lang/$LOCAL"
done
echo "Processing POD . . ."
# rootfs
for file in em_multistrap; do
pod2html -outfile doc/html/$file.html -title $file < $file
pod2man $file > doc/man/man1/$file.1
wrap_langs "[type: pod]" "$file" "\$lang:doc/pod/\$lang/$file"
done
echo "Refreshing POT file for translators"
# use -k to create all XML even if untranslated or the XSL breaks the build.
po4a -k 0 $CONFIG
# just make sure the XML catalog is available for XSL.
# never go to the internet for build config, use -nonet.
XML_CATALOG_FILES="/etc/xml/catalog" \
xsltproc -o doc/man/ -''-nonet http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl doc/xml/emdebian-rootfs.1.xml
mv doc/man/empbuilderlib.3 doc/man/man3/empbuilderlib.3
mv doc/man/emrootfslib.3 doc/man/man3/emrootfslib.3
mv doc/man/emsandbox.1 doc/man/man1/emsandbox.1
mv doc/man/*.1 doc/man/man1/
#mv doc/man/*.3 doc/man/man3/
for l in $LANGS; do
mkdir -p doc/man/$l/man3/
mkdir -p doc/man/$l/man1/
mv doc/man/$l/empbuilderlib.3 doc/man/$l/man3/empbuilderlib.3
mv doc/man/$l/emsandbox.1 doc/man/$l/man1/emsandbox.1
mv doc/man/$l/*.1 doc/man/$l/man1/
done
# never go to the internet for build config, use -nonet.
xsltproc -o doc/html/ -nonet http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl doc/xml/emdebian-rootfs.1.xml
for i in `ls doc/html/*.html`; do
iconv -t utf-8 -f iso8859-1 $i > doc/html/tmp
sed < doc/html/tmp > $i -e 's:charset=ISO-8859-1:charset=UTF-8:'
done
rm -f doc/html/tmp
rm -f pod2htmd.tmp
rm -f pod2htmi.tmp
rm -rf doc/pod/

@ -0,0 +1,145 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
<!ENTITY empdebuild SYSTEM "empdebuild.1.xml">
<!ENTITY emsandbox SYSTEM "emsandbox.1.xml">
<!ENTITY empbuilderlib SYSTEM "empbuilderlib.3.xml">
<!ENTITY emrootfslib SYSTEM "emrootfslib.3.xml">
]>
<book label="Index" status="1.8.0">
<bookinfo>
<title>emdebian-rootfs</title>
<date>Sun 11 Jan 2009 19:55:45 GMT</date>
<releaseinfo>Release: 1.8.0</releaseinfo>
<orgname>Emdebian</orgname>
<author>
<firstname>Neil</firstname>
<surname>Williams</surname>
</author>
<legalnotice id="GPL">
<title>The GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</title>
<para>This documentation is part of emdebian-tools.</para>
<para>emdebian-tools is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.</para>
<para>This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.</para>
<para>You should have received a copy of the GNU General Public License
along with this program. If not, see
<ulink url="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</ulink>.
</para>
<note>
<para>In Debian you can find a copy of the GNU General
Public Licence in <filename>/usr/share/common-licenses/GPL-3</filename></para>
</note>
</legalnotice>
</bookinfo>
<preface id="preface">
<title>Emdebian Tools Reference</title>
<formalpara>
<title>Purpose</title>
<para>This documentation consists primarily of the manpages for <emphasis>emdebian-tools</emphasis>
but also contains useful references and links to further reading on a variety of topics related
to Emdebian and cross building. It is intended to be read alongside the
<ulink url="http://www.emdebian.org/">Emdebian website</ulink> and
<ulink url="http://wiki.debian.org/Embedded_Debian">Emdebian Wiki</ulink>.
</para>
</formalpara>
<para>Some scripts embed the manpage content in the perl script as pod content. These manpages
are listed separately in the HTML versions.
</para>
</preface>
<chapter label="1" id="manpages"><title>Emdebian Tools manpages</title>
&empdebuild;
&emsandbox;
&empbuilderlib;
&emrootfslib;
</chapter>
<chapter label="2" id="others">
<title>Other manpages and external links</title>
<para>These manpages are generated from perl instead of XML and are not currently listed
in the main table of contents. The HTML version is hosted separately:
</para>
<refsect1 id="compare">
<title>Debian::Packages::Compare</title>
<para><ulink url="DebianPackagesCompare.html">Debian::Packages::Compare</ulink>
manpage.</para>
</refsect1>
<refsect1 id="dh_gentdeb">
<title>dh_gentdeb</title>
<para><ulink url="dh_gentdeb.html">dh_gentdeb</ulink> manpage.</para>
</refsect1>
<refsect1 id="dpkg-gentdeb">
<title>dpkg-gentdeb</title>
<para><ulink url="dpkg-gentdeb.html">dpkg-gentdeb</ulink> manpage.</para>
</refsect1>
<refsect1 id="emtargetcmp">
<title>emtargetcmp</title>
<para><ulink url="emtargetcmp.html">emtargetcmp</ulink> manpage</para>
</refsect1>
<refsect1 id="emprunecross">
<title>emprunecross</title>
<para><ulink url="emprunecross.html">emprunecross</ulink> manpage</para>
</refsect1>
<refsect1 id="module">
<title>Emdebian::Tools</title>
<para><ulink url="EmdebianTools.html">Emdebian::Tools</ulink> function
reference.
</para>
</refsect1>
<refsect1 id="eminstalltdeb">
<title>em_installtdeb</title>
<para><ulink url="em_installtdeb.html">em_installtdeb</ulink> manpage</para>
</refsect1>
<refsect1 id="emrecent">
<title>emrecent</title>
<para><ulink url="emrecent.html">emrecent</ulink> manpage</para>
</refsect1>
<refsect1 id="emgrip">
<title>emgrip</title>
<para><ulink url="emgrip.html">emgrip</ulink> manpage</para>
</refsect1>
<refsect1 id="em_autogrip">
<title>em_autogrip</title>
<para><ulink url="em_autogrip.html">em_autogrip</ulink> manpage</para>
</refsect1>
<refsect1 id="emdebcheck">
<title>emdebcheck</title>
<para><ulink url="emdebcheck.html">emdebcheck</ulink> manpage</para>
</refsect1>
<refsect1 id="emcache">
<title>emcache</title>
<para><ulink url="emcache.html">emcache</ulink> manpage</para>
</refsect1>
<refsect1 id="emdepends">
<title>emdepends</title>
<para><ulink url="emdepends.html">emdepends</ulink> manpage</para>
</refsect1>
<refsect1 id="splitout_tdeb">
<title>splitout_tdeb</title>
<para><ulink url="splitout_tdeb.html">dplitout_tdeb</ulink> manpage.</para>
</refsect1>
<refsect1>
<title>WWW references</title>
<itemizedlist>
<listitem>
<para>
<ulink url="http://www.emdebian.org/">Emdebian.org website</ulink>
</para>
</listitem>
<listitem>
<para>
<ulink url="http://www.linux.codehelp.co.uk/emdebian/depends.html">Emdebian dependency maps</ulink>
</para>
</listitem>
<listitem>
<para>
<ulink url="http://www.linux.codehelp.co.uk/emdebian/">Emdebian presentation</ulink>
</para>
</listitem>
</itemizedlist>
</refsect1>
</chapter>
</book>

@ -0,0 +1,77 @@
<?xml version="1.0" encoding="UTF-8"?>
<refentry id="empbuilderlib">
<refentryinfo>
<productname>empbuilderlib</productname>
<productnumber/>
</refentryinfo>
<refmeta>
<refentrytitle>empbuilderlib</refentrytitle>
<manvolnum>3</manvolnum>
<refmiscinfo class="source">EMDEBIAN-ROOTFS</refmiscinfo>
<refmiscinfo class="manual">EMDEBIAN-ROOTFS</refmiscinfo>
</refmeta>
<refnamediv id="name">
<refname>empbuilderlib</refname>
<refpurpose>Common functions for Emdebian chroots</refpurpose>
</refnamediv>
<refsect1 id="description">
<title>DESCRIPTION</title>
<para><emphasis>empbuilderlib</emphasis> is intended solely for use on
the build machine. Do not use these functions in second_stage_install !
<emphasis>empbuilderlib</emphasis> requires <emphasis role="bold">perl</emphasis>!
</para>
<para><emphasis>empbuilderlib</emphasis> is a shell library which
requires perl and pbuilder (which means bash!).
<emphasis>empbuilderlib</emphasis> draws in POSIX shell functions
from emrootfslib to be able to call in functions from
first_stage_install within debootstrap. The only reasons to continue
putting new functions in here are if:</para>
<orderedlist>
<listitem>
<para>The functions are only useful to create cross-building chroots OR</para>
</listitem>
<listitem>
<para>the functions need to call pbuilder code directly and are not
necessary within first_stage_install.
</para>
</listitem>
</orderedlist>
<para>There should be no need to call pbuilder code within scripts that
generate a root filesystem.</para>
</refsect1>
<refsect1 id="autoclean_aptcache">
<title>autoclean_aptcache</title>
<para>Same as the pbuilder option but run by default in <command>empdebuild</command>
to remove obsolete .deb archives from the apt cache directories used by
<command>empdebuild</command>.
</para>
</refsect1>
<refsect1 id="copy_host_configuration">
<title>copy_host_configuration</title>
<para>Copy hosts, hostname and resolv.conf from the system /etc/
directory and adapts /etc/hostname to use a different
name (emdebian-$ARCH).
</para>
</refsect1>
<refsect1 id="extractembuildplace">
<title>extractembuildplace</title>
<para>Modified version of the equivalent function in pbuilder-modules
to extract the compressed chroot (used by empdebuild).</para>
</refsect1>
<refsect1>
<title>Author</title>
<para><emphasis>empbuilderlib</emphasis> was written
by Neil Williams <email>codehelp@debian.org</email>.
</para>
<para>This manual page was written by Neil Williams
<email>codehelp@debian.org</email>
</para>
</refsect1>
<refsect1 id="seealso">
<title>SEE ALSO</title>
<para>See also <filename>apt-cross</filename> (1),
<filename>dpkg-cross</filename> (1), <emphasis>emdebian-tools</emphasis> (1),
<filename>emrootfslib</filename> (3).
</para>
</refsect1>
</refentry>

@ -0,0 +1,347 @@
<?xml version="1.0" encoding="UTF-8"?>
<refentry id="empdebuild">
<refentryinfo>
<productname>empdebuild</productname>
<productnumber/>
</refentryinfo>
<refmeta>
<refentrytitle>empdebuild</refentrytitle>
<manvolnum>1</manvolnum>
<refmiscinfo class="source">EMDEBIAN-TOOLS</refmiscinfo>
<refmiscinfo class="manual">EMDEBIAN-TOOLS</refmiscinfo>
</refmeta>
<refnamediv id="name">
<refname>empdebuild</refname>
<refpurpose>chroot tool for Emdebian cross compiling</refpurpose>
</refnamediv>
<refsynopsisdiv>
<cmdsynopsis>
<command>empdebuild</command>
<group>
<arg>-a</arg>
<arg>--arch </arg>
<replaceable> ARCHITECTURE</replaceable>
</group>
<group>
<arg>--testing</arg>
</group>
<group>
<arg>--login-after-fail</arg>
</group>
<group>
<arg>--build</arg>
<arg>build</arg>
</group>
</cmdsynopsis>
<cmdsynopsis>
<command>empdebuild</command>
<group>
<arg>-a</arg>
<arg>--arch </arg>
<replaceable> ARCHITECTURE</replaceable>
</group>
<group>
<arg>--testing</arg>
</group>
<group>
<arg>--create</arg>
<arg>create</arg>
</group>
</cmdsynopsis>
<cmdsynopsis>
<command>empdebuild</command>
<group>
<arg>-a</arg>
<arg>--arch </arg>
<replaceable> ARCHITECTURE</replaceable>
</group>
<group>
<arg>--testing</arg>
</group>
<group>
<arg>--save-after-login</arg>
</group>
<group>
<arg>--login</arg>
<arg>login </arg>
</group>
</cmdsynopsis>
<cmdsynopsis>
<command>empdebuild</command>
<group>
<arg>-a</arg>
<arg>--arch </arg>
<replaceable> ARCHITECTURE</replaceable>
</group>
<group>
<arg>--testing</arg>
</group>
<group>
<arg>--update</arg>
<arg>update</arg>
</group>
</cmdsynopsis>
<cmdsynopsis>
<command>empdebuild</command>
<group>
<arg>-a</arg>
<arg>--arch </arg>
<replaceable> ARCHITECTURE</replaceable>
</group>
<group>
<arg>--login-after-fail</arg>
</group>
<group>
<arg>--autobuild</arg>
<arg>autobuild</arg>
</group>
</cmdsynopsis>
<cmdsynopsis>
<command>empdebuild</command>
<group>
<arg>-a</arg>
<arg>--arch </arg>
<replaceable> ARCHITECTURE</replaceable>
</group>
<group>
<arg>--clean</arg>
<arg>clean</arg>
</group>
</cmdsynopsis>
</refsynopsisdiv>
<refsect1 id="description">
<title>DESCRIPTION</title>
<para>Note that <command>empdebuild</command> does not support all the
options available to <command>pbuilder</command>.
</para>
<para><command>empdebuild</command> is an Emdebian version of pdebuild, building
Emdebian packages in a chroot using code from pbuilder. The Emdebian chroot includes the
cross-building toolchain from Emdebian for the requested architecture and includes
support for installing cross versions of package dependencies via
<command>apt-cross</command> with all the advantages of a chroot - identification of
missing dependencies and the ability to build packages without installing the dependencies
on the main system, e.g. to support a buildd.
</para>
<note>
<title>empdebuild is a build chroot</title>
<para><command>empdebuild</command> creates a chroot for the same architecture as
the system running <command>empdebuild</command> and then installs a cross-building
toolchain from Emdebian using the <command>dpkg-cross</command> default
architecture or the specified architecture. This has some important results:
</para>
<orderedlist>
<listitem>
<para>The chroot is a Debian system running <filename>emdebian-tools</filename>
and is equivalent to a typical installation of emdebian-tools
<emphasis>after</emphasis> <command>emsetup</command> has been completed
successfully. This includes installing perl and debconf inside the chroot.
</para>
</listitem>
<listitem>
<para>A suitable Emdebian toolchain will be installed in the chroot.
</para>
</listitem>
<listitem>
<para>The same cache files are needed inside the chroot as would be needed on the
main system - cross-built binaries <emphasis role="bold">cannot</emphasis> be run
within the the chroot. All the normal emdebian patch files will be needed.
</para>
</listitem>
<listitem>
<para>This is a full build system with native and cross compilers, development
packages, autotools and subversion. It is <emphasis role="bold">NOT</emphasis>
suitable for installation on any device. Use <command>emsandbox</command>
instead.
</para>
</listitem>
<listitem>
<para>The chroot disables the installation of recommended packages by
apt using the Install-Recommends "false" option.
</para>
</listitem>
</orderedlist>
</note>
<para>Use <command>emsandbox</command> to create cross chroots (where the
chroot is built for a different architecture to the system running the chroot),
e.g. to prepare a rootfs for installation on an arm device using emdebian-tools
installed on i386, amd64 etc. See <command>emsandbox</command> (1).
</para>
</refsect1>
<refsect1 id="commands">
<title>COMMANDS</title>
<para>Options for <command>dpkg-buildpackage</command> can be given
after the <option>--</option> option. The default options are
<option>-uc -us</option> which cannot be overridden. Also certain
commands do not make sense in this context,
e.g. <option>-a</option> for architecture will be silently dropped.
</para>
<variablelist remap="TP">
<varlistentry>
<term><option>--build</option>|<option>build</option></term>
<listitem>
<para>(to provide) similar functionality to pdebuild for Emdebian -
copies the source into the chroot and runs a build using
<command>emdebuild</command>.
</para>
<para>Use <option>--login-after-fail</option> to debug a failed build.
If <command>emdebuild</command> fails inside the chroot,
<command>empdebuild</command> will then open a shell at the point
of failure, allowing you to debug the build session with the active data.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--create</option>|<option>create</option></term>
<listitem>
<para>Runs <command>debootstrap</command> with a modified suite rule
set to create a basic Emdebian environment, including emdebian-tools and
an Emdebian toolchain for the default or specified architecture.
</para>
<para>Checks for an existing chroot and exits if one is found - either use
<option>--update</option> or move the old chroot out of the way.
</para>
<para>If <option>--create</option> fails after debootstrap has
completed, <option>--update</option> should be able to recover
and create the necessary tarball.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--login</option>|<option>login</option></term>
<listitem>
<para>Login to the chroot. Unless <option>--save-after-login</option> is used,
changes made within the chroot will be lost.
</para>
<para>When setting up any chroot, debconf is set to use the default values
and this leads to <command>dpkg-cross</command> being set to
<userinput>None</userinput> as the default cross building architecture.
When logged into the chroot, always specify the <option>--arch</option>
option to <command>apt-cross</command> and all
<emphasis>emdebian-tools</emphasis> scripts.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--update</option>|<option>update</option></term>
<listitem>
<para>Updates the Emdebian environment, including emdebian-tools and
an Emdebian toolchain for the default or specified architecture. Depending on
the status of gcc-?.? in Debian, there can be problems updating the cross
building toolchain at this stage. If you get reports of broken packages
or toolchain packages that fail to install, allow the update to continue as
normal, then login to the chroot with the <option>--save-after-login</option>
option. If the problem relates to a package named <filename>$PACKAGE-$ARCH-cross</filename>
not <filename>$PACKAGE-$ARCHTYPE</filename> ($ARCHTYPE for arm = arm-linux-gnu), this
package is handled by <command>dpkg-cross</command> and <command>apt-cross</command>.
Use <command>apt-cross -a $ARCH -v -i $PACKAGE</command> (omit the -$ARCH-cross suffix)
to update such packages ahead of the Emdebian repository. Use
<command>apt-get dist-upgrade</command> and <command>emsetup -a $ARCH --yes</command>
to complete the upgrade. Type 'exit' or use 'Ctrl-D' to exit from the chroot and
the updated packages will be saved alongside the updated chroot.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--clean</option>|<option>clean</option></term>
<listitem>
<para>Uses pbuilder functions to clean the chroot build place,
removing any previous build environments. In some situations, a stale
build environment may still contain active mounts for
<computeroutput>proc</computeroutput> or <computeroutput>dev/pts</computeroutput>
and these will result in <emphasis>Device or resource busy</emphasis> errors.
To umount the relevant points, look for your Emdebian working directory being
listed in the output of <computeroutput>mount</computeroutput> and pass that
directory name to:
<programlisting>
$ sudo umount PATH
</programlisting>
Once umounted, either remove the files manually or run <command>sudo empdebuild</command>
<option>--clean</option> again.
</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 id="options">
<title>OPTIONS</title>
<variablelist remap="TP">
<varlistentry>
<term><option>-a</option>|<option>--arch</option><replaceable> ARCHITECTURE</replaceable></term>
<listitem>
<para>Override the <command>dpkg-cross</command> default architecture
for this operation on the chroot. The Emdebian toolchain in the chroot
will be upgraded (or installed if the chroot contains a toolchain for a
different architecture).
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<option>--testing</option>
</term>
<listitem>
<para>Create, update, login or build a package within a chroot based on
Debian testing, not Debian unstable. This is a fallback option for the times
when Debian unstable transitions make it impossible to install a cross-building
toolchain or update the existing toolchain.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<option>--save-after-login</option>
</term>
<listitem>
<para>Login to the chroot and allow changes made within the chroot to persist
into subsequent sessions. Only supported in conjunction with
<option>login</option>|<option>--login</option>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<option>--login-after-fail</option>
</term>
<listitem>
<para>Login to the chroot if <command>emdebuild</command> fails
within the chroot, at the point where the build failed. Chroot cross builds
can involve a protracted setup phase which can be hard to replicate
outside the chroot. Use this option to find out why a chroot build failed
when a normal build succeeded. Only supported in conjunction with
<option>build</option>|<option>--build</option>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-h</option>|<option>--help</option></term>
<listitem>
<para>print the usage message and exit.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<option>--version</option>
</term>
<listitem>
<para>print the usage message and exit.</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1>
<title>Author</title>
<para><command>empdebuild</command> was written
by Neil Williams <email>codehelp@debian.org</email>.
</para>
<para>This manual page was written by Neil Williams
<email>codehelp@debian.org</email>
</para>
</refsect1>
<refsect1 id="seealso">
<title>SEE ALSO</title>
<para>See also <filename>apt-cross</filename> (1), <filename>em_make</filename> (1),
<filename>dpkg-cross</filename> (1), <emphasis>emdebian-tools</emphasis> (1),
<filename>emsandbox</filename> (1).
</para>
</refsect1>
</refentry>

@ -0,0 +1,214 @@
<?xml version="1.0" encoding="UTF-8"?>
<refentry id="emrootfslib">
<refentryinfo>
<productname>emrootfslib</productname>
<productnumber/>
</refentryinfo>
<refmeta>
<refentrytitle>emrootfslib</refentrytitle>
<manvolnum>3</manvolnum>
<refmiscinfo class="source">EMDEBIAN-ROOTFS</refmiscinfo>
<refmiscinfo class="manual">EMDEBIAN-ROOTFS</refmiscinfo>
</refmeta>
<refnamediv id="name">
<refname>emrootfslib</refname>
<refpurpose>Common functions for Emdebian root filesystems</refpurpose>
</refnamediv>
<refsect1 id="description">
<title>DESCRIPTION</title>
<para><emphasis>emrootfslib</emphasis> is intended solely for use on
the build machine. Do not use these functions in second_stage_install !
<emphasis>emrootfslib</emphasis> requires <emphasis role="bold">perl</emphasis>!
</para>
<para>There should be no need to call pbuilder code within scripts that
generate a root filesystem and bash code must not be used in
<emphasis>emrootfslib</emphasis>.</para>
</refsect1>
<refsect1 id="basic_etc_fstab">
<title>basic_etc_fstab</title>
<para>Removing packages from the normal Debian debootstrap set can
mean that certain critical files can be omitted. basic_etc_fstab
creates a basic version of $TARGET/etc/fstab where it does not
already exist.
</para>
</refsect1>
<refsect1 id="basic_group_setup">
<title>basic_group_setup</title>
<para>Removing packages from the normal Debian debootstrap set can
mean that certain critical files can be omitted. basic_group_setup
creates a basic version of $TARGET/etc/group where it does not
already exist.
</para>
</refsect1>
<refsect1 id="basic_passwd_setup">
<title>basic_passwd_setup</title>
<para>Removing packages from the normal Debian debootstrap set can
mean that certain critical files can be omitted. basic_passwd_setup
creates a basic version of $TARGET/etc/passwd where it does not
already exist.
</para>
</refsect1>
<refsect1 id="busybox_inittab">
<title>busybox_inittab</title>
<para>Note: this function overwrites an existing $TARGET/etc/inittab
</para>
<para>busybox does not support runlevels and so the /etc/inittab
file needs to be modified to support busybox. Currently, this function
overwrites an existing $TARGET/etc/inittab - this is likely to change
in future versions.
</para>
</refsect1>
<refsect1 id="busybox_rcS">
<title>busybox_rcS</title>
<para>Note: this function overwrites an existing $TARGET/etc/init.d/rcS
</para>
<para>busybox does not support runlevels and so the /etc/init.d/rcS
script needs to be modified to support busybox. Currently, this function
overwrites an existing $TARGET/etc/init.d/rcS - this is likely to change
in future versions.
</para>
</refsect1>
<refsect1 id="check_dirs">
<title>check_dirs</title>
<para>Check that the $BUILDPLACE, $BUILDRESULT and $APTCACHE directories
exist (used by empdebuild).</para>
</refsect1>
<refsect1 id="checkarch">
<title>checkarch</title>
<para>Calls check_arch from Debian::DpkgCross using perl.
The perl call dies if the specified string does not match a
supported architecture.</para>
</refsect1>
<refsect1 id="create_emdebiantgz">
<title>create_emdebiantgz</title>
<para>Modified version of the equivalent function in pbuilder-modules
to extract the compressed chroot (used by empdebuild).</para>
</refsect1>
<refsect1 id="disable_apt_recommends">
<title>disable_apt_recommends</title>
<para>Enforces a default of not installing recommended packages inside the
chroot.
</para>
</refsect1>
<refsect1 id="extra_etc_rcd">
<title>extra_etc_rcd</title>
<para>Removing packages from the normal Debian debootstrap set can
mean that certain critical files can be omitted. extra_etc_rcd
creates a basic version of $TARGET/etc/rcS.d where it does not
already exist.
</para>
</refsect1>
<refsect1 id="make_dpkg_dirs">
<title>make_dpkg_dirs</title>
<para>Prepare for unpacking and general dpkg work by setting up
$TARGET/var/lib/dpkg/status and $TARGET/var/lib/dpkg/available.
</para>
</refsect1>
<refsect1 id="prepare_proc">
<title>prepare_proc</title>
<para>Ensure that $TARGET/proc and $TARGET/sys exist so that
proc and sys can be mounted automatically.
</para>
</refsect1>
<refsect1 id="prepare_var">
<title>prepare_var</title>
<para>Ensure that $TARGET/var/log/ and $TARGET/var/spool exist so
that various installation routines can proceed.
</para>
</refsect1>
<refsect1 id="set_approx_time">
<title>set_approx_time</title>
<para>Normal Debian installations have a network connection and
typical Debian desktop boxes also have a backup battery. Some
embedded machines do not have either of these systems, making
it impossible to store or retrieve even a vaguely close indication
of the current time.
</para>
<para>set_approx_time uses the systems available on the build
machine to store an approximate indication of the time that the
root filesystem was created and write that time to a file in the
root filesystem itself. For most purposes, this is sufficient for
the purposes of setting up the root filesystem to the point where
a network connection can be created and a call can be made to an
internet clock using <command>ntpdate-debian</command>.
</para>
</refsect1>
<refsect1 id="set_cdebconf_default">
<title>set_cdebconf_default</title>
<para>Adds "export DEBCONF_USE_CDEBCONF=true" to
$TARGET/etc/profile for cdebconf support.
</para>
</refsect1>
<refsect1 id="symlink_rcS">
<title>symlink_rcS</title>
<para>Call repeatedly to create init symlinks, using the template
$TARGET/etc/rcS.d/S$number$file
</para>
<variablelist remap="TP">
<varlistentry>
<term>
<option>file</option>
</term>
<listitem>
<para>file is the filename in $TARGET/etc/init.d/
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<option>number</option>
</term>
<listitem>
<para>number is the number for the link in the init sequence.
</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 id="unpack_debootstrap">
<title>unpack_debootstrap</title>
<para>Specialized routine that replaces the normal second stage of
debootstrap (you may consider it a series of hacks if you prefer).
unpack uses dpkg to extract the files from the .deb package and
process the control information. Unlike <command>dpkg</command>
<option>--unpack</option>, the unpack routine does
<emphasis role="bold">NOT</emphasis> run any maintainer scripts which
would inevitably fail in a cross built environment.
Instead, it updates the relevant dpkg status and database files
in the root filesystem and leaves the package in the unpacked state.
</para>
<para>unpack_debootstrap also sets up the busybox applets - future
versions may split this functionality into a separate function.
</para>
<para>unpack_debootstrap also performs checks on /usr/sbin/invoke-rc.d
and /usr/sbin/update-rc.d - future versions may split this functionality
into a separate function.
</para>
<para>Finally, unpack_debootstrap removes all .deb package files
from /var/cache/apt/archives. The remaining task (dpkg --configure -a)
is performed via emsecondstage.</para>
</refsect1>
<refsect1 id="x_feign_install">
<title>x_feign_install</title>
<para>Copied from debootstrap suite scripts to make a basic
installation of a .deb package - although this is the basis of
unpack_debootstrap, it is only really used for dpkg itself.
</para>
</refsect1>
<refsect1>
<title>Author</title>
<para><emphasis>empbuilderlib</emphasis> was written
by Neil Williams <email>codehelp@debian.org</email>.
</para>
<para>This manual page was written by Neil Williams
<email>codehelp@debian.org</email>
</para>
</refsect1>
<refsect1 id="seealso">
<title>SEE ALSO</title>
<para>See also <filename>apt-cross</filename> (1),
<filename>dpkg-cross</filename> (1), <emphasis>emdebian-tools</emphasis> (1),
<filename>empdebuilderlib</filename> (3).
</para>
</refsect1>
</refentry>

@ -0,0 +1,448 @@
<?xml version="1.0" encoding="UTF-8"?>
<refentry id="emsandbox">
<refentryinfo>
<productname>emsandbox</productname>
<productnumber/>
</refentryinfo>
<refmeta>
<refentrytitle>emsandbox</refentrytitle>
<manvolnum>1</manvolnum>
<refmiscinfo class="source">EMDEBIAN-TOOLS</refmiscinfo>
<refmiscinfo class="manual">EMDEBIAN-TOOLS</refmiscinfo>
</refmeta>
<refnamediv id="name">
<refname>emsandbox</refname>
<refpurpose>create Emdebian root filesystems</refpurpose>
</refnamediv>
<refsynopsisdiv>
<cmdsynopsis>
<command>emsandbox</command>
<group>
<arg>-a</arg>
<arg>--arch </arg>
<replaceable> ARCHITECTURE</replaceable>
</group>
<group>
<arg>--create</arg>
<arg>create</arg>
</group>
<group>
<group>
<arg>-s</arg>
<arg>--script</arg>
</group>
<replaceable> FILENAME</replaceable>
</group>
<group>
<arg>-S</arg>
<arg>--suite</arg>
<replaceable> NAME</replaceable>
</group>
<group>
<arg>--machine-path</arg>
<replaceable>PATH</replaceable>
</group>
<group>
<arg>-m</arg>
<arg>--machine</arg>
<replaceable> NAME</replaceable>
<group>
<arg>-v</arg>
<arg>--variant</arg>
<replaceable> NAME</replaceable>
</group>
</group>
</cmdsynopsis>
</refsynopsisdiv>
<refsect1 id="shell">
<title>SHELL INTERPRETERS</title>
<para><command>emsandbox</command> is bash code and uses
<command>embootstrap</command> which is bash code and also sources
pbuilder code which is also bash code. <command>debootstrap</command>
re-executes itself with the default shell and then tries to source the
suite script which fails because the re-executed copy of debootstrap is
now running under the default shell, not bash.
</para>
<para>This problem can show up as a failure within <command>debootstrap</command>
</para>
<programlisting>
I: Retrieving zlib1g
I: Validating zlib1g
</programlisting>
<para>The next line should be:</para>
<programlisting>
I: Extracting base-passwd...
</programlisting>
<para>Unfortunately, this is a result of the default shell
interpreter in Debian being changed after the scripts were written
and it is a non-trivial problem. It is not possible for
<command>embootstrap</command> could migrate to cdebootstrap currently.
</para>
<para>The only current solution is to change your default shell to
/bin/bash inside the environment running <command>emsandbox</command>.
</para>
</refsect1>
<refsect1 id="description">
<title>DESCRIPTION</title>
<para><command>emsandbox</command> supports customised generation of
basic root filesystems from cross-built Emdebian packages, ready for
unpacking and configuring on an embedded device.
</para>
<para>Note that <filename>emsandbox</filename> does not support all the
options available to <filename>debootstrap</filename>. Some of the
debootstrap options that are supported are implemented as machine
specific configuration files in your Emdebian work directory.
(See <option>--machine</option> and <option>--variant</option>.)
</para>
<para><filename>emsandbox</filename> is a wrapper for debootstrap to prepare
an Emdebian root filesystem, using Emdebian packages and a native chroot
via 'debootstrap --foreign' and code from pbuilder.
</para>
<para>The Emdebian rootfs, as generated by <command>emsandbox</command>
is not fully configured - packages are unpacked and certain support
files are created but none of the packages are configured (not even
the pre-install scripts). This last stage is the only process that
<emphasis>must</emphasis> be run on the actual device
<emphasis>before the first boot</emphasis>, using the <command>emsecondstage</command>
script which requires a working <command>chroot</command> environment.
Typically, <command>emsecondstage</command> is run from some kind of
minimal bootloader environment that has sufficient support for mounting
subsystems like proc and filesystems like the root filesystem partition
and can chroot into the root filesystem. This method means that the
majority of the work of creating the root filesystem can be done on
the build machine.
</para>
<para>The tarball created by <command>emsandbox</command> should be
copied onto the target device and unpacked using:
</para>
<programlisting>
# cd /mnt/target/dir
# tar -xzpf emdebian-arm.tgz
</programlisting>
<para>Immediately after unpacking, start the package configuration
by running <command>./emsecondstage</command> on the target device.
(Configuration involves running the cross-built binaries and is the
only part of the process that must be run on the target device.)
</para>
<para><command>emsecondstage</command> should <emphasis>always</emphasis>
be run from the directory into which it was installed.
</para>
<programlisting>
# ./emsecondstage
</programlisting>
</refsect1>
<refsect1 id="commands">
<title>COMMANDS</title>
<variablelist remap="TP">
<varlistentry>
<term><option>--create</option>|<option>create</option></term>
<listitem>
<para>Runs <command>debootstrap</command> <option>--foreign</option>
with a modified suite rule set to create a basic Emdebian rootfs.
</para>
<para>Checks for an existing chroot and exits if one is found.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-h</option>|<option>--help</option></term>
<listitem>
<para>print the usage message and exit.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<option>--version</option>
</term>
<listitem>
<para>print the usage message and exit.</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 id="options">
<title>OPTIONS</title>
<variablelist remap="TP">
<varlistentry>
<term><option>-a</option>|<option>--arch</option><replaceable> ARCHITECTURE</replaceable></term>
<listitem>
<para>Override the <command>dpkg-cross</command> default architecture
for this operation on the chroot.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-s</option>|<option>--script</option><replaceable> FILENAME</replaceable></term>
<listitem>
<para>Override the default package selection and installation
script with a customised debootstrap suite script (written in shell
and compatible with whichever shell interpreter is to be installed
on the target).
</para>
<para>Some customised scripts are provided with emdebian-tools. The
default uses the standard Emdebian 'busybox' package with 'dpkg' and
'apt'. Replacement scripts need to be full debootstrap suite shell
scripts that specify how to complete the first and second stage
installations.
</para>
<para>Customised scripts packages with <emphasis>emdebian-tools</emphasis>
include scripts for a root filesystem including libgtk2.0-0 and a complete
GPE root filesystem.</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<option>--machine-path</option>
<replaceable> PATH</replaceable>
</term>
<listitem>
<para>Override the default path to machine and variant configuration. By
default, emsandbox uses <filename>${WORK}/machine</filename> where
<userinput>$WORK</userinput> is the working directory specified
to <emphasis>emdebian-tools</emphasis> in the debconf configuration.
The specified path must already exist and contain the relevant
<filename>packages.conf</filename> configuration as well as the
<filename>setup.sh</filename> and <filename>config.sh</filename> shell
scripts (which may be empty).
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-m</option>|<option>--machine</option><replaceable> MACHINE</replaceable></term>
<listitem>
<para>Load machine specific configuration data from your Emdebian
working directory. If no variant is specified, config is read from
<filename>$WORK/machine/$MACHINE/default/</filename> where $WORK
is the work directory specified in debconf for emdebian-tools.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-v</option>|<option>--variant</option><replaceable> VARIANT</replaceable></term>
<listitem>
<para>Load variant specific configuration data from your Emdebian
working directory. Requires <option>--machine</option>. Configuration
data is read from <filename>$WORK/machine/$MACHINE/$VARIANT/</filename> where $WORK
is the work directory specified in debconf for emdebian-tools.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>-S</option>|<option>--suite</option><replaceable> NAME</replaceable></term>
<listitem>
<para>Override the default suite [unstable] and specify another
supported suite. Note that if the Emdebian repository is used,
the suite chosen <emphasis>must</emphasis> be a normal
Emdebian/Debian suite name from 'unstable, testing or sid', or
a Debian release codename for a release including or later
than lenny. No other suite name is supported in Emdebian.
</para>
<para>The selected suite is set in the root filesystem as the
default suite for apt to use when looking for updates.
</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1 id="machinevariants">
<title>Machine variants</title>
<para><command>emsandbox</command> supports a set of customisation routines
for each combination of machine and variant, allowing the rootfs to be customised
to specific variants of a specific machine. Configuration data is stored in the
<filename>machine</filename> subdirectory of your Emdebian work directory.
Using the <option>-m</option> option to <command>emsandbox</command> loads
<filename>packages.conf</filename> from the <filename>$WORK/machine/$MACHINE/default</filename>
subdirectory prior to starting debootstrap. Once the first stage install is complete,
<command>emsandbox</command> calls <filename>setup.sh</filename> from the same
directory, passing the location and architecture of the tarball, so that other
fine tuning can take place prior to creating the tarball. At this stage, any
operations inside the rootfs must not try to execute any binaries within the
rootfs. Immediately before creating the tarball, <filename>config.sh</filename>
is copied into the <filename>/machine/$MACHINE/default/</filename> directory
of the rootfs, ready to be called when <command>emsecondstage</command> has
completed the second stage of the debootstrap process.
</para>
<para>Skeleton versions of <filename>packages.conf</filename>,
<filename>setup.sh</filename> and <filename>config.sh</filename> are available
in <filename>/usr/share/emdebian-tools/machine/</filename>.
</para>
<para><filename>packages.conf</filename> is intended to be the principal place
for adjusting the emsandbox tarball to suit the needs of specific machine variants.
<filename>setup.sh</filename> and <filename>config.sh</filename> can fine tune
the results but in order to avoid reinventing the wheel, if more than a few
machines need similar adjustments to the same files, future versions of
<filename>packages.conf</filename> will collate those into a single
configuration parameter available to all.
</para>
<para><filename>packages.conf</filename> supports:</para>
<variablelist>
<varlistentry>
<term>
<option>INCLUDE</option>
</term>
<listitem>
<para>Add a comma separated list of package names to the list of packages
added to the tarball and installed in the second stage. Currently, debootstrap
has problems with multiple repositories so either upload this package to the
same repository as your other packages or create an apt-proxy that can serve
as a local repository, set it in <option>PROXY</option> and specify a usable
mirror for the device in <option>MIRROR</option>.</para>
<para>DEFAULT: empty</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<option>SCRIPT</option>
</term>
<listitem>
<para>Overrides the default emsandbox suite-script that debootstrap uses to
determine the base and required packages and the all important sequence in which
the packages can be installed. SCRIPT can be overridden on the emsandbox command line.
</para>
<para>DEFAULT: <filename>/usr/share/emdebian-tools/emdebian.crossd</filename></para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<option>MIRROR</option>
</term>
<listitem>
<para>Overrides the default emsandbox mirror. This repository will be set in
<filename>/etc/apt/sources.list</filename> and will also be used by debootstrap to obtain
all packages for the tarball unless <option>PROXY</option> is also set.
</para>
<para>DEFAULT: http://buildd.emdebian.org/emdebian/</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<option>PROXY</option>
</term>
<listitem>
<para>Specifies a separate repository to pass to debootstrap that may be local or
otherwise not intended for use once the tarball is installed. Use <option>MIRROR</option>
to set the same value in debootstrap and <filename>/etc/apt/sources.list</filename>.
If <option>PROXY</option> is specified without <option>MIRROR</option>, the default
emsandbox MIRROR (http://buildd.emdebian.org/emdebian/) will be written into
<filename>/etc/apt/sources.list</filename>.</para>
<para>DEFAULT: empty</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<option>TARBALL_NAME</option>
</term>
<listitem>
<para>Overrides the default name (emdebian-$ARCH) of the tarball. Do not specify a path here,
just a filename with the .tgz suffix.</para>
<para>DEFAULT: emdebian-$ARCH.tgz where $ARCH is specified to emsandbox or as the dpkg-cross
default architecture.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>
<option>SUITE</option>
</term>
<listitem>
<para>Override the default suite [unstable] and specify another
supported suite. Note that if the Emdebian repository is used,
the suite chosen <emphasis>must</emphasis> be a normal
Emdebian/Debian suite name from 'unstable, testing or sid', or
a Debian release codename for a release including or later
than lenny. No other suite name is supported in Emdebian.
</para>
<para>The selected suite is set in the root filesystem as the
default suite for apt to use when looking for updates.
</para>
<para>Not recommended to be changed.
</para>
<para>DEFAULT: unstable
</para>
</listitem>
</varlistentry>
</variablelist>
<para>Due to limitations in the current debootstrap support, the only way
of adding packages to the first stage is by providing a customised suite
script. Even if emsandbox migrates to using a tool from Stag to overcome
shortcomings in debootstrap, support for packages.conf, setup.sh and config.sh
will remain.</para>
</refsect1>
<refsect1 id="automation">
<title>Automating rootfs builds</title>
<para>Providing you are trying to build a root filesystem for an
architecture supported within Debian, <emphasis>emdebian-tools</emphasis>
can help you automate the package builds.
See <filename>em_autobuild</filename> (1)</para>
</refsect1>
<refsect1 id="shell">
<title>SHELL variables</title>
<para>Note that the Debian chroot program from coreutils expects you
to want the same shell outside the chroot as you want to use inside
the chroot. The typical Debian default shell in <filename>/etc/passwd</filename>
is bash which is not present in the Emdebian rootfs so <command>chroot</command>
needs the <option>/bin/sh</option> option.</para>
</refsect1>
<refsect1 id="files">
<title>FILES</title>
<para>Most <emphasis>emdebian-tools</emphasis> use configuration data from
<filename>apt-cross</filename> and <filename>dpkg-cross</filename>.
<command>emsource</command> and <command>emsandbox </command> also support
configuration using <filename>debconf</filename> to set a subversion username
and default working directory (which must be writable) for unpacking source
downloads. Default debconf values can be overridden with user-specific
values using <filename>~/.apt-cross/emsource</filename> or
<filename>~/.apt-cross/emsandbox</filename> respectively.
</para>
<refsect2>
<title>/etc/emsandbox.conf</title>
<para>System-wide configuration file handled by <command>debconf</command>
controlling unpacking source archives to a default working
directory. Can also include a subversion username setting, intended for
single-user installations. <filename>/etc/emsandbox.conf</filename>
settings can be overridden on a per-user basis by copying the current
file to <filename>~/.apt-cross/emsandbox</filename> and editing the
values.</para>
<para>Two variables can be set (see also <filename>/etc/emsandbox.conf</filename>):
</para>
<itemizedlist>
<listitem>
<para><emphasis>workingdir</emphasis>: A simple default
location for <command>emsandbox</command> to create a source tree to
download and unpack prebuilt binary packages. If left blank, a
new top level directory tree is used but this is intended for chroot
support only.
</para>
</listitem>
<listitem>
<para><emphasis>targetsuite</emphasis>: Emdebian follows Debian by
defaulting to building against unstable. This setting determines the
versions of libraries and packages linked against the cross-built emdebian
packages.
</para>
</listitem>
</itemizedlist>
</refsect2>
<refsect2>
<title>~/.apt-cross/emsandbox</title>
<para>User-specific version of <filename>/etc/emsandbox.conf</filename>,
supporting the same variables to provide user-specific overrides.
</para>
</refsect2>
</refsect1>
<refsect1>
<title>Author</title>
<para><command>emsandbox</command> was written
by Neil Williams <email>codehelp@debian.org</email>.
</para>
<para>This manual page was written by Neil Williams
<email>codehelp@debian.org</email>
</para>
</refsect1>
<refsect1 id="seealso">
<title>SEE ALSO</title>
<para>See also <filename>apt-cross</filename> (1), <filename>em_make</filename> (1),
<filename>dpkg-cross</filename> (1), <emphasis>emdebian-tools</emphasis> (1).
</para>
</refsect1>
</refentry>

@ -0,0 +1,382 @@
#!/bin/bash
set -e
# embootstrap -- create a bootstrap for emdebian builds
#
# Note that this script controls tarballs for empdebuild and emsandbox
# pass --cross to set an emsandbox tarball.
#
# Copyright (C) 2007-2008 Neil Williams <codehelp@debian.org>
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
CWD=`pwd`
# test for sudo
# make sure sudo is in use.
# bash cannot seem to do this when set -e is enabled
# because grep returns non-zero on a non-match
# so I use perl. :-)
ISROOT=`perl -e '$e=\`printenv\`; ($e =~ /\nUSER=root\n/) ? print "yes" : print "no";'`
if [ $ISROOT == "no" ] ; then
echo "embootstrap needs to be run under sudo or as root."
exit 2
fi
. /usr/lib/pbuilder/pbuilder-modules
. /usr/lib/pbuilder/pbuilder-buildpackage-funcs
. /usr/share/emdebian-tools/empbuilderlib
# move to our own function file later.
# Need support for create (this script), update (unpack base.tgz) and login
# (sudo chroot /bin/sh) as well as the final empdebuild (emsource,emdebuild)
# in a separate script.
# Currently, this script needs user intervention to build the chroot:
# emsetup asks for confirmation and apt-get install wants GnuPG verification.
# This script will concentrate only on creating and updating the chroot.
# Parameters.
# WORK=location of this script.
# MIRROR=the Debian primary mirror that will replace the default debootstrap mirror
# (ftp.debian.org is not a primary and only supports 2 architectures).
# TODO: needs command line options to set the rest of these parameters.
# Note --oknodo will cause failures, see #426877
WORK=$CWD
get_work_dir
BUILDPLACE=$WORKDIR
BASETGZ="$BUILDPLACE/emdebian.tgz"
BASETGZ=`echo $BASETGZ | tr -s \/`
BUILDPLACE="$BUILDPLACE/pbuilder"
# tidy up // to /
BUILDPLACE=`echo $BUILDPLACE | tr -s \/`
MIRROR=
# don't die if the user has set 'None' for the dpkg-cross default.
get_default_arch
BUILDPLACE="${WORKDIR}/pbuilder/build"
if [ -d $BUILDPLACE ]; then
rm -rf $BUILDPLACE/*
fi
if [ ! -d $BUILDPLACE ]; then
mkdir -p $BUILDPLACE
fi
BASETGZ="${WORKDIR}/emdebian.tgz"
SUITE=unstable
CROSS=x
MACHINE=x
VARIANT=x
MACHINEPATH="${WORKDIR}/machine/"
USEDEVPTS="yes"
USEPROC="yes"
while [ -n "$1" ]; do
case "$1" in
-a|--arch)
shift
ARCH=$1
# chomp the argument to --arch
shift
;;
--testing|testing)
shift;
BASETGZ="${WORKDIR}/emdebian-testing.tgz"
SUITE=testing
echo "Creating an embootstrap testing chroot"
;;
# only for emsandbox support, empdebuild does not pass -S
-S|--suite)
shift
SUITE=$1
shift
;;
--cross|cross)
shift;
BASETGZ="${WORKDIR}/emdebian-$ARCH.tgz"
CROSS=$ARCH
echo "Creating an embootstrap $ARCH chroot"
;;
--script)
shift
CMD_SCRIPT=$1
if [ ! -f $CMD_SCRIPT ]; then
echo "Cannot find suite script '$CMD_SCRIPT'."
exit;
fi
echo "Using $CMD_SCRIPT"
shift
;;
--machine-path)
shift
MACHINEPATH=$1
shift
;;
--machine)
shift
MACHINE=$1
VARIANT=default
if [ ! -d "${MACHINEPATH}/$MACHINE" ]; then
echo "Cannot find '${MACHINEPATH}/$MACHINE'."
exit
fi
shift
;;
--variant)
shift
VARIANT=$1
if [ ! $MACHINE ]; then
echo "Variant specified without a machine."
exit
fi
if [ ! -d "${MACHINEPATH}/$MACHINE/$VARIANT" ]; then
echo "Cannot find '${MACHINEPATH}/$MACHINE/$VARIANT'."
exit
fi
shift
;;
*)
echo "Unrecognised option: $1"
exit;
;;
esac
done
if [ "$ARCH" = "None.\n" ]; then
echo $ARCH
echo Use the --arch option or dpkg-reconfigure dpkg-cross
exit
fi
# include packages.conf if --machine used.
if [ "$MACHINE" != "x" -a "$VARIANT" != "x" -a $CROSS -a $CROSS = $ARCH ]; then
# sets INCLUDE, SCRIPT, MIRROR etc.
if [ -f ${MACHINEPATH}/$MACHINE/$VARIANT/packages.conf ]; then
. ${MACHINEPATH}/$MACHINE/$VARIANT/packages.conf
fi
echo "Using $MACHINE:$VARIANT"
if [ $TARBALL_NAME ]; then
echo " -> creating ${WORKDIR}/${TARBALL_NAME}"
BASETGZ="${WORKDIR}/${TARBALL_NAME}"
fi
fi
checkarch
HOST_ARCH=`dpkg-architecture -qDEB_HOST_ARCH`
# let the command line override the packages.conf
if [ ! $SCRIPT ]; then
SCRIPT=$CMD_SCRIPT
fi
# if neither command line nor packages.conf have a script set, use default.
if [ ! $SCRIPT ]; then
SCRIPT="/usr/share/emdebian-tools/emdebian.crossd"
fi
if [ $CROSS -a $CROSS = $ARCH ]; then
echo "Building $ARCH chroot on $HOST_ARCH to install $ARCH packages."
else
echo "Building $HOST_ARCH chroot on $HOST_ARCH to cross-build $ARCH packages."
fi
if [ -f ${BASETGZ} ]; then
echo "${BASETGZ} already exists! Aborting . . ."
exit 1;
fi
echo "Checking for a user writeable tree in $BUILDPLACE"
check_dirs
echo " -> running debootstrap"
export LANG=C
export LC_ALL=C
# debootstrap 1.0.7 has moved
WORK="/usr/share/debootstrap/"
# handle old versions of debootstrap so that we can migrate into testing.
if [ -f "/usr/lib/debootstrap/functions" ]; then
WORK="/usr/lib/debootstrap/";
fi
FOREIGN=
INC=
if [ $CROSS -a $CROSS = $ARCH ]; then
echo " -> cross detected, using foreign."
FOREIGN="--foreign"
if [ ! $MIRROR ]; then
MIRROR="http://www.emdebian.org/crush/"
fi
if [ ! $PROXY ]; then
PROXY="http://www.emdebian.org/crush/"
fi
if [ $INCLUDE ]; then
INC="--include=$INCLUDE"
fi
# if SUITE is empty in packages.conf, reset the default
if [ ! $SUITE ]; then
SUITE=unstable
fi
BUILDD=$SCRIPT
if [ ! -f ${WORKDIR}/stamp-debootstrap ]; then
echo "DEBOOTSTRAP_DIR=$WORK debootstrap $INC --verbose $FOREIGN --arch ${ARCH} $SUITE $BUILDPLACE $PROXY $BUILDD"
DEBOOTSTRAP_DIR=$WORK debootstrap ${INC} --verbose $FOREIGN --arch ${ARCH} $SUITE $BUILDPLACE $PROXY $BUILDD
echo " -> debootstrap stage complete"
echo " -> Checking for machine:variant hooks"
# hooks
if [ $INC ]; then
echo "${INC}" >> $BUILDPLACE/debootstrap/machineincludes
fi
if [ -f ${MACHINEPATH}/$MACHINE/$VARIANT/setup.sh ]; then
if [ ! -z "$EXTRA" ]; then
if [ -e $EXTRA ]; then
cp $EXTRA $BUILDPLACE/
fi
fi
echo " -> Running $MACHINE/$VARIANT/setup.sh $BUILDPLACE $ARCH"
sh ${MACHINEPATH}/$MACHINE/$VARIANT/setup.sh $BUILDPLACE $ARCH
fi
if [ -f ${MACHINEPATH}/$MACHINE/$VARIANT/config.sh ]; then
echo " -> Copying config.sh for $MACHINE:$VARIANT into tarball"
mkdir -p $BUILDPLACE/machine/
cp ${MACHINEPATH}/$MACHINE/$VARIANT/config.sh $BUILDPLACE/machine/
fi
touch ${WORKDIR}/stamp-debootstrap
fi # end of $CROSS
else # else if not $CROSS
# TODO this should be configurable - emdebian-tools will add a primary later.
# copy or use the ~/.apt-cross/sources.foo. files.
if [ ! $MIRROR ]; then
URL=`perl -e "use Emdebian::Tools; use Config::Auto; print &get_primary;"`
if [ ! -z "$URL" ]; then
MIRROR="http://${URL}/debian"
fi
fi
if [ ! $MIRROR ]; then
MIRROR="http://ftp.fr.debian.org/debian/"
fi
BUILDD=/usr/share/emdebian-tools/emdebian.buildd
if [ ! -f ${WORKDIR}/stamp-debootstrap ]; then
echo "DEBOOTSTRAP_DIR=$WORK debootstrap --verbose $SUITE $BUILDPLACE $MIRROR $BUILDD"
DEBOOTSTRAP_DIR=$WORK debootstrap --verbose $SUITE $BUILDPLACE $MIRROR $BUILDD
touch ${WORKDIR}/stamp-debootstrap
fi
fi
mkdir -p "$BUILDPLACE/tmp/buildd"
copy_host_configuration
# emdebian-tools will be reconfigured later.
# ensure src is available if not emsandbox
echo " -> Installing apt-lines for $MIRROR"
mkdir -p "$BUILDPLACE/etc/apt/sources.list.d/"
rm -f "$BUILDPLACE"/etc/apt/sources.list
if [ $CROSS -a $CROSS = $ARCH ]; then
cat >> "$BUILDPLACE"/etc/apt/sources.list.d/emdebian.sources.list << EOF
#emdebian target repository : default source list
# created by emsandbox
deb $MIRROR $SUITE main
#deb-src $MIRROR $SUITE main
EOF
else
cat >> "$BUILDPLACE"/etc/apt/sources.list << EOF
deb $MIRROR $SUITE main
deb-src $MIRROR $SUITE main
EOF
fi
if [ $CROSS -a $CROSS = $ARCH ]; then
# copy our secure apt key into the chroot for apt-key
cp /usr/share/emdebian-tools/emdebian-archive-keyring.gpg $BUILDPLACE/
# copy in our install helper
cp /usr/share/emdebian-tools/emsecondstage $BUILDPLACE/
# only executable by root to allow debootstrap to work properly.
chmod 744 $BUILDPLACE/emsecondstage
rm -f $BUILDPLACE/debootstrap/debootstrap.log
# empty if using unpack but should still exist.
save_aptcache
else
echo "Refreshing the base.tgz "
echo " -> upgrading packages"
mountproc
chroot $BUILDPLACE /usr/bin/apt-get update
recover_aptcache
chroot $BUILDPLACE /usr/bin/apt-get -y --force-yes dist-upgrade
echo " -> adding the Emdebian repository key"
chroot $BUILDPLACE mkdir -p /home/$SUDO_USER/.gnupg
chroot $BUILDPLACE mkdir -p /home/$SUDO_USER/.dpkg-cross
if [ -f /home/$SUDO_USER/.devscripts ]; then
cp /home/$SUDO_USER/.devscripts $BUILDPLACE/home/$SUDO_USER/.devscripts
fi
cp /usr/share/emdebian-tools/emdebian-archive-keyring.gpg $BUILDPLACE/
chroot $BUILDPLACE apt-key add emdebian-archive-keyring.gpg
if [ -f emdebian-archive-keyring.gpg ]; then
rm emdebian-archive-keyring.gpg
fi
echo " -> updating /etc/hosts"
cp /etc/hosts $BUILDPLACE/etc/hosts
# emdebian.buildd installs emdebian-tools which sets up apt for the emdebian repository
echo " -> updating the apt cache"
chroot "$BUILDPLACE" /usr/bin/apt-get update
# upgrade emdebian-tools and apt-cross before running emsetup
echo " -> upgrading emdebian-tools and apt-cross"
chroot "$BUILDPLACE" /usr/bin/apt-get -y --force-yes dist-upgrade
echo " -> updating apt-cross cache"
DPKG_CROSS="/home/$SUDO_USER/.dpkg-cross"
if [ ! -f $DPKG_CROSS/apt.conf-${SUITE} ]; then
chroot $BUILDPLACE /usr/bin/apt-cross -a $ARCH -S $SUITE -u
else
echo " -> copying existing apt-cross cache"
cp $DPKG_CROSS/apt.conf-$SUITE $BUILDPLACE/$DPKG_CROSS/
cp $DPKG_CROSS/sources.$SUITE $BUILDPLACE/$DPKG_CROSS/
cp $DPKG_CROSS/status-$SUITE $BUILDPLACE/$DPKG_CROSS/
cp -r $DPKG_CROSS/$SUITE $BUILDPLACE/$DPKG_CROSS/
fi
echo " -> running emsetup"
if chroot "$BUILDPLACE" /usr/bin/emsetup -v -a $ARCH --yes; then
:
else
echo " -> emsetup failed"
if [ "${LOGIN_AFTER_FAIL}" = "yes" ]; then
echo " -> Logging into the chroot"
echo " -> Build directory: /trunk/$SVN"
echobacktime
chroot $BUILDPLACE /bin/sh
save_aptcache
echo " -> emsetup failed"
chroot $BUILDPLACE /usr/bin/apt-get clean
umountproc
create_emdebiantgz
cleanbuildplace
rm ${WORKDIR}/stamp-debootstrap
exit 1;
fi
save_aptcache
umountproc
chroot $BUILDPLACE /usr/bin/apt-get clean
create_emdebiantgz
cleanbuildplace
rm ${WORKDIR}/stamp-debootstrap
echobacktime
echo " -> emsetup failed: exiting with an error!"
echo " Try --login-after-fail"
exit 1;
fi
umountproc
save_aptcache
chroot $BUILDPLACE /usr/bin/apt-get clean
fi
create_emdebiantgz
cleanbuildplace
rm ${WORKDIR}/stamp-debootstrap

@ -0,0 +1,93 @@
# bash completion support
#
# Copyright (C) 2008 Neil Williams <codehelp@debian.org>
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
_get_dpkg_cross_list()
{
grep Choices: /var/lib/dpkg/info/dpkg-cross.templates \
| cut -d':' -f2 | sed -e 's/None, //' | sed -e 's/,//g'
}
_get_machine_name()
{
WORK=`cat /etc/emsandbox.conf | grep workingdir | sed -e 's/workingdir: \(.*\)/\1\/machine/'`
ls $WORK
}
_get_variant_name()
{
WORK=`cat /etc/emsandbox.conf | grep workingdir | sed -e 's/workingdir: \(.*\)/\1\/machine/'`
ls -1 $WORK/*
}
# rootfs cannot not support stable until Lenny is released.
_supported_suites()
{
echo unstable testing sid lenny
}
_emsandbox()
{
local cur prev opts cmds help machine arch quiet
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
help="-h -? --help --version "
cmds="create --create "
arch="-a --arch "
opts="-s --script -S --suite"
machine="-m --machine -v --variant --machine-path "
case "$prev" in
-@(a|-arch))
COMPREPLY=( $( _get_dpkg_cross_list $cur ) )
;;
-@(m|-machine))
COMPREPLY=( $( _get_machine_name $cur ) )
;;
-@(V|-variant))
COMPREPLY=( $( _get_variant_name $cur ) )
;;
-@(S|-suite))
COMPREPLY=( $( _supported_suites $cur ) )
;;
*)
COMPREPLY=( $(compgen -W "${arch}${help}${opts}${machine}${cmds}" -- ${cur}) )
;;
esac
}
complete -F _emsandbox -o default emsandbox
_em_multistrap()
{
local cur prev opts cmds help machine arch quiet
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
help="-h -? --help --version "
arch="-a --arch "
opts="-f --file"
machine=""
case "$prev" in
-@(a|-arch))
COMPREPLY=( $( _get_dpkg_cross_list $cur ) )
;;
*)
COMPREPLY=( $(compgen -W "${arch}${help}${opts}${machine}${cmds}" -- ${cur}) )
;;
esac
}
complete -F _em_multistrap -o default em_multistrap

@ -0,0 +1,87 @@
# emdebian secondstage support (example only).
# busybox is not currently built with internal dpkg
# support so this package set might not work.
#
# Copyright (C) 2007-2008 Neil Williams <codehelp@debian.org>
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
mirror_style release
download_style apt
work_out_debs () {
required="busybox dpkg libstdc++6 libgcc1 libc6 cdebconf
debconf-shell libdebian-installer4 zlib1g
base-passwd tzdata"
base="apt gpgv
debianutils makedev gnupg udev base-files
debian-archive-keyring udhcpc udhcpd
util-linux module-init-tools initscripts"
}
first_stage_install () {
PRESERVE_BUILDPLACE="yes"
. /usr/share/emdebian-tools/emrootfslib
extract $required
make_dpkg_dirs
prepare_proc
prepare_var
info INSTCORE " -> Preparing basic defaults for $BUILDPLACE/etc"
basic_etc_fstab
basic_group_setup
basic_passwd_setup
basic_shadow_setup
basic_etc_profile
shell_update_rcd
set_approx_time
set_cdebconf_default
provide_empty_install_info
provide_var_lib_x11
info INSTCORE " -> Setting up dpkg in $BUILDPLACE"
x_feign_install dpkg
info INSTCORE " -> Unpacking packages in $BUILDPLACE"
unpack_debootstrap
info INSTCORE " -> Adapting configuration for Emdebian"
busybox_symlinks
disable_updatercd
disable_invokercd
disable_apt_recommends
busybox_inittab
busybox_rcS
setup_devices
info INSTCORE " -> First stage install complete in $BUILDPLACE"
}
second_stage_install () {
if [ -f /datestring ]; then
TIME=`cat /datestring`
echo "Setting approximate time of $TIME"
date -s $TIME
fi
info INSTCORE "Running ldconfig..."
in_target /sbin/ldconfig
in_target depmod
info INSTCORE "Setting cdebconf environment"
export DEBCONF_USE_CDEBCONF=true
DEBIAN_FRONTEND=noninteractive
DEBCONF_NONINTERACTIVE_SEEN=true
export DEBIAN_FRONTEND DEBCONF_NONINTERACTIVE_SEEN
# bug: See #451130
in_target /usr/lib/cdebconf/debconf-loadtemplate /usr/share/debconf/demo /usr/share/debconf/demo.templates
info INSTCORE "Configuring in $BUILDPLACE"
in_target dpkg --configure -a
info BASESUCCESS "Emdebian base system installed successfully."
}

@ -0,0 +1,80 @@
# emdebian secondstage support (Default busybox, dpkg and apt version)
#
# Copyright (C) 2007-2008 Neil Williams <codehelp@debian.org>
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
mirror_style release
download_style apt
work_out_debs () {
required="coreutils dpkg libstdc++6 libgcc1 libc6 cdebconf
debconf-shell libdebian-installer4 zlib1g libnewt0.52
libslang2 base-passwd"
base="apt gpgv libncurses5 libreadline5 readline-common
debianutils makedev whiptail gnupg udev base-files
debian-archive-keyring dhcp3-client
util-linux module-init-tools initscripts"
}
first_stage_install () {
PRESERVE_BUILDPLACE="yes"
. /usr/share/emdebian-tools/emrootfslib
extract $required
make_dpkg_dirs
prepare_proc
prepare_var
info INSTCORE " -> Preparing basic defaults for $BUILDPLACE/etc"
basic_etc_fstab
basic_group_setup
basic_passwd_setup
basic_shadow_setup
basic_etc_profile
shell_update_rcd
set_approx_time
set_cdebconf_default
provide_empty_install_info
provide_var_lib_x11
info INSTCORE " -> Setting up dpkg in $BUILDPLACE"
x_feign_install dpkg
info INSTCORE " -> Unpacking packages in $BUILDPLACE"
unpack_debootstrap
info INSTCORE " -> Adapting configuration for Emdebian"
disable_apt_recommends
setup_devices
info INSTCORE " -> First stage install complete in $BUILDPLACE"
}
second_stage_install () {
if [ -f /datestring ]; then
TIME=`cat /datestring`
echo "Setting approximate time of $TIME"
date -s $TIME
fi
info INSTCORE "Running ldconfig..."
in_target /sbin/ldconfig
in_target depmod
info INSTCORE "Setting cdebconf environment"
export DEBCONF_USE_CDEBCONF=true
DEBIAN_FRONTEND=noninteractive
DEBCONF_NONINTERACTIVE_SEEN=true
export DEBIAN_FRONTEND DEBCONF_NONINTERACTIVE_SEEN
# bug: See #451130
in_target /usr/lib/cdebconf/debconf-loadtemplate /usr/share/debconf/demo /usr/share/debconf/demo.templates
info INSTCORE "Configuring in $BUILDPLACE"
in_target dpkg --configure -a
info BASESUCCESS "Emdebian base system installed successfully."
}

@ -0,0 +1,85 @@
# emdebian secondstage support (Default busybox, dpkg and apt version)
#
# Copyright (C) 2007-2008 Neil Williams <codehelp@debian.org>
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
mirror_style release
download_style apt
work_out_debs () {
required="busybox dpkg libstdc++6 libgcc1 libc6 cdebconf
debconf-shell libdebian-installer4 zlib1g libnewt0.52
libslang2 base-passwd"
base="apt gpgv libncurses5 libreadline5 readline-common
debianutils makedev whiptail gnupg udev base-files
debian-archive-keyring dhcp3-client
util-linux module-init-tools initscripts"
}
first_stage_install () {
PRESERVE_BUILDPLACE="yes"
. /usr/share/emdebian-tools/emrootfslib
extract $required
make_dpkg_dirs
prepare_proc
prepare_var
info INSTCORE " -> Preparing basic defaults for $BUILDPLACE/etc"
basic_etc_fstab
basic_group_setup
basic_passwd_setup
basic_shadow_setup
basic_etc_profile
shell_update_rcd
set_approx_time
set_cdebconf_default
provide_empty_install_info
provide_var_lib_x11
info INSTCORE " -> Setting up dpkg in $BUILDPLACE"
x_feign_install dpkg
info INSTCORE " -> Unpacking packages in $BUILDPLACE"
unpack_debootstrap
info INSTCORE " -> Adapting configuration for Emdebian"
busybox_symlinks
disable_updatercd
disable_invokercd
disable_apt_recommends
busybox_inittab
busybox_rcS
setup_devices
info INSTCORE " -> First stage install complete in $BUILDPLACE"
}
second_stage_install () {
if [ -f /datestring ]; then
TIME=`cat /datestring`
echo "Setting approximate time of $TIME"
date -s $TIME
fi
info INSTCORE "Running ldconfig..."
in_target /sbin/ldconfig
in_target depmod
info INSTCORE "Setting cdebconf environment"
export DEBCONF_USE_CDEBCONF=true
DEBIAN_FRONTEND=noninteractive
DEBCONF_NONINTERACTIVE_SEEN=true
export DEBIAN_FRONTEND DEBCONF_NONINTERACTIVE_SEEN
# bug: See #451130
in_target /usr/lib/cdebconf/debconf-loadtemplate /usr/share/debconf/demo /usr/share/debconf/demo.templates
info INSTCORE "Configuring in $BUILDPLACE"
in_target dpkg --configure -a
info BASESUCCESS "Emdebian base system installed successfully."
}

@ -0,0 +1,90 @@
# emdebian secondstage support (busybox, dpkg, apt + gtk version)
#
# Copyright (C) 2007-2008 Neil Williams <codehelp@debian.org>
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
mirror_style release
download_style apt
work_out_debs () {
required="busybox dpkg libstdc++6 libgcc1 libc6 cdebconf
debconf-shell libdebian-installer4 zlib1g libnewt0.52
libslang2 base-passwd"
base="apt gpgv libncurses5 libreadline5 readline-common
debianutils makedev whiptail iptables initscripts
gnupg udev base-files debian-archive-keyring libgtk2.0-0
libxfixes3 fontconfig-config ttf-bitstream-vera gpe
libsoup2.2-8 dbus xinit libice6 langupdate
libsm6 galculator dhcp3-client util-linux
module-init-tools sysvinit-utils xauth xserver-xorg-video-fbdev
xserver-xorg-input-tslib xfonts-base hicolor-icon-theme"
}
first_stage_install () {
PRESERVE_BUILDPLACE="yes"
. /usr/share/emdebian-tools/emrootfslib
extract $required
make_dpkg_dirs
prepare_proc
prepare_var
info INSTCORE " -> Preparing basic defaults for $BUILDPLACE/etc"
basic_etc_fstab
basic_group_setup
basic_passwd_setup
basic_shadow_setup
basic_etc_profile
shell_update_rcd
set_approx_time
set_cdebconf_default
provide_empty_install_info
provide_var_lib_x11
info INSTCORE " -> Setting up dpkg in $BUILDPLACE"
x_feign_install dpkg
info INSTCORE " -> Unpacking packages in $BUILDPLACE"
unpack_debootstrap
info INSTCORE " -> Adapting configuration for Emdebian"
busybox_symlinks
disable_updatercd
disable_invokercd
disable_apt_recommends
busybox_inittab
busybox_rcS
sample_xorg_conf
setup_devices
info INSTCORE " -> First stage install complete in $BUILDPLACE"
}
second_stage_install () {
if [ -f /datestring ]; then
TIME=`cat /datestring`
echo "Setting approximate time of $TIME"
date -s $TIME
fi
info INSTCORE "Running ldconfig..."
in_target /sbin/ldconfig
in_target depmod
info INSTCORE "Setting cdebconf environment"
export DEBCONF_USE_CDEBCONF=true
DEBIAN_FRONTEND=noninteractive
DEBCONF_NONINTERACTIVE_SEEN=true
export DEBIAN_FRONTEND DEBCONF_NONINTERACTIVE_SEEN
# bug: See #451130
in_target /usr/lib/cdebconf/debconf-loadtemplate /usr/share/debconf/demo /usr/share/debconf/demo.templates
info INSTCORE "Configuring in $BUILDPLACE"
in_target dpkg --configure -a
info BASESUCCESS "Emdebian base system installed successfully."
}

@ -0,0 +1,101 @@
# emdebian secondstage support (Grip version)
#
# Copyright (C) 2007-2009 Neil Williams <codehelp@debian.org>
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
mirror_style release
download_style apt
finddebs_style from-indices
variants - buildd fakechroot minbase
if doing_variant fakechroot; then
test "$FAKECHROOT" = "true" || error 1 FAKECHROOTREQ "This variant requires fakechroot environment to be started"
fi
LIBC=libc6
if [ "$ARCH" = "alpha" ] || [ "$ARCH" = "ia64" ]; then
LIBC="libc6.1"
elif [ "$ARCH" = "hurd-i386" ]; then
LIBC="libc0.3"
fi
work_out_debs () {
required="$(get_debs Priority: required)"
if doing_variant - || doing_variant fakechroot; then
#required="$required $(get_debs Priority: important)"
# ^^ should be getting debconf here somehow maybe
base="$(get_debs Priority: important)"
elif doing_variant buildd; then
base="$(get_debs Build-Essential: yes)"
elif doing_variant minbase; then
base="apt"
fi
if doing_variant fakechroot; then
# ldd.fake needs binutils
required="$required binutils"
fi
}
first_stage_install () {
extract $required
PRESERVE_BUILDPLACE="yes"
. /usr/share/emdebian-tools/emrootfslib
make_dpkg_dirs
basic_etc_fstab
basic_etc_profile
if [ -x "$TARGET/usr/bin/md5sum.textutils" ] && [ \! -e "$TARGET/usr/bin/md5sum" ]; then
cp "$TARGET/usr/bin/md5sum.textutils" "$TARGET/usr/bin/md5sum"
fi
if doing_variant fakechroot; then
setup_devices_fakechroot
else
setup_devices
fi
x_feign_install dpkg
info INSTCORE " -> Unpacking packages in $BUILDPLACE"
unpack_debootstrap
disable_apt_recommends
info INSTCORE " -> First stage install complete in $BUILDPLACE"
}
second_stage_install () {
if [ -f /datestring ]; then
TIME=`cat /datestring`
echo "Setting approximate time of $TIME"
date -s $TIME
fi
info INSTCORE "Running ldconfig..."
in_target /sbin/ldconfig
in_target depmod
info INSTCORE "Setting debconf environment"
DEBIAN_FRONTEND=noninteractive
DEBCONF_NONINTERACTIVE_SEEN=true
export DEBIAN_FRONTEND DEBCONF_NONINTERACTIVE_SEEN
if doing_variant fakechroot; then
install_fakechroot_tools
fi
setup_dselect_method apt
info CONFBASE "Configuring packages..."
./emsecondstage
}

@ -0,0 +1,84 @@
# emdebian secondstage support (busybox, dpkg, apt + gtk version)
#
# Copyright (C) 2007-2008 Neil Williams <codehelp@debian.org>
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
mirror_style release
download_style apt
work_out_debs () {
required="busybox dpkg libstdc++6 libgcc1 libc6 cdebconf
libdebian-installer4 zlib1g libnewt0.52 libslang2"
base="apt gpgv libncurses5 libreadline5 readline-common
debconf-shell debianutils makedev base-passwd whiptail
gnupg udev base-files debian-archive-keyring libgtk2.0-0
fontconfig-config ttf-bitstream-vera xfonts-base"
}
first_stage_install () {
PRESERVE_BUILDPLACE="yes"
. /usr/share/emdebian-tools/emrootfslib
extract $required
make_dpkg_dirs
prepare_proc
prepare_var
info INSTCORE " -> Preparing basic defaults for $BUILDPLACE/etc"
basic_etc_fstab
basic_group_setup
basic_passwd_setup
basic_etc_profile
shell_update_rcd
set_approx_time
set_cdebconf_default
provide_empty_install_info
provide_var_lib_x11
info INSTCORE " -> Setting up dpkg in $BUILDPLACE"
x_feign_install dpkg
info INSTCORE " -> Unpacking packages in $BUILDPLACE"
unpack_debootstrap
info INSTCORE " -> Adapting configuration for Emdebian"
busybox_symlinks
disable_updatercd
disable_invokercd
disable_apt_recommends
busybox_inittab
busybox_rcS
sample_xorg_conf
setup_devices
info INSTCORE " -> First stage install complete in $BUILDPLACE"
}
second_stage_install () {
if [ -f /datestring ]; then
TIME=`cat /datestring`
echo "Setting approximate time of $TIME"
date -s $TIME
fi
info INSTCORE "Running ldconfig..."
in_target /sbin/ldconfig
in_target depmod
info INSTCORE "Setting cdebconf environment"
export DEBCONF_USE_CDEBCONF=true
DEBIAN_FRONTEND=noninteractive
DEBCONF_NONINTERACTIVE_SEEN=true
export DEBIAN_FRONTEND DEBCONF_NONINTERACTIVE_SEEN
# bug: See #451130
in_target /usr/lib/cdebconf/debconf-loadtemplate /usr/share/debconf/demo /usr/share/debconf/demo.templates
info INSTCORE "Configuring in $BUILDPLACE"
in_target dpkg --configure -a
info BASESUCCESS "Emdebian base system installed successfully."
}

@ -0,0 +1,198 @@
# empbuilderlib : shell library to support building chroots for Emdebian.
#
# Copyright (C) 2006-2008 Neil Williams <codehelp@debian.org>
# Copyright (C) 2001-2007 Junichi Uekawa
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# This shell library requires perl and pbuilder (which means bash!) !
# Draws in POSIX shell functions from emrootfslib to be able to call
# in functions from first_stage_install within debootstrap. The only
# reasons to continue putting new functions in here are if:
# 1. the functions are only useful to create cross-building chroots OR
# 2. the functions need to call pbuilder code directly.
# There should be no need to call pbuilder code within scripts that
# generate a root filesystem.
# Intended solely for use on the build machine. Do not use these functions
# in second_stage_install !
. /usr/share/emdebian-tools/emrootfslib
. /usr/lib/pbuilder/pbuilder-modules
WORKPLACE="${WORKDIR}/pbuilder"
BASETGZ="${WORKDIR}/emdebian.tgz"
#pbuilder base values
DEBIAN_BUILDARCH=$ARCH
# cross-building chroot is same arch as host.
BUILDRESULT="$WORKPLACE/result/"
# tidy up // to /
BUILDRESULT=`echo $BUILDRESULT | tr -s \/`
APTCACHE="$WORKPLACE/aptcache/"
# tidy up // to /
APTCACHE=`echo $APTCACHE | tr -s \/`
AUTO_DEBSIGN=yes
APTCACHEHARDLINK="no"
BUILDPLACE="$WORKPLACE/build"
# the default is to add a PID in the buildplace.
BASEBUILDPLACE="$BUILDPLACE"
if [ "${PRESERVE_BUILDPLACE}" != "yes" ]; then
BUILDPLACE="$BUILDPLACE/$$"
fi
function extractembuildplace () {
# after calling this function, umountproc, and cleanbuildplace
# needs to be called. Please trap it.
if [ ! \( "${PRESERVE_BUILDPLACE}" = "yes" -a -d "$BUILDPLACE" \) ]; then
cleanbuildplace
echo "Building the Emdebian build Environment"
if ! mkdir -p "$BUILDPLACE"; then
echo "E: failed to build the directory to chroot"
exit 1
fi
echo " -> extracting base tarball [${BASETGZ}]"
if [ ! -f "$BASETGZ" ]; then
echo "E: failed to find $BASETGZ, have you created your base tarball yet?"
exit 1
fi
if ! (cd "$BUILDPLACE" && tar xfzp "$BASETGZ"); then
echo "E: failed to extract $BASETGZ to $BUILDPLACE"
exit 1
fi
echo " -> creating local configuration"
if [ $CROSS -a $CROSS != $ARCH ]; then
hostname -f > "$BUILDPLACE/etc/mailname"
else
echo "emdebian-$ARCH" > "$BUILDPLACE/etc/mailname"
fi
if [ ! -f "$BUILDPLACE/etc/apt/apt.conf.d/10disablerecommends" ]; then
disable_apt_recommends
fi
fi
copy_local_configuration
mountproc
mkdir -p "$BUILDPLACE/tmp/buildd"
chmod 1777 "$BUILDPLACE/tmp"
if [ "$OVERRIDE_APTLINES" = "yes" ]; then
installaptlines
fi
}
function autoclean_aptcache() {
if [ -n "$APTCACHE" ]; then
echo " -> Cleaning the cached apt archive"
chroot $BUILDPLACE /usr/bin/apt-get autoclean || true
find "$APTCACHE/" -maxdepth 1 -name \*.deb | \
while read A; do
if [ ! -f "$BUILDPLACE/var/cache/apt/archives/"$(basename "$A") -a \
-f "$A" ]; then
echo " -> obsolete cache content "$(basename "$A")" removed"
rm -f "$A" || true
fi
done
fi
}
# intended only for chroots
function copy_host_configuration () {
echo " -> copying local configuration"
if [ $CROSS -a $CROSS != $ARCH ]; then
for a in hosts hostname resolv.conf; do
sudo rm -f "$BUILDPLACE/etc/$a"
if [ ! -f "/etc/$a" ]; then
echo "E: /etc/$a does not exist, your setup is insane. fix it" >&2
sudo cp $( readlink -f "/etc/$a" ) "$BUILDPLACE/etc/$a";
fi
done
else
# sandboxes need a different hostname
mkdir -p "$BUILDPLACE"/etc/
cat > "$BUILDPLACE"/etc/hostname << EOF
emdebian-$ARCH
EOF
fi
}
function createemchroot()
{
if [ $SUITE == testing ]; then
BASETGZ="${WORKDIR}/emdebian-testing.tgz"
SUITE=testing
. /usr/share/emdebian-tools/embootstrap --arch $ARCH testing
echo "Creating an embootstrap testing chroot"
else
BASETGZ="$WORKDIR/emdebian.tgz"
. /usr/share/emdebian-tools/embootstrap --arch $ARCH
fi
}
function checkembuilddep () {
# call satisfydepends
local BUILDOPT="--binary-all"
case "${BINARY_ARCH}" in
yes) BUILDOPT="--binary-arch";;
*) ;;
esac
PBUILDERSATISFYDEPENDSCMD=/usr/lib/pbuilder/pbuilder-satisfydepends
CONTROL=$BUILDPLACE/trunk/$SVN/debian/control
# this version parses debian/control, NOT the .dsc
# so that when Emdebian removes dependencies, the chroot does too.
echo "Running: $PBUILDERSATISFYDEPENDSCMD --control $CONTROL --chroot $BUILDPLACE ${BUILDOPT}"
if "$PBUILDERSATISFYDEPENDSCMD" --control "$CONTROL" --chroot "${BUILDPLACE}" "${BUILDOPT}" ; then
echo " -> installed ${HOST_ARCH} dependencies."
else
echo "E: pbuilder-satisfydepends failed." >&2
exit 2
fi
# install extra packages to the chroot
if [ -n "$EXTRAPACKAGES" ]; then
if echo "DEBIAN_FRONTEND=noninteractive usr/bin/apt-get -y --force-yes install ${EXTRAPACKAGES}" | chroot $BUILDPLACE /bin/sh; then
:
else
# if apt failed (maybe update needs to be run), save so far and exit cleanly
save_aptcache
umountproc
cleanbuildplace
exit 1;
fi
fi
}
# get $ARCH .deb and put into /var/cache/apt/archives to
# allow these to be saved between builds.
function save_aptcrosscache() {
# save the current aptcache archive
# it is safe to call this function several times.
local doit
if [ -n "$APTCACHE" ]; then
echo "Copying back the cached apt-cross archive contents"
mkdir -p "$APTCACHE" ;
if [ "$APTCACHEHARDLINK" = "yes" ]; then
doit=ln
else
doit=cp
fi
# apt-cross puts the archives in the chroot /
find "$BUILDPLACE/" -maxdepth 1 -name \*.deb | \
while read A ;do
if [ ! -f "$APTCACHE/"$(basename "$A") -a -f "$A" ]; then
echo " -> new cache content "$(basename "$A")" added"
$doit "$A" "$APTCACHE/" || true
fi
done
fi
}

@ -0,0 +1,619 @@
#!/bin/bash
set -e
# empdebuild : emdebian version of pdebuild.
#
# Emdebian chroot builder - initially supporting the creation of a
# chroot capable of running emdebian-tools to reduce the number of
# cross dependencies that need to be installed on the build system.
#
# Copyright (C) 2006-2008 Neil Williams <codehelp@debian.org>
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Note 1: Most configuration values are calculated, not taken from the command line
# or an rc file.
# Note 2: emdebuild creates a build log for us - just the output of dpkg-buildpackage,
# not the rest of the chroot operations.
. /usr/share/emdebian-tools/empbuilderlib
SUITE=unstable
function usagehelp () {
# print out help message
cat <<EOF
empdebuild - cross-building chroot Emdebian package builder
version $OURVERSION
Syntax: sudo empdebuild [OPTIONS] [COMMAND]
Only one command can be actioned at any one time.
Options must precede the command to take effect.
Commands:
-?|-h|--help|-version: print this help message and exit
--create|create: create a cross-building base .tgz for unstable
--update|update: update the base .tgz and save changes
--build|build: build the current package in the chroot
(needs to be run in the top source directory)
--autobuild|autobuild PACKAGE: build the specified package in the chroot
(used by the autobuilder)
--login|login: Login to the chroot to run tests or fix problems.
--clean|clean: Clean up all build sub directories.
Options:
--arch: Override the default cross-build architecture (from dpkg-cross).
--testing: Override the default suite (unstable) to use testing
instead. This is a fallback option for use during
toolchain transitions in unstable.
--save-after-login: Allow changes made within the chroot login to persist.
--login-after-fail: In case of error, try to log in to the new chroot.
-- OPTIONS dpkg-buildpackage options
(except: -uc -us [default] -a [ignored])
Although based on pbuilder, empdebuild cannot support the full range of
pbuilder commands or options. In addition, creating a cross-building chroot for
testing involves a variety of changes to the creation of a similar chroot for
unstable so testing is only supported as an override, rather than using the
pbuilder method of a --distribution option.
When testing local changes made with emdebuild, use 'empdebuild --build' which
will use the .diff.gz from the current working directory.
Once the local changes are complete and are committed to Emdebian SVN, you
can use 'empdebuild --autobuild PACKAGE' to ensure that the patches are
usable for the autobuilder.
Options to dpkg-buildpackage can be specified after the -- option.
Note that '-uc' and '-us' are set by default and '-a' will be ignored
(because arch is controlled separately). Options are passed down to
emdebuild unchanged.
EOF
}
function get_cross_depends ()
{
# derived from checkbuilddep_internal
# Use this function to fulfill the cross-dependencies
DEBIAN_XCONTROL=debian/xcontrol
BD_REGEXP="build-depends"
local INSTALLPKG
local INSTALLPKGLIST
local INSTALLPKGMULTI
local CURRENTREALPKGNAME
if [ ! -f ${DEBIAN_XCONTROL} ]; then
return
fi
echo " -> updating apt-cross cache"
chroot $BUILDPLACE /usr/bin/apt-cross -a $ARCH -S $SUITE -u
echo " -> Attempting to parse the cross-build dependencies"
# read debian/xcontrol
for INSTALLPKGMULTI in $(cat ${DEBIAN_XCONTROL} | \
awk '
BEGIN{source=1}
/^$/ {source=0}
/^Source:/ {source=1}
/^[^ ]*:/ {p=0}
tolower($0) ~ /^'"${BD_REGEXP}"':/ {p=1}
{if(p && source) {print $0}}' | \
sed 's/^[^: ]*://' | \
tr " " "/" | \
awk 'BEGIN{RS=","} {print}'); do
echo " -> Considering cross-build-dep$(echo "$INSTALLPKGMULTI" | tr "/" " " )"
# parse the list - removing commas etc.
for INSTALLPKG in $(echo "$INSTALLPKGMULTI" | \
awk 'BEGIN{RS="|"} {print}'); do
CURRENTREALPKGNAME=$(echo "$INSTALLPKG" | sed -e 's/^[/]*//' -e 's/[[/(].*//') #)# syntax hack
INSTALLPKGLIST="${INSTALLPKGLIST} ${CURRENTREALPKGNAME}"
done; # end parse list
done; # end parse debian/xcontrol
if [ -n "${INSTALLPKGLIST}" ]; then
echo " -> Installing ${INSTALLPKGLIST}"
chroot $BUILDPLACE /usr/bin/apt-cross -q -k -a $ARCH --install ${INSTALLPKGLIST}
save_aptcrosscache
fi
echo " -> Finished parsing the cross build-deps"
}
function update_emchroot ()
{
if [ $SUITE == testing ]; then
BASETGZ="${WORKDIR}/emdebian-testing.tgz"
SUITE=testing
echo "Updating the embootstrap testing chroot"
else
BASETGZ="$WORKDIR/emdebian.tgz"
fi
extractembuildplace
echo "File extracted to: $BUILDPLACE"
echo ""
echo " -> upgrading packages"
disable_apt_recommends
# force the sources list - a bit of a hack really.
# TODO this should be configurable - emdebian-tools will add a primary later.
cp /usr/share/emdebian-tools/emsources.$SUITE $BUILDPLACE/etc/apt/sources.list
if echo "/usr/bin/apt-get update" | chroot $BUILDPLACE /bin/sh; then
:
else
# if apt failed (maybe update needs to be run), save so far and exit cleanly
save_aptcache
# copy out the failed build here first.
umountproc
cleanbuildplace
exit 1;
fi
echo " -> updating apt-cross cache for $SUITE"
if echo "/usr/bin/apt-cross -a $ARCH -S $SUITE -u" | chroot $BUILDPLACE /bin/sh; then
:
else
# if apt failed (maybe update needs to be run), save so far and exit cleanly
save_aptcache
umountproc
cleanbuildplace
exit 1;
fi
recover_aptcache
# TODO persistent problems with the toolchains mean this needs to be optional.
if echo "DEBIAN_FRONTEND=noninteractive /usr/bin/apt-get $OPTIONS -y --force-yes upgrade" | chroot $BUILDPLACE /bin/sh; then
:
else
# if apt failed (maybe update needs to be run), save so far and exit cleanly
save_aptcache
umountproc
cleanbuildplace
exit 1;
fi
if echo "DEBIAN_FRONTEND=noninteractive /usr/bin/apt-get $OPTIONS -y --force-yes dist-upgrade" | chroot $BUILDPLACE /bin/sh; then
:
else
# if apt failed (maybe update needs to be run), save so far and exit cleanly
save_aptcache
umountproc
cleanbuildplace
exit 1;
fi
chroot $BUILDPLACE /usr/bin/apt-get $OPTIONS -y --force-yes install emdebian-tools || true
chroot $BUILDPLACE /usr/bin/apt-get $OPTIONS --purge -y --force-yes autoremove || true
autoclean_aptcache
save_aptcache
echo " -> updating devscripts configuration"
if [ -f /home/$SUDO_USER/.devscripts ]; then
cp /home/$SUDO_USER/.devscripts $BUILDPLACE/home/$SUDO_USER/.devscripts
fi
VAL=`chroot $BUILDPLACE hostname -f 2>&1`
if [ "$VAL" != "" ]; then
echo " -> updating /etc/hosts"
cp /etc/hosts $BUILDPLACE/etc/hosts
fi
# sometimes this returns non-zero
if echo "$COLOUR ARCH=$ARCH /usr/bin/emsetup --arch $ARCH --yes" | chroot $BUILDPLACE /bin/sh; then
:
fi
umountproc || true
chroot $BUILDPLACE /usr/bin/apt-get clean || true
create_emdebiantgz
}
# very similar to emchrootbuild but calls emsource inside the
# chroot instead of copying the source in from outside.
# i.e. autobuilder mode (so it tries to be quiet).
function empautobuild()
{
if [ $SUITE == testing ]; then
BASETGZ="${WORKDIR}/emdebian-testing.tgz"
SUITE=testing
echo "Building in the embootstrap testing chroot"
else
BASETGZ="$WORKDIR/emdebian.tgz"
fi
. /usr/lib/pbuilder/pbuilder-buildpackage-funcs
PACKAGE=$1
BUILDRESULTUID="${BUILDRESULTUID:-${SUDO_UID:-0}}"
BUILDRESULTGID="${BUILDRESULTGID:-${SUDO_GID:-0}}"
INITIAL=`echo $PACKAGE | cut -b1`
TRUNK="$INITIAL/${PACKAGE}/trunk"
echobacktime
extractembuildplace
echo "File extracted to: $BUILDPLACE"
echo ""
recover_aptcache
createbuilduser
if [ -f "/etc/devscripts.conf" ]; then
cp /etc/devscripts.conf $BUILDPLACE/etc/devscripts.conf
fi
if [ -f "/home/$SUDO_USER/.devscripts" ]; then
mkdir -p $BUILDPLACE/home/$SUDO_USER/
cp /home/$SUDO_USER/.devscripts $BUILDPLACE/home/$SUDO_USER/.devscripts
fi
COLOUR=
if [ $ANSI_COLORS_DISABLED ]; then
COLOUR=ANSI_COLORS_DISABLED=1
fi
echo "Checking the Emdebian toolchain"
# fails with non-zero if no toolchain is found
if echo "$COLOUR /usr/bin/emsetup -q --arch $ARCH --report" | chroot $BUILDPLACE /bin/sh; then
:
else
umountproc
cleanbuildplace
exit 1;
fi
if echo "$COLOUR ARCH=$ARCH emsource -q -a $ARCH -b --build-dep $PACKAGE $EM_DPKG_OPTS" | chroot $BUILDPLACE /bin/sh; then
:
else
echo " -> emsource -b failed"
if [ "${LOGIN_AFTER_FAIL}" = "yes" ]; then
echo " -> Logging into the chroot"
echobacktime
chroot $BUILDPLACE /bin/sh
save_aptcache
umountproc
cleanbuildplace
exit 1;
fi
save_aptcache
umountproc
cleanbuildplace
exit 1;
fi
if [ $? -ne 0 ]; then
echo " -> emsource -b failed"
if [ "${LOGIN_AFTER_FAIL}" = "yes" ]; then
echo " -> Logging into the chroot"
echobacktime
chroot $BUILDPLACE /bin/sh
save_aptcache
umountproc
cleanbuildplace
exit 1;
fi
fi
FULLPATH="$BUILDPLACE/trunk/$TRUNK/"
FULLPATH=`echo $FULLPATH | tr -s \/`
PKGRESULT="${BUILDRESULT}${INITIAL}/${PACKAGE}/trunk"
echo "Copying build results to ${PKGRESULT}"
mkdir -p "$PKGRESULT"
if [ -d "${PKGRESULT}" ]; then
chown -R "${BUILDRESULTUID}:${BUILDRESULTGID}" "${BUILDRESULT}/"*
cp -p "${FULLPATH}"/* "${PKGRESULT}" 2>/dev/null || true
chown -R "${BUILDRESULTUID}:${BUILDRESULTGID}" "${BUILDRESULT}/"*
else
echo "E: BUILDRESULT=[$BUILDRESULT] is not a directory." >&2
fi
save_aptcache
umountproc
cleanbuildplace
echobacktime
}
function emchrootbuild()
{
if [ $SUITE == testing ]; then
BASETGZ="${WORKDIR}/emdebian-testing.tgz"
SUITE=testing
echo "Building in the embootstrap testing chroot"
else
BASETGZ="$WORKDIR/emdebian.tgz"
fi
. /usr/lib/pbuilder/pbuilder-buildpackage-funcs
BUILDRESULTUID="${BUILDRESULTUID:-${SUDO_UID:-0}}"
BUILDRESULTGID="${BUILDRESULTGID:-${SUDO_GID:-0}}"
while ! test -d ./debian -o "$(pwd)" = "$WORKDIR" ; do
cd ..;
done
if test ! -d ./debian; then
echo "Cannot find ./debian dir"
cleanbuildplace
exit 1
fi;
PKG_SOURCENAME=`dpkg-parsechangelog|sed -n 's/^Source: //p'`
PKG_VERSION=`dpkg-parsechangelog|sed -n 's/^Version: \(.*:\|\)//p'`
HOST_ARCH=`dpkg-architecture -qDEB_HOST_ARCH`
echo "Building ${PKG_SOURCENAME} ${PKG_VERSION} on ${HOST_ARCH} for $ARCH"
INITIAL=`echo $PKG_SOURCENAME | cut -b1`
PKG=`basename \$PWD`;
TRUNK="$INITIAL/${PKG_SOURCENAME}/trunk"
SVN="$TRUNK/${PKG}"
if [ "$LOGIN_AFTER_FAIL" == "yes" ]; then
echo " -> will attempt to login after build failure"
fi
echo " -> source location: trunk/$SVN"
# get the Debian .dsc
DEB_VER=`echo $PKG_VERSION | sed -n 's/em[0-9]*$//p'`
if [ "$DEB_VER" == "" ]; then
echo "$PKG_VERSION is not an Emdebian version string."
cleanbuildplace
exit 1;
fi
DSC="${PKG_SOURCENAME}_${DEB_VER}.dsc"
if [ ! -f "../$DSC" ]; then
echo "Cannot find ../$DSC"
cleanbuildplace
exit 1;
fi
echo " -> using $DSC"
# don't duplicate the downloads made by emsource
DIFFS=`find ../ -name emdebian-*\.patch`
DEBDIFFS=`find ../ -maxdepth 1 -name debian-patch*`
OLDSRC="$PKG_SOURCENAME.old"
echobacktime
extractembuildplace
echo "File extracted to: $BUILDPLACE"
echo ""
recover_aptcache
createbuilduser
if [ -f "/etc/devscripts.conf" ]; then
cp /etc/devscripts.conf $BUILDPLACE/etc/devscripts.conf
fi
if [ -f "/home/$SUDO_USER/.devscripts" ]; then
mkdir -p $BUILDPLACE/home/$SUDO_USER/
cp /home/$SUDO_USER/.devscripts $BUILDPLACE/home/$SUDO_USER/.devscripts
fi
COLOUR=
if [ $ANSI_COLORS_DISABLED ]; then
COLOUR=ANSI_COLORS_DISABLED=1
fi
echo "Checking the Emdebian toolchain"
# fails with non-zero if no toolchain is found
if echo "$COLOUR /usr/bin/emsetup --arch $ARCH --report" | chroot $BUILDPLACE /bin/sh; then
:
else
umountproc
cleanbuildplace
exit 1;
fi
echo "Copying Debian source"
chroot $BUILDPLACE mkdir -p trunk/$TRUNK
copydsc "../$DSC" "$BUILDPLACE/trunk/${TRUNK}/"
chroot $BUILDPLACE /usr/bin/dpkg-source -x trunk/${TRUNK}/$DSC trunk/$SVN
echo "Applying Emdebian changes"
for PATCH in $DEBDIFFS
do
if [ ! -d /trunk/$SVN/debian/patches/ ]; then
echo "Creating debian/patches directory"
mkdir -p $BUILDPLACE/trunk/$SVN/debian/patches/
fi
NAME=`echo $PATCH | sed -e 's/..\/debian-patch-//'`
echo "Copying $PATCH to /trunk/$SVN/debian/patches/$NAME"
cp "$PATCH" "$BUILDPLACE/trunk/$SVN/debian/patches/$NAME"
done
for PATCH in $DIFFS
do
cp "$PATCH" "$BUILDPLACE/trunk/$TRUNK"
if echo "cd /trunk/$SVN; patch -p1 < $PATCH" | chroot $BUILDPLACE /bin/sh; then
:
else
umountproc
cleanbuildplace
exit 1;
fi
done
# only check for dependencies AFTER debian/control has been patched for Emdebian.
echo " -> installing build dependencies for $PKG_SOURCENAME"
checkembuilddep
# new function to parse and install cross-depends.
# read debian/xcontrol, pass Build-Cross-Depends to apt-cross -i
get_cross_depends
save_aptcache
echo " -> copying ../$OLDSRC"
cp -r "../$OLDSRC" "$BUILDPLACE/trunk/$TRUNK"
echo "Running emdebuild -a $ARCH $EM_DPKG_OPTS "
COLOUR=
if [ $ANSI_COLORS_DISABLED ]; then
COLOUR=ANSI_COLORS_DISABLED=1
fi
if echo "cd /trunk/$SVN; $COLOUR ARCH=$ARCH emdebuild -a $ARCH $EM_DPKG_OPTS" | chroot $BUILDPLACE /bin/sh; then
:
else
echo " -> emdebuild failed"
if [ "${LOGIN_AFTER_FAIL}" = "yes" ]; then
echo " -> Logging into the chroot"
echo " -> Build directory: /trunk/$SVN"
echobacktime
chroot $BUILDPLACE /bin/sh
save_aptcache
umountproc
cleanbuildplace
exit 1;
fi
save_aptcache
umountproc
cleanbuildplace
exit 1;
fi
if [ $? -ne 0 ]; then
echo " -> emdebuild failed"
if [ "${LOGIN_AFTER_FAIL}" = "yes" ]; then
echo " -> Logging into the chroot"
echo " -> Build directory: /trunk/$SVN"
echobacktime
chroot $BUILDPLACE /bin/sh
save_aptcache
umountproc
cleanbuildplace
exit 1;
fi
fi
FULLPATH="$BUILDPLACE/trunk/$TRUNK/"
FULLPATH=`echo $FULLPATH | tr -s \/`
PKGRESULT="${BUILDRESULT}${INITIAL}/${PKG_SOURCENAME}/trunk"
echo "Copying build results to ${PKGRESULT}"
mkdir -p "$PKGRESULT"
if [ -d "${PKGRESULT}" ]; then
chown -R "${BUILDRESULTUID}:${BUILDRESULTGID}" "${BUILDRESULT}/"*
cp -p "${FULLPATH}"/* "${PKGRESULT}" 2>/dev/null || true
chown -R "${BUILDRESULTUID}:${BUILDRESULTGID}" "${BUILDRESULT}/"*
else
echo "E: BUILDRESULT=[$BUILDRESULT] is not a directory." >&2
fi
CHANGES=`find $PKGRESULT -name \*${PKG_VERSION}_${ARCH}.changes`
echo " -> .changes file : ${CHANGES}"
EMDSC=`find $PKGRESULT -name \*${PKG_VERSION}.dsc`
echo " -> .dsc file : ${EMDSC}"
EMDEBS=`find $PKGRESULT -name \*${PKG_VERSION}*deb | grep -c deb`
echo " -> ${EMDEBS} packages built."
save_aptcache
umountproc
cleanbuildplace
echobacktime
}
function emlogin()
{
if [ $SUITE == testing ]; then
BASETGZ="${WORKDIR}/emdebian-testing.tgz"
echo "Logging into the embootstrap testing chroot"
else
BASETGZ="$WORKDIR/emdebian.tgz"
fi
extractembuildplace
recover_aptcache
echo " -> entering the shell"
echo "File extracted to: $BUILDPLACE"
# login should be as close to failsafe as possible so do v.little else.
chroot $BUILDPLACE /bin/sh || true
save_aptcache
umountproc
# saving the buildplace afterwards
if [ "${SAVE_AFTER_LOGIN}" = "yes" ]; then
echo " -> Saving the results, modifications to this session will persist"
chroot $BUILDPLACE /usr/bin/apt-get clean || true
create_emdebiantgz
fi
cleanbuildplace
}
# test for sudo - normally empdebuild is installed in /usr/sbin so this
# test is really only for SVN users.
# make sure sudo is in use.
# bash cannot seem to do this when set -e is enabled
# because grep returns non-zero on a non-match
# so I use perl. :-)
ISSUDOSET=`perl -e '$e=\`printenv\`; ($e =~ /SUDO_USER/) ? print "yes" : print "no";'`
if [ $ISSUDOSET == "no" ] ; then
AREWEROOT=`perl -e '$e=\`printenv\`; ($e =~ /LOGNAME=root/) ? print "yes" : print "no";'`
if [ $AREWEROOT == "no" ]; then
echo "empdebuild needs to be run under sudo or as root."
exit 2
fi
fi
if [ ! $1 ];then
usagehelp
exit;
fi
USEDEVPTS="yes"
USEPROC="yes"
while [ -n "$1" ]; do
case "$1" in
--help|-h|-?|--version)
usagehelp
exit;
;;
-a|--arch)
shift
ARCH=$1
# chomp the argument to --arch
shift
;;
--testing)
shift
SUITE=testing
;;
--create|create)
shift;
checkarch
createemchroot
exit;
;;
--update|update)
shift;
checkarch
update_emchroot
exit;
;;
--build|build)
shift;
checkarch
emchrootbuild
exit;
;;
--autobuild|autobuild)
shift;
PACKAGE=$1
shift;
checkarch
empautobuild $PACKAGE
exit;
;;
--save-after-login)
shift
SAVE_AFTER_LOGIN="yes"
;;
--login-after-fail)
shift
LOGIN_AFTER_FAIL="yes"
;;
--login|login)
shift
checkarch
emlogin
exit;
;;
--clean|clean)
shift
echo "Trying to ensure crashed chroots are unmounted"
CRASH=`mount | grep "$WORKDIR" | cut -d' ' -f3`
if [ "$CRASH" ]; then
echo "Trying to ensure crashed chroots are unmounted"
mount | grep "$WORKDIR" | cut -d' ' -f3 | xargs umount || true
fi
echo "Cleaning $BASEBUILDPLACE"
clean_subdirectories $BASEBUILDPLACE
# if debootstrap fails, we start again so remove the stamp.
if [ -f $WORKDIR/stamp-debootstrap ]; then
rm $WORKDIR/stamp-debootstrap
fi
exit;
;;
--)
while [ -n "$1" ]
do
EM_DPKG_OPTS+="$1 "
shift
done
break
;;
*)
echo "Unrecognised option: $1"
echo
usagehelp
exit;
;;
esac
done

@ -0,0 +1,658 @@
# emrootfslib : shell library to support root filesystems for Emdebian.
#
# This file is POSIX shell, compatible with debootstrap.
# Do not include or reference pbuilder functions or bash code here.
#
# Copyright (C) 2006-2008 Neil Williams <codehelp@debian.org>
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# This shell library requires perl !
# Intended solely for use on the build machine. Do not use these functions
# in second_stage_install !
OURVERSION=`perl -e 'use Emdebian::Tools; print &tools_version();'`
get_default_arch ()
{
ARCH=`perl -e 'use Debian::DpkgCross; \
&read_config(); \
my $arch = &get_architecture(); \
print (qq/None.\n/) if (!$arch); \
print $arch;';`
}
get_work_dir ()
{
WORKDIR=`perl -e 'use Cwd; use Emdebian::Tools; use Config::Auto; use Debian::DpkgCross; \
&read_config; \
my $w = &get_workdir; \
$w = cwd if (! -d $w); \
$w =~ s/\/$//; \
print $w;';`
}
get_work_dir
get_default_arch
WORKPLACE="${WORKDIR}/pbuilder"
BASETGZ="${WORKDIR}/emdebian.tgz"
#pbuilder base values
DEBIAN_BUILDARCH=$ARCH
# cross-building chroot is same arch as host.
BUILDRESULT="$WORKPLACE/result/"
# tidy up // to /
BUILDRESULT=`echo $BUILDRESULT | tr -s \/`
APTCACHE="$WORKPLACE/aptcache/"
# tidy up // to /
APTCACHE=`echo $APTCACHE | tr -s \/`
AUTO_DEBSIGN=yes
APTCACHEHARDLINK="no"
BUILDPLACE="$WORKPLACE/build"
# the default is to add a PID in the buildplace.
BASEBUILDPLACE="$BUILDPLACE"
if [ "${PRESERVE_BUILDPLACE}" != "yes" ]; then
BUILDPLACE="$BUILDPLACE/$$"
fi
checkarch ()
{
ARCH=$ARCH perl -e 'use Debian::DpkgCross; $arch = $ENV{ARCH}; $arch=~s/ //g; \
die "Unsupported architecture: $arch Use --arch\n" if (not defined (&check_arch($arch)));'
}
create_emdebiantgz() {
(
if ! cd "$BUILDPLACE"; then
echo "Error: unexpected error in chdir to $BUILDPLACE" >&2
exit 1;
fi
while test -f "${BASETGZ}.tmp"; do
echo " -> Someone else has lock over ${BASETGZ}.tmp, waiting"
sleep 10s
done
echo " -> creating base tarball [${BASETGZ}]"
if ! sudo tar cfz "${BASETGZ}.tmp" * ; then
echo " -> failed building base tarball"
rm -f "${BASETGZ}.tmp"
exit 1;
fi
mv "${BASETGZ}.tmp" "${BASETGZ}"
)
}
check_dirs()
{
if [ ! -d $BUILDPLACE ] ; then
mkdir -p $BUILDPLACE
fi
if [ ! -d $BUILDRESULT ] ; then
mkdir -p $BUILDRESULT
fi
if [ ! -d $APTCACHE ] ; then
mkdir -p $APTCACHE
fi
}
disable_apt_recommends () {
if [ -d "$BUILDPLACE/etc/apt/apt.conf.d/" ]; then
if [ ! -f "$BUILDPLACE/etc/apt/apt.conf.d/10disablerecommends" ]; then
echo " -> disabling Apt::Install-Recommends"
cat > $BUILDPLACE/etc/apt/apt.conf.d/10disablerecommends << 'EOF'
APT
{
Install-Recommends "false"
};
EOF
fi
fi
}
disable_apt_pdiffs () {
if [ -d "$BUILDPLACE/etc/apt/apt.conf.d/" ]; then
if [ ! -f "$BUILDPLACE/etc/apt/apt.conf.d/12disablepdiffs" ]; then
echo " -> disabling Apt::Acquire::PDiffs"
cat > $BUILDPLACE/etc/apt/apt.conf.d/12disablepdiffs << 'EOF'
APT
{
Acquire::PDiffs "false";
};
EOF
fi
fi
}
apt_autoremove_always () {
if [ -d "$BUILDPLACE/etc/apt/apt.conf.d/" ]; then
if [ ! -f "$BUILDPLACE/etc/apt/apt.conf.d/11always_autoremove" ]; then
echo " -> enabling Apt::AutomaticRemove"
cat > $BUILDPLACE/etc/apt/apt.conf.d/11always_autoremove << 'EOF'
APT
{
AutomaticRemove "true"
};
EOF
fi
fi
}
unpack_debootstrap () {
info INSTCORE "Starting unpacking in $BUILDPLACE"
for deb in `ls $BUILDPLACE/var/cache/apt/archives/*.deb`; do
ver=`dpkg -f $deb Version`
pkg=`dpkg -f $deb Package`
info INSTCORE "Unpacking $pkg ($ver) ...."
dpkg -x $deb $BUILDPLACE/
# get the package listing with reduced parsing complexity
mkdir $BUILDPLACE/listing
ar -p $deb data.tar.gz > $BUILDPLACE/listing/data.tar.gz
tar -tzf $BUILDPLACE/listing/data.tar.gz | sed -e 's/^\.//' | sed -e 's/^\/$/\/\./' | sed -e 's/\/$//' > $BUILDPLACE/var/lib/dpkg/info/${pkg}.list
rm -rf $BUILDPLACE/listing
rm -rf $BUILDPLACE/tmp/*
dpkg -e $deb $BUILDPLACE/tmp/
for maint in `ls $BUILDPLACE/tmp/`; do
mv $BUILDPLACE/tmp/$maint $BUILDPLACE/var/lib/dpkg/info/$pkg.$maint
if [ $maint = "control" ]; then
grep -v "^$" $BUILDPLACE/var/lib/dpkg/info/$pkg.$maint >> $BUILDPLACE/var/lib/dpkg/available
grep -v "^$" $BUILDPLACE/var/lib/dpkg/info/$pkg.$maint >> $BUILDPLACE/var/lib/dpkg/status
echo "" >> $BUILDPLACE/var/lib/dpkg/available
echo "Status: install ok unpacked" >> $BUILDPLACE/var/lib/dpkg/status
rm $BUILDPLACE/var/lib/dpkg/info/$pkg.$maint
fi
# need a dpkg filter to make this stick
if [ $maint = "symbols" ]; then
rm $BUILDPLACE/var/lib/dpkg/info/$pkg.symbols
fi
done
if [ -f $BUILDPLACE/var/lib/dpkg/info/$pkg.conffiles ]; then
echo "Conffiles:" >> $BUILDPLACE/var/lib/dpkg/status
info INSTCORE "Processing $pkg.conffiles"
for line in `cat $BUILDPLACE/var/lib/dpkg/info/$pkg.conffiles`; do
md5=`md5sum $BUILDPLACE/$line | cut -d" " -f1`
echo " $line $md5" >> $BUILDPLACE/var/lib/dpkg/status
done
fi
echo "" >> $BUILDPLACE/var/lib/dpkg/status
done
if [ ! -e "$BUILDPLACE/etc/localtime" ]; then
ln -sf /usr/share/zoneinfo/UTC "$BUILDPLACE/etc/localtime"
fi
info INSTCORE "Removing archives..."
rm -f $BUILDPLACE/var/cache/apt/archives/*.deb
# (skip stages in emsecondstage)
touch $BUILDPLACE/debootstrap/unpacked
}
busybox_symlinks ()
{
# busybox symlinks are best managed in postinst so that dpkg
# does not complain when they are replaced by Debian packages.
# this allows more applets to be supported by default.
if [ -f $BUILDPLACE/usr/share/busybox/busybox.links ]; then
cd $BUILDPLACE
# setup busybox
cp usr/share/busybox/busybox.links .
cp usr/share/busybox/install.sh .
# link in the rest of its applets from OUTSIDE the chroot
info INSTCORE "Symlinking the busybox applets..."
sh ./install.sh $BUILDPLACE/ --symlinks
rm $BUILDPLACE/install.sh
rm $BUILDPLACE/busybox.links
else
info INSTCORE "busybox configuration not required"
fi
}
disable_invokercd ()
{
# invoke-rc.d is usually shell but is being looked at in Debian.
if [ ! -f $BUILDPLACE/usr/sbin/invoke-rc.d ]; then
echo '#!/bin/sh' > $BUILDPLACE/usr/sbin/invoke-rc.d
echo 'exec /etc/init.d/$1 $2' > $BUILDPLACE/usr/sbin/invoke-rc.d
echo '' >> $BUILDPLACE/usr/sbin/invoke-rc.d
chmod 755 $BUILDPLACE/usr/sbin/invoke-rc.d
fi
}
disable_updatercd ()
{
# a better fix for /usr/sbin/update-rc.d is available via sysv-rc
if [ ! -f $BUILDPLACE/usr/sbin/update-rc.d ]; then
echo "#!/bin/sh" > $BUILDPLACE/usr/sbin/update-rc.d
echo "" >> $BUILDPLACE/usr/sbin/update-rc.d
chmod 755 $BUILDPLACE/usr/sbin/update-rc.d
fi
RC=`head $BUILDPLACE/usr/sbin/update-rc.d | grep /usr/bin/perl || true`
if [ "$RC" != "" ]; then
info INSTCORE "Replacing perl update-rc.d"
echo "#!/bin/sh" > $BUILDPLACE/usr/sbin/update-rc.d
echo "" >> $BUILDPLACE/usr/sbin/update-rc.d
chmod 755 $BUILDPLACE/usr/sbin/update-rc.d
fi
}
extra_etc_rcd ()
{
if [ ! -d $BUILDPLACE/etc/rcS.d ]; then
mkdir $BUILDPLACE/etc/rcS.d
fi
if [ ! -d $BUILDPLACE/etc/rc0.d ]; then
mkdir $BUILDPLACE/etc/rc0.d
fi
if [ ! -d $BUILDPLACE/etc/rc1.d ]; then
mkdir $BUILDPLACE/etc/rc1.d
fi
if [ ! -d $BUILDPLACE/etc/rc6.d ]; then
mkdir $BUILDPLACE/etc/rc6.d
fi
}
provide_var_lib_x11 ()
{
if [ ! -d $BUILDPLACE/var/lib/x11 ]; then
mkdir -p $BUILDPLACE/var/lib/x11
fi
}
basic_group_setup () {
if [ ! -f $BUILDPLACE/etc/group ]; then
echo \
"root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
audio:x:29:
utmp:x:43:
video:x:44:
" > $BUILDPLACE/etc/group
fi
}
basic_passwd_setup () {
if [ ! -f $BUILDPLACE/etc/passwd ]; then
echo \
"root:x:0:0:root:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
" > $BUILDPLACE/etc/passwd
fi
}
# need /etc/shadow too
basic_shadow_setup () {
if [ ! -f $BUILDPLACE/etc/shadow ]; then
echo \
"root:$1$Vu4M34LT$0L2BfH9nXbSG1zQWxUH8M1:0::::::
daemon:*:13896:0:99999:7:::
bin:*:0:0:99999:7:::
sys:*:0:0:99999:7:::
sync:*:0:0:99999:7:::
games:*:0:0:99999:7:::
man:*:0:0:99999:7:::
lp:*:0:0:99999:7:::
mail:*:0:0:99999:7:::
news:*:0:0:99999:7:::
uucp:*:0:0:99999:7:::
proxy:*:0:0:99999:7:::
www-data:*:0:0:99999:7:::
backup:*:0:0:99999:7:::
list:*:0:0:99999:7:::
irc:*:0:0:99999:7:::
gnats:*:0:0:99999:7:::
nobody:*:0:0:99999:7:::" > $BUILDPLACE/etc/shadow
fi
}
provide_empty_install_info () {
if [ ! -f $BUILDPLACE/usr/sbin/install-info ]; then
echo \
'#!/bin/sh
exec /etc/init.d/$1 $2
' > $BUILDPLACE/usr/sbin/install-info
chmod 755 $BUILDPLACE/usr/sbin/install-info
fi
}
set_approx_time () {
if [ -d $BUILDPLACE/bin ]; then
DATE=`date`
ZERO=`date -d@0`
# if we have a usable date, store it.
if [ "$DATE" != "$ZERO" ]; then
APPROX=`stat -c%Y $BUILDPLACE/bin/`
STR=`date -d@$APPROX +%m%d%H%M%Y`
info INSTCORE "Storing approximate time '$STR' in './datestring'"
echo "$STR" > $BUILDPLACE/datestring
fi
fi
}
basic_etc_fstab () {
if [ ! -f "$BUILDPLACE/etc/fstab" ]; then
cat > $BUILDPLACE/etc/fstab << 'EOF'
# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
devpts /dev/pts devpts mode=0620,gid=5 0 0
usbdevfs /proc/bus/usb usbdevfs noauto 0 0
EOF
chown 0.0 "$BUILDPLACE/etc/fstab";
chmod 0644 "$BUILDPLACE/etc/fstab"
fi
}
make_dpkg_dirs () {
mkdir -p "$BUILDPLACE/var/lib/dpkg"
: >"$BUILDPLACE/var/lib/dpkg/status"
echo >"$BUILDPLACE/var/lib/dpkg/available"
echo -n >"$BUILDPLACE/var/lib/dpkg/diversions"
}
x_feign_install () {
local pkg="$1"
local deb="$(debfor $pkg)"
local ver="$(
ar -p "$BUILDPLACE/$deb" control.tar.gz | zcat |
tar -O -xf - control ./control 2>/dev/null |
sed -ne 's/^Version: *//Ip' | head -n 1
)"
mkdir -p "$BUILDPLACE/var/lib/dpkg/info"
echo \
"Package: $pkg
Version: $ver
Status: install ok installed
" >> "$BUILDPLACE/var/lib/dpkg/status"
touch "$BUILDPLACE/var/lib/dpkg/info/${pkg}.list"
}
prepare_proc () {
if [ ! -d $BUILDPLACE/proc ]; then
mkdir -p $BUILDPLACE/proc
fi
if [ ! -d $BUILDPLACE/sys ]; then
mkdir -p $BUILDPLACE/sys
fi
}
prepare_var () {
if [ ! -d $BUILDPLACE/var/log ]; then
mkdir -p $BUILDPLACE/var/log
fi
if [ ! -d $BUILDPLACE/var/spool ]; then
mkdir -p $BUILDPLACE/var/spool
fi
}
busybox_inittab () {
if [ ! -e "$BUILDPLACE/etc/inittab" ]; then
info INSTCORE "Adding default busybox inittab"
cat > $BUILDPLACE/etc/inittab << 'EOF'
# /etc/inittab
#
# Copyright (C) 2001 Erik Andersen <andersen@codepoet.org>
#
# Note: BusyBox init doesn't support runlevels.
# Startup the system
null::sysinit:/bin/mount -o remount,rw /
null::sysinit:/bin/mount -t proc proc /proc
null::sysinit:/bin/mount -t sysfs sysfs /sys
null::sysinit:/bin/mount -t devpts devpts /dev/pts
null::sysinit:/bin/mount -a
null::sysinit:/bin/hostname -F /etc/hostname
null::sysinit:/sbin/ifconfig lo 127.0.0.1 up
null::sysinit:/sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo
# now run any rc scripts and then login
::sysinit:/etc/init.d/rcS
# Set up a couple of getty's
tty1::respawn:/sbin/getty 38400 tty1
tty2::respawn:/sbin/getty 38400 tty2
# Put a getty on the serial port
#ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100
ttyS2::respawn:/sbin/getty -L ttyS2 115200 vt100
# Logging junk
null::sysinit:/bin/touch /var/log/messages
null::respawn:/sbin/syslogd -n -m 0
null::respawn:/sbin/klogd -n
tty3::respawn:/usr/bin/tail -f /var/log/messages
# Stuff to do for the 3-finger salute
::ctrlaltdel:/sbin/reboot
# Stuff to do before rebooting
null::shutdown:/usr/bin/killall klogd
null::shutdown:/usr/bin/killall syslogd
null::shutdown:/bin/umount -a -r
null::shutdown:/sbin/swapoff -a
EOF
fi
}
busybox_rcS () {
if [ ! -d "$BUILDPLACE/etc/default" ]; then
mkdir -p $BUILDPLACE/etc/default
fi
if [ ! -d "$BUILDPLACE/etc/rc.d" ]; then
mkdir -p $BUILDPLACE/etc/rc.d
fi
if [ ! -f "$BUILDPLACE/etc/default/rcS" ]; then
echo "#!/bin/sh" > $BUILDPLACE/etc/default/rcS
echo >> $BUILDPLACE/etc/default/rcS
chown 0.0 "$BUILDPLACE/etc/default/rcS"
chmod 644 "$BUILDPLACE/etc/default/rcS"
fi
# derived from the buildroot version.
if [ ! -e "$BUILDPLACE/etc/init.d/rcS" ]; then
info INSTCORE "Adding default busybox rcS"
cat > $BUILDPLACE/etc/init.d/rcS << 'EOF'
#!/bin/sh
set -e
# Start all init scripts in /etc/rc.d/
#
if [ ! -z "$SPAWNED" ]; then
/bin/login
fi
SPAWNED="$SPAWNED ."
export SPAWNED=\$SPAWNED
for i in /etc/rc.d/S??* ;do
# Ignore dangling symlinks (if any).
[ ! -f "$i" ] && continue
case "$i" in
*.sh)
# Source shell script for speed.
(
trap - INT QUIT TSTP
set start
. $i
)
;;
*)
# No sh extension, so fork subprocess.
$i start
;;
esac
done
EOF
chown 0.0 "$BUILDPLACE/etc/init.d/rcS"
chmod 0755 "$BUILDPLACE/etc/init.d/rcS"
fi
}
# call repeatedly to create init symlinks.
# arg1 is the file in $BUILDPLACE/etc/init.d/
# arg2 is the number for the link in the init sequence
# where 'foo 20' runs after 'bar 10' etc.
symlink_rcS () {
local file="$1"
local num="$2"
linkname="S$num$file"
if [ ! -d "$BUILDPLACE/etc/rc.d/" ]; then
mkdir $BUILDPLACE/etc/rc.d
fi
if [ -f $BUILDPLACE/etc/init.d/$file ]; then
ln -sf ../init.d/$file $BUILDPLACE/etc/rc.d/$linkname
fi
}
symlink_rcK () {
local file="$1"
local num="$2"
linkname="K$num$file"
if [ ! -d "$BUILDPLACE/etc/rc.d/" ]; then
mkdir $BUILDPLACE/etc/rc.d
fi
if [ -f $BUILDPLACE/etc/init.d/$file ]; then
ln -sf ../init.d/$file $BUILDPLACE/etc/rc.d/$linkname
fi
}
basic_etc_profile () {
if [ ! -e "$BUILDPLACE/etc/profile" ]; then
info INSTCORE "Adding a basic /etc/profile file"
cat > $BUILDPLACE/etc/profile << 'EOF'
if [ "`id -u`" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games/"
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/games"
fi
if [ "$PS1" ]; then
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
export PATH
export DISPLAY=:0
umask 022
EOF
fi
}
set_cdebconf_default () {
info INSTCORE "Setting cdebconf as default."
echo "export DEBCONF_USE_CDEBCONF=true" >> $BUILDPLACE/etc/profile
}
set_tslib_pointercal () {
info INSTCORE "Setting location of tslib calibration file."
echo "export TSLIB_CALIBFILE=/etc/pointercal" >> $BUILDPLACE/etc/profile
}
# this function is coded to match the sample_xorg_conf
# some devices might use /dev/input/event1 or event2
set_tslib_tsdevice () {
info INSTCORE "Setting location of tslib touchscreen device."
echo "export TSLIB_TSDEVICE=/dev/input/event0" >> $BUILDPLACE/etc/profile
}
sample_xorg_conf () {
if [ ! -e "$BUILDPLACE/etc/X11/xorg.conf" ]; then
info INSTCORE "Adding sample xorg.conf"
cat > $BUILDPLACE/etc/X11/xorg.conf << 'EOF'
# You probably want to change at least some of these
# lines and provide it via machine:variant customisations.
# This one comes from balloon3-config.
Section "Files"
FontPath "/usr/share/fonts/truetype/ttf-bitstream-vera/"
EndSection
Section "InputDevice"
Identifier "Generic Keyboard"
Driver "kbd"
EndSection
# /dev/input/event0 is kernel-module specific.
# You may need to change this.
Section "InputDevice"
Identifier "Touchscreen"
Driver "tslib"
Option "ScreenNumber" "0"
Option "Width" "0"
Option "Height" "0"
Option "Rotate" "NONE"
Option "TslibDevice" "/dev/input/event0"
EndSection
Section "Device"
Identifier "Generic Video Card"
Driver "fbdev"
Option "UseFBDev" "true"
EndSection
Section "Monitor"
Identifier "Configured Monitor"
EndSection
Section "ServerLayout"
Identifier "Default Layout"
Screen "Default Screen"
InputDevice "Touchscreen"
EndSection
Section "Screen"
Identifier "Default Screen"
Monitor "Configured Monitor"
EndSection
EOF
fi
}
shell_update_rcd () {
if [ ! -e "$BUILDPLACE/usr/sbin/update-rc.d" ]; then
info INSTCORE "Adding a /usr/sbin/update-rc.d shell script"
cp /usr/share/emdebian-tools/update-rc.d $BUILDPLACE/usr/sbin/
chmod 0755 $BUILDPLACE/usr/sbin/update-rc.d
fi
}

@ -0,0 +1,172 @@
#!/bin/bash
set -e
# emsandbox : emdebian roots creation.
#
# Copyright (C) 2006-2008 Neil Williams <codehelp@debian.org>
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# the name is not finalised
PROG=emsandbox
function usagehelp () {
# print out help message
cat <<EOF
$PROG - cross-built chroot Emdebian rootfs builder
version $OURVERSION
Syntax: sudo $PROG [OPTIONS] [COMMAND]
Commands:
-?|-h|--help|--version: print this help message and exit
--create|create: create a cross-built base tarball for ARCH
Options:
-a|--arch: Override the default cross-build architecture (from dpkg-cross).
-s|--script FILENAME: Override the default package set and second-stage install.
-S|--suite NAME: Override the default suite [unstable]
-m|--machine NAME: Specify a machine name for customisation hooks
-v|--variant NAME: Specify a machine variant name for customisation hooks
--machine-path PATH: Specify a path to replace the $WORK/machine default
Although based on debootstrap, $PROG cannot support the full range of
debootstrap commands or options.
Some customised $PROG scripts are provided with emdebian-tools. The
default uses the standard Emdebian 'busybox' package with 'dpkg' and 'apt'.
Replacement scripts need to be full debootstrap suite shell scripts that specify
how to complete the first and second stage installations. If the script uses
'busybox', the second-stage install function must be compatible with the
shell applet in busybox - avoid bashisms!
Overriding the default suite also configures the root filesystem to look
for updates within the specified suite.
EOF
}
. /usr/share/emdebian-tools/empbuilderlib
SUITE=unstable
PACKAGE=
EXTRA_BASE=""
EXTRA_REQ=""
MACHINE=
VARIANT=
FILENAME=
get_work_dir
get_default_arch
check_sudo()
{
# test for sudo - normally empdebuild is installed in /usr/sbin so this
# test is really only for SVN users.
# make sure sudo is in use.
# bash cannot seem to do this when set -e is enabled
# because grep returns non-zero on a non-match
# so I use perl. :-)
ISROOT=`perl -e '$e=\`printenv\`; ($e =~ /\nUSER=root\n/) ? print "yes" : print "no";'`
if [ $ISROOT == "no" ] ; then
echo "$PROG needs to be run under sudo or as root."
exit 2
fi
}
while [ -n "$1" ]; do
case "$1" in
--help|-h|-\?|--version)
usagehelp
exit;
;;
-a|--arch)
shift
ARCH=$1
# chomp the argument to --arch
shift
;;
--create|create)
shift;
;;
-s|--script)
shift
FILENAME=$1
shift
;;
-S|--suite)
shift
SUITE=$1
shift
;;
-m|--machine)
shift
MACHINE=$1
shift
;;
-v|--variant)
shift
VARIANT=$1
shift
;;
--machine-path)
shift
MACHINEPATH=$1
shift
;;
*)
echo "Unrecognised option: $1"
echo
usagehelp
exit;
;;
esac
done
if [ $INCLUDE ]; then
INCLUDE="--include=$1"
fi
if [ $MACHINEPATH ]; then
CUSTOM="--machine-path $MACHINEPATH"
fi
if [ $MACHINE ]; then
CUSTOM+=" --machine $MACHINE"
fi
if [ $VARIANT ]; then
CUSTOM+=" --variant $VARIANT"
fi
if [ "$ARCH" = "None." ]; then
echo Error: No default architecture has been set.
echo Use the --arch option or \'sudo dpkg-reconfigure dpkg-cross\'
exit
fi
checkarch
check_sudo
CROSS=$ARCH
if [ "x$SUITE" != "xunstable" ]; then
CUSTOM+=" --suite $SUITE"
fi
BASETGZ="${WORKDIR}/emdebian-$ARCH.tgz"
if [ $FILENAME ]; then
BASETGZ="${WORKDIR}/$FILENAME"
/usr/share/emdebian-tools/embootstrap --arch $ARCH --cross --script $FILENAME $CUSTOM $INCLUDE
echo " -> embootstrap complete"
else
/usr/share/emdebian-tools/embootstrap --arch $ARCH --cross $CUSTOM
fi

@ -0,0 +1,133 @@
#!/bin/sh
set -e
# emsandbox : emdebian rootfs installer
#
# Copyright (C) 2007-2008 Neil Williams <codehelp@debian.org>
#
# This package is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# simple wrapper to aid installation of the rootfs
# Provides a space for pre-installation custom commands as well as simplifying
# the command line.
TARGET=`pwd`
PROG=emsecondstage
usagehelp () {
# print out help message
cat <<EOF
$PROG - emdebian roots installer
Syntax: sudo $PROG
sudo $PROG [COMMAND]
Commands:
-?|-h|--help|-version: print this help message and exit
Although based on debootstrap, $PROG cannot support the full range of
debootstrap commands or options.
The standard Emdebian rootfs uses the 'busybox' package with 'dpkg' and
'apt'. Replacement scripts need to be full debootstrap suite shell
scripts that specify how to complete the first and second stage
installations. If the script uses 'busybox', the second-stage install
function must be compatible with the shell applet in busybox - avoid
bashisms!
Machine specific customisation hooks need to be shell scripts
(not bash) located in /debootstrap/machine/config.sh in the top level
directory of the rootfs. If you used 'emsandbox --machine ...' to
create the rootfs, the config.sh script for your machine and variant
has already been installed and will be executed by $PROG.
If the root filesystem used the 'unpack' method, $PROG only has to
apply the machine specific customisation hooks.
EOF
}
while [ -n "$1" ]; do
case "$1" in
--help|-h|-?|--version)
usagehelp
exit;
;;
*)
echo "Unrecognised command: $1"
exit;
;;
esac
done
# debootstrap directory removed if successful so avoid running twice.
if [ -d "$TARGET/debootstrap/" ]; then
chmod 0755 $TARGET
chroot $TARGET mount proc -t proc /proc || true
if [ -f datestring ]; then
TIME=`cat datestring`
echo "Setting approximate time of $TIME"
chroot $TARGET date -s $TIME || true
fi
echo "Running ldconfig in $TARGET ..."
chroot $TARGET /sbin/ldconfig
# in_target depmod # can only be run under the installed kernel, not the unpacking one.
DEBIAN_FRONTEND=noninteractive
DEBCONF_NONINTERACTIVE_SEEN=true
export DEBIAN_FRONTEND DEBCONF_NONINTERACTIVE_SEEN
# bug: See #451130
if [ -f "$TARGET/usr/lib/cdebconf/debconf-loadtemplate" ]; then
export DEBCONF_USE_CDEBCONF=true
echo "Configuring cdebconf"
chroot $TARGET /usr/lib/cdebconf/debconf-loadtemplate /usr/share/debconf/demo /usr/share/debconf/demo.templates
fi
echo "Configuring ..."
chroot $TARGET dpkg --configure -a
echo "Emdebian base system installed successfully in $TARGET."
fi
if [ -f $TARGET/machine/config.sh ]; then
echo " -> Running second stage config.sh script for this machine variant"
sh $TARGET/machine/config.sh
rm -r $TARGET/machine/
fi
if [ -d $TARGET/debootstrap ]; then
rm -rf $TARGET/debootstrap
fi
if [ -d $TARGET/machine ]; then
rm -rf $TARGET/machine
fi
if [ -f $TARGET/0x97BB3B58.txt ]; then
rm $TARGET/0x97BB3B58.txt
fi
# If there is no time or date, this will need to remain.
#if [ -f $TARGET/emdebian-archive-keyring.gpg ]; then
# rm $TARGET/emdebian-archive-keyring.gpg
#fi
if [ -d $TARGET/tmp/buildd ]; then
rm -rf $TARGET/tmp/buildd
fi
# finally, remove self
if [ -f $TARGET/emsecondstage ]; then
rm $TARGET/emsecondstage
fi
echo "Emdebian base system installed successfully."

@ -0,0 +1,12 @@
MACHINE:VARIANT README
======================
The example files live machine/default so that you can copy
the files into the right place in your machine:variant hierarchy.
$WORK/machine/$machine_name/default/packages.conf
$WORK/machine/$machine_name/default/config.sh
$WORK/machine/$machine_name/default/setup.sh
http://www.emdebian.org/emdebian/customisation.html

@ -0,0 +1,20 @@
#!/bin/sh -e
# This config script provides a method of adjusting the tarball
# contents immediately after the second stage install has completed.
# The script is copied into the tarball and unpacked to:
# $TARGET/machine/config.sh
# NOTE: At this stage, the ./debootstrap/ directory has already been
# removed. Do not rely on the tarball itself being available either.
# If any other files or scripts are needed by your additions to this
# script, you must ensure that setup.sh includes them into the tarball.
# It may be easier to create a normal Debian package that can do the
# job for you.
# This example file can act as a skeleton for your own scripts.
# Copy into $WORK/machine/$MACHINE/$VARIANT/ and edit.
# ($WORK is your emdebian working directory, as set in debconf.)
# Use 'default' as the variant directory if no other variants exist.
# config.sh does not have to be executable.

@ -0,0 +1,77 @@
# This is a standard shell conf file, included directly into embootstrap
# This example file can act as a skeleton for your own scripts.
# Copy into $WORK/machine/$MACHINE/$VARIANT/ and edit.
# ($WORK is your emdebian working directory, as set in debconf.)
# Use 'default' as the variant directory if no other variants exist.
# packages.conf is intended to be the principal place for adjusting
# the emsandbox tarball to suit the needs of specific machine variants.
# setup.sh and config.sh can fine tune the results but in order to avoid
# reinventing the wheel, if more than a few machines need similar
# adjustments to the same files, future versions of packages.conf will
# collate those into a single configuration parameter available to all.
# More options and parameters will be added in due course, including
# support for additional sources for /etc/apt/sources.list and single
# parameter changes to certain files like /etc/inittab.
# Due to limitations in the current debootstrap support, the only way
# of adding packages to the first stage is by providing a
# customised suite script. Even if emsandbox migrates to using a tool
# from Stag to overcome shortcomings in debootstrap, support for
# packages.conf, setup.sh and config.sh will remain.
# INCLUDE adds a comma separated list of package names to the list
# of packages added to the tarball and installed in the second stage.
# Currently, debootstrap has problems with multiple repositories so
# either upload this package to the same repository as your other
# packages or create an apt-proxy that can serve as a local repository,
# set it in PROXY and specify a usable mirror for the device in MIRROR.
# DEFAULT: empty
INCLUDE=
# SCRIPT overrides the default emsandbox suite-script that debootstrap
# uses to determine the base and required packages and the all important
# sequence in which the packages can be installed. SCRIPT can be overridden
# on the emsandbox command line.
# DEFAULT: /usr/share/emdebian-tools/emdebian.crossd
SCRIPT=
# MIRROR overrides the default emsandbox mirror. This repository will
# will be set in /etc/apt/sources.list and will also be used by
# debootstrap to obtain all packages for the tarball unless
# PROXY is also set.
# DEFAULT: http://www.emdebian.org/emdebian/
MIRROR=
# PROXY specifies a separate repository to pass to debootstrap that may
# be local or otherwise not intended for use once the tarball is installed
# Use MIRROR to set the same value in debootstrap and /etc/apt/sources.list
# If PROXY is specified without MIRROR, the default emsandbox MIRROR will
# be written into /etc/apt/sources.list
# DEFAULT: empty
PROXY=
# It is often useful to include a kernel image and/or modules or extra
# files but these may be in generated or variable paths - e.g. including
# a version string or in another part of the filesystem. To include these
# files in the emsandbox tarball, write out a list of paths into a file in
# $WORK/machine/$MACHINE/$VARIANT and read the contents into the
# setup.sh script. The files copied or unpacked into the $BUILDPLACE
# will then be included into the tarball.
# If there are extra files with absolute paths that do not change
# between releases, specify them in EXTRA. Absolute paths only -
# wildcards supported by 'cp' are allowed. Files are copied into
# $BUILDPLACE unchanged to be processed by setup.sh (if it exists).
EXTRA=
# TARBALL_NAME overrides the default name (emdebian-$ARCH) of the tarball
# Do not specify a path here, just a filename with the .tgz suffix
# DEFAULT: emdebian-$ARCH.tgz where $ARCH is specified to emsandbox or
# as the dpkg-cross default architecture.
TARBALL_NAME=
# SUITE is not recommended to be changed.
# DEFAULT: unstable
SUITE=

@ -0,0 +1,29 @@
#!/bin/sh -e
# This setup script is an alternative method of adjusting the tarball
# contents immediately after the first stage install has completed.
# It may be easier to create a normal Debian package that can do the
# job for you. (Remember to use the postinst if you want to append
# to existing files instead of replacing the emsandbox versions.
# The script is called by embootstrap with the following arguments:
# $1 = $BUILDPLACE - the top directory of the debootstrapped system
# $2 = $ARCH - the specified architecture, already checked with dpkg-architecture.
# This example file can act as a skeleton for your own scripts.
# Copy into $WORK/machine/$MACHINE/$VARIANT/ and edit.
# ($WORK is your emdebian working directory, as set in debconf.)
# Use 'default' as the variant directory if no other variants exist.
# setup.sh does not have to be executable.
# Use any other scripts or files that you need for first stage install.
# To use any of those scripts or files in the second stage, ensure
# that this script copies the relevant files into the tarball at
# /machine/$MACHINE/$VARIANT/
# e.g. To pass the location of a kernel or other files to be added to the
# tarball, write out a file into $WORK/machine/$MACHINE/$VARIANT and
# read the contents into this script.
# Nothing to do by default.

@ -5,6 +5,6 @@ use warnings;
# Eventually, this will replace the em_ one or call em_ with
# --arch and take over native duties.
#debug
my $str = join(" ", @ARGV);
system ("sudo /opt/working/emdebian/svn/current/em_multistrap $str");
system ("/usr/sbin/em_multistrap $str");

@ -0,0 +1,68 @@
#!/bin/sh
#
# Copyright 2008 Hands.com Ltd <phil@hands.com>
# Copyright 2008 Neil Williams <codehelp@debian.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
initd="/etc/init.d"
etcd="/etc/rc.d"
bn=$1;shift
if [ "$bn" = '-f' ]; then
bn=$1
shift
fi
defaults () {
makelinks "S${1:-20}"
makelinks "K${2:-${1:-20}}"
}
makelinks () {
echo " Adding symlink for $initd/$bn ...";
echo "${etcd}/${1}${bn} -> ../init.d/$bn"
ln -s "../init.d/$bn" "${etcd}/${1}${bn}"
}
if [ -z "$bn" -o -z "$1" ]; then
echo "Insufficient arguments"
exit 1
fi
if [ ! -f "$initd/$bn" ]; then
echo "update-rc.d: $initd/$bn: file does not exist\n"
exit 1
fi
if [ "$1" = 'remove' ]; then
shift
echo "rm -f /etc/rc.d/*${bn}"
rm -f "/etc/rc.d/*${bn}"
exit;
elif [ "$1" = 'defaults' ]; then
makelinks "S${2:-20}"
makelinks "K${3:-${2:-20}}"
exit 0;
else
if [ "$1" = 'start' ]
then
shift
num=$1
# use two digit prefixes
if [ $num -lt 10 ]; then
num="0${num}"
fi
makelinks "S${num}"
while [ "$1" != "." ]
do
shift
done
shift
if [ "$1" = 'stop' ]; then
shift
makelinks "K${1}"
fi
fi
exit 0;
fi
Loading…
Cancel
Save