#!/bin/sh # # Builds upon the Openmoko toolchain: # http://wiki.openmoko.org/wiki/Toolchain # PREFIX=/usr/local/openmoko/arm ARCH=arm-angstrom-linux-gnueabi CONF=$PREFIX/$ARCH/etc/opkg.conf LIB=$PREFIX/lib OPKG_CL=$PREFIX/bin/opkg-cl MAKE="`which make`" INSTALL="`which install`" CWD=$PWD root=$PWD/root remove_root=true interactive=false # ----- Find the Openmoko SVN repository -------------------------------------- for base in $PWD $HOME /home; do for dir in "" openmoko moko om; do for svn in svn.openmoko.org svn.openmoko svn ""; do try=$base/$dir/$svn if [ -d $try/developers/werner ]; then SVN=$try break 3 fi done done done echo "SVN=$SVN" if [ -z "$SVN" ]; then echo svn checkout http://svn.openmoko.org/ exit 1 fi # ----- Find the cache -------------------------------------------------------- for base in $PWD $HOME /home; do for dir in "" openmoko moko om; do for name in opkg-cache .opkg-cache; do try=$base/$dir/$name if [ -d $try ]; then CACHE=$try break 3 fi done done done if [ ! -z "`opkg-cl --cache=dummy --version 2>&1 >/dev/null`" -o \ -z "$CACHE" ]; then cache= else cache="--cache=$CACHE" fi # ----- Special commands in the build script ---------------------------------- opkg() { LD_LIBRARY_PATH=$LIB $OPKG_CL $cache -f $CONF -o "$root" "$@" } pkg() { LD_LIBRARY_PATH=$LIB $OPKG_CL $cache -f $CONF -o "$root" -V 0 install "$@" } make() { PATH=$PATH:$PREFIX/bin $MAKE -s CC=$ARCH-gcc "$@" } install() { [ -e "$1" ] [ -d "$2" ] cp "$1" "$root/$2/" } root() { cd $root } # ----- Set up the root directory --------------------------------------------- if [ "$root" = "${root#/}" ]; then root="$PWD/$root" fi root="`echo \"$root\" | sed 's|/$||'`" root_base="`dirname \"$root\"`" if [ -d "$root" ]; then if $remove_root; then rm -rf "$root" else echo "$root: output directory already exists" 1>&2 exit 1 fi fi if [ -e "$root" ]; then echo "$root: something is in the way" 1>&2 exit 1 fi if [ ! -d "$root_base" ]; then echo "$root: no parent directory" 1>&2 exit 1 fi echo "Creating $root" mkdir "$root" # ----- set up the bare essentials -------------------------------------------- mkdir -p "$root/dev" mkdir -p "$root/proc" mkdir -p "$root/sys" mknod "$root/dev/null" c 1 3 mknod "$root/dev/tty" c 5 0 mknod "$root/dev/console" c 5 1 mknod "$root/dev/ttySAC2" c 204 66 mkdir -p "$root/sbin" mkdir -p "$root/bin" mkdir -p "$root/etc" mkdir -p "$root/tmp" mkdir -p "$root/usr/local/bin" mkdir -p "$root/usr/lib/opkg" mkdir -p "$root/home/root" chmod 755 "$root/home" "$root/home/root" echo ROOT / auto defaults 0 0 >"$root/etc/fstab" echo "root::0:0:root:/home/root:/bin/sh" >"$root/etc/passwd" cp $CONF "$root/etc" # ----- opkg environment ------------------------------------------------------ PKG_CONFIG_SYSROOT_DIR="$root" PKG_CONFIG_PATH="/usr/lib/pkgconfig" CONFIG_SITE=/usr/local/openmoko/arm/site-config export PKG_CONFIG_SYSROOT_DIR PKG_CONFIG_PATH CONFIG_SITE # ----- opkg package database ------------------------------------------------- # @@@ cache lists and packages update_cache() { mkdir -p $PWD/cache root=$PWD/cache opkg update } # ----- opkg update custom=$1 if [ ! -z "$custom" ]; then if [ "${custom#/}" = "$custom" ]; then custom="$PWD/$custom" fi . "$custom" fi if $interactive; then while read -e -p "mkroot> " l; do eval "$l" done fi # ----- run postinstall scripts ----------------------------------------------- # # The only thing we really need our post-install scripts to do is to rename the # alternatives. We accomplish this by executing them on the host, but giving # them a very limited PATH, containing only update-alternatives. # restricted_bin=$SVN/developers/werner/myroot/restricted_bin cd "$root/usr/lib/opkg/info" MYROOT_ROOT="$root" export MYROOT_ROOT for n in *.postinst; do PATH=$restricted_bin ./$n done rm *.postinst # ----- Done ------------------------------------------------------------------ exit