spk view spk-convert @ rev 112

moved pack to spk-convert for now.
author Christian Mesh <meshca@clarkson.edu>
date Sat Jun 09 15:48:33 2012 -0500 (2012-06-09)
parents dae62126a6a4
children 45434133a9df
line source
1 #!/bin/sh
2 #
3 # Spk-convert - Convert other distrobution's packages to tazpkg form. Read the README before adding or
4 # modifing any code in spk!
5 #
6 # Copyright (C) SliTaz GNU/Linux - BSD License
7 # Author: See AUTHORS files
8 #
9 . /usr/lib/slitaz/libspk.sh
11 #
12 # Functions
13 #
15 # Help and usage
16 usage() {
17 name=$(basename $0)
18 cat << EOT
20 $(boldify $(gettext "Usage:")) $name [packages|--options]
22 $(gettext "Convert SliTaz Packages")
24 $(boldify $(gettext "Options:"))
25 --install $(gettext "Install package after conversion")
26 --root= $(gettext "Set the root file system path")
27 --debug $(gettext "Display some useful debug information")
29 $(boldify $(gettext "Examples:"))
30 $name package1.rpm package2.tgz packageN.ipk
32 EOT
33 exit 0
34 }
36 # Move tazpkg pack to shared lib?
38 # generate a receipt based on standard receipt vars
39 # Usage: generate_receipt $receipt $base_package
40 generate_receipt() {
41 local receipt=$1
42 local base_package=$2
43 cat > $receipt <<EOT
44 # SliTaz package receipt.
45 # generated by tazpkg from package $(basename $base_package)
46 PACKAGE="$PACKAGE"
47 VERSION="$VERSION"
48 CATEGORY="misc"
49 SHORT_DESC="$SHORT_DESC"
50 WEB_SITE="$WEB_SITE"
51 MAINTAINER="$MAINTAINER"
52 DEPENDS="$DEPENDS"
53 CONFIG_FILES="$CONFIG_FILES"
54 EOT
56 }
58 # Create SliTaz package archive using cpio and lzma.
59 # TODO: Cook also pack packages, we should share code in libpkg.sh
60 # Usage: pack $package
61 pack() {
62 local package=$1
63 local dir="$2"
64 local fs="$dir/fs"
65 local receipt="$dir/receipt"
67 if [ ! -f "$receipt" ]; then
68 gettext "Receipt is missing. Please read the documentation."; newline
69 exit 0
70 else
71 # cd $dir
72 newline
73 echo $(boldify "Packing :") $package
74 separator
76 # Create files.list with redirecting find outpout.
77 gettext "Creating the list of files..."
78 find $fs -type f -print > $dir/files.list
79 find $fs -type l -print >> $dir/files.list
81 status
82 gettext "Creating $CHECKSUM of files..."
83 local file
84 for file in $(cat $dir/files.list); do
85 [ -L "$fs$file" ] && continue
86 [ -f "$fs$file" ] || continue
87 case "$file" in
88 /lib/modules/*/modules.*|*.pyc) continue;;
89 esac
90 $CHECKSUM "$fs$file" | sed 's/ fs/ /' >> $dir/$CHECKSUM
91 done
93 status
94 UNPACKED_SIZE=$(du -chs $fs $receipt $dir/files.list $dir/$CHECKSUM \
95 $dir/description.txt 2> /dev/null | \
96 awk '{ sz=$1 } END { print sz }')
98 # Build cpio archives.
99 gettext "Compressing the fs... "
100 find $fs | cpio -o -H newc --quiet | lzma e $fs.cpio.lzma -si
101 rm -rf $fs
102 status
104 PACKED_SIZE=$(du -chs $fs.cpio.lzma $receipt $dir/files.list \
105 $dir/$CHECKSUM $dir/description.txt 2> /dev/null | \
106 awk '{ sz=$1 } END { print sz }')
108 gettext "Updating receipt sizes..."
109 sed -i s/^PACKED_SIZE.*$// $receipt
110 sed -i s/^UNPACKED_SIZE.*$// $receipt
111 sed -i "s/^PACKAGE=/PACKED_SIZE=\"$PACKED_SIZE\"\nUNPACKED_SIZE=\"$UNPACKED_SIZE\"\nPACKAGE=/" $receipt
112 status
114 gettext "Creating full cpio archive... "
115 find $dir -print | cpio -o -H newc --quiet > $dir.tazpkg
116 status
118 gettext "Restoring original package tree... "
120 unlzma -c $fs.cpio.lzma | cpio -idm --quiet $dir
121 status
123 rm $fs.cpio.lzma
124 separator
125 eval_gettext "Package \$package compressed successfully."; newline
126 echo $(gettext "Size") : $(du -sh $dir.tazpkg)
127 newline
128 fi
129 }
133 # search dependencies for files
134 # Usage: find_depends $fs
135 find_depends() {
136 local fs=$1
138 local DEFAULT_DEPENDS="glibc-base gcc-lib-base"
140 for chkfile in $(find $fs -type f); do
141 is_elf $chkfile || continue
142 case "$chkfile" in
143 *.o|*.ko|*.ko.gz) continue;;
144 esac
146 ldd $chkfile | \
147 while read lib rem; do
148 case "$lib" in
149 statically|linux-gate.so*|ld-*.so|*/ld-*.so)
150 continue;;
151 esac
153 find $fs | grep -q /$lib$ && continue
155 for dep in $(fgrep $lib files.list | cut -d: -f1); do
156 case " $DEFAULT_DEPENDS " in
157 *\ $dep\ *) continue 2;;
158 esac
159 grep -qs "^$dep$" $tmpdir/depends && continue 2
160 done
162 if [ -n "$dep" ]; then
163 echo "$dep" >> $tmpdir/depends
164 else
165 grep -qs ^$lib$ $tmpdir/unresolved ||
166 echo "$lib" >> $tmpdir/unresolved
167 fi
168 done
169 done
170 unset spc
171 local spc
172 for file in $(cat $tmpdir/depends 2> /dev/null | sort | uniq); do
173 echo -n "$spc$file"
174 spc=" "
175 done
176 }
178 show_unresolved_lib() {
179 local receipt=$1
180 if [ -s $tmpdir/unresolved ]; then
181 echo -e "BUGS=\"$(gettext 'No dependency for')" >> $receipt
182 for lib in $(cat $tmpdir/unresolved | sort | uniq); do
183 eval_gettext "WARNING: unknown dependency for \$lib"; newline
184 echo -n " $lib" >> $receipt
185 done
186 echo "\"" >> $receipt
187 fi
188 }
192 # convert a .ipk package to .tazpkg
193 # Usage: convert_ipk $package_file
194 convert_ipk() {
195 local package_file=$1
197 mkdir -p $tmpdir
198 tar xOzf $package_file ./control.tar.gz | tar xzf - -C $tmpdir
200 local control="$tmpdir/control"
202 # filter ipk control file for variable
203 # Usage: filter_vars $search_var
204 filter_vars() {
205 local var=$1
206 echo "$(grep ^$var $control | sed 's/.*: //')"
207 }
209 # Load up receipt template variables
210 PACKAGE=$(filter_vars "Package")
211 VERSION=$(filter_vars "Version")
212 MAINTAINER=$(filter_vars "Maintainer")
213 SHORT_DESC=$(filter_vars "Description")
214 WEB_SITE="http://openwrt.org/"
216 target=$(filter_vars "Architecture")
217 case "$target" in
218 i386|all)
219 local file="$PACKAGE-$VERSION"
220 local receipt="$tmpdir/$file/receipt"
221 local fs="$tmpdir/$file/fs"
223 mkdir -p $fs
224 tar xOzf $package_file ./data.tar.gz | tar xzf - -C $fs
226 unset CONFIG_FILES
227 [ -s $tmpdir/conffiles ] && $CONFIG_FILE=$(cat $tmpdir/conffiles)
231 DEPENDS=$(find_depends $fs)
232 generate_receipt $receipt $package_file
234 show_unresolved_lib $receipt
236 # Writes a ipk script to receipt function
237 # Usage: transpose_func $function_name $script
238 transpose_func() {
239 local func=$1
240 local script=$2
241 if [ -s $script ]; then
242 cat >> $receipt << EOT
243 $func()
244 {
245 $(cat $script)
246 }
247 EOT
248 fi
249 }
251 # read functions into receipt
252 transpose_func pre_install $tmpdir/preinst
253 transpose_func post_install $tmpdir/postinst
254 transpose_func pre_remove $tmpdir/prerm
255 transpose_func post_remove $tmpdir/postrm
257 [ -z "$SHORT_DESC" ] || echo $SHORT_DESC > $file/description.txt
259 pack $PACKAGE $file
261 mv $tmpdir/$file.tazpkg .
262 ;;
263 *)
264 gettext "Invalid target: $target (expected i386)"; newline
265 ;;
266 esac
267 unset_receipt
268 rm -rf $tmpdir
269 }
271 # convert a .pkg.tar.gz/.apk package to .tazpkg
272 # Usage: convert_arch $package_file
273 convert_arch() {
274 local package_file=$1
276 # Extract
277 local fs="$tmpdir/fs"
278 mkdir -p $fs
279 tar xzf $package_file -C $fs
281 local PKGINFO="$fs/.PKGINFO"
282 if [ -f $PKGINFO ]; then
284 # filter .PKGINFO file for variable
285 # Usage: filter_vars $search_var
286 filter_vars() {
287 local var=$1
288 echo $(grep ^$var $PKGINFO | sed 's/.*= //')
289 }
291 PACKAGE=$(filter_vars "pkgname")
292 VERSION=$(filter_vars "pkgver")
293 SHORT_DESC=$(filter_vars "pkgdesc")
294 WEB_SITE=$(filter_vars "url")
295 MAINTAINER=$(filter_vars "packager")
297 local file="$tmpdir/$package-$version"
298 local receipt="$file/receipt"
300 DEPENDS=$(find_depends $fs)
301 generate_receipt $receipt $package_file
303 mkdir $file
304 mv $fs $file
306 show_unresolved_lib $tmpdir/$file/receipt
307 rm -f $file/fs/.[A-Z]*
309 pack $PACKAGE $file
311 mv $file.tazpkg .
312 else
313 eval_gettext "\$package_file does not look like an Archlinux/Alpine package !"; newline
314 fi
315 unset_receipt
316 rm -rf $tmpdir
317 }
319 # convert a .tgz package to .tazpkg
320 # Usage: convert_tgz $package_file
321 convert_tgz() {
322 local package_file=$1
323 local package=$(basename $package_file)
325 # Set package to current args
326 IFS='-'
327 set -- $package
328 unset IFS
330 local PACKAGE=$1
331 local VERSION=$2
332 local file="$tmpdir/$PACKAGE-$VERSION"
333 local receipt="$file/receipt"
334 local fs="$file/fs"
336 # Extract package
337 mkdir -p $fs
338 tar xzf $package_file -C $fs
340 if [ -d $fs/install ]; then
341 # Set other receipt vars
342 SHORT_DESC=$(grep ^$PACKAGE $fs/install/slack-desc | \
343 head -1 | sed 's/.*(\(.*\)).*/\1/')
344 WEB_SITE="http://www.slackware.com/packages/"
345 MAINTAINER="nobody@slitaz.org"
347 DEPENDS=$(find_depends $fs)
348 generate_receipt $receipt $package_file
350 show_unresolved_lib $receipt
352 # post_install function from doinst.sh
353 if [ -f $fs/install/doinst.sh ]; then
354 cat >> $receipt <<EOM
356 post_install()
357 {
358 chroot \$1/ sh - << EOT
359 cd /
360 $(cat $fs/install/doinst.sh | sed -e 's/\\/\\\\/g' | sed -e 's/\$/\\$/g')
361 EOT
362 }
363 EOM
364 fi
366 # Get full description
367 if [ ! -z "$SHORT_DESC" ]; then
368 grep ^$PACKAGE $fs/install/slack-desc | \
369 sed "s/^$PACKAGE://" > $file/description.txt
370 fi
372 rm -rf $fs/install
374 pack $PACKAGE $file
376 mv $file.tazpkg .
377 else
378 eval_gettext "\$package_file does not look like a Slackware package !"; newline
379 fi
380 rm -rf $tmpdir
381 }
383 # convert a .deb package to .tazpkg
384 # Usage: convert_deb $package_file
385 convert_deb() {
386 local $package_file="$1"
388 # Extract deb control
389 mkdir -p $tmpdir
390 dpkg-deb -e $package_file $tmpdir
393 # filter control file for variable
394 # Usage: filter_vars $search_var
395 filter_vars() {
396 local var=$1
397 local result=$(grep '^ *$var:' $tmpdir/control)
398 echo ${result##*:}
399 }
401 PACKAGE=$(filter_vars "Package")
402 VERSION=$(filter_vars "Version")
403 SHORT_DESC=$(filter_vars "Description")
404 WEB_SITE="http://packages.debian.org/search?keywords=$PACKAGE"
405 MAINTAINER="nobody@slitaz.org"
406 target="$(grep ^Architecture $tmpdir/control | sed 's/.*: //')"
408 case "$target" in
409 i386|all)
410 local file="$tmpdir/$PACKAGE-$VERSION"
411 local receipt="$file/receipt"
412 local fs="$file/fs"
414 # Extract deb contents
415 mkdir -p $fs
416 dpkg-deb -x $package_file $fs
418 DEPENDS=$(find_depends $fs)
419 generate_receipt $receipt $package_file
421 if [ -s $tmpdir/conffiles ]; then
422 cat >> $receipt <<EOT
423 CONFIG_FILES="$(cat $tmpdir/conffiles)"
424 EOT
425 fi
427 show_unresolved_lib $file/receipt
429 # Description.txt
430 [ -z "$SHORT_DESC" ] || echo "$SHORT_DESC" > $file/Description.txt
432 pack $PACKAGE $file
434 mv $file.tazpkg .
435 ;;
436 *)
437 gettext "Invalid target: $target (expected i386 or all)"; newline
438 ;;
439 esac
440 rm -rf $tmpdir
441 }
443 # convert a .rpm package to .tazpkg
444 # Usage: convert_rpm $package_file
445 convert_rpm() {
446 local package_file=$1
448 # Move package_file to tmp
449 mkdir -p $tmpdir
450 cp $package_file $tmpdir
451 package_file=$tmpdir/$(basename $package_file)
453 # filter package_file for variable
454 # Usage: filter_vars $search_var
455 filter_vars() {
456 local var=$1
457 echo $(rpm -qip $package_file | grep "^$var*" | awk '{print $3}')
458 }
460 PACKAGE=$(filter_vars "Name")
461 VERSION=$(filter_vars "Version")
462 SHORT_DESC=$(filter_vars "Summary")
463 WEB_SITE=$(filter_vars "URL")
464 if [ -z "$WEB_SITE" ]; then
465 WEB_SITE="http://rpmfind.net/linux/rpm2html/search.php?query=$PACKAGE"
466 fi
467 CATEGORY="misc";
468 MAINTAINER="nobody@slitaz.org";
471 local file="$tmpdir/$PACKAGE-$VERSION"
472 local receipt="$file/receipt"
473 local fs="$file/fs"
475 mkdir -p $fs
477 rpm -qip $package_file | \
478 grep "^Description*" -A 100 | \
479 grep -v "^Description*" > \
480 $file/description.txt
482 cd $fs
483 rpm2cpio $package_file | cpio -idm --quiet
484 cd - > /dev/null
487 DEPENDS=$(find_depends $fs)
488 generate_receipt $receipt $package_file
490 show_unresolved_lib $receipt
492 pack $PACKAGE $file
494 mv $file.tazpkg .
496 unset_receipt
497 rm -rf $tmpdir
498 }
501 #
502 # Commands and exit
503 #
505 case "$1" in
506 ""|*usage|*help) usage ;;
507 esac
509 #
510 # Handle packages: package package.tazpkg ... packageN packageN.tazpkg
511 #
513 check_root
515 for pkg in $@
516 do
517 if [ "$(dd if=$pkg bs=8 count=1 skip=1 2> /dev/null)" == "debian-b" ];
518 then
519 convert_deb $pkg
520 else
521 case "$pkg" in
522 *.deb|*.udeb)
523 convert_deb $pkg;;
524 *.rpm)
525 convert_rpm $pkg;;
526 *.tgz)
527 convert_tgz $pkg;;
528 *.apk|*.pkg.tar.gz)
529 convert_arch $pkg;;
530 *.ipk|*.opk)
531 convert_ipk $pkg;;
532 *)
533 gettext "Unsupported format"; newline;;
534 esac
535 fi
536 done
538 exit 0