Author: glen
Date: Tue Apr  7 00:55:20 2009
New Revision: 10320

Modified:
   geninitrd/trunk/geninitrd
   geninitrd/trunk/geninitrd.sysconfig
Log:
- lzma/bzip/gzip compressors
- need to think about image extension which cames from .spec....

Modified: geninitrd/trunk/geninitrd
==============================================================================
--- geninitrd/trunk/geninitrd   (original)
+++ geninitrd/trunk/geninitrd   Tue Apr  7 00:55:20 2009
@@ -47,6 +47,7 @@
        uname_r=$(uname -r)
        echo "usage: $PROGRAM [--version] [-v] [-f] [--ifneeded] [--preload 
<module>]"
        echo "       [--with=<module>] [--image-version] [--fstab=<fstab>] 
[--nocompress]"
+       echo "       [--compress=yes|lzma|bzip2|gzip]"
        echo "       [--initrdfs=rom|initramfs|ext2|cram] 
[--modules-conf=<modules.conf>]"
        echo "       [--with-raidstart] [--without-raidstart]"
        echo "       [--with-bootsplash] [--without-bootsplash]"
@@ -761,6 +762,60 @@
        ln -s init $DESTDIR/linuxrc
 }
 
+# find if $symbol exists in System.map $mapfile
+sym_exists() {
+       local mapfile="$1"
+       local symbol="$2"
+       if [ ! -f $mapfile ]; then
+               # missing mapfile (not a pld kernel?)
+               return 1
+       fi
+
+       awk -vc=1 -vsymbol="$symbol" '$2 == "T" && $3 == symbol {c = 0} END 
{exit c}' $mapfile
+}
+
+# find best compressor (or forced one) for initrd
+find_compressor() {
+       local mode="$1"
+       # the best compressor list
+       local compressors='lzma bzip2 gzip'
+
+       # a specified one, take it
+       if ! is_yes "$mode"; then
+               compressors=gzip
+       fi
+
+       debug "finding compressor: $compressors (via $mode)"
+       # check for compressor validity
+       local c prog map=/boot/System.map-$kernel
+       for c in $compressors; do
+               case $c in
+               lzma)
+                       sym=unlzma
+                       prog=lzma
+                       ;;
+               bzip2)
+                       sym=bzip2
+                       prog=bzip2
+                       ;;
+               gzip)
+                       sym=gunzip
+                       prog=gzip
+                       ;;
+               *)
+                       die "Unknown compressor $c"
+                       ;;
+               esac
+               if sym_exists $map $sum && [ -x $prog ]; then
+                       echo $c
+                       return
+               fi
+       done
+
+       debug "using gzip for compressor (fallback)"
+       echo gzip
+}
+
 if [ -r /etc/sysconfig/geninitrd ]; then
        . /etc/sysconfig/geninitrd
 fi
@@ -861,6 +916,12 @@
        -v)
                verbose=-v
                ;;
+       --compress)
+               COMPRESS=$2
+               ;;
+       --compress=*)
+               COMPRESS="${1#--compress=}"
+               ;;
        --nocompress)
                COMPRESS=no
                ;;
@@ -1244,10 +1305,24 @@
        die "Filesystem $INITRDFS not supported by $PROGRAM"
 esac
 
-if is_yes "$COMPRESS"; then
+if ! is_no "$COMPRESS"; then
        tmp=$(mktemp "$target".XXXXXX) || die "mktemp failed"
-       debug "Compressing $target"
-       gzip -9 < "$IMAGE" > "$tmp"
+       compressor=$(find_compressor "$COMPRESS")
+       debug "Compressing $target with $compressor"
+
+       # TODO: the image name (specified from kernel.spec) already contains
+       # extension, which is .gz most of the time.
+       case "$compressor" in
+       lzma)
+               lzma -9 < "$IMAGE" > "$tmp"
+               ;;
+       bzip2)
+               bzip2 -9 < "$IMAGE" > "$tmp"
+               ;;
+       gzip)
+               gzip -9 < "$IMAGE" > "$tmp"
+               ;;
+       esac
        mv -f "$tmp" "$target"
 else
        cp -a "$IMAGE" "$target"

Modified: geninitrd/trunk/geninitrd.sysconfig
==============================================================================
--- geninitrd/trunk/geninitrd.sysconfig (original)
+++ geninitrd/trunk/geninitrd.sysconfig Tue Apr  7 00:55:20 2009
@@ -4,8 +4,10 @@
 ## Modules that should be loaded before anything (i.e. jbd for ext3)
 #PREMODS=""
 
-## Should initrd be compressed?
-COMPRESS=yes
+## Compression for the initrd.
+## lzma / bzip2 / gzip.
+## yes (default) = the 'best' available is chosen.
+#COMPRESS=yes
 
 ## What filesystem to use (rom or ext2)?
 # PLD Linux kernel has only romfs compiled in.
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to