--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/bldsystemtools/commonbldutils/clean.pl Tue Feb 02 01:39:43 2010 +0200
@@ -0,0 +1,342 @@
+use strict;
+
+use Getopt::Long;
+use File::Path;
+use File::Spec::Functions;
+
+my $gRealTimeBuildErrors = 0;
+sub RealTimeBuildError($)
+{
+ $gRealTimeBuildErrors++;
+ print STDERR "ERROR: RealTimeBuild: ", @_, "\n";
+ return "RealTimeBuild error";
+}
+
+# Process the commandline
+my ($iDataSource, $iSrc, $iMRPSrc, $platform, $iDummy, $iVerbose) = ProcessCommandLine();
+
+my ($iDirList)= ProcessList($iDataSource, $iSrc, $iMRPSrc, $platform, $iVerbose);
+my @delete;
+
+search_dir($iSrc, $iDirList, \@delete, $iVerbose);
+
+foreach my $leftover (keys %$iDirList)
+{
+ print "REMARK: LEFTOVER: $leftover ($$iDirList{$leftover})\n";
+}
+
+if ($gRealTimeBuildErrors && !$iDummy)
+{
+ print STDERR "\nWARNING: Files will NOT be deleted, because of earlier real time build errors\n\n";
+ $iDummy = 1;
+}
+
+foreach my $delete (@delete)
+{
+ if ($iDummy)
+ {
+ print "REMARK: $delete is not referenced by any MRP\n";
+ } else {
+ # Delete the files or directories
+ # make sure it is not read only
+ #Convert back to \ for dos command
+ $delete =~ s#\/#\\#g;
+ system("attrib -r /s /d \"$delete\"");
+ my $deletenum = rmtree($delete);
+ if ($deletenum == 0)
+ {
+ RealTimeBuildError("failed to deleted $delete");
+ } elsif (-d "$delete") {
+ RealTimeBuildError("failed to deleted directory $delete"); #Because it still exists
+ } elsif ($deletenum > 1) {
+ print "REMARK: deleted $deletenum files in directory $delete as they are not referenced by any MRP\n";
+ } else {
+ print "REMARK: deleted $delete as it is not referenced by any MRP\n";
+ }
+ }
+}
+
+sub search_dir
+{
+ my ($dir, $iDirList, $delete, $iVerbose) = @_;
+ my @flist;
+
+ print "Processing $dir\n" if ($iVerbose);
+ if (opendir(DIRH,"$dir"))
+ {
+ @flist=readdir(DIRH);
+ closedir DIRH;
+ ENTRY: foreach my $entry (@flist)
+ {
+ # ignore . and .. :
+ next if ($entry eq "." || $entry eq "..");
+ my $partial_match;
+ # Check entry again $iDirList for matches
+ foreach my $sourceline (keys %$iDirList)
+ {
+ if ($sourceline =~ m#^$dir/$entry$#i)
+ {
+ # Exact match delete entry in %$iDirList
+ # Check to see if something has already partial matched
+ print "REMARK: $dir/$entry is probably covered more than once\n" if ($partial_match);
+ if ($iVerbose)
+ {
+ if (-d "$dir/$entry")
+ {
+ print "Keeping directory $dir/$entry ($$iDirList{$sourceline})\n";
+ } else {
+ print "Keeping file $dir/$entry ($$iDirList{$sourceline})\n";
+ }
+ }
+ delete $$iDirList{$sourceline};
+ # No more processing required
+ next ENTRY;
+ }
+ # Check to see if there is reference to inside this directory
+ if ($sourceline =~ m#^$dir/$entry/#i)
+ {
+ # something reference this as a directory need more processing
+ $partial_match = 1 if (-d "$dir/$entry");
+ }
+ }
+ if ($partial_match)
+ {
+ search_dir("$dir/$entry", $iDirList, $delete, $iVerbose) if (-d "$dir/$entry");
+ next ENTRY;
+ }
+ # No match place on deletion list
+ push @$delete, "$dir/$entry";
+ print "Marking $dir/$entry for delete\n" if ($iVerbose);
+ }
+ }else{
+ RealTimeBuildError("can not read directory $dir");
+ }
+}
+
+# ProcessList
+#
+# Inputs
+# $iDataSource - ref to array of files to process
+# $iSrc - real location of source files
+# $iMRPSrc - where the mrp thinks they are
+#
+# Outputs
+#
+# Description
+# This function processes mrp files
+sub ProcessList
+{
+ my ($iDataSource, $iSrc, $iMRPSrc, $platform, $iVerbose) = @_;
+
+ my %Sources;
+ my @ComponentList;
+ my %mrpHash;
+
+ # Need the dir swap
+ $iDataSource =~ s/^$iMRPSrc/$iSrc/;
+ # Read the options.txt
+ open OPTIONS, $iDataSource or die RealTimeBuildError("Cannot open $iDataSource $!");
+ while(<OPTIONS>)
+ {
+ if (/^GT\+Techview baseline mrp location:\s*(\S+)\s*$/i)
+ {
+ $mrpHash{lc $1} = $1;
+ next;
+ }
+ if (/^GT only baseline mrp location:\s*(\S+)\s*$/i)
+ {
+ $mrpHash{lc $1} = $1;
+ next;
+ }
+ if (/^Strong crypto mrp location:\s*(\S+)\s*$/i)
+ {
+ $mrpHash{lc $1} = $1;
+ next;
+ }
+ if (/^Techview component list:\s*(\S+)\s*$/i)
+ {
+ push @ComponentList, $1;
+ next;
+ }
+ if (/^GT component list:\s*(\S+)\s*$/i)
+ {
+ push @ComponentList, $1;
+ next;
+ }
+ }
+ close OPTIONS;
+ for (my $i = 0; $i < scalar(@ComponentList); $i++)
+ {
+ # Fix path
+ $ComponentList[$i] =~ s#\\#\/#g;
+ # Need the dir swap
+ $ComponentList[$i] =~ s/^$iMRPSrc/$iSrc/;
+ open IN, $ComponentList[$i] or die RealTimeBuildError("Cannot open ".$ComponentList[$i]." $!");
+ while(<IN>)
+ {
+ my ($mrp) = /^\s*\S+\s+(\S+)\s*$/;
+ $mrpHash{lc $mrp} = $mrp;
+ }
+ close IN;
+ }
+
+ my @mrpList = sort values %mrpHash;
+ for (my $i = 0; $i < scalar(@mrpList); $i++)
+ {
+ # Fix path
+ $mrpList[$i] =~ s#\\#\/#g;
+ # Need the dir swap
+ $mrpList[$i] =~ s/^$iMRPSrc/$iSrc/i;
+ # Fix the CustKit / Devkit and techviewexamplesdk mrp locations
+ $mrpList[$i] =~ s#^/product/CustKit#$iSrc/os/unref/orphan/cedprd/CustKit#i;
+ $mrpList[$i] =~ s#^/product/DevKit#$iSrc/os/unref/orphan/cedprd/DevKit#i;
+ $mrpList[$i] =~ s#^/product/techviewexamplesdk#$iSrc/os/unref/orphan/cedprd/techviewexamplesdk#i;
+ $Sources{"$iSrc/os/unref/orphan/cedprd/SuppKit"} = "clean.pl";
+ $Sources{"$iSrc/os/unref/orphan/cedprd/tools"} = "clean.pl";
+ $Sources{"$iSrc/os/buildtools/toolsandutils/productionbldtools"} = "clean.pl";
+
+ if (open MRP, $mrpList[$i])
+ {
+ my $mrpfile = $mrpList[$i];
+ my $mrpfile_in_source = 0;
+
+ while(<MRP>)
+ {
+ my $dir;
+ if (/^\s*source\s+(\S.*\S)\s*$/i) # must allow for spaces in names
+ {
+ my $origdir = $1;
+ $dir = $origdir;
+
+ #Find any relative paths and add them to the end of the mrp location to create a full path
+ if (($dir =~ /\.\\/)||($dir =~ /\.\.\\/)||($dir !~ /\\/))
+ {
+ $dir =~ s#\.\.#\.#g; # .. becomes .
+ $dir =~ s#^\.#\\\.#g; # add an extra \ incase one is not present at start of path, canonpath wil cleanup multiple \
+
+ $dir = "\\".$dir if ($dir !~ /\\/); #add \ to start of path if source line only specifies a file
+
+ # Fix paths to /
+ $dir =~ s#\\#\/#g;
+
+ $dir =~ s/$iMRPSrc/$iSrc/i if ($dir =~ /^$iMRPSrc/);
+
+ $dir = $iSrc.$dir if ($dir !~ /^$iMRPSrc/);
+
+ $dir = canonpath($dir);
+ }
+
+ # Fix paths to /
+ $dir =~ s#\\#\/#g;
+
+ # Remove any / from the end of the sourceline just in case the directory was ended in one
+ $dir =~ s#\/$##;
+ # Need the dir swap
+ $dir =~ s/^$iMRPSrc/$iSrc/i;
+ # Fix the CustKit / Devkit and techviewexamplesdk mrp locations
+ $dir =~ s#^/product/CustKit#$iSrc/os/unref/orphan/cedprd/CustKit#i;
+ $dir =~ s#^/product/DevKit#$iSrc/os/unref/orphan/cedprd/DevKit#i;
+ $dir =~ s#^/product/techviewexamplesdk#$iSrc/os/unref/orphan/cedprd/techviewexamplesdk#i;
+
+ if ($mrpfile =~ /^$dir$/i || $mrpfile =~ /^$dir\//i) {
+ # mrpfile covered by source statements
+ $mrpfile_in_source = 1;
+ }
+
+ # ignore location of release notes
+ next if ($dir =~ /^\/component_defs/i);
+
+ if (!-e $dir) {
+ # CBR tools consider missing source as a fatal error
+ RealTimeBuildError("$dir does not exist (listed as source in $mrpfile)");
+ } elsif (!defined $Sources{$dir}) {
+ $Sources{$dir} = $mrpfile;
+ } else {
+ print "REMARK: $origdir in $mrpfile is already defined in $Sources{$dir}\n";
+ }
+ }
+ }
+ close MRP;
+ print "REMARK: $mrpList[$i] does not include itself as source\n" if (!$mrpfile_in_source);
+ } else {
+ RealTimeBuildError("Cannot open ".$mrpList[$i]." $!");
+ }
+ }
+ return \%Sources;
+}
+
+# ProcessCommandLine
+#
+# Inputs
+#
+# Outputs
+# @iDataSource array of multiple (txt file(s) to process)
+# $iSrc - real location of files
+# $iMRPSrc - where the mrp thinks they are
+# @iDummy - do not delete anything
+#
+# Description
+# This function processes the commandline
+
+sub ProcessCommandLine {
+ my ($iHelp, $iDataSource, $iSrc, $iMRPSrc, $platform, $iDummy, $iVerbose);
+ GetOptions('h' => \$iHelp, 'o=s' =>\$iDataSource, 's=s' =>\$iSrc, 'm=s' =>\$iMRPSrc, 'p=s' =>\$platform,'n' => \$iDummy, 'v' => \$iVerbose);
+
+ if (($iHelp) || (!defined $iSrc) || (!defined $iMRPSrc) || (!defined $platform))
+ {
+ Usage();
+ }
+
+ die RealTimeBuildError("Source directory $iSrc must be an absolute path with no drive letter") if ($iSrc !~ m#^[\\\/]#);
+ die RealTimeBuildError("Source directory $iMRPSrc must be an absolute path with no drive letter") if ($iMRPSrc !~ m#^[\\\/]#);
+ # Fix the paths
+ $iSrc =~ s#\\#\/#g;
+ $iMRPSrc =~ s#\\#\/#g;
+ $iDataSource =~ s#\\#\/#g;
+ if (! -d "$iSrc")
+ {
+ die RealTimeBuildError("$iSrc is not a directory") ;
+ }
+
+ # Need the dir swap
+ $iDataSource =~ s/^$iMRPSrc/$iSrc/i;
+ if (! -e "$iDataSource")
+ {
+ die RealTimeBuildError("Cannot open $iDataSource");
+ }
+
+ return($iDataSource, $iSrc, $iMRPSrc, $platform, $iDummy, $iVerbose);
+}
+
+# Usage
+#
+# Output Usage Information.
+#
+
+sub Usage {
+ print <<USAGE_EOF;
+
+ Usage: clean.pl [options]
+
+ options:
+
+ -h help
+ -o options.txt to process
+ -s Source directory to process
+ -m MRP source directory
+ -p platform of product (beech or cedar)
+ -n Not do anything (dummy run)
+ -v Verbose
+
+ Note:
+ Due to CustKit using the clean-src directory (%clean-src%) for source
+ The files need to be deleted from the %clean-src% directory
+ This tool substitutes directory specified by -m with the directory
+ specified by -s in all locations
+ This means that options.txt and the component lists and mrp's must be
+ referenced in the directory
+ specified by -m
+
+USAGE_EOF
+ exit 1;
+}
\ No newline at end of file