--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/group/cleaner.pl Thu Dec 17 09:14:38 2009 +0200
@@ -0,0 +1,266 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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: Cleaner script to perform more thorough cleanup than abld reallyclean#
+
+use strict;
+use constant DEBUG => 0;
+
+my $iCleanup_file = "cleanup.txt";
+my @iErrors = ();
+my $iTag_platform = "__PLATFORM__";
+my $iTag_target = "__TARGET__";
+my @iPlatforms = ( "winscw", "armv5" );
+my @iTargets = ( "udeb", "urel" );
+my $iSlowClean = 0;
+my $iTest = 0;
+
+# ----------------------------------------------------------------------------
+# Main
+# ----------------------------------------------------------------------------
+
+my $iCommand = shift @ARGV || "";
+
+if ( $iCommand eq "clean" ) {
+
+ print "Running cleanup...\n";
+ clean();
+
+} elsif ( $iCommand eq "slowclean" ) {
+
+ $iSlowClean = 1;
+ clean();
+
+} elsif ( $iCommand eq "test" ) {
+
+ print "Running test...\n";
+ $iTest = 1;
+ clean();
+
+} elsif ( $iCommand eq "init" ) {
+
+ init_environment();
+
+} elsif ( $iCommand eq "generate" ) {
+
+ generate();
+
+} else {
+ print "Usage: $0 <command>\n";
+ print "Commands:\n";
+ print " init Initializes the build environment by calling 'bldmake bldfiles' and 'abld makefile'.\n";
+ print " This needs to be run only if the environment has not been built yet and 'abld build -what' fails.\n";
+ print " generate Generates a configuration file of releasables to be cleaned.\n";
+ print " clean Cleans the build quickly by deleting all matching files from the configuration file.\n";
+ print " slowclean Slower and more thorough clean that deletes all similar files in addition to the ones normal clean deletes.\n";
+ print " Example: Cleanup list contains file 'binary.dll'. Slowclean will also delete files named\n";
+ print " 'binary.dll.foo' and 'binary.dll.bar'\n";
+ print " test Runs a test to see what files would be deleted on a real cleanup run.\n";
+ print " Shows only files that would not be deleted by 'abld reallyclean'.\n";
+ exit 0;
+}
+
+# Print possible errors
+print join "\n", @iErrors;
+
+exit 0;
+
+# ----------------------------------------------------------------------------
+# Subroutines
+# ----------------------------------------------------------------------------
+
+
+# ----------------------------------------------------------------------------
+# Initializes the environment to be able to call 'abld build -what'
+# ----------------------------------------------------------------------------
+#
+sub init_environment {
+ # Initialize the environment in order to get "abld build -what" to run properly
+ print "Initializing build environment...\n";
+
+ print "Calling 'bldmake bldfiles'\n";
+ system "bldmake bldfiles";
+
+ print "Calling 'abld export'\n";
+ system "abld export";
+
+ print "Calling 'abld makefile winscw'\n";
+ system "abld makefile winscw";
+
+ print "Calling 'abld makefile armv5'\n";
+ system "abld makefile armv5";
+
+ print "Done.\n";
+}
+
+
+# ----------------------------------------------------------------------------
+# Generates the cleanup list by calling 'abld build -what' and parsing it
+# ----------------------------------------------------------------------------
+#
+sub generate {
+ print "Attempting to generate the cleanup list...\n";
+
+ # Get the list of releasables from the build tools
+ open my $in, "abld build -what 2>&1 |" or die "Cannot open pipe! $!";
+
+ my %parsed;
+ while ( <$in> ) {
+ if ( /No such file or directory/ ) {
+ push @iErrors, "Unable to generate cleanup list. The environment is not ready. Run 'init' before running 'generate'";
+ last;
+ }
+
+ $_ = lc $_;
+ next unless /^\\epoc32/;
+
+ s/release\\(?:winscw|armv5)\\(?:udeb|urel)/release\\$iTag_platform\\$iTag_target/i;
+
+ # Cenrep file. Add the corresponding .cre file to the cleanup list
+ if ( /(.+?winscw\\c\\private\\10202be9\\)(.{8})\.txt/ ) {
+ $parsed{ $1 . "persists\\" . $2 . ".cre\n" }++;
+ }
+
+ $parsed{ $_ }++;
+ }
+
+ close $in;
+
+ if ( @iErrors > 0 ) {
+ return;
+ }
+
+ open my $out, ">$iCleanup_file" or die "Cannot open file $iCleanup_file! $!";
+ print $out join "", sort keys %parsed;
+ close $out;
+}
+
+
+# ----------------------------------------------------------------------------
+# Cleans up the environment by deleting all files found from the cleanup list
+# Cleaning is done by finding all files that match the string in the list in
+# so all similarly named files are also deleted. (CodeWarrior temporary files etc )
+# ----------------------------------------------------------------------------
+#
+sub clean {
+
+ if ( !-e $iCleanup_file ) {
+ push @iErrors, "Cleanup file $iCleanup_file not found! Run 'generate' to generate it.";
+ return;
+ }
+
+ open my $in, "$iCleanup_file" or die "Cannot open cleanup file $iCleanup_file! $!";
+ my @releasables = <$in>;
+ close $in;
+
+ my $total = scalar @releasables;
+ print "$total rules found from cleanup list...\n";
+
+ my @deleted = ();
+ my $progress = 0;
+ foreach ( @releasables ) {
+ $progress++;
+
+ next if $_ eq "";
+
+ # Found __PLATFORM__ tag. Substitute it with all known platforms and add them back to the array
+ if ( /$iTag_platform/ ) {
+ foreach my $platform ( @iPlatforms ) {
+ my $new_releasable = $_;
+ $new_releasable =~ s/$iTag_platform/$platform/;
+ debug( "Adding releasable: $new_releasable" );
+ push @releasables, $new_releasable;
+ $total++; # Adjust the total amount of files to be deleted
+ }
+
+ # Move on to the next round
+ next;
+ }
+
+ # Found __TARGET__ tag. Substitute it with all known targets and add them back to the array
+ if ( /$iTag_target/ ) {
+ foreach my $target ( @iTargets ) {
+ my $new_releasable = $_;
+ $new_releasable =~ s/$iTag_target/$target/;
+ debug( "Adding releasable: $new_releasable" );
+ push @releasables, $new_releasable;
+ $total++; # Adjust the total amount of files to be deleted
+ }
+
+ # Move on to the next round
+ next;
+ }
+
+ # At this point there is nothing to substitute. Find all files matching the releasable name and delete them
+ chomp; # Get rid of newline at the end
+
+ my $releasable = lc $_;
+ my @files_found;
+ if ( $iSlowClean == 1 ) {
+ @files_found = glob "$_*";
+ } else {
+ push @files_found, $releasable;
+ }
+ foreach my $file ( @files_found ) {
+ next unless $file =~ /^\\epoc32/; # Some kind of safeguard, just in case
+
+ if ( $iTest == 1 ) {
+
+ # If the file is not one of the releasables, it would not be deleted by reallyclean
+ # So add it to the list of files that would only be deleted by this script
+
+ $file = lc $file;
+ if ( $file ne $releasable || $file =~ /\.cre$/ ) {
+ push @deleted, $file;
+ }
+
+ } else {
+
+ my $err = 0;
+ unlink $file or ( $err = -1 );
+ if ( $err ne -1 ) {
+ push @deleted, $file;
+ }
+ }
+ }
+
+ # Report progress
+ my $percent = ( $progress / $total ) * 100;
+ printf "\r ( %d / %d ) % .1f %%", $progress, $total, $percent;
+ }
+
+ if ( @deleted > 0 ) {
+ print "\n\nSummary:\n";
+ foreach my $deleted ( sort @deleted ) {
+ if ( $iTest ) {
+ print "Would be deleted: $deleted\n";
+ } else {
+ print "Deleted: $deleted\n";
+ }
+ }
+ } else {
+ print "\n\nNothing to be done.\n";
+ }
+}
+
+
+# ----------------------------------------------------------------------------
+# Debug output. Prints a string if the debug flag is defined
+# ----------------------------------------------------------------------------
+#
+sub debug {
+ my $msg = shift;
+ if ( DEBUG ) {
+ print $msg;
+ }
+}
\ No newline at end of file