From 100326c4fe516a5d5242a56fee49d2a049e27344 Mon Sep 17 00:00:00 2001 From: Olivier Blin Date: Tue, 15 Mar 2011 21:15:40 +0000 Subject: add xz compression support for squashfs --- lib/MDV/Draklive/Loopback.pm | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/lib/MDV/Draklive/Loopback.pm b/lib/MDV/Draklive/Loopback.pm index 55e7c93..0032e6e 100644 --- a/lib/MDV/Draklive/Loopback.pm +++ b/lib/MDV/Draklive/Loopback.pm @@ -15,7 +15,7 @@ our %loop_types; squashfs => { read_only => 1, is_loopback => 1, - modules => sub { "loop", has_squashfs4_with_lzma($_[0]) ? "squashfs" : "squashfs_lzma" }, + modules => sub { "loop", best_squashfs4_compression($_[0]) ? "squashfs" : "squashfs_lzma" }, extension => '-lzma.sqfs', build => sub { my ($live, $dir) = @_; @@ -29,15 +29,15 @@ our %loop_types; my $exclude_file = tmpnam(); output_p($exclude_file, map { $root . "$_\n" } grep { -e $root . $_ } @{$dir->{exclude} || []}); my $sort = $live->{settings}{config_root} . '/' . $dir->{sort}; - my $squashfs4 = has_squashfs4_with_lzma($live); + my $squashfs4_comp = best_squashfs4_compression($live); run_foreach(sub { if (/^mksquashfs: file .*, uncompressed size (\d+) bytes\s*(?:DUPLICATE|LINK)?$/) { $progress->{current} += $1; $progress->show(time()); } }, - $squashfs4 ? 'mksquashfs' : 'mksquashfs3', $src, $dest, - $squashfs4 ? ('-comp', 'lzma') : '-lzma', + $squashfs4_comp ? 'mksquashfs' : 'mksquashfs3', $src, $dest, + $squashfs4_comp ? ('-comp', $squashfs4_comp) : '-lzma', '-noappend', '-no-progress', '-info', '-b', '1048576', #'-processors', 1, '-ef', $exclude_file, @@ -133,10 +133,20 @@ sub get_loop_modules { (); } -sub has_squashfs4_with_lzma { - my ($live) = @_; +sub has_squashfs4_with { + my ($live, $comp) = @_; my $kernel = $live->find_kernel; - cat_($live->get_system_root . "/boot/config-" . $live->find_kernel->{version}) =~ /^CONFIG_DECOMPRESS_LZMA_NEEDED=y$/m; + my $ucomp = uc($comp); + cat_($live->get_system_root . "/boot/config-" . $live->find_kernel->{version}) =~ /^CONFIG_SQUASHFS_$ucomp=y$/m; +} + +sub mksquashfs4_compressors() { + map { /^Compressors available/ .. /^$/ ? if_(/^\t(\w+)/, chomp_($1)) : () } `mksquashfs 2>&1`; +} + +sub best_squashfs4_compression { + my ($live) = @_; + find { has_squashfs4_with($live, $_) } intersection([ mksquashfs4_compressors() ], [ qw(xz lzma) ]); } 1; -- cgit v1.2.1