2005-11-14 14:24:17 +00:00
|
|
|
#!/usr/bin/perl
|
2005-11-14 15:05:53 +00:00
|
|
|
# __________ __ ___.
|
|
|
|
# Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
|
|
# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
|
|
# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
|
|
# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
|
|
# \/ \/ \/ \/ \/
|
|
|
|
# $Id$
|
|
|
|
#
|
|
|
|
|
|
|
|
$ROOT="..";
|
|
|
|
|
|
|
|
if($ARGV[0] eq "-r") {
|
|
|
|
$ROOT=$ARGV[1];
|
|
|
|
shift @ARGV;
|
|
|
|
shift @ARGV;
|
|
|
|
}
|
|
|
|
|
|
|
|
my $verbose;
|
|
|
|
if($ARGV[0] eq "-v") {
|
|
|
|
$verbose =1;
|
|
|
|
shift @ARGV;
|
|
|
|
}
|
|
|
|
|
|
|
|
my $firmdir="$ROOT/firmware";
|
2005-11-14 14:24:17 +00:00
|
|
|
|
|
|
|
my $wpslist=$ARGV[0];
|
|
|
|
|
2005-11-14 15:05:53 +00:00
|
|
|
my $target = $ARGV[1];
|
|
|
|
my $cppdef = $target;
|
|
|
|
|
|
|
|
|
2005-11-14 14:24:17 +00:00
|
|
|
if(!$wpslist) {
|
2005-11-14 15:05:53 +00:00
|
|
|
print "Usage: wpsbuilds.pl <WPSLIST> <target>\n",
|
|
|
|
"Run this script in the root of the target build, and it will put all the\n",
|
|
|
|
"stuff in .rockbox/wps/\n";
|
2005-11-14 14:24:17 +00:00
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
2005-11-14 15:05:53 +00:00
|
|
|
sub getlcdsizes {
|
2005-11-17 22:39:26 +00:00
|
|
|
my ($remote) = @_;
|
|
|
|
|
2005-11-14 15:05:53 +00:00
|
|
|
open(GCC, ">gcctemp");
|
2005-11-17 22:39:26 +00:00
|
|
|
if($remote) {
|
|
|
|
# Get the remote LCD screen size
|
|
|
|
print GCC <<STOP
|
|
|
|
\#include "config.h"
|
|
|
|
#ifdef HAVE_REMOTE_LCD
|
|
|
|
Height: LCD_REMOTE_HEIGHT
|
|
|
|
Width: LCD_REMOTE_WIDTH
|
|
|
|
#endif
|
|
|
|
STOP
|
|
|
|
;
|
|
|
|
}
|
|
|
|
else {
|
2005-11-14 15:05:53 +00:00
|
|
|
print GCC <<STOP
|
|
|
|
\#include "config.h"
|
|
|
|
Height: LCD_HEIGHT
|
|
|
|
Width: LCD_WIDTH
|
|
|
|
STOP
|
|
|
|
;
|
2005-11-17 22:39:26 +00:00
|
|
|
}
|
2005-11-14 15:05:53 +00:00
|
|
|
close(gcc);
|
|
|
|
|
|
|
|
my $c="cat gcctemp | gcc $cppdef -I. -I$firmdir/export -E -P -";
|
|
|
|
|
|
|
|
#print "CMD $c\n";
|
|
|
|
|
|
|
|
open(GETSIZE, "$c|");
|
|
|
|
|
|
|
|
my ($height, $width);
|
|
|
|
while(<GETSIZE>) {
|
|
|
|
if($_ =~ /^Height: (\d*)/) {
|
|
|
|
$height = $1;
|
|
|
|
}
|
|
|
|
elsif($_ =~ /^Width: (\d*)/) {
|
|
|
|
$width = $1;
|
|
|
|
}
|
|
|
|
if($height && $width) {
|
|
|
|
last;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
close(GETSIZE);
|
|
|
|
unlink("gcctemp");
|
|
|
|
|
|
|
|
return ($height, $width);
|
|
|
|
}
|
|
|
|
|
|
|
|
sub mkdirs {
|
|
|
|
my $wpsdir = $wps;
|
2005-11-17 22:39:26 +00:00
|
|
|
$wpsdir =~ s/\.(r|)wps//;
|
2005-11-14 15:05:53 +00:00
|
|
|
mkdir ".rockbox/wps", 0777;
|
2005-11-18 15:33:05 +00:00
|
|
|
mkdir ".rockbox/themes", 0777;
|
2005-11-17 22:39:26 +00:00
|
|
|
|
|
|
|
if( -d ".rockbox/wps/$wpsdir") {
|
2005-11-17 23:47:23 +00:00
|
|
|
#print STDERR "wpsbuild warning: directory wps/$wpsdir already exists!\n";
|
2005-11-17 22:39:26 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
mkdir ".rockbox/wps/$wpsdir", 0777;
|
|
|
|
}
|
2005-11-14 15:05:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
sub copywps {
|
|
|
|
# we assume that we copy the WPS files from the same dir the WPSLIST
|
|
|
|
# file is located in
|
|
|
|
my $dir;
|
|
|
|
|
|
|
|
if($wpslist =~ /(.*)WPSLIST/) {
|
|
|
|
$dir = $1;
|
|
|
|
my $wpsdir = $wps;
|
2005-11-17 22:39:26 +00:00
|
|
|
$wpsdir =~ s/\.(r|)wps//;
|
2005-11-14 15:05:53 +00:00
|
|
|
system("cp $dir/$wps .rockbox/wps/");
|
2005-11-17 23:47:23 +00:00
|
|
|
|
2005-11-16 01:24:52 +00:00
|
|
|
if (-e "$dir/$wpsdir") {
|
|
|
|
system("cp $dir/$wpsdir/*.bmp .rockbox/wps/$wpsdir/");
|
|
|
|
}
|
2005-11-14 15:05:53 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
print STDERR "beep, no dir to copy WPS from!\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-11-14 14:24:17 +00:00
|
|
|
sub buildcfg {
|
|
|
|
my $cfg = $wps;
|
2005-11-14 15:05:53 +00:00
|
|
|
my @out;
|
2005-11-14 14:24:17 +00:00
|
|
|
|
2005-11-17 22:39:26 +00:00
|
|
|
$cfg =~ s/\.(r|)wps/.cfg/;
|
2005-11-14 14:24:17 +00:00
|
|
|
|
2005-11-14 15:05:53 +00:00
|
|
|
push @out, <<MOO
|
|
|
|
\#
|
2005-11-14 14:24:17 +00:00
|
|
|
\# $cfg generated by wpsbuild.pl
|
2005-11-14 15:05:53 +00:00
|
|
|
\# $wps is made by $author
|
2005-11-14 14:24:17 +00:00
|
|
|
\#
|
|
|
|
wps: /.rockbox/wps/$wps
|
|
|
|
MOO
|
|
|
|
;
|
2005-11-14 15:05:53 +00:00
|
|
|
if($font) {
|
|
|
|
push @out, "font: /.rockbox/fonts/$font\n";
|
|
|
|
}
|
|
|
|
if($statusbar) {
|
|
|
|
push @out, "statusbar: $statusbar\n";
|
|
|
|
}
|
2005-11-18 15:33:05 +00:00
|
|
|
if($rwps && $has_remote ) {
|
2005-11-17 22:39:26 +00:00
|
|
|
push @out, "rwps: /.rockbox/wps/$rwps\n";
|
|
|
|
}
|
2005-11-14 15:05:53 +00:00
|
|
|
|
2005-11-17 22:39:26 +00:00
|
|
|
if(-f ".rockbox/wps/$cfg") {
|
|
|
|
print STDERR "wpsbuild warning: wps/$cfg already exists!\n";
|
|
|
|
}
|
|
|
|
else {
|
2005-11-18 15:33:05 +00:00
|
|
|
open(CFG, ">.rockbox/themes/$cfg");
|
2005-11-17 22:39:26 +00:00
|
|
|
print CFG @out;
|
|
|
|
close(CFG);
|
|
|
|
}
|
2005-11-14 14:24:17 +00:00
|
|
|
}
|
|
|
|
|
2005-11-17 22:39:26 +00:00
|
|
|
# Get the LCD sizes first
|
|
|
|
my ($main_height, $main_width) = getlcdsizes();
|
|
|
|
my ($remote_height, $remote_width) = getlcdsizes(1);
|
|
|
|
|
2005-11-18 15:33:05 +00:00
|
|
|
$has_remote = true if ($remote_height && $remote_width);
|
|
|
|
|
2005-11-14 14:24:17 +00:00
|
|
|
open(WPS, "<$wpslist");
|
|
|
|
while(<WPS>) {
|
|
|
|
my $l = $_;
|
|
|
|
if($l =~ /^ *\#/) {
|
|
|
|
# skip comment
|
|
|
|
next;
|
|
|
|
}
|
2005-11-17 22:39:26 +00:00
|
|
|
if($l =~ /^ *<(r|)wps>/i) {
|
|
|
|
$isrwps = $1;
|
2005-11-14 14:24:17 +00:00
|
|
|
$within = 1;
|
2005-11-18 15:33:05 +00:00
|
|
|
# undef is a unary operator (!)
|
|
|
|
undef $wps;
|
|
|
|
undef $rwps;
|
|
|
|
undef $width;
|
|
|
|
undef $height;
|
|
|
|
undef $font;
|
|
|
|
undef $statusbar;
|
|
|
|
undef $author;
|
2005-11-14 14:24:17 +00:00
|
|
|
next;
|
|
|
|
}
|
|
|
|
if($within) {
|
2005-11-17 22:39:26 +00:00
|
|
|
if($l =~ /^ *<\/${isrwps}wps>/i) {
|
|
|
|
# Get the required width and height
|
|
|
|
my ($rheight, $rwidth);
|
|
|
|
if($isrwps) {
|
|
|
|
($rheight, $rwidth) = ($remote_height, $remote_width);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
($rheight, $rwidth) = ($main_height, $main_width);
|
|
|
|
}
|
2005-11-14 15:05:53 +00:00
|
|
|
|
|
|
|
if(!$rheight || !$rwidth) {
|
2005-11-17 22:39:26 +00:00
|
|
|
printf STDERR "wpsbuild notice: No %sLCD size, skipping $wps\n",
|
|
|
|
$isrwps?"remote ":"";
|
2005-11-18 15:33:05 +00:00
|
|
|
$within = 0;
|
2005-11-17 22:39:26 +00:00
|
|
|
next;
|
2005-11-14 15:05:53 +00:00
|
|
|
}
|
|
|
|
|
2005-11-14 15:10:40 +00:00
|
|
|
#print "LCD: $wps wants $height x $width\n";
|
|
|
|
#print "LCD: is $rheight x $rwidth\n";
|
2005-11-14 15:05:53 +00:00
|
|
|
|
2005-11-14 18:46:38 +00:00
|
|
|
if(($height <= $rheight) && ($width <= $rwidth)) {
|
2005-11-14 15:05:53 +00:00
|
|
|
#
|
|
|
|
# The target model has an LCD that is suitable for this
|
|
|
|
# WPS
|
|
|
|
#
|
2005-11-14 15:10:40 +00:00
|
|
|
#print "Size requirement is fine!\n";
|
2005-11-14 15:05:53 +00:00
|
|
|
mkdirs();
|
2005-11-17 23:47:23 +00:00
|
|
|
if(!$isrwps) {
|
|
|
|
# We only make .cfg files for <wps> sections:
|
|
|
|
buildcfg();
|
|
|
|
}
|
2005-11-14 15:05:53 +00:00
|
|
|
copywps();
|
|
|
|
}
|
2005-11-14 15:10:40 +00:00
|
|
|
else {
|
|
|
|
#print "Skip $wps due to size restraints\n";
|
|
|
|
}
|
2005-11-14 14:24:17 +00:00
|
|
|
$within = 0;
|
|
|
|
}
|
|
|
|
elsif($l =~ /^Name: (.*)/i) {
|
2005-11-17 23:47:23 +00:00
|
|
|
# Note that in the case this is within <rwps>, $wps will contain the
|
|
|
|
# name of the rwps. Use $isrwps to figure out what type it is.
|
2005-11-14 14:24:17 +00:00
|
|
|
$wps = $1;
|
|
|
|
}
|
2005-11-17 22:39:26 +00:00
|
|
|
elsif($l =~ /^RWPS: (.*)/i) {
|
|
|
|
$rwps = $1;
|
|
|
|
}
|
2005-11-14 15:05:53 +00:00
|
|
|
elsif($l =~ /^Author: (.*)/i) {
|
|
|
|
$author = $1;
|
|
|
|
}
|
|
|
|
elsif($l =~ /^Width: (.*)/i) {
|
|
|
|
$width = $1;
|
|
|
|
}
|
|
|
|
elsif($l =~ /^Height: (.*)/i) {
|
|
|
|
$height = $1;
|
|
|
|
}
|
2005-11-14 14:24:17 +00:00
|
|
|
elsif($l =~ /^Font: (.*)/i) {
|
|
|
|
$font = $1;
|
|
|
|
}
|
|
|
|
elsif($l =~ /^Statusbar: (.*)/i) {
|
|
|
|
$statusbar = $1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-11-14 15:05:53 +00:00
|
|
|
close(WPS)
|