summaryrefslogtreecommitdiff
path: root/scripts/mkipkg
Side-by-side diff
Diffstat (limited to 'scripts/mkipkg') (more/less context) (show whitespace changes)
-rwxr-xr-xscripts/mkipkg371
1 files changed, 371 insertions, 0 deletions
diff --git a/scripts/mkipkg b/scripts/mkipkg
new file mode 100755
index 0000000..54651af
--- a/dev/null
+++ b/scripts/mkipkg
@@ -0,0 +1,371 @@
+#!/bin/sh
+# vim: et sw=4
+
+# TODO: srcdir!=builddir
+
+usage()
+{
+ echo "usage: $self --destdir=[destination installation directory]"
+ echo "usage: $self [destination installation directory]"
+ exit 1
+}
+
+self=mkipkg
+destdir=
+strip=strip
+control=
+builddir=
+srcdir=
+prefix=
+preinst=
+postinst=
+prerm=
+postrm=
+mkfsjffs2=
+ipkgbuild=ipkg-build
+buildversion=
+subst=
+user=root
+group=root
+filesubst=
+
+oldpwd=
+
+for option
+do
+ case "$option" in
+ -*=*)
+ arg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'`
+ ;;
+ esac
+
+ case "$option" in
+ --destdir=*)
+ destdir=$arg
+ ;;
+ --strip=*)
+ strip=$arg
+ ;;
+ --control=*)
+ control=$arg
+ ;;
+ --preinst=*)
+ preinst=$arg
+ ;;
+ --postinst=*)
+ postinst=$arg
+ ;;
+ --prerm=*)
+ prerm=$arg
+ ;;
+ --postrm=*)
+ postrm=$arg
+ ;;
+ --builddir=*)
+ builddir=$arg
+ ;;
+ --srcdir=*)
+ srcdir=$arg
+ ;;
+ --prefix=*)
+ prefix=$arg
+ ;;
+ --mkfsjffs2=*)
+ mkfsjffs2=$arg
+ ;;
+ --ipkgbuild=*)
+ ipkgbuild=$arg
+ ;;
+ --buildversion=*)
+ buildversion=$arg
+ ;;
+ --subst=*)
+ subst=$arg
+ ;;
+ --user=*)
+ user=$arg
+ ;;
+ --group=*)
+ group=$arg
+ ;;
+ --filesubst=*)
+ filesubst=$arg
+ ;;
+ --classic)
+ classic=-c
+ ;;
+ -*)
+ usage
+ ;;
+ *)
+ destdir=$option
+ ;;
+ esac
+done
+
+if [ -z "$control" ]; then
+ control=$destdir/CONTROL/control
+fi
+if [ -z "$prerm" ]; then
+ prerm=$destdir/CONTROL/prerm
+fi
+if [ -z "$postrm" ]; then
+ postrm=$destdir/CONTROL/postrm
+fi
+if [ -z "$preinst" ]; then
+ preinst=$destdir/CONTROL/preinst
+fi
+if [ -z "$postinst" ]; then
+ postinst=$destdir/CONTROL/postinst
+fi
+
+# remove leading slash from prefix (to fix globbing)
+if [ -n "$prefix" ]; then
+ prefix=`echo $prefix | sed -e "s,/\(.*\),\\1,"`
+fi
+
+if [ -z "$destdir" ]; then
+ usage
+fi
+
+if [ ! -r $control ]; then
+ echo "$self: cannot find $control, exiting..."
+ exit 1
+fi
+
+if [ -z "`which $ipkgbuild 2>/dev/null`" ]; then
+ echo "$self: cannot find ipkg-build, exiting..."
+ exit 1
+fi
+
+findFile()
+{
+ local path=
+ if [ $# = 1 ]; then
+ find $1 -type f -o -type b -o -type c -o -type l -o -type d
+ else
+ find . -type f -o -type b -o -type c -o -type l -o -type d | \
+ sed -e "s,\./\(.*\),\\1,g"
+ fi
+
+}
+
+_pushd() { oldpwd=`pwd`; cd $1; }
+_popd() { cd $oldpwd; }
+
+setVar()
+{
+ eval "$1='$2'"
+}
+
+expandMaskToList()
+{
+ local _list=`echo $1`
+ local _tmpFileList=
+ for f in $_list; do
+ if [ -d $f ]; then
+ find="`findFile $f`"
+ if [ -z "$find" ]; then
+ find="$f"
+ fi
+ f="$f `findFile $f`"
+ fi
+ _tmpFileList=$f" $_tmpFileList"
+ done
+ setVar $2 "$_tmpFileList"
+}
+
+createFileList()
+{
+ local excludeMask
+ local includeMask
+ if (cat $1|grep -q ^FileExcludeMask); then
+ excludemaskpresent=1
+ excludeMask=$(eval echo '"'$(sed -n -e "s,^FileExcludeMask: *,,p" $1)'"')
+ fi
+ if (cat $1|grep -q ^FileIncludeMask); then
+ includemaskpresent=1
+ includeMask=$(eval echo '"'$(sed -n -e "s,^FileIncludeMask: *,,p" $1)'"')
+ else
+ if (cat $1|grep -q ^Files:); then
+ includemaskpresent=1
+ includeMask=$(eval echo '"'$(sed -n -e "s,^Files: *,,p" $1)'"')
+ fi
+ fi
+
+ excludeMask="$excludeMask CONTROL/* usr/share/* CVS/* SCCS/*"
+
+ if [ $includemaskpresent == 1 ]; then
+ if [ -z "$includeMask" ]; then
+ setVar $2 ""
+ return 0
+ fi
+ _pushd $destdir
+ expandMaskToList "$includeMask" _fileList
+ _popd
+ else
+ _fileList=`cd $destdir && findFile`
+ fi
+
+ _excludeList=
+ if [ -n "$excludeMask" ]; then
+ _pushd $destdir
+ expandMaskToList "$excludeMask" _excludeList
+ _popd
+ fi
+
+ local realFileList=
+ local missing=0
+ for file in $_fileList; do
+ local containedInList=0
+ for i in $_excludeList; do
+ if [ $file = $i ]; then
+ containedInList=1
+ fi
+ done
+ if [ $containedInList = 0 ]; then
+ if [ ! -e $file ]; then
+# echo "$self: $file not found"
+ missing=1
+ fi
+ realFileList=$file" $realFileList"
+ fi
+ done
+
+ if [ $missing = 1 ]; then
+ return 1
+ fi
+
+ setVar $2 "$realFileList"
+}
+
+stripFile()
+{
+ if [ -f $1 -a -x $1 ]; then
+ $strip --strip-all $1
+ fi
+}
+
+substFile()
+{
+ local oldfile=$1
+
+ if [ ! -e $2 ]; then return 1; fi
+
+ if [ -e $oldfile ]; then
+ newfile=./`echo $1|sed -f $2|sed -e's,^/,,g'`
+ olddir=./`dirname $1`
+ newdir=`dirname $newfile`
+
+ if [ "$newdir" = "$olddir" ]; then
+ return 0
+ fi
+
+ mkdir -p $newdir
+ mv $1 $newfile
+ rmdir -p $olddir 2>/dev/null
+ fi
+}
+
+stripFiles()
+{
+ for f in $1; do
+ stripFile $f
+ done
+}
+
+substFiles()
+{
+ for f in $1; do
+ substFile $f
+ done
+}
+
+substAndStripFiles()
+{
+ for f in $1; do
+ stripFile $f
+ substFile $f $2
+ done
+}
+
+installScript()
+{
+ if [ -n "$1" -a -f "$1" ]; then
+ destfile=`basename $1`
+ if [ -n "$subst" ]; then
+ sed -f $subst < $1 > $ctrldir/$destfile
+ else
+ cat $1 > $ctrldir/$destfile
+ fi
+ chmod +x $ctrldir/$destfile
+ fi
+}
+
+tempDir=/tmp/`basename $self`.$$
+mkdir -p $tempDir
+if [ $? != 0 ]; then
+ echo "$self: cannot create $tempDir, exiting..."
+ exit 1
+fi
+
+cd $destdir; createFileList $control ipkgFileList
+if [ "$?" != "0" ]; then
+ echo "$self: ERROR: missing files, not building $control"
+ exit 1
+fi
+
+( cd $destdir && tar cf - $ipkgFileList 2>/dev/null ) | \
+( cd $tempDir && tar xf - 2>/dev/null )
+
+if [ -z "$filesubst" ]; then
+ ( cd $tempDir && stripFiles "$ipkgFileList" )
+else
+ if ! (echo $filesubst|grep -q '^/'); then
+ filesubst="$oldpwd/$filesubst"
+ fi
+ ( cd $tempDir && substAndStripFiles "$ipkgFileList" $filesubst )
+fi
+
+path="`echo "$PATH" | sed -e "s/\:/ /g"`"
+if [ -z "$mkfsjffs2" ]; then
+ for i in $path; do
+ if [ -x "$i/mkfs.jffs2" ]; then
+ mkfsjffs2="$i/mkfs.jffs2"
+ break
+ fi
+ done
+fi
+
+if [ -z "$mkfsjffs2" ]; then
+ echo "$self: WARNING: no mkjfs.jffs2 found in path. Falling back to using du"
+ echo "for size calculation. mkfs.jffs2 is recommended for size calculation"
+ echo "as it calculates the real package size on the compressed file system,"
+ echo "in contrast to du calculating the uncompressed size!"
+ buildsize=`du -h -s $tempDir | awk '{print $1}'`
+else
+ buildsize=`$mkfsjffs2 -r $tempDir | wc -c`
+fi
+
+ctrldir=$tempDir/CONTROL
+
+mkdir -p $ctrldir
+
+if [ ! -e $subst ] || [ -z "$subst" ]; then
+ cat $control | egrep -v '^(FileIncludeMask|FileExcludeMask|Files):' > $ctrldir/control
+else
+ sed -f $subst < $control | egrep -v '^(FileIncludeMask|FileExcludeMask|Files):' > $ctrldir/control
+fi
+
+if [ "$buildsize" != "0" ]; then
+ echo "Installed-Size: $buildsize" >> $ctrldir/control
+fi
+
+installScript $preinst
+installScript $postinst
+installScript $prerm
+installScript $posrm
+
+$ipkgbuild $classic -o $user -g $group $tempDir
+
+rm -rf $tempDir