diff --git a/Makefile b/Makefile index 5c0955c..a034b33 100644 --- a/Makefile +++ b/Makefile @@ -25,6 +25,7 @@ fwdata: linux-firmware.git/WHENCE dvb-firmware.git/README fw.list mkdir -p fwdata.tmp/lib/firmware cd linux-firmware.git; ./copy-firmware.sh -v ../fwdata.tmp/lib/firmware/ ./assemble-firmware.pl fw.list fwdata.tmp/lib/firmware + find fwdata.tmp/lib/firmware -empty -type d -delete install -d fwdata.tmp/usr/share/doc/pve-firmware cp linux-firmware.git/WHENCE fwdata.tmp/usr/share/doc/pve-firmware/README install -d fwdata.tmp/usr/share/doc/pve-firmware/licenses diff --git a/assemble-firmware.pl b/assemble-firmware.pl index e99bed0..734ed62 100755 --- a/assemble-firmware.pl +++ b/assemble-firmware.pl @@ -301,6 +301,7 @@ sub copy_fw { } my $fwdone = {}; +my $fwbase_name = {}; my $error = 0; @@ -309,6 +310,9 @@ while(defined(my $line = <$fd>)) { chomp $line; my ($fw, $mod) = split(/\s+/, $line, 2); + my $fw_name = basename($fw); + $fwbase_name->{$fw_name} = 1; + next if $mod =~ m|^kernel/sound|; next if $mod =~ m|^kernel/drivers/isdn|; @@ -400,4 +404,41 @@ while(defined(my $line = <$fd>)) { } close($fd); -exit($error); +exit($error) if $error; + +my $target_fw_string = `find '$target' -type f -o -type l`; +chomp $target_fw_string; +exit(-1) if !$target_fw_string; + +my $all_fw_files = [ split("\n", $target_fw_string) ]; + +my ($keep, $delete) = (0, 0); + +my $link_target = {}; +for my $f (@$all_fw_files) { + next if ! -l $f; + my $link = basename($f); + my $file = readlink($f); + my $target = basename($file); + $link_target->{$target} = 1 if $fwbase_name->{$link}; + $link_target->{$file} = 1 if $fwbase_name->{$link}; +} + +for my $f (@$all_fw_files) { + my $name = basename($f); + + if ($fwbase_name->{$name}) { + $keep++; + } elsif ($link_target->{$name}) { + #print "skip link target '$f'\n"; + $keep++; + } else { + print "delete unreferenced $f\n"; + unlink $f or warn "ERROR deleting '$f' - $!\n"; + $delete++; + } +} + +print "cleanup end result: keep: $keep, delete: $delete\n"; + +exit(0);