summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rwxr-xr-xmkipks35
-rwxr-xr-xscripts/ipkg-build194
-rwxr-xr-xscripts/ipkg-unbuild29
3 files changed, 241 insertions, 17 deletions
diff --git a/mkipks b/mkipks
index 21b903c..26c72b9 100755
--- a/mkipks
+++ b/mkipks
@@ -1,98 +1,98 @@
#!/bin/sh
QTE_VERSION=2.3.2
DEB_VERSION=2.0
# Have to do this here, since CVS can't store symlinks
mkdir -p etc/rc2.d
rm -f etc/rc2.d/S98opie
ln -s ../init.d/opie etc/rc2.d/S98opie
rm -f ipaq/etc/rc2.d/S96opieatd
ln -s ../init.d/opieatd ipaq/etc/rc2.d/S96opieatd
VERSION_MAJ=$(sed -n -e 's/.*QPE_VERSION "\([0-9]*\)\..*\..*".*/\1/p' <$OPIEDIR/include/qpe/version.h)
VERSION_MIN=$(sed -n -e 's/.*QPE_VERSION ".*\.\([0-9]*\)\..*".*/\1/p' <$OPIEDIR/include/qpe/version.h)
VERSION_PAT=$(sed -n -e 's/.*QPE_VERSION ".*\..*\.\([0-9]*\).*/\1/p' <$OPIEDIR/include/qpe/version.h)
SUB_VERSION=$(sed -n -e 's,.*SUB_VERSION \"\(.*\)\".*,\1,p' <$OPIEDIR/include/qpe/version.h)
if grep -q 'QPE_VERSION .*snapshot' $OPIEDIR/include/qpe/version.h
then
VERSION_CVS="$(date +%Y%m%d)"
SUB_VERSION=$VERSION_CVS
else
VERSION_CVS=""
fi
QPE_VERSION=$VERSION_MAJ.$VERSION_MIN.$VERSION_PAT
ARCH=arm
STRIP=arm-linux-strip
STRIP_FILES="*ARM*not stripped"
TDIR=/tmp/ipk$$
-DATADIR=$TDIR/data
-CTRLDIR=$TDIR/control
+DATADIR=$TDIR
+CTRLDIR=$TDIR/CONTROL
IMAGEDIR=
VERB=
LIST=
RPM=
while [ $# -ne 0 ]
do
case "$1" in
-v)
VERB=1
echo >&2 "Packaging for version $VERSION_MAJ.$VERSION_MIN.$VERSION_PAT$VERSION_CVS"
;; -l)
LIST=1
;; -i)
shift
IMAGEDIR=$1
DATADIR=$IMAGEDIR
mkdir -p $IMAGEDIR
;; -rpm)
if [ "$OPIEDIR" != "/opt/Qtopia" ]
then
echo >&2 '$OPIEDIR is not the standard /usr/Qtopia directory.'
sleep 1
#exit 1
fi
RPM=1
;; -arch)
shift
ARCH=$1
STRIP=
STRIP_FILES=
;; /*)
FILES="$FILES $1"
;; *)
FILES="$FILES $PWD/$1"
esac
shift
done
if [ -z "$FILES" ]
then
FILES=`find $OPIEDIR -name "*.control" -print`
fi
RDIR=$PWD
cd $OPIEDIR
for i in $FILES
do
rm -rf $TDIR
mkdir -p $DATADIR
mkdir -p $CTRLDIR
packagename=${i##*/}; packagename=${packagename%.control}
version=$(eval echo '"'$(sed -n -e "s/^Version: *//p" $i)'"')
depends=$(eval echo '"'$(sed -n -e "s/^Depends: *//p" $i)'"')
files=$(eval echo $(sed -n -e "s/^Files://p" $i))
arch=$(eval echo $(sed -n -e "s/^Arch://p" $i))
section=$(sed -n -e "s/^Section: *//p" $i)
provides=$(sed -n -e "s/^Provides: *//p" $i)
conflicts=$(sed -n -e "s/^Conflicts: *//p" $i)
@@ -126,106 +126,107 @@ do
;; etc/*.d/*)
BASE=$(dirname /$ff)
;; ipaq/*)
BASE=$(dirname ${ff#ipaq})
;; *)
# For SHARP ROM compatibility. Should change to Qtopia.
BASE=/opt/QtPalmtop/$(dirname $ff)
esac
if [ -f $ff -o -b $ff -o -c $ff ]
then
D=$DATADIR$BASE
if [ -x $ff -a -n "$STRIP" ]
then
case $(file $ff) in
$STRIP_FILES)
$STRIP $ff
;; *)
esac
fi
if [ -n "$RPM" ]
then
case "$ff" in
/*) RPMFILES="$RPMFILES $ff"
;; *) RPMFILES="$RPMFILES $OPIEDIR/$ff"
esac
else
mkdir -p $D
if cp -a $ff $D
then
true
else
ERROR=1
fi
fi
else
echo >&2 "$0: $i: No such file: $ff"
ERROR=1
fi
done
done
fi
if [ -z "$ERROR" ]
then
if [ -n "$RPM" ]
then
SPEC=/tmp/mkipks-rpm-$$.spec
echo >$SPEC "Summary: $summary"
echo >>$SPEC "Name: $packagename"
echo >>$SPEC "Group: $section" ##########
echo >>$SPEC "License: $license"
echo >>$SPEC "Version: ${version%-*}"
echo >>$SPEC "Release: ${version#*-}"
echo >>$SPEC "%description"
sed -n -e '/^Description:/,$ p' $i | tail +2 >>$SPEC
echo >>$SPEC "%files"
echo >>$SPEC "%defattr(-,root,root)"
/bin/ls $RPMFILES >>$SPEC
rpm -bb --target $ARCH-unknown-linux $SPEC
# rm $SPEC
elif [ -z "$IMAGEDIR" ]
then
#size=$(du -h -s $DATADIR | sed -e 's/[ ].*//')
- size=$(mkfs.jffs2 -r $DATADIR | wc -c)
+ if (which mkfs.jffs2 >/dev/null 2>&1); then
+ size=$(mkfs.jffs2 -r $DATADIR | wc -c)
+ fi
echo "Package: $packagename" >$CTRLDIR/control
+ if [ ! -z "$size" ]; then
echo "Installed-Size: $size" >>$CTRLDIR/control
+ else
+ echo "Warning, no mkfs.jffs2 found, unable to set Installed-Size."
+ fi
+ echo "Architecture: $ARCH" >>$CTRLDIR/control
echo "Filename: ./$package.ipk" >>$CTRLDIR/control
echo "Version: $version" >>$CTRLDIR/control
- echo "Depends: $depends" >>$CTRLDIR/control
- echo "Provides: $provides" >>$CTRLDIR/control
- echo "Conflicts: $conflicts" >>$CTRLDIR/control
- egrep -v "^(Files|Version|Depends|Provides|Conflicts):" >>$CTRLDIR/control $i
- echo "$DEB_VERSION" >$TDIR/debian-binary
+ [ ! -z "$depends" ] && echo "Depends: $depends" >>$CTRLDIR/control
+ [ ! -z "$provides" ] && echo "Provides: $provides" >>$CTRLDIR/control
+ [ ! -z "$conflicts" ] && echo "Conflicts: $conflicts" >>$CTRLDIR/control
+ egrep -v "^(Files|Version|Depends|Provides|Conflicts|Architecture):" >>$CTRLDIR/control $i
+# echo "$DEB_VERSION" >$TDIR/debian-binary
base=${i%.control}
scripts="preinst postinst prerm postrm"
for pf in $scripts
do
if [ -x ${base}.$pf ]
then
cp ${base}.$pf $CTRLDIR/$pf
fi
done
- if [ "$UID" = 0 ]
- then
- chown -R root.root $TDIR
- else
- echo "Warning: You are not root. Unable to squash permissions."
- fi
- ( cd $CTRLDIR; tar cfz ../control.tar.gz ./*; )
- ( cd $DATADIR; tar cfz ../data.tar.gz ./*; )
- ( cd $TDIR; rm -rf control data; tar cf - ./debian-binary ./control.tar.gz ./data.tar.gz; ) | gzip >$RDIR/$package.ipk
+ $OPIEDIR/scripts/ipkg-build -o root -g root $TDIR
RESULT=$package.ipk
if [ -n "$VERB" ]
then
echo >&2 "Built $RESULT ($size)"
fi
if [ -n "$LIST" ]
then
echo $RESULT
fi
fi
else
echo >&2 "Not building $package package"
fi
done
+# clean up
+rm -rf $TDIR
diff --git a/scripts/ipkg-build b/scripts/ipkg-build
new file mode 100755
index 0000000..ac8f286
--- a/dev/null
+++ b/scripts/ipkg-build
@@ -0,0 +1,194 @@
+#!/bin/bash
+
+# ipkg-build -- construct a .ipk from a directory
+# Carl Worth <cworth@east.isi.edu>
+# based on a script by Steve Redler IV, steve@sr-tech.com 5-21-2001
+set -e
+
+ipkg_extract_value() {
+ sed -e "s/^[^:]*:[[:space:]]*//"
+}
+
+required_field() {
+ field=$1
+
+ value=`grep "^$field:" < $CONTROL/control | ipkg_extract_value`
+ if [ -z "$value" ]; then
+ echo "*** Error: $CONTROL/control is missing field $field" >&2
+ return 1
+ fi
+ echo $value
+ return 0
+}
+
+pkg_appears_sane() {
+ local pkg_dir=$1
+
+ local owd=`pwd`
+ cd $pkg_dir
+
+ PKG_ERROR=0
+
+ tilde_files=`find . -name '*~'`
+ if [ -n "$tilde_files" ]; then
+ echo "*** Warning: The following files have names ending in '~'.
+You probably want to remove them: " >&2
+ ls -ld $tilde_files
+ echo >&2
+ fi
+
+ large_uid_files=`find . -uid +99`
+
+ if [ "$ogargs" = "" ] && [ -n "$large_uid_files" ]; then
+ echo "*** Warning: The following files have a UID greater than 99.
+You probably want to chown these to a system user: " >&2
+ ls -ld $large_uid_files
+ echo >&2
+ fi
+
+
+ if [ ! -f "$CONTROL/control" ]; then
+ echo "*** Error: Control file $pkg_dir/$CONTROL/control not found." >&2
+ cd $owd
+ return 1
+ fi
+
+ pkg=`required_field Package`
+ [ "$?" -ne 0 ] && PKG_ERROR=1
+
+ version=`required_field Version | sed 's/.*://;'`
+ [ "$?" -ne 0 ] && PKG_ERROR=1
+
+ arch=`required_field Architecture`
+ [ "$?" -ne 0 ] && PKG_ERROR=1
+
+ required_field Maintainer >/dev/null
+ [ "$?" -ne 0 ] && PKG_ERROR=1
+
+ required_field Description >/dev/null
+ [ "$?" -ne 0 ] && PKG_ERROR=1
+
+ section=`required_field Section`
+ [ "$?" -ne 0 ] && PKG_ERROR=1
+ if [ -z "$section" ]; then
+ echo "The Section field should have one of the following values:" >&2
+ echo "admin, base, comm, editors, extras, games, graphics, kernel, libs, misc, net, text, web, x11" >&2
+ fi
+
+ priority=`required_field Priority`
+ [ "$?" -ne 0 ] && PKG_ERROR=1
+ if [ -z "$priority" ]; then
+ echo "The Priority field should have one of the following values:" >&2
+ echo "required, important, standard, optional, extra." >&2
+ echo "If you don't know which priority value you should be using, then use \`optional'" >&2
+ fi
+
+ if echo $pkg | grep '[^a-z0-9.+-]'; then
+ echo "*** Error: Package name $name contains illegal characters, (other than [a-z0-9.+-])" >&2
+ PKG_ERROR=1;
+ fi
+
+ local bad_fields=`sed -ne 's/^\([^[:space:]][^:[:space:]]\+[[:space:]]\+\)[^:].*/\1/p' < $CONTROL/control | sed -e 's/\\n//'`
+ if [ -n "$bad_fields" ]; then
+ bad_fields=`echo $bad_fields`
+ echo "*** Error: The following fields in $CONTROL/control are missing a ':'" >&2
+ echo " $bad_fields" >&2
+ echo "ipkg-build: This may be due to a missing initial space for a multi-line field value" >&2
+ PKG_ERROR=1
+ fi
+
+ for script in $CONTROL/preinst $CONTROL/postinst $CONTROL/prerm $CONTROL/postrm; do
+ if [ -f $script -a ! -x $script ]; then
+ echo "*** Error: package script $script is not executable" >&2
+ PKG_ERROR=1
+ fi
+ done
+
+ if [ -f $CONTROL/conffiles ]; then
+ for cf in `cat $CONTROL/conffiles`; do
+ if [ ! -f ./$cf ]; then
+ echo "*** Error: $CONTROL/conffiles mentions conffile $cf which does not exist" >&2
+ PKG_ERROR=1
+ fi
+ done
+ fi
+
+ cd $owd
+ return $PKG_ERROR
+}
+
+###
+# ipkg-build "main"
+###
+ogargs=""
+usage="Usage: $0 [-o owner] [-g group] <pkg_directory> [<destination_directory>]"
+while getopts ":o:g:" opt; do
+ case $opt in
+ o ) owner=$OPTARG
+ ogargs="--owner=$owner"
+ ;;
+ g ) group=$OPTARG
+ ogargs="$ogargs --group=$group"
+ ;;
+ \? ) echo $usage >&2
+ esac
+done
+
+
+shift $(($OPTIND - 1))
+
+# continue on to process additional arguments
+
+case $# in
+1)
+ dest_dir=.
+ ;;
+2)
+ dest_dir=$2
+ ;;
+*)
+ echo echo $usage >&2
+ exit 1
+ ;;
+esac
+
+pkg_dir=$1
+
+if [ ! -d $pkg_dir ]; then
+ echo "*** Error: Directory $pkg_dir does not exist" >&2
+ exit 1
+fi
+
+# CONTROL is second so that it takes precedence
+CONTROL=
+[ -d $pkg_dir/DEBIAN ] && CONTROL=DEBIAN
+[ -d $pkg_dir/CONTROL ] && CONTROL=CONTROL
+if [ -z "$CONTROL" ]; then
+ echo "*** Error: Directory $pkg_dir has no CONTROL subdirectory." >&2
+ exit 1
+fi
+
+if ! pkg_appears_sane $pkg_dir; then
+ echo >&2
+ echo "ipkg-build: Please fix the above errors and try again." >&2
+ exit 1
+fi
+
+tmp_dir=$dest_dir/IPKG_BUILD.$$
+mkdir $tmp_dir
+
+tar $ogargs -C $pkg_dir -czf $tmp_dir/data.tar.gz . --exclude=$CONTROL
+tar $ogargs -C $pkg_dir/$CONTROL -czf $tmp_dir/control.tar.gz .
+
+echo "2.0" > $tmp_dir/debian-binary
+
+pkg_file=$dest_dir/${pkg}_${version}_${arch}.ipk
+here_dir=$PWD
+## tar -C $tmp_dir -czf $pkg_file ./debian-binary ./data.tar.gz ./control.tar.gz
+rm -f $pkg_file
+cd $tmp_dir ; ar crf $here_dir/$pkg_file ./debian-binary ./data.tar.gz ./control.tar.gz
+cd $here_dir
+rm $tmp_dir/debian-binary $tmp_dir/data.tar.gz $tmp_dir/control.tar.gz
+rmdir $tmp_dir
+
+echo "Packaged contents of $pkg_dir into $pkg_file"
diff --git a/scripts/ipkg-unbuild b/scripts/ipkg-unbuild
new file mode 100755
index 0000000..f724f75
--- a/dev/null
+++ b/scripts/ipkg-unbuild
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+set -e
+
+if [ $# -lt 1 ]; then
+ echo "usage: $0: package.ipk"
+ exit 1
+fi
+
+while [ $# -gt 0 ]; do
+ filename=$1
+ shift
+
+ pkg=`echo $filename | sed 's/.*\///;s/.ipk$//;s/.deb$//'`
+
+ mkdir -p $pkg
+ mkdir -p $pkg/CONTROL
+
+ pkg_dir=$PWD
+ cd $pkg; (ar x ../$filename || tar zxf ../$filename) >& /dev/null
+ cd $pkg_dir
+
+ tar xzf $pkg/data.tar.gz -C $pkg
+ tar xzf $pkg/control.tar.gz -C $pkg/CONTROL
+ rm -f $pkg/control.tar.gz $pkg/data.tar.gz $pkg/debian-binary
+done
+
+
+