summaryrefslogtreecommitdiff
path: root/scripts/mkipkg
Unidiff
Diffstat (limited to 'scripts/mkipkg') (more/less context) (ignore 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 @@
1#!/bin/sh
2# vim: et sw=4
3
4# TODO: srcdir!=builddir
5
6usage()
7{
8 echo "usage: $self --destdir=[destination installation directory]"
9 echo "usage: $self [destination installation directory]"
10 exit 1
11}
12
13self=mkipkg
14destdir=
15strip=strip
16control=
17builddir=
18srcdir=
19prefix=
20preinst=
21postinst=
22prerm=
23postrm=
24mkfsjffs2=
25ipkgbuild=ipkg-build
26buildversion=
27subst=
28user=root
29group=root
30filesubst=
31
32oldpwd=
33
34for option
35do
36 case "$option" in
37 -*=*)
38 arg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'`
39 ;;
40 esac
41
42 case "$option" in
43 --destdir=*)
44 destdir=$arg
45 ;;
46 --strip=*)
47 strip=$arg
48 ;;
49 --control=*)
50 control=$arg
51 ;;
52 --preinst=*)
53 preinst=$arg
54 ;;
55 --postinst=*)
56 postinst=$arg
57 ;;
58 --prerm=*)
59 prerm=$arg
60 ;;
61 --postrm=*)
62 postrm=$arg
63 ;;
64 --builddir=*)
65 builddir=$arg
66 ;;
67 --srcdir=*)
68 srcdir=$arg
69 ;;
70 --prefix=*)
71 prefix=$arg
72 ;;
73 --mkfsjffs2=*)
74 mkfsjffs2=$arg
75 ;;
76 --ipkgbuild=*)
77 ipkgbuild=$arg
78 ;;
79 --buildversion=*)
80 buildversion=$arg
81 ;;
82 --subst=*)
83 subst=$arg
84 ;;
85 --user=*)
86 user=$arg
87 ;;
88 --group=*)
89 group=$arg
90 ;;
91 --filesubst=*)
92 filesubst=$arg
93 ;;
94 --classic)
95 classic=-c
96 ;;
97 -*)
98 usage
99 ;;
100 *)
101 destdir=$option
102 ;;
103 esac
104done
105
106if [ -z "$control" ]; then
107 control=$destdir/CONTROL/control
108fi
109if [ -z "$prerm" ]; then
110 prerm=$destdir/CONTROL/prerm
111fi
112if [ -z "$postrm" ]; then
113 postrm=$destdir/CONTROL/postrm
114fi
115if [ -z "$preinst" ]; then
116 preinst=$destdir/CONTROL/preinst
117fi
118if [ -z "$postinst" ]; then
119 postinst=$destdir/CONTROL/postinst
120fi
121
122# remove leading slash from prefix (to fix globbing)
123if [ -n "$prefix" ]; then
124 prefix=`echo $prefix | sed -e "s,/\(.*\),\\1,"`
125fi
126
127if [ -z "$destdir" ]; then
128 usage
129fi
130
131if [ ! -r $control ]; then
132 echo "$self: cannot find $control, exiting..."
133 exit 1
134fi
135
136if [ -z "`which $ipkgbuild 2>/dev/null`" ]; then
137 echo "$self: cannot find ipkg-build, exiting..."
138 exit 1
139fi
140
141findFile()
142{
143 local path=
144 if [ $# = 1 ]; then
145 find $1 -type f -o -type b -o -type c -o -type l -o -type d
146 else
147 find . -type f -o -type b -o -type c -o -type l -o -type d | \
148 sed -e "s,\./\(.*\),\\1,g"
149 fi
150
151}
152
153_pushd() { oldpwd=`pwd`; cd $1; }
154_popd() { cd $oldpwd; }
155
156setVar()
157{
158 eval "$1='$2'"
159}
160
161expandMaskToList()
162{
163 local _list=`echo $1`
164 local _tmpFileList=
165 for f in $_list; do
166 if [ -d $f ]; then
167 find="`findFile $f`"
168 if [ -z "$find" ]; then
169 find="$f"
170 fi
171 f="$f `findFile $f`"
172 fi
173 _tmpFileList=$f" $_tmpFileList"
174 done
175 setVar $2 "$_tmpFileList"
176}
177
178createFileList()
179{
180 local excludeMask
181 local includeMask
182 if (cat $1|grep -q ^FileExcludeMask); then
183 excludemaskpresent=1
184 excludeMask=$(eval echo '"'$(sed -n -e "s,^FileExcludeMask: *,,p" $1)'"')
185 fi
186 if (cat $1|grep -q ^FileIncludeMask); then
187 includemaskpresent=1
188 includeMask=$(eval echo '"'$(sed -n -e "s,^FileIncludeMask: *,,p" $1)'"')
189 else
190 if (cat $1|grep -q ^Files:); then
191 includemaskpresent=1
192 includeMask=$(eval echo '"'$(sed -n -e "s,^Files: *,,p" $1)'"')
193 fi
194 fi
195
196 excludeMask="$excludeMask CONTROL/* usr/share/* CVS/* SCCS/*"
197
198 if [ $includemaskpresent == 1 ]; then
199 if [ -z "$includeMask" ]; then
200 setVar $2 ""
201 return 0
202 fi
203 _pushd $destdir
204 expandMaskToList "$includeMask" _fileList
205 _popd
206 else
207 _fileList=`cd $destdir && findFile`
208 fi
209
210 _excludeList=
211 if [ -n "$excludeMask" ]; then
212 _pushd $destdir
213 expandMaskToList "$excludeMask" _excludeList
214 _popd
215 fi
216
217 local realFileList=
218 local missing=0
219 for file in $_fileList; do
220 local containedInList=0
221 for i in $_excludeList; do
222 if [ $file = $i ]; then
223 containedInList=1
224 fi
225 done
226 if [ $containedInList = 0 ]; then
227 if [ ! -e $file ]; then
228# echo "$self: $file not found"
229 missing=1
230 fi
231 realFileList=$file" $realFileList"
232 fi
233 done
234
235 if [ $missing = 1 ]; then
236 return 1
237 fi
238
239 setVar $2 "$realFileList"
240}
241
242stripFile()
243{
244 if [ -f $1 -a -x $1 ]; then
245 $strip --strip-all $1
246 fi
247}
248
249substFile()
250{
251 local oldfile=$1
252
253 if [ ! -e $2 ]; then return 1; fi
254
255 if [ -e $oldfile ]; then
256 newfile=./`echo $1|sed -f $2|sed -e's,^/,,g'`
257 olddir=./`dirname $1`
258 newdir=`dirname $newfile`
259
260 if [ "$newdir" = "$olddir" ]; then
261 return 0
262 fi
263
264 mkdir -p $newdir
265 mv $1 $newfile
266 rmdir -p $olddir 2>/dev/null
267 fi
268}
269
270stripFiles()
271{
272 for f in $1; do
273 stripFile $f
274 done
275}
276
277substFiles()
278{
279 for f in $1; do
280 substFile $f
281 done
282}
283
284substAndStripFiles()
285{
286 for f in $1; do
287 stripFile $f
288 substFile $f $2
289 done
290}
291
292installScript()
293{
294 if [ -n "$1" -a -f "$1" ]; then
295 destfile=`basename $1`
296 if [ -n "$subst" ]; then
297 sed -f $subst < $1 > $ctrldir/$destfile
298 else
299 cat $1 > $ctrldir/$destfile
300 fi
301 chmod +x $ctrldir/$destfile
302 fi
303}
304
305tempDir=/tmp/`basename $self`.$$
306mkdir -p $tempDir
307if [ $? != 0 ]; then
308 echo "$self: cannot create $tempDir, exiting..."
309 exit 1
310fi
311
312cd $destdir; createFileList $control ipkgFileList
313if [ "$?" != "0" ]; then
314 echo "$self: ERROR: missing files, not building $control"
315 exit 1
316fi
317
318( cd $destdir && tar cf - $ipkgFileList 2>/dev/null ) | \
319( cd $tempDir && tar xf - 2>/dev/null )
320
321if [ -z "$filesubst" ]; then
322 ( cd $tempDir && stripFiles "$ipkgFileList" )
323else
324 if ! (echo $filesubst|grep -q '^/'); then
325 filesubst="$oldpwd/$filesubst"
326 fi
327 ( cd $tempDir && substAndStripFiles "$ipkgFileList" $filesubst )
328fi
329
330path="`echo "$PATH" | sed -e "s/\:/ /g"`"
331if [ -z "$mkfsjffs2" ]; then
332 for i in $path; do
333 if [ -x "$i/mkfs.jffs2" ]; then
334 mkfsjffs2="$i/mkfs.jffs2"
335 break
336 fi
337 done
338fi
339
340if [ -z "$mkfsjffs2" ]; then
341 echo "$self: WARNING: no mkjfs.jffs2 found in path. Falling back to using du"
342 echo "for size calculation. mkfs.jffs2 is recommended for size calculation"
343 echo "as it calculates the real package size on the compressed file system,"
344 echo "in contrast to du calculating the uncompressed size!"
345 buildsize=`du -h -s $tempDir | awk '{print $1}'`
346else
347 buildsize=`$mkfsjffs2 -r $tempDir | wc -c`
348fi
349
350ctrldir=$tempDir/CONTROL
351
352mkdir -p $ctrldir
353
354if [ ! -e $subst ] || [ -z "$subst" ]; then
355 cat $control | egrep -v '^(FileIncludeMask|FileExcludeMask|Files):' > $ctrldir/control
356else
357 sed -f $subst < $control | egrep -v '^(FileIncludeMask|FileExcludeMask|Files):' > $ctrldir/control
358fi
359
360if [ "$buildsize" != "0" ]; then
361 echo "Installed-Size: $buildsize" >> $ctrldir/control
362fi
363
364installScript $preinst
365installScript $postinst
366installScript $prerm
367installScript $posrm
368
369$ipkgbuild $classic -o $user -g $group $tempDir
370
371rm -rf $tempDir