diff -r fa9d7d89d3d6 -r 68f68128601f sbsv1/abld/test/cw_ide_test.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sbsv1/abld/test/cw_ide_test.pl Thu Nov 25 13:59:07 2010 +0000 @@ -0,0 +1,418 @@ +#!perl +# Copyright (c) 2004-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: +# Script to build specified MMP files with both command line and IDE, then +# use EVALID to compare the results. +# Inspired by "buildall.pl", written by Cuong Phan +# +# + +use strict; +use File::Basename; # for fileparse() +use File::Path; # for mkpath +use Cwd; # for cwd +use OLE; +use Getopt::Long; + +sub Usage ($) + { + my ($message) = @_; + print <) + { + $specifiedCWD = ""; + + if (/#.*cwd:/i) + { + $specifiedCWD = $_; + $specifiedCWD =~ s/^.*cwd:/cwd:/i; + $specifiedCWD =~ s/\).*$//; + $specifiedCWD =~ s/\s*//g; + $specifiedCWD =~ s/\//\\/g; + $specifiedCWD .="?"; + } + + s/#.*$//; # remove comments + s/\s*$//; # remove trailing ws + s/^\s*//; # remove leading ws + s/\//\\/g; # convert / to \ + next if ($_ eq ""); + push @mmplist, $specifiedCWD.$_; + } +close FILELIST; + +&Usage("No MMP files?") if (@mmplist == 0); + +# create an instance of CodeWarrior +my $CW = CreateObject OLE "CodeWarrior.CodeWarriorApp"; +if (!defined($CW)) + { + print "Failed to start CodeWarrior\n"; + exit(1); + } + +# turn on autoflush, to get stdout in the right place... +# These runes come from perlfaq5 + +my $old_fh = select(STDOUT); +$| = 1; +select($old_fh); + +foreach my $mmpfile (@mmplist) + { + $specifiedCWD = ""; + + if ($mmpfile =~ /^cwd:/) + { + $specifiedCWD = $mmpfile; + $specifiedCWD =~ s/^cwd://; + $specifiedCWD =~ s/\?.*$//; + $mmpfile =~ s/^cwd:.*\?//; + } + + if (!-f $mmpfile) + { + print "MISSING: $mmpfile\n"; + next; + } + + foreach my $platform (@ARGV) + { + $platform = uc $platform; + my ($mmpname, $mmpdir, $mmpext) = fileparse($mmpfile,'\..*'); + my $phasename = $mmpname."_".$platform; + + my $origdir = cwd; + + if ($specifiedCWD) + { + print ("chdir $specifiedCWD\n"); + chdir ($specifiedCWD); + + # Workaround for Base components, where GENEXEC.MKE needs to be executed to export the required headers for a build + do_system ("bldmake bldfiles"); + do_system ("abld makefile $platform"); + } + else + { + print ("chdir $mmpdir\n"); + chdir ($mmpdir); + } + + my $time = localtime; + print "===-------------------------------------------------\n"; + print "=== $phasename\n"; + print "===-------------------------------------------------\n"; + print "=== $phasename started $time\n"; + + if ($specifiedCWD) + { + $mmpdir = "\\".$mmpdir; + } + else + { + $mmpdir = ""; + } + + &do_one_mmp_file($phasename, $mmpname, $platform, $mmpdir); + + $time = localtime; + print "=== $phasename finished $time\n"; + + chdir($origdir); + print ("chdir $origdir\n"); + } + } + +$CW->Quit(0); +exit(0); + +sub do_system($) + { + my ($cmd) = @_; + print " $cmd\n"; + return system($cmd); + } + +sub zip_and_check($$$) + { + my ($zipname, $releaseref, $complain) = @_; + + unlink($zipname) if (-f $zipname); + + my @ziplist; + foreach (sort keys %$releaseref) + { + if (-f $_) + { + push @ziplist,$_; # add to zip archive + } + else + { + print "MISSING: $_\n" if ($complain); + } + } + + if (scalar @ziplist ==0 && $complain) + { + print "Can't create empty archive $zipname\n"; + return; + } + + # Make the non-empty archive + + open ZIP, "| zip -q $zipname -@"; + print ZIP + join("\n",@ziplist,""); + close ZIP; + print "Created $zipname\n"; + } + +sub do_one_mmp_file($$$) + { + my ($phasename, $mmpname, $platform, $mmpdir) = @_; + + print "=== $phasename == $mmpname.mmp\n"; + + # use MAKMAKE to generate the makefile + # make CLEAN to remove any existing build results + # make ALL to build everything + # make WHAT to get the releaseables, as per abld.pl + # check the releaseables and zip up the ones which do exist + # make CLEAN again to get ready for the IDE build... + + my $makefile = "$mmpname.$platform"; + my %allreleaseables=(); # complete list, for putting back afterwards + my %releaseables=(); # just things we expect the IDE to build + my %uncheckedreleaseables=(); + my $makecmd = "make -s"; + $makecmd = "make" if ($Options{"v"}); + + unlink $makefile if (-f $makefile); + &do_system("perl -S makmake.pl $mmpdir$mmpname $platform"); + return if (!-f $makefile); + + open PIPE,"make -s -r -f $makefile WHAT |"; + while () + { + next if (/Nothing to be done for \S+\.$/o); +# releasables split on whitespace - quotes possible -stripped out + while (/("([^"\t\n\r\f]+)"|([^ "\t\n\r\f]+))/go) + { + my $file = ($2 ? $2 : $3); + $allreleaseables{$file}=1; + next if ($file =~ /epoc32\\localisation\\/i); + next if ($file =~ /epoc32\\data/i && $platform =~ /winscw/i); + $releaseables{$file}=1; + } + } + close PIPE; + &zip_and_check("$mmpname.orig.$platform.zip", \%allreleaseables, 0); + + &do_system("$makecmd -r -f $makefile CLEAN"); + &do_system("$makecmd -r -f $makefile ALL"); + &zip_and_check("$mmpname.cmd.$platform.zip", \%releaseables, 1); + + &do_system("$makecmd -r -f $makefile CLEAN"); + + print "=== $phasename == $mmpname.mcp\n"; + + # Remove the remnants of previous projects + # use MAKMAKE to generate the importable .xml + # import the xml to create the .mcp + # build the relevant targets + # extract the contents of the "Errors & Warnings" window + # check against the commandline list of releasables, zip up the ones which exist + + my $currentdir = cwd; + $currentdir =~ s/\//\\/g; + my $xmlfile = "$currentdir\\$mmpname.xml"; + my $mcpfile = "$currentdir\\$mmpname.mcp"; + my $mcpdata = "$currentdir\\${mmpname}_Data"; + + &do_system("rmdir /s/q $mcpdata") if (-d $mcpdata); + unlink $mcpfile if (-f $mcpfile); + unlink $xmlfile if (-f $xmlfile); + + &do_system("perl -S makmake.pl $mmpdir$mmpname CW_IDE:$platform"); + if (-f $xmlfile) + { + &fixup_XML($xmlfile) if ($Options{"v"}); + my $project = $CW->ImportProject($xmlfile, $mcpfile, 'true'); + if (defined($project)) + { + my $success = &BuildTargets($project->Targets,$platform); + $project->Close(); + return if (!$success); + &zip_and_check("$mmpname.ide.$platform.zip", \%releaseables, 1); + } + else + { + print "ERROR: failed to import $xmlfile\n"; + return; + } + } + else + { + print "ERROR: failed to create $xmlfile\n"; + return; + } + + print "=== $phasename == $mmpname.evalid\n"; + + # remove & recreate a clean temporary directory for unzipping + # unzip the saved results of the cmd and ide builds + # use EVALID to compare the releaseables + + my $evaliddir = "c:\\temp\\evalid"; + &do_system("rmdir /s/q $evaliddir") if (-d $evaliddir); + mkpath([$evaliddir]); + + if ( &do_system("unzip -q $mmpname.cmd.$platform.zip -d $evaliddir\\cmd")==0 + && &do_system("unzip -q $mmpname.ide.$platform.zip -d $evaliddir\\ide")==0) + { + open EVALID,"perl -S evalid.pl $evaliddir\\ide $evaliddir\\cmd -c |"; + while () + { + print $_ if (/^(PROBLEM|Failed)/); + print $_ if (/^OK/ && $Options{"v"}); + if (/^FAILED/) + { + if (/\.map\t/i) + { + print "WARNING(S): $_"; + } + else + { + print "FATAL ERROR(S): $_"; + } + } + } + close EVALID; + } + else + { + print "FATAL ERROR(S): problems unpacking zip files\n"; + } + &do_system("rmdir /s/q $evaliddir") if (-d $evaliddir); + + # Restore original files, if any + if (-e "$mmpname.orig.$platform.zip") + { + &do_system("unzip -q -o $mmpname.orig.$platform.zip -d \\"); + } + } + +sub fixup_XML($) + { + my ($xmlfile) = @_; + open XML,"<$xmlfile" or return; + my @lines = ; + close XML; + + foreach (@lines) + { + # Insist that build commands are logged to the output window, irrespective of CW version + s-LogMessagesfalse-LogMessagestrue-; + s-ShowCommandLinefalse-ShowCommandLinetrue-; + + # Remove generation of Browse info by Language Parser (temporary workaround for crashes in automated IDE builds) + s-BrowserGenerator2-BrowserGenerator0-; + } + + open XML,">$xmlfile" or return; + print XML @lines; + close XML; + } + +sub BuildTargets($$) + { + my ($targets,$platform) = @_; + + for (my $item=0; $item<$targets->Count; $item++ ) + { + my $target = $targets->Item($item); + my $targetName = $target->name; + # Skip platforms we aren't interested in... + next if ($targetName !~ /$platform /i); + + print "Building $targetName...\n"; + + $target->RemoveObjectCode( 'true' ); + + my $buildMessages = $target->BuildAndWaitToComplete(); + if (!defined($buildMessages)) + { + printf "FATAL ERROR(S): build aborted? (%s)\n", $target->LastError(); + return 0; + } + + my $messageList = $buildMessages->Informations; + &printMessages("",$messageList) if defined($messageList); + + my $warningCount = $buildMessages->WarningCount; + my $errorCount = $buildMessages->ErrorCount; + print "Completed $targetName with $errorCount errors and $warningCount warnings\n"; + + if ($errorCount > 0) + { + $messageList = $buildMessages->Errors; + &printMessages("FATAL ERROR(S): ", $messageList); + } + if ($warningCount > 0) + { + $messageList = $buildMessages->Warnings; + &printMessages("WARNING: ", $messageList); + } + } + return 1; + } + +sub printMessages ($$) + { + my ($prefix,$messageList) = @_; + + # traverse through the list of messages + for (my $item = 0; $item < ($messageList->Count); $item++) + { + my $message = $messageList->Item($item); + print $prefix,$message->MessageText,"\n"; + } + } +