diff -r 000000000000 -r dfb7c4ff071f commsfwtools/preparedefaultcommsdatabase/defaultcommdb/group/createcommdbs.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/commsfwtools/preparedefaultcommsdatabase/defaultcommdb/group/createcommdbs.pl Thu Dec 17 09:22:25 2009 +0200 @@ -0,0 +1,531 @@ +# Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# + +#!perl + +use strict; +use File::Copy; +use File::Path; +use File::stat; +use Getopt::Long; +use Cwd; +use FindBin; + + +if ($^O =~ /MSWin32/) +{ + require Win32::Mutex; + require Win32::File; +} + + +$::emulatorCfg = 'emulator.cfg'; +$::targetCfg = 'target.cfg'; + +GetOptions ( + 'command=s' => \$::command, + 'platform=s' => \$::platform, + 'variant=s' => \$::variant, + 'targetcfg=s' => \$::targetCfg, + 'emulatorcfg=s' => \$::emulatorCfg, + 'sourceDir=s' => \$::sourceDir, + 'platsec!' => \$::platsec); + +# +# Constants. +# + +my $epocRoot = GetEpocRoot(); +my $EpocWinsStore = 'c:\defaultcommdb'; +my $emptyDatabase = 'empty.txt'; + +my $emulatorstore = $epocRoot . 'epoc32/winscw/c/defaultcommdb'; + +my $release = $epocRoot . 'epoc32/release/'; +my $winscedUREL = $release . 'wins/urel/ced.exe'; +my $winscwcedUREL = $release . 'winscw/urel/ced.exe'; +my $winscedUDEB = $release . 'wins/udeb/ced.exe'; +my $winscwcedUDEB = $release . 'winscw/udeb/ced.exe'; + +# Linux static copies +my $bindir = $FindBin::Bin.'/../bin/'; +my @bincopies=( + # plat var source destination + ['emulator', 'both', $bindir.'commsdb.dat', $emulatorstore.'/commsdb.dat'], + ['emulator', 'udeb', $bindir.'cccccc00.cre', $epocRoot.'epoc32/release/winscw/udeb/z/private/10202be9/cccccc00.cre'], + ['emulator', 'urel', $bindir.'cccccc00.cre', $epocRoot.'epoc32/release/winscw/urel/z/private/10202be9/cccccc00.cre'], + ['target', 'both', $bindir.'cccccc00.cre', $epocRoot.'epoc32/data/z/private/10202be9/cccccc00.cre'] + ); + +# +# Main. +# +unless ($::command and $::platform and $::variant and (scalar(@ARGV) == 0)) +{ + die "CreateCommdbs Error: Invalid arguments\n"; +} + +my $platType; +if ($::platform =~ /^(wins|wincw)/i) +{ + $platType = 'emulator'; +} +else +{ + $platType = 'target'; +} + +# +# Check OS, and perform copies of key binaries from source if dynamic generation in unsupported +# + +if (!($^O =~ /MSWin32/)) + { + foreach my $bincopy (@bincopies) + { + my ($copyplat, $copyvar, $source, $destination) = @$bincopy; + + if (($copyplat eq $platType) and (($copyvar eq lc($::variant)) or ($copyvar eq "both"))) + { + if (($::command eq "build") and not (-e $destination)) + { + # Existing files are considered to be current + print ("Warning: createcommdbs.pl: \'$destination\' generated by a copy from source as building is not supported on this platform.\n"); + print ("Copy \'$source\' to \'$destination\'\n"); + CopyFile($source, $destination); + } + elsif (($::command eq "clean") and (-e $destination)) + { + unlink ($destination) + } + elsif ($::command eq "releasables") + { + print ("$destination\n"); + } + } + } + exit; + } + +my $cccccc00Root; +my $cccccc00NameCre; +my $cccccc00Nametxt; + +$cccccc00Root = "/private/10202be9/"; +$cccccc00NameCre = "cccccc00.cre"; +$cccccc00Nametxt = "cccccc00.txt"; + +my $data = +{ + target => + { + sourceCfg => "$::sourceDir/$::targetCfg", + cedCfg => "$EpocWinsStore\\$::targetCfg", + emptyDb => "$::sourceDir/$emptyDatabase", + destinationCdb => $emulatorstore . '/CommsDb.dat', + }, + emulator => + { + sourceCfg => "$::sourceDir\\$::emulatorCfg", + cedCfg => "$EpocWinsStore\\$::emulatorCfg", + emptyDb => "$::sourceDir\\$emptyDatabase", + destinationCdb => $emulatorstore . '/CommsDb.dat', + } +}; + +my $ced; +my $cedPlatfrom; +my $cedVariant; +my $emulatorstore; +my $CopiedCfg; +my $CedLog; +my $winsCdb; +my $CdbEmpty; +my $romCdb; +my $attrib; +my $cdbIn; +my $cdbOut; +my $cdbDatPath; +my $cdbDatFile; +my $cdbDatExt; +my $zDrive; +my $zDriveCre; + +# +# Establish location of ced.exe +# +if ($platType =~ 'emulator') +{ + $cedPlatfrom = $::platform; + $cedVariant = $::variant; +} +elsif (($platType =~ 'target') && (-e $winscwcedUREL)) +{ + $cedPlatfrom = 'WINSCW'; + $cedVariant = 'UREL'; +} +elsif (($platType =~ 'target') && (-e $winscwcedUDEB)) +{ + $cedPlatfrom = 'WINSCW'; + $cedVariant = 'UDEB'; +} +elsif (($platType =~ 'target') && (-e $winscedUREL)) +{ + $cedPlatfrom = 'WINS'; + $cedVariant = 'UREL'; +} +elsif (($platType =~ 'target') && (-e $winscedUDEB)) +{ + $cedPlatfrom = 'WINS'; + $cedVariant = 'UDEB'; +} + +$cdbIn = '/c/defaultcommdb/'; +$cdbOut = '/c/defaultcommdb/'; + +$CopiedCfg = $epocRoot . 'epoc32/' . $cedPlatfrom . $cdbIn . $platType . '.cfg'; +$CedLog = $CopiedCfg . '.log'; + +if ($ENV{DEFAULTCOMMSDATDATAFILE}) +{ + ($cdbDatPath, $cdbDatFile, $cdbDatExt) = SplitFileName($ENV{DEFAULTCOMMSDATDATAFILE}); +} +else +{ + $cdbDatPath = $epocRoot. 'epoc32/' . $cedPlatfrom . $cdbOut; + $cdbDatFile = 'CommsDb'; + $cdbDatExt = '.dat'; +} + +$zDrive = $release . $cedPlatfrom . '/' . $cedVariant . '/z'; +$zDriveCre = $zDrive . $cccccc00Root . $cccccc00NameCre; +$CdbEmpty = $zDrive . $cccccc00Root . $cccccc00Nametxt; + +if ($::command eq 'build') +{ + $ced = $release . $cedPlatfrom . '/' . $cedVariant . '/ced.exe'; + $emulatorstore = $epocRoot . 'epoc32/' . $cedPlatfrom . $cdbIn; + $winsCdb = $epocRoot . 'epoc32/' . $cedPlatfrom . '/c' . $cccccc00Root . "persists/" . $cccccc00NameCre; + $romCdb = $epocRoot . 'epoc32/' . 'data/z' . $cccccc00Root . $cccccc00NameCre; + + if ($platType =~ 'emulator') + { + $CopiedCfg = $emulatorstore . 'emulator.cfg'; + } + else + { + $CopiedCfg = $emulatorstore . 'target.cfg'; + } + + PreBuild(); +} +elsif ($::command eq 'clean') +{ + Clean(); +} +elsif ($::command eq 'releasables') +{ + Releasables(); +} + +# +# Subs. +# + +sub PreBuild +{ + if ($^O =~ /MSWin32/) + { + # We cannot have more than one instance of this script's activites running at the same time on Windows, so + # we safeguarded everything with a Windows mutex. Mutex name needs to be unique for every build, + # so we add the current working directory and EPOCROOT to the mutex name + + my $drive = Win32::GetCwd(); + $drive =~ s/^(\D:).*/$1/; + my $mutexname = $drive.lc($ENV{'EPOCROOT'}); + $mutexname =~ s/[:\\\/]+/_/g; + + my $mutex = Win32::Mutex->new(1,"CEDMUTEX_".$mutexname); + die "Unable to create mutex, createcommdbs.pl not run" if not $mutex; + if ($mutex->wait()) + { + Build(); + $mutex->release(); + } + else + { + die "Unable to access mutex, createcommdbs.pl not run"; + } + } + else + { + Build(); + } +} + +sub Build +{ + print("\n**Constructing $::platform $::variant database**\n"); + print("**$winsCdb\n\n"); + # delete old log file if it exists + DeleteFile($CedLog); + + #Check for empty cenrep initialisation .txt file and store if missing + if (!(-e $CdbEmpty)) + { + print("\nCopying $data->{$platType}->{emptyDb} to $CdbEmpty\n"); + CopyFile($data->{$platType}->{emptyDb}, $CdbEmpty); + print("Remove ReadOnly attribute! from $CdbEmpty \n\n"); + if ($^O =~ /MSWin32/) + { + no strict; # Not nice this, but avoids compilation errors on Linux + Win32::File::SetAttributes($CdbEmpty, NORMAL) || die $!; + } + } + + # Ensure CFG file exists + if (-e $data->{$platType}->{sourceCfg}) + { + print("Copying $data->{$platType}->{sourceCfg} ... \n"); + CopyIfYounger($data->{$platType}->{sourceCfg}, $CopiedCfg); + print("copied successfully to $CopiedCfg\n\n"); + + # Ensure replacement file is more up-to-date than existing file + if (FileIsYounger($CopiedCfg, $data->{$platType}->{destinationCdb})) + { + print("$CopiedCfg newer than $data->{$platType}->{destinationCdb}\n"); + RunCed(); + + if ($@) + { + die $@; + } + print("\n"); + } + else + { + print("$data->{$platType}->{sourceCfg} older than $data->{$platType}->{destinationCdb}\n"); + print("Construction aborted.\n"); + } + } + else + { + print("CreateCommdbs Error: $data->{$platType}->{sourceCfg} does not exist, construction aborted.\n"); + } + + print("Deleting $CopiedCfg\n"); + DeleteFile($CopiedCfg); + +} + + +sub Clean +{ + print("$data->{$platType}->{destinationCdb}\n"); + DeleteFile($data->{$platType}->{destinationCdb}); + print("Deleting $CopiedCfg\n"); + DeleteFile($CopiedCfg); + print("Deleting $CedLog\n"); + DeleteFile($CedLog); + print("Deleting $cdbDatPath$cdbDatFile$cdbDatExt\n"); + DeleteFile("$cdbDatPath$cdbDatFile$cdbDatExt"); +} + +sub Releasables +{ + print("$data->{$platType}->{destinationCdb}\n"); + print("$CdbEmpty\n"); +} + +sub RunCed +{ + print("sub RunCed\n"); + + print("Running $ced -Mconsole -dJustInTime=0 -dtextshell -- -i $data->{$platType}->{cedCfg} -d -o $data->{$platType}->{cedCfg}.log\n"); + + system ("$ced -Mconsole -dJustInTime=0 -dtextshell -- -i $data->{$platType}->{cedCfg} -d -o $data->{$platType}->{cedCfg}.log"); + + CheckCedLog("$CopiedCfg.log"); + CheckEpocLog(); + + #copy to output location + print("Copy $winsCdb to $data->{$platType}->{destinationCdb}\n"); + CopyFile($winsCdb, $data->{$platType}->{destinationCdb}); + + #copy to z drive + print("Copy $winsCdb to $zDriveCre\n"); + CopyFile($winsCdb, $zDriveCre); + + #print("Copy $winsCdb to $romCdb\n"); + #CopyFile($winsCdb, $romCdb); +} + +sub CheckCedLog +{ + print("sub CheckCedLog\n"); + my $log = shift; + open (LOG, $log) or die "CreateCommdbs Error: Couldn't open \"$log\" for reading: $!\n"; + + my @log = reverse ; + close (LOG); + unless ($log[0] eq "SUCCESS\n") + { + die "CreateCommdbs Error: CED failed to generate commdb, see \"$log\" for details\n"; + } +} + +sub CheckEpocLog +{ + print("sub CheckEpocLog\n"); + my $log = $ENV{'TEMP'}."\\epocwind.out"; + unless (open (LOG, $log)) + { + print "CreateCommdbs Error: Couldn't open \"$log\" for reading: $!\n"; + return; + } + + foreach my $line () + { + if ($line =~ m/ced\.exe.+panic/i) + { + print "CreateCommdbs Error: CED panic detected, see \"$log\" for details\n"; + } + } + + close(LOG); +} + +sub CopyFile +{ + my $file1 = shift; + my $file2 = shift; + (my $path) = SplitFileName($file2); + + unless (-e $path) + { + mkpath ($path) or die "CreateCommdbs Error: Couldn't make path \"$path\": $!\n"; + } + + if (-e $file2 and not -w $file2) + { + system "attrib -r $file2"; + } + copy ($file1, $file2) or die "CreateCommdbs Error: Couldn't copy \"$file1\" to \"$file2\": $!\n"; +} + +sub MoveFile +{ + my $file1 = shift; + my $file2 = shift; + (my $path) = SplitFileName($file2); + + unless (-e $path) + { + mkpath ($path) or die "CreateCommdbs Error: Couldn't make path \"$path\": $!\n"; + } + move ($file1, $file2) or die "CreateCommdbs Error: Couldn't move \"$file1\" to \"$file2\": $!\n"; +} + +sub DeleteFile +{ + my $file = shift; + if (-e $file) + { + unlink ($file) or die "CreateCommdbs Error: Couldn't delete \"$file\": $!\n"; + } +} + +sub SplitFileName +{ + my $fileName = shift; + my $path = ''; + my $base = ''; + my $ext = ''; + + if ($fileName =~ /^(.*\/)/) + { + $path = $1; + } + if ($fileName =~ /\/?([^\/]*?)(\.[^\/\.]*)?$/) + { + $base = $1; + } + if ($fileName =~ /(\.[^\/\.]*)$/o) + { + $ext = $1; + } + + die unless ($fileName eq "$path$base$ext"); + return ($path, $base, $ext); +} + +sub CopyIfYounger +{ + my $from = shift; + my $to = shift; + unless (-e $from) + { + die "Error: \"$from\" not found\n"; + } + + if (FileIsYounger($from, $to)) + { + CopyFile($from, $to); + } +} + +sub FileIsYounger +{ + my $file1 = shift; + my $file2 = shift; + return (FileModifiedTime($file1) > FileModifiedTime($file2)); +} + +sub FileModifiedTime +{ + my $file = shift; + if (-e $file) + { + my $st = stat($file) or return 0; + return $st->mtime; + } + return 0; +} + +sub RenameFile +{ + my $file1 = shift; + my $file2 = shift; + + rename ($file1, $file2) or die "installCommdb Error: Couldn't rename \"$file1\" to \"$file2\": $!\n"; +} + +sub GetEpocRoot +{ + my $path = $ENV{EPOCROOT}; + + # replace to forward slashes + $path =~ s/\\/\//g; + + # append trailing slash if one isn't already present + if($path =~ m/.*\/$/) + { + return $path; + } + else + { + return $path."\/"; + } +}