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