#!/usr/bin/perl use warnings; use strict; use File::Basename qw(dirname basename); use File::Spec::Functions; use File::Find; my $DEBUG = 1; my $parent = "Resources"; my $prefix = "/sw"; my $dir = File::Spec->rel2abs(dirname($0)); # Functions sub do_cmd { my $cmd = shift; print "$cmd\n" if $DEBUG; system($cmd) == 0 or die "Command failed: $cmd\nError: $!\n"; } sub install { do_cmd("sudo apt-get -y install " . join(' ', @_)); } sub reparent { do_cmd("rm -rf \Q$parent"); do_cmd('./reparent ' . join (' ', @_)); } sub data { my %d = @_; while (my ($k, $v) = each %d) { my $newd = catfile($parent, $prefix, $v); do_cmd("mkdir -p \Q$newd\E"); do_cmd("cp " . quotemeta(catfile('data', $k)) . " \Q$newd\E"); } } sub sedfiles { my %d = @_; (my $newp = $prefix) =~ s/^/./; while (my ($k, $v) = each %d) { my $sourcef = catfile($prefix, $k); my $newf = catfile($parent, $prefix, $v); do_cmd("mkdir -p " . quotemeta(dirname($newf))); do_cmd("sed -e 's,$prefix,$newp,g' \Q$sourcef\E > \Q$newf\E"); } } sub remove { for my $set (@_) { my ($adir, @exclude) = @$set; my $rdir = catfile($parent, $prefix, $adir); my @rm; if (! -d $rdir or !@exclude) { @rm = ($rdir); } else { opendir DIR, $rdir; my @c = grep { ! /^\.\.?$/ } readdir DIR; closedir DIR; @rm = @c; for my $exc (@exclude) { @rm = grep { ! /$exc/ } @rm; } if (scalar(@rm) == scalar(@c)) { @rm = ($rdir); } else { @rm = map { catfile($rdir, $_) } @rm; } } do_cmd("rm -rf " . join(' ', @rm)); } } sub remove_subs { my @s = @_; find(sub { foreach my $s (@s) { if (&$s()) { do_cmd("rm -rf $_"); last; } } }, $parent); } sub template { my $app = glob('template/*.app'); my $appn = basename($app); do_cmd("rm -rf \Q$appn"); do_cmd("cp -R \Q$app\E \Q$appn\E"); do_cmd("cp data/script \Q" . catfile($appn, 'Contents/Resources')); do_cmd("cp data/Info.plist \Q" . catfile($appn, 'Contents')); do_cmd("mv $parent/* \Q" . catfile($appn, 'Contents/Resources')); do_cmd("rm -rf $parent"); } # Config install(qw(nicotine gtk+2 gtk2-engines)); reparent(qw(atk1-shlibs glib2-shlibs gtk2-engines gtk+2-shlibs libgettext3-shlibs libiconv nicotine pango1-xft2-shlibs pygtk2-py23)); remove( [ 'share/doc' ], [ 'share/info' ], [ 'share/themes', 'Clearlooks' ], [ 'lib/gtk-2.0/2.4.0/engines' ], [ 'lib/gtk-2.0/2.4.0/immodules' ], [ 'lib/gtk-2.0/2.4.0/loaders', 'png', 'gif' ], [ 'lib/pango/1.4.0/modules', 'basic' ], ); remove_subs(sub { /\.py[co]$/ }); data('pangorc' => 'etc', 'gtkrc-2.0' => 'etc', 'getdisplay.sh' => 'bin'); sedfiles( "etc/gtk-2.0/gdk-pixbuf.loaders" => "etc/gdk-pixbuf.loaders", "etc/pango/pango.modules" => "etc/pango/pango.modules", ); template();