spk view spk-convert @ rev 115

Successfully converted a arch package\!
author Christian Mesh <meshca@clarkson.edu>
date Sat Jun 09 16:38:58 2012 -0500 (2012-06-09)
parents da05a2439630
children 6e35af74e898
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 cd $fs
79 find . -type f -print > $dir/files.list
80 find . -type l -print >> $dir/files.list
81 sed -i s/'^.'/''/ $dir/files.list
82 cd - /dev/null
84 status
85 gettext "Creating $CHECKSUM of files..."
86 local file
87 cd $fs
88 for file in $(cat $dir/files.list); do
89 [ -L "$file" ] && continue
90 [ -f "$file" ] || continue
91 case "$file" in
92 /lib/modules/*/modules.*|*.pyc) continue;;
93 esac
94 $CHECKSUM "$file" | sed 's/ fs/ /' >> $dir/$CHECKSUM
95 done
96 cd - /dev/null
98 status
99 UNPACKED_SIZE=$(du -chs $fs $receipt $dir/files.list $dir/$CHECKSUM \
100 $dir/description.txt 2> /dev/null | \
101 awk '{ sz=$1 } END { print sz }')
103 # Build cpio archives.
104 gettext "Compressing the fs... "
105 cd $dir
106 find fs | cpio -o -H newc --quiet | lzma e $fs.cpio.lzma -si
107 cd - /dev/null
108 rm -rf $fs
109 status
111 PACKED_SIZE=$(du -chs $fs.cpio.lzma $receipt $dir/files.list \
112 $dir/$CHECKSUM $dir/description.txt 2> /dev/null | \
113 awk '{ sz=$1 } END { print sz }')
115 gettext "Updating receipt sizes..."
116 sed -i s/^PACKED_SIZE.*$// $receipt
117 sed -i s/^UNPACKED_SIZE.*$// $receipt
118 sed -i "s/^PACKAGE=/PACKED_SIZE=\"$PACKED_SIZE\"\nUNPACKED_SIZE=\"$UNPACKED_SIZE\"\nPACKAGE=/" $receipt
119 status
121 gettext "Creating full cpio archive... "
122 cd $dir
123 find . -print | cpio -o -H newc --quiet > $dir.tazpkg
124 cd - /dev/null
125 status
127 gettext "Restoring original package tree... "
129 unlzma -c $fs.cpio.lzma | cpio -idm --quiet $dir
130 status
132 rm $fs.cpio.lzma
133 separator
134 eval_gettext "Package \$package compressed successfully."; newline
135 echo $(gettext "Size") : $(du -sh $dir.tazpkg)
136 newline
137 fi
138 }
142 # search dependencies for files
143 # Usage: find_depends $fs
144 find_depends() {
145 local fs=$1
147 local DEFAULT_DEPENDS="glibc-base gcc-lib-base"
149 for chkfile in $(find $fs -type f); do
150 is_elf $chkfile || continue
151 case "$chkfile" in
152 *.o|*.ko|*.ko.gz) continue;;
153 esac
155 ldd $chkfile | \
156 while read lib rem; do
157 case "$lib" in
158 statically|linux-gate.so*|ld-*.so|*/ld-*.so)
159 continue;;
160 esac
162 find $fs | grep -q /$lib$ && continue
164 for dep in $(fgrep $lib files.list | cut -d: -f1); do
165 case " $DEFAULT_DEPENDS " in
166 *\ $dep\ *) continue 2;;
167 esac
168 grep -qs "^$dep$" $tmpdir/depends && continue 2
169 done
171 if [ -n "$dep" ]; then
172 echo "$dep" >> $tmpdir/depends
173 else
174 grep -qs ^$lib$ $tmpdir/unresolved ||
175 echo "$lib" >> $tmpdir/unresolved
176 fi
177 done
178 done
179 unset spc
180 local spc
181 for file in $(cat $tmpdir/depends 2> /dev/null | sort | uniq); do
182 echo -n "$spc$file"
183 spc=" "
184 done
185 }
187 show_unresolved_lib() {
188 local receipt=$1
189 if [ -s $tmpdir/unresolved ]; then
190 echo -e "BUGS=\"$(gettext 'No dependency for')" >> $receipt
191 for lib in $(cat $tmpdir/unresolved | sort | uniq); do
192 eval_gettext "WARNING: unknown dependency for \$lib"; newline
193 echo -n " $lib" >> $receipt
194 done
195 echo "\"" >> $receipt
196 fi
197 }
201 # convert a .ipk package to .tazpkg
202 # Usage: convert_ipk $package_file
203 convert_ipk() {
204 local package_file=$1
206 mkdir -p $tmpdir
207 tar xOzf $package_file ./control.tar.gz | tar xzf - -C $tmpdir
209 local control="$tmpdir/control"
211 # filter ipk control file for variable
212 # Usage: filter_vars $search_var
213 filter_vars() {
214 local var=$1
215 echo "$(grep ^$var $control | sed 's/.*: //')"
216 }
218 # Load up receipt template variables
219 PACKAGE=$(filter_vars "Package")
220 VERSION=$(filter_vars "Version")
221 MAINTAINER=$(filter_vars "Maintainer")
222 SHORT_DESC=$(filter_vars "Description")
223 WEB_SITE="http://openwrt.org/"
225 target=$(filter_vars "Architecture")
226 case "$target" in
227 i386|all)
228 local file="$PACKAGE-$VERSION"
229 local receipt="$tmpdir/$file/receipt"
230 local fs="$tmpdir/$file/fs"
232 mkdir -p $fs
233 tar xOzf $package_file ./data.tar.gz | tar xzf - -C $fs
235 unset CONFIG_FILES
236 [ -s $tmpdir/conffiles ] && $CONFIG_FILE=$(cat $tmpdir/conffiles)
240 DEPENDS=$(find_depends $fs)
241 generate_receipt $receipt $package_file
243 show_unresolved_lib $receipt
245 # Writes a ipk script to receipt function
246 # Usage: transpose_func $function_name $script
247 transpose_func() {
248 local func=$1
249 local script=$2
250 if [ -s $script ]; then
251 cat >> $receipt << EOT
252 $func()
253 {
254 $(cat $script)
255 }
256 EOT
257 fi
258 }
260 # read functions into receipt
261 transpose_func pre_install $tmpdir/preinst
262 transpose_func post_install $tmpdir/postinst
263 transpose_func pre_remove $tmpdir/prerm
264 transpose_func post_remove $tmpdir/postrm
266 [ -z "$SHORT_DESC" ] || echo $SHORT_DESC > $file/description.txt
268 pack $PACKAGE $file
270 mv $tmpdir/$file.tazpkg .
271 ;;
272 *)
273 gettext "Invalid target: $target (expected i386)"; newline
274 ;;
275 esac
276 unset_receipt
277 rm -rf $tmpdir
278 }
280 # convert a .pkg.tar.gz/.apk package to .tazpkg
281 # Usage: convert_arch $package_file
282 convert_arch() {
283 local package_file=$1
285 # Extract
286 local fs="$tmpdir/fs"
287 mkdir -p $fs
289 case $package_file in
290 *.apk|*.pkg.tar.gz)
291 tar xzf $package_file -C $fs;;
292 *.pkg.tar.xz)
293 tar xf $package_file -C $fs;;
294 esac
296 local PKGINFO="$fs/.PKGINFO"
297 if [ -f $PKGINFO ]; then
299 # filter .PKGINFO file for variable
300 # Usage: filter_vars $search_var
301 filter_vars() {
302 local var=$1
303 echo $(grep ^$var $PKGINFO | sed 's/.*= //')
304 }
306 PACKAGE=$(filter_vars "pkgname")
307 VERSION=$(filter_vars "pkgver")
308 SHORT_DESC=$(filter_vars "pkgdesc")
309 WEB_SITE=$(filter_vars "url")
310 MAINTAINER=$(filter_vars "packager")
312 local file="$tmpdir/$PACKAGE-$VERSION"
313 local receipt="$file/receipt"
315 mkdir $file
316 mv $fs $file
318 DEPENDS=$(find_depends $fs)
319 generate_receipt $receipt $package_file
321 show_unresolved_lib $tmpdir/$file/receipt
322 rm -f $file/fs/.[A-Z]*
324 pack $PACKAGE $file
326 mv $file.tazpkg .
327 else
328 eval_gettext "\$package_file does not look like an Archlinux/Alpine package !"; newline
329 fi
330 unset_receipt
331 rm -rf $tmpdir
332 }
334 # convert a .tgz package to .tazpkg
335 # Usage: convert_tgz $package_file
336 convert_tgz() {
337 local package_file=$1
338 local package=$(basename $package_file)
340 # Set package to current args
341 IFS='-'
342 set -- $package
343 unset IFS
345 local PACKAGE=$1
346 local VERSION=$2
347 local file="$tmpdir/$PACKAGE-$VERSION"
348 local receipt="$file/receipt"
349 local fs="$file/fs"
351 # Extract package
352 mkdir -p $fs
353 tar xzf $package_file -C $fs
355 if [ -d $fs/install ]; then
356 # Set other receipt vars
357 SHORT_DESC=$(grep ^$PACKAGE $fs/install/slack-desc | \
358 head -1 | sed 's/.*(\(.*\)).*/\1/')
359 WEB_SITE="http://www.slackware.com/packages/"
360 MAINTAINER="nobody@slitaz.org"
362 DEPENDS=$(find_depends $fs)
363 generate_receipt $receipt $package_file
365 show_unresolved_lib $receipt
367 # post_install function from doinst.sh
368 if [ -f $fs/install/doinst.sh ]; then
369 cat >> $receipt <<EOM
371 post_install()
372 {
373 chroot \$1/ sh - << EOT
374 cd /
375 $(cat $fs/install/doinst.sh | sed -e 's/\\/\\\\/g' | sed -e 's/\$/\\$/g')
376 EOT
377 }
378 EOM
379 fi
381 # Get full description
382 if [ ! -z "$SHORT_DESC" ]; then
383 grep ^$PACKAGE $fs/install/slack-desc | \
384 sed "s/^$PACKAGE://" > $file/description.txt
385 fi
387 rm -rf $fs/install
389 pack $PACKAGE $file
391 mv $file.tazpkg .
392 else
393 eval_gettext "\$package_file does not look like a Slackware package !"; newline
394 fi
395 rm -rf $tmpdir
396 }
398 # convert a .deb package to .tazpkg
399 # Usage: convert_deb $package_file
400 convert_deb() {
401 local package_file="$1"
403 # Extract deb control
404 mkdir -p $tmpdir
405 dpkg-deb -e $package_file $tmpdir
408 # filter control file for variable
409 # Usage: filter_vars $search_var
410 filter_vars() {
411 local var=$1
412 local result=$(grep "^ *$var:" $tmpdir/control)
413 echo ${result##*:}
414 }
416 PACKAGE=$(filter_vars "Package")
417 VERSION=$(filter_vars "Version")
418 SHORT_DESC=$(filter_vars "Description")
419 WEB_SITE="http://packages.debian.org/search?keywords=$PACKAGE"
420 MAINTAINER="nobody@slitaz.org"
421 target="$(grep ^Architecture $tmpdir/control | sed 's/.*: //')"
423 case "$target" in
424 i386|all)
425 local file="$tmpdir/$PACKAGE-$VERSION"
426 local receipt="$file/receipt"
427 local fs="$file/fs"
429 # Extract deb contents
430 mkdir -p $fs
431 dpkg-deb -x $package_file $fs
433 DEPENDS=$(find_depends $fs)
434 generate_receipt $receipt $package_file
436 if [ -s $tmpdir/conffiles ]; then
437 cat >> $receipt <<EOT
438 CONFIG_FILES="$(cat $tmpdir/conffiles)"
439 EOT
440 fi
442 show_unresolved_lib $file/receipt
444 # Description.txt
445 [ -z "$SHORT_DESC" ] || echo "$SHORT_DESC" > $file/description.txt
447 pack $PACKAGE $file
449 mv $file.tazpkg .
450 ;;
451 *)
452 gettext "Invalid target: $target (expected i386 or all)"; newline
453 ;;
454 esac
455 rm -rf $tmpdir
456 }
458 # convert a .rpm package to .tazpkg
459 # Usage: convert_rpm $package_file
460 convert_rpm() {
461 local package_file=$1
463 # Move package_file to tmp
464 mkdir -p $tmpdir
465 cp $package_file $tmpdir
466 package_file=$tmpdir/$(basename $package_file)
468 # filter package_file for variable
469 # Usage: filter_vars $search_var
470 filter_vars() {
471 local var=$1
472 echo $(rpm -qip $package_file | grep "^$var*" | awk '{print $3}')
473 }
475 PACKAGE=$(filter_vars "Name")
476 VERSION=$(filter_vars "Version")
477 SHORT_DESC=$(filter_vars "Summary")
478 WEB_SITE=$(filter_vars "URL")
479 if [ -z "$WEB_SITE" ]; then
480 WEB_SITE="http://rpmfind.net/linux/rpm2html/search.php?query=$PACKAGE"
481 fi
482 CATEGORY="misc";
483 MAINTAINER="nobody@slitaz.org";
486 local file="$tmpdir/$PACKAGE-$VERSION"
487 local receipt="$file/receipt"
488 local fs="$file/fs"
490 mkdir -p $fs
492 rpm -qip $package_file | \
493 grep "^Description*" -A 100 | \
494 grep -v "^Description*" > \
495 $file/description.txt
497 cd $fs
498 rpm2cpio $package_file | cpio -idm --quiet
499 cd - > /dev/null
502 DEPENDS=$(find_depends $fs)
503 generate_receipt $receipt $package_file
505 show_unresolved_lib $receipt
507 pack $PACKAGE $file
509 mv $file.tazpkg .
511 unset_receipt
512 rm -rf $tmpdir
513 }
516 #
517 # Commands and exit
518 #
520 case "$1" in
521 ""|*usage|*help) usage ;;
522 esac
524 #
525 # Handle packages: package package.tazpkg ... packageN packageN.tazpkg
526 #
528 check_root
530 for pkg in $@
531 do
532 if [ "$(dd if=$pkg bs=8 count=1 skip=1 2> /dev/null)" == "debian-b" ];
533 then
534 convert_deb $pkg
535 else
536 case "$pkg" in
537 *.deb|*.udeb)
538 convert_deb $pkg;;
539 *.rpm)
540 convert_rpm $pkg;;
541 *.tgz)
542 convert_tgz $pkg;;
543 *.apk|*.pkg.tar.gz|*.pkg.tar.xz)
544 convert_arch $pkg;;
545 *.ipk|*.opk)
546 convert_ipk $pkg;;
547 *)
548 gettext "Unsupported format"; newline;;
549 esac
550 fi
551 done
553 exit 0