almost finished... copy fonts, backdrops, icon files, skins. last thing to do is...
[kugel-rb.git] / tools / buildtheme.pl
blob488a57d0abb0c660c6bd633d2850075124771549
1 #!/usr/bin/perl
2 # __________ __ ___.
3 # Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 # Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 # Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 # Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 # \/ \/ \/ \/ \/
8 # $Id: wpsbuild.pl 24813 2010-02-21 19:10:57Z kugel $
11 use strict;
12 use Getopt::Long qw(:config pass_through); # pass_through so not confused by -DTYPE_STUFF
14 my $ROOT="..";
15 my $verbose;
16 my $rbdir=".rockbox";
17 my $wpslist;
18 my $target;
19 my $modelname;
21 # Get options
22 GetOptions ( 'r|root=s' => \$ROOT,
23 'm|modelname=s' => \$modelname,
24 'v|verbose' => \$verbose,
25 'rbdir=s' => \$rbdir, # If we want to put in a different directory
28 ($wpslist, $target) = @ARGV;
30 my $firmdir="$ROOT/firmware";
31 my $cppdef = $target;
32 my @depthlist = ( 16, 8, 4, 2, 1 );
35 # LCD sizes
36 my ($main_height, $main_width, $main_depth);
37 my ($remote_height, $remote_width, $remote_depth);
38 my $has_remote;
41 if(!$wpslist) {
42 print "Usage: buildtheme.pl <WPSLIST> <target>\n",
43 "Run this script in the root of the target build, and it will put all the\n",
44 "stuff in $rbdir/wps/\n";
45 exit;
48 sub getlcdsizes
50 my ($remote) = @_;
52 open(GCC, ">gcctemp");
53 if($remote) {
54 # Get the remote LCD screen size
55 print GCC <<STOP
56 \#include "config.h"
57 #ifdef HAVE_REMOTE_LCD
58 Height: LCD_REMOTE_HEIGHT
59 Width: LCD_REMOTE_WIDTH
60 Depth: LCD_REMOTE_DEPTH
61 #endif
62 STOP
65 else {
66 print GCC <<STOP
67 \#include "config.h"
68 Height: LCD_HEIGHT
69 Width: LCD_WIDTH
70 Depth: LCD_DEPTH
71 STOP
74 close(GCC);
76 my $c="cat gcctemp | gcc $cppdef -I. -I$firmdir/export -E -P -";
78 #print "CMD $c\n";
80 open(GETSIZE, "$c|");
82 my ($height, $width, $depth);
83 while(<GETSIZE>) {
84 if($_ =~ /^Height: (\d*)/) {
85 $height = $1;
87 elsif($_ =~ /^Width: (\d*)/) {
88 $width = $1;
90 elsif($_ =~ /^Depth: (\d*)/) {
91 $depth = $1;
93 if($height && $width && $depth) {
94 last;
97 close(GETSIZE);
98 unlink("gcctemp");
100 return ($height, $width, $depth);
103 # Get the LCD sizes first
104 ($main_height, $main_width, $main_depth) = getlcdsizes();
105 ($remote_height, $remote_width, $remote_depth) = getlcdsizes(1);
107 #print "LCD: ${main_width}x${main_height}x${main_depth}\n";
108 $has_remote = 1 if ($remote_height && $remote_width && $remote_depth);
110 my $isrwps;
111 my $within;
113 my %theme;
116 sub match {
117 my ($string, $pattern)=@_;
119 $pattern =~ s/\*/.*/g;
120 $pattern =~ s/\?/./g;
122 return ($string =~ /^$pattern\z/);
125 sub matchdisplaystring {
126 my ($string)=@_;
127 return ($string =~ /${main_width}x${main_height}x${main_depth}/i) ||
128 ($string =~ /r${remote_width}x${remote_height}x${remote_depth}/i);
131 sub mkdirs
133 my ($themename) = @_;
134 mkdir "$rbdir", 0777;
135 mkdir "$rbdir/wps", 0777;
136 mkdir "$rbdir/themes", 0777;
137 mkdir "$rbdir/icons", 0777;
138 mkdir "$rbdir/backdrops", 0777;
140 if( -d "$rbdir/wps/$themename") {
141 # print STDERR "wpsbuild warning: directory wps/$themename already exists!\n";
143 else
145 mkdir "$rbdir/wps/$themename", 0777;
149 sub buildcfg {
150 my ($themename) = @_;
151 my @out;
153 push @out, <<MOO
155 \# generated by buildtheme.pl
156 \# $themename is made by $theme{"Author"}
160 my %configs = (
161 "Name" => "# Theme Name",
162 "WPS" => "wps", "RWPS" => "rwps",
163 "FMS" => "fms", "RFMS" => "rfms",
164 "SBS" => "sbs", "RSBS" => "rsbs",
165 "Font" => "font", "Remote Font" => "remote font",
166 "Statusbar" => "statusbar", "Remote Statusbar" => "remote statusbar",
167 "selector type" => "selector type", "Remote Selector Type" => "remote selector type",
168 "backdrop" => "backdrop", "iconset" => "iconset", "viewers iconset" => "viewers iconset",
169 "remote iconset" => "remote iconset", "remote viewers iconset" => "remote viewers iconset",
170 "Foreground Color" => "foreground color", "Background Color" => "background color",
171 "backdrop" => "backdrop"
174 while( my ($k, $v) = each %configs )
176 if ($k =~ "Name")
178 # do nothing
180 elsif ($k =~ /WPS|RWPS|FMS|RFMS|SBS|RSBS/ && exists($theme{$k}))
182 push (@out, "$v: $themename.$v\n");
184 elsif ($k =~ /backdrop/ )
186 if (exists($theme{$k}))
188 my $dst = $theme{$k};
189 $dst =~ s/(\.[0-9]*x[0-9]*x[0-9]*)//;
190 push (@out, "$v: $theme{$k}\n");
192 else
194 push (@out, "$v: -\n");
197 elsif (exists($theme{$k}))
199 push (@out, "$v: $theme{$k}\n");
201 else
203 push (@out, "$v: -\n");
207 # if(-f "$rbdir/themes/$themename.cfg") {
208 # print STDERR "wpsbuild warning: $themename.cfg already exists!\n";
210 # else {
211 open(CFG, ">$rbdir/themes/$themename.cfg");
212 print CFG @out;
213 close(CFG);
218 sub copythemefont
220 my ($font) = @_;
221 #copy the font specified by the theme
223 my $o=$font;
224 $o =~ s/\.fnt/\.bdf/;
225 mkdir "$rbdir/fonts";
226 my $cmd ="$ROOT/tools/convbdf -f -o \"$rbdir/fonts/$font\" \"$ROOT/fonts/$o\" ";
227 # print "$cmd\n";
228 `$cmd`;
231 sub copyiconset
233 my ($iconset) = @_;
234 #copy the icon specified by the theme
236 if ($iconset ne '') {
237 $iconset =~ s/.rockbox/$rbdir/;
238 $iconset =~ /\/(.*icons\/(.*))/i;
239 `cp $ROOT/icons/$2 $1`;
243 sub copybackdrop
245 my ($backdrop) = @_;
246 #copy the backdrop file into the build dir
247 if ($backdrop ne '')
249 my $dst = $backdrop;
250 $dst =~ s/(\.[0-9]*x[0-9]*x[0-9]*)//;
251 my $cmd = "cp $ROOT/$backdrop $rbdir/$dst";
252 # print "$cmd\n";
253 `$cmd`;
258 sub copyskin
260 my ($themename, $skin, $ext) = @_;
261 # we assume that we copy the WPS files from the same dir the WPSLIST
262 # file is located in
263 my $dir;
264 my @filelist;
265 my $src;
266 my $dest;
268 if($wpslist =~ /(.*)OUT/) {
269 $dir = $1;
271 # first try the actual filename given to us
272 # then $skin.widthxheightxdepths.ext
273 # then $skin.ext
274 $src = "${dir}$skin.$ext";
275 if ( -e $src )
277 my $cmd = "cp $src $rbdir/wps/$themename.$ext";
278 `$cmd`;
280 else
282 my $is_remote = ($ext =~ /^r.../i);
283 my $width = $is_remote ? $remote_width : $main_width;
284 my $height = $is_remote ? $remote_height : $main_height;
285 my $depth = $is_remote ? $remote_depth : $main_depth;
287 foreach my $d (@depthlist)
289 next if ($d > $depth);
290 $src = "${dir}$skin.${width}x${height}x${d}.$ext";
291 last if (-e $src);
293 if (-e $src)
295 my $cmd = "cp $src $rbdir/wps/$themename.$ext";
296 print "$cmd\n";
297 `$cmd`;
299 elsif (-e "${dir}$skin.$ext")
301 my $cmd = "cp ${dir}$skin.$ext $rbdir/wps/$themename.$ext";
302 `$cmd`;
304 else
306 #print STDERR "buildtheme warning: No suitable skin file for $ext\n";
312 open(WPS, "<$wpslist");
313 while(<WPS>) {
314 my $l = $_;
316 # remove CR
317 $l =~ s/\r//g;
318 if($l =~ /^ *\#/) {
319 # skip comment
320 next;
322 if($l =~ /^ *<(r|)wps>/i) {
323 $isrwps = $1;
324 $within = 1;
325 undef %theme;
326 next;
328 if($within) {
329 if($l =~ /^ *<\/${isrwps}wps>/i) {
330 #get the skin directory
331 $wpslist =~ /(.*)WPSLIST/;
332 my $wpsdir = $1;
333 $within = 0;
335 next if (!exists($theme{Name}));
336 mkdirs($theme{Name});
337 buildcfg($theme{Name});
339 copyskin($theme{"Name"}, $theme{"WPS"}, "wps") if exists($theme{"WPS"});
340 copyskin($theme{"Name"}, $theme{"RWPS"}, "rwps") if exists($theme{"RWPS"});
341 copyskin($theme{"Name"}, $theme{"FMS"}, "fms") if exists($theme{"FMS"});
342 copyskin($theme{"Name"}, $theme{"RFMS"}, "rfms") if exists($theme{"RFMS"});
343 copyskin($theme{"Name"}, $theme{"SBS"}, "sbs") if exists($theme{"SBS"});
344 copyskin($theme{"Name"}, $theme{"RSBS"}, "rsbs") if exists($theme{"RSBS"});
346 copyiconset($theme{"iconset"}) if exists($theme{"iconset"});
347 copyiconset($theme{"remote iconset"}) if exists($theme{"remote iconset"});
348 copyiconset($theme{"viewers iconset"}) if exists($theme{"viewers iconset"});
349 copyiconset($theme{"remote viewers iconset"}) if exists($theme{"remote viewers iconset"});
351 copythemefont($theme{"Font"}) if exists($theme{"Font"});
352 copythemefont($theme{"Remote Font"}) if exists($theme{"Remote Font"});
354 copybackdrop($theme{"backdrop"}) if exists($theme{"backdrop"});
359 elsif($l =~ /^([\w ]*)\.?(.*):\s*(.*)/) {
360 my $var = $1;
361 my $extra = $2;
362 my $value = $3;
363 if (!exists($theme{$var}))
365 if (!$extra ||
366 ($extra && (match($target, $extra) || matchdisplaystring($extra))))
368 $theme{$var} = $value;
369 #print "\'$var\': $value\n";
373 else{
374 #print "Unknown line: $l!\n";
379 close(WPS);