summaryrefslogtreecommitdiff
authorkergoth <kergoth>2003-04-26 15:25:19 (UTC)
committer kergoth <kergoth>2003-04-26 15:25:19 (UTC)
commitdd4f6b36681a28f785cf0923b0f9fc58ebe9a3bf (patch) (side-by-side diff)
tree667849b9c8bace1c558b4c9af668a5ab5a177ab9
parent908a099ba19192dcb341959125efce6cf0df20f1 (diff)
downloadopie-dd4f6b36681a28f785cf0923b0f9fc58ebe9a3bf.zip
opie-dd4f6b36681a28f785cf0923b0f9fc58ebe9a3bf.tar.gz
opie-dd4f6b36681a28f785cf0923b0f9fc58ebe9a3bf.tar.bz2
Countless improvements to the ipk creation script
Diffstat (more/less context) (show whitespace changes)
-rwxr-xr-xscripts/mkipkg94
1 files changed, 53 insertions, 41 deletions
diff --git a/scripts/mkipkg b/scripts/mkipkg
index 54651af..7877078 100755
--- a/scripts/mkipkg
+++ b/scripts/mkipkg
@@ -1,371 +1,383 @@
#!/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
+ find $1 -type f -o -type b -o -type c -o -type l
+ find $1 -type d -a -empty
else
- find . -type f -o -type b -o -type c -o -type l -o -type d | \
+ find . -type f -o -type b -o -type c -o -type l | \
sed -e "s,\./\(.*\),\\1,g"
+ find . -type d -a -empty
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`"
+ f="`findFile $f`"
fi
- _tmpFileList=$f" $_tmpFileList"
+ _tmpFileList="`eval echo $f` $_tmpFileList"
done
setVar $2 "$_tmpFileList"
}
createFileList()
{
local excludeMask
local includeMask
+ local includemaskpresent=0
+ local excludemaskpresent=0
+
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/*"
+ _pushd $destdir
+
+ excludeMask="$excludeMask CONTROL/* usr/share/*"
+
+ if [ $includemaskpresent != 1 ]; then
+ includeMask="."
+ fi
- if [ $includemaskpresent == 1 ]; then
if [ -z "$includeMask" ]; then
setVar $2 ""
+ _popd
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
+ _excludeList="$_excludeList `find -name \*CVS\* -o -name \*SCCS\*`"
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"
+ if ! [ -e $file -o -L $file ]; then
+ echo "$self: $file not found"
missing=1
fi
realFileList=$file" $realFileList"
fi
done
+ _popd
+
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`
+ if [ -e $oldfile -o -L $oldfile ]; then
+ newfile=`echo $oldfile|sed -f $2|sed -e's,^/,,g'`
+ olddir=`dirname $oldfile`
+ base=`basename $oldfile`
newdir=`dirname $newfile`
+# echo >&2 moving $oldfile to $newfile
+
if [ "$newdir" = "$olddir" ]; then
return 0
fi
mkdir -p $newdir
- mv $1 $newfile
+ mv $olddir/$base $newfile
rmdir -p $olddir 2>/dev/null
fi
}
stripFiles()
{
for f in $1; do
- stripFile $f
+ stripFile ./$f
done
}
substFiles()
{
for f in $1; do
- substFile $f
+ substFile ./$f
done
}
substAndStripFiles()
{
for f in $1; do
- stripFile $f
- substFile $f $2
+ stripFile ./$f
+ substFile ./$f $2
done
}
installScript()
{
if [ -n "$1" -a -f "$1" ]; then
destfile=`basename $1`
+ filetype=`echo $destfile|cut -d. -f2`
+ if [ -n "$filetype" ]; then destfile=$filetype; fi
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
+ctrldir=$tempDir/CONTROL
+
+mkdir -p $ctrldir
+
+if [ ! -e $subst ] || [ -z "$subst" ]; then
+ cat $control > $ctrldir/control.new
+else
+ sed -f $subst < $control > $ctrldir/control.new
+fi
+
+createFileList $ctrldir/control.new 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 )
+
+cat $ctrldir/control.new | egrep -v '^(Files|FileExcludeMask|FileIncludeMask):' > $ctrldir/control
+rm -f $ctrldir/control.new
+
+( 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