| [33] | 1 | |
|---|
| 2 | use warnings; |
|---|
| 3 | use strict; |
|---|
| 4 | |
|---|
| 5 | use File::Basename qw(dirname basename); |
|---|
| 6 | use File::Spec::Functions; |
|---|
| 7 | use File::Find; |
|---|
| 8 | |
|---|
| 9 | my $DEBUG = 1; |
|---|
| 10 | my $parent = "Resources"; |
|---|
| 11 | my $prefix = "/sw"; |
|---|
| 12 | my $dir = File::Spec->rel2abs(dirname($0)); |
|---|
| 13 | |
|---|
| 14 | |
|---|
| 15 | sub do_cmd { |
|---|
| 16 | my $cmd = shift; |
|---|
| 17 | print "$cmd\n" if $DEBUG; |
|---|
| 18 | system($cmd) == 0 or die "Command failed: $cmd\nError: $!\n"; |
|---|
| 19 | } |
|---|
| 20 | |
|---|
| 21 | sub install { |
|---|
| 22 | do_cmd("sudo apt-get -y install " . join(' ', @_)); |
|---|
| 23 | } |
|---|
| 24 | |
|---|
| 25 | sub reparent { |
|---|
| 26 | do_cmd("rm -rf \Q$parent"); |
|---|
| 27 | do_cmd('./reparent ' . join (' ', @_)); |
|---|
| 28 | } |
|---|
| 29 | |
|---|
| 30 | sub data { |
|---|
| 31 | my %d = @_; |
|---|
| 32 | while (my ($k, $v) = each %d) { |
|---|
| 33 | my $newd = catfile($parent, $prefix, $v); |
|---|
| 34 | do_cmd("mkdir -p \Q$newd\E"); |
|---|
| 35 | do_cmd("cp " . quotemeta(catfile('data', $k)) |
|---|
| 36 | . " \Q$newd\E"); |
|---|
| 37 | } |
|---|
| 38 | } |
|---|
| 39 | |
|---|
| 40 | sub sedfiles { |
|---|
| 41 | my %d = @_; |
|---|
| 42 | (my $newp = $prefix) =~ s/^/./; |
|---|
| 43 | while (my ($k, $v) = each %d) { |
|---|
| 44 | my $sourcef = catfile($prefix, $k); |
|---|
| 45 | my $newf = catfile($parent, $prefix, $v); |
|---|
| 46 | do_cmd("mkdir -p " . quotemeta(dirname($newf))); |
|---|
| 47 | do_cmd("sed -e 's,$prefix,$newp,g' \Q$sourcef\E > \Q$newf\E"); |
|---|
| 48 | } |
|---|
| 49 | } |
|---|
| 50 | |
|---|
| 51 | sub remove { |
|---|
| 52 | for my $set (@_) { |
|---|
| 53 | my ($adir, @exclude) = @$set; |
|---|
| 54 | my $rdir = catfile($parent, $prefix, $adir); |
|---|
| 55 | |
|---|
| 56 | my @rm; |
|---|
| 57 | if (! -d $rdir or !@exclude) { |
|---|
| 58 | @rm = ($rdir); |
|---|
| 59 | } else { |
|---|
| 60 | opendir DIR, $rdir; |
|---|
| 61 | my @c = grep { ! /^\.\.?$/ } readdir DIR; |
|---|
| 62 | closedir DIR; |
|---|
| 63 | |
|---|
| 64 | @rm = @c; |
|---|
| 65 | for my $exc (@exclude) { |
|---|
| 66 | @rm = grep { ! /$exc/ } @rm; |
|---|
| 67 | } |
|---|
| 68 | if (scalar(@rm) == scalar(@c)) { |
|---|
| 69 | @rm = ($rdir); |
|---|
| 70 | } else { |
|---|
| 71 | @rm = map { catfile($rdir, $_) } @rm; |
|---|
| 72 | } |
|---|
| 73 | } |
|---|
| 74 | |
|---|
| 75 | do_cmd("rm -rf " . join(' ', @rm)); |
|---|
| 76 | } |
|---|
| 77 | } |
|---|
| 78 | |
|---|
| 79 | sub remove_subs { |
|---|
| 80 | my @s = @_; |
|---|
| 81 | find(sub { |
|---|
| 82 | foreach my $s (@s) { |
|---|
| 83 | if (&$s()) { |
|---|
| 84 | do_cmd("rm -rf $_"); |
|---|
| 85 | last; |
|---|
| 86 | } |
|---|
| 87 | } |
|---|
| 88 | }, $parent); |
|---|
| 89 | } |
|---|
| 90 | |
|---|
| 91 | sub template { |
|---|
| 92 | my $app = glob('template/*.app'); |
|---|
| 93 | my $appn = basename($app); |
|---|
| 94 | do_cmd("rm -rf \Q$appn"); |
|---|
| 95 | do_cmd("cp -R \Q$app\E \Q$appn\E"); |
|---|
| 96 | do_cmd("cp data/script \Q" . catfile($appn, 'Contents/Resources')); |
|---|
| 97 | do_cmd("cp data/Info.plist \Q" . catfile($appn, 'Contents')); |
|---|
| 98 | do_cmd("mv $parent/* \Q" . catfile($appn, 'Contents/Resources')); |
|---|
| 99 | do_cmd("rm -rf $parent"); |
|---|
| 100 | } |
|---|
| 101 | |
|---|
| 102 | |
|---|
| 103 | install(qw(nicotine gtk+2 gtk2-engines)); |
|---|
| 104 | reparent(qw(atk1-shlibs glib2-shlibs gtk2-engines gtk+2-shlibs |
|---|
| 105 | libgettext3-shlibs libiconv nicotine pango1-xft2-shlibs pygtk2-py23)); |
|---|
| 106 | remove( |
|---|
| 107 | [ 'share/doc' ], |
|---|
| 108 | [ 'share/info' ], |
|---|
| 109 | [ 'share/themes', 'Clearlooks' ], |
|---|
| 110 | [ 'lib/gtk-2.0/2.4.0/engines' ], |
|---|
| 111 | [ 'lib/gtk-2.0/2.4.0/immodules' ], |
|---|
| 112 | [ 'lib/gtk-2.0/2.4.0/loaders', 'png', 'gif' ], |
|---|
| 113 | [ 'lib/pango/1.4.0/modules', 'basic' ], |
|---|
| 114 | ); |
|---|
| 115 | remove_subs(sub { /\.py[co]$/ }); |
|---|
| 116 | data('pangorc' => 'etc', 'gtkrc-2.0' => 'etc', 'getdisplay.sh' => 'bin'); |
|---|
| 117 | sedfiles( |
|---|
| 118 | "etc/gtk-2.0/gdk-pixbuf.loaders" => "etc/gdk-pixbuf.loaders", |
|---|
| 119 | "etc/pango/pango.modules" => "etc/pango/pango.modules", |
|---|
| 120 | ); |
|---|
| 121 | template(); |
|---|