-rwxr-xr-x | scripts/mkipkg | 371 |
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 | |||
6 | usage() | ||
7 | { | ||
8 | echo "usage: $self --destdir=[destination installation directory]" | ||
9 | echo "usage: $self [destination installation directory]" | ||
10 | exit 1 | ||
11 | } | ||
12 | |||
13 | self=mkipkg | ||
14 | destdir= | ||
15 | strip=strip | ||
16 | control= | ||
17 | builddir= | ||
18 | srcdir= | ||
19 | prefix= | ||
20 | preinst= | ||
21 | postinst= | ||
22 | prerm= | ||
23 | postrm= | ||
24 | mkfsjffs2= | ||
25 | ipkgbuild=ipkg-build | ||
26 | buildversion= | ||
27 | subst= | ||
28 | user=root | ||
29 | group=root | ||
30 | filesubst= | ||
31 | |||
32 | oldpwd= | ||
33 | |||
34 | for option | ||
35 | do | ||
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 | ||
104 | done | ||
105 | |||
106 | if [ -z "$control" ]; then | ||
107 | control=$destdir/CONTROL/control | ||
108 | fi | ||
109 | if [ -z "$prerm" ]; then | ||
110 | prerm=$destdir/CONTROL/prerm | ||
111 | fi | ||
112 | if [ -z "$postrm" ]; then | ||
113 | postrm=$destdir/CONTROL/postrm | ||
114 | fi | ||
115 | if [ -z "$preinst" ]; then | ||
116 | preinst=$destdir/CONTROL/preinst | ||
117 | fi | ||
118 | if [ -z "$postinst" ]; then | ||
119 | postinst=$destdir/CONTROL/postinst | ||
120 | fi | ||
121 | |||
122 | # remove leading slash from prefix (to fix globbing) | ||
123 | if [ -n "$prefix" ]; then | ||
124 | prefix=`echo $prefix | sed -e "s,/\(.*\),\\1,"` | ||
125 | fi | ||
126 | |||
127 | if [ -z "$destdir" ]; then | ||
128 | usage | ||
129 | fi | ||
130 | |||
131 | if [ ! -r $control ]; then | ||
132 | echo "$self: cannot find $control, exiting..." | ||
133 | exit 1 | ||
134 | fi | ||
135 | |||
136 | if [ -z "`which $ipkgbuild 2>/dev/null`" ]; then | ||
137 | echo "$self: cannot find ipkg-build, exiting..." | ||
138 | exit 1 | ||
139 | fi | ||
140 | |||
141 | findFile() | ||
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 | |||
156 | setVar() | ||
157 | { | ||
158 | eval "$1='$2'" | ||
159 | } | ||
160 | |||
161 | expandMaskToList() | ||
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 | |||
178 | createFileList() | ||
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 | |||
242 | stripFile() | ||
243 | { | ||
244 | if [ -f $1 -a -x $1 ]; then | ||
245 | $strip --strip-all $1 | ||
246 | fi | ||
247 | } | ||
248 | |||
249 | substFile() | ||
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 | |||
270 | stripFiles() | ||
271 | { | ||
272 | for f in $1; do | ||
273 | stripFile $f | ||
274 | done | ||
275 | } | ||
276 | |||
277 | substFiles() | ||
278 | { | ||
279 | for f in $1; do | ||
280 | substFile $f | ||
281 | done | ||
282 | } | ||
283 | |||
284 | substAndStripFiles() | ||
285 | { | ||
286 | for f in $1; do | ||
287 | stripFile $f | ||
288 | substFile $f $2 | ||
289 | done | ||
290 | } | ||
291 | |||
292 | installScript() | ||
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 | |||
305 | tempDir=/tmp/`basename $self`.$$ | ||
306 | mkdir -p $tempDir | ||
307 | if [ $? != 0 ]; then | ||
308 | echo "$self: cannot create $tempDir, exiting..." | ||
309 | exit 1 | ||
310 | fi | ||
311 | |||
312 | cd $destdir; createFileList $control ipkgFileList | ||
313 | if [ "$?" != "0" ]; then | ||
314 | echo "$self: ERROR: missing files, not building $control" | ||
315 | exit 1 | ||
316 | fi | ||
317 | |||
318 | ( cd $destdir && tar cf - $ipkgFileList 2>/dev/null ) | \ | ||
319 | ( cd $tempDir && tar xf - 2>/dev/null ) | ||
320 | |||
321 | if [ -z "$filesubst" ]; then | ||
322 | ( cd $tempDir && stripFiles "$ipkgFileList" ) | ||
323 | else | ||
324 | if ! (echo $filesubst|grep -q '^/'); then | ||
325 | filesubst="$oldpwd/$filesubst" | ||
326 | fi | ||
327 | ( cd $tempDir && substAndStripFiles "$ipkgFileList" $filesubst ) | ||
328 | fi | ||
329 | |||
330 | path="`echo "$PATH" | sed -e "s/\:/ /g"`" | ||
331 | if [ -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 | ||
338 | fi | ||
339 | |||
340 | if [ -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}'` | ||
346 | else | ||
347 | buildsize=`$mkfsjffs2 -r $tempDir | wc -c` | ||
348 | fi | ||
349 | |||
350 | ctrldir=$tempDir/CONTROL | ||
351 | |||
352 | mkdir -p $ctrldir | ||
353 | |||
354 | if [ ! -e $subst ] || [ -z "$subst" ]; then | ||
355 | cat $control | egrep -v '^(FileIncludeMask|FileExcludeMask|Files):' > $ctrldir/control | ||
356 | else | ||
357 | sed -f $subst < $control | egrep -v '^(FileIncludeMask|FileExcludeMask|Files):' > $ctrldir/control | ||
358 | fi | ||
359 | |||
360 | if [ "$buildsize" != "0" ]; then | ||
361 | echo "Installed-Size: $buildsize" >> $ctrldir/control | ||
362 | fi | ||
363 | |||
364 | installScript $preinst | ||
365 | installScript $postinst | ||
366 | installScript $prerm | ||
367 | installScript $posrm | ||
368 | |||
369 | $ipkgbuild $classic -o $user -g $group $tempDir | ||
370 | |||
371 | rm -rf $tempDir | ||