--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/mmpscan.pl Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,253 @@
+# 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:
+# Perl script to scan tree looking for MMP files with particular keywords
+#
+#
+
+use strict;
+use File::Find; # for find()
+use File::Basename; # for fileparse()
+use Cwd; # for getcwd()
+
+use Getopt::Long;
+my %Options=();
+GetOptions(\%Options, "f=s");
+
+my @patterns = (
+
+'START\s+BITMAP.*\.MCL',
+'START\s+BITMAP.*\.MBW',
+'START\s+BITMAP',
+'START\s+RESOURCE',
+'ALWAYS_BUILD_AS_ARM',
+'ASSPABI',
+'ASSPEXPORTS',
+'ASSPLIBRARY',
+'CAPABILITY',
+'COMPRESSTARGET',
+'DEFFILE',
+'DOCUMENT',
+'EPOCALLOWDLLDATA',
+'EPOCCALLDLLENTRYPOINTS',
+'EPOCDATALINKADDRESS',
+'EPOCFIXEDPROCESS',
+'EPOCHEAPSIZE',
+'EPOCPROCESSPRIORITY',
+'EPOCSTACKSIZE',
+'EXPORTLIBRARY',
+'EXPORTUNFROZEN',
+'FIRSTLIB',
+'LANG',
+# 'LIBRARY',
+'DEBUGLIBRARY',
+'LINKAS',
+'MACRO\s+__SECURE_API__',
+'MACRO',
+'NOCOMPRESSTARGET',
+'NOEXPORTLIBRARY',
+'NOSTRICTDEF',
+'OPTION',
+'RAMTARGET',
+'RESOURCE',
+'ROMTARGET',
+'SECUREID',
+'SRCDBG',
+# 'SOURCE',
+# 'SOURCEPATH',
+'STATICLIBRARY',
+'STRICTDEPEND',
+'SYSTEMINCLUDE',
+'SYSTEMRESOURCE',
+# 'TARGET',
+'TARGETPATH',
+'TARGETTYPE\s+ANI',
+'TARGETTYPE\s+APP',
+'TARGETTYPE\s+CTL',
+'TARGETTYPE\s+DLL',
+'TARGETTYPE\s+ECOMIIC',
+'TARGETTYPE\s+EPOCEXE',
+'TARGETTYPE\s+EXEDLL',
+'TARGETTYPE\s+EXEXP', # must precede TARGETTYPE EXE
+'TARGETTYPE\s+EXE',
+'TARGETTYPE\s+FSY',
+'TARGETTYPE\s+IMPLIB',
+'TARGETTYPE\s+KDLL',
+'TARGETTYPE\s+KEXT',
+'TARGETTYPE\s+KLIB',
+'TARGETTYPE\s+LDD',
+'TARGETTYPE\s+LIB',
+'TARGETTYPE\s+MDA',
+'TARGETTYPE\s+MDL',
+'TARGETTYPE\s+NOTIFIER2',
+'TARGETTYPE\s+NOTIFIER',
+'TARGETTYPE\s+PDD',
+'TARGETTYPE\s+PDL',
+'TARGETTYPE\s+PLUGIN',
+'TARGETTYPE\s+PLUGIN3',
+'TARGETTYPE\s+RDL',
+'TARGETTYPE\s+TEXTNOTIFIER2',
+'TARGETTYPE\s+VAR',
+'UID',
+'USERINCLUDE',
+'VENDORID',
+'VERSION',
+
+# from START WINS ... END
+'START\s+WINS',
+'BASEADDRESS',
+'WIN32_LIBRARY',
+'WIN32_RESOURCE',
+'COPY_FOR_STATIC_LINKAGE',
+'WIN32_HEADERS',
+
+# count some unmatched things
+'AIF',
+'SOURCE\s.*\.CIA', # CIA files
+'TARGETTYPE\s+(other)?', # a trick to catch unsupported targettypes
+'TARGET\s.*DUMMY', # who doesn't really want a TARGET
+'#IF',
+'#INCLUDE_FAILURE', # unresolved #include directives
+'#INCLUDE',
+
+);
+
+my %instances = ();
+my %patternsbyfile = ();
+my $mmpcount = 0;
+
+sub read_mmp($$$)
+ {
+ my ($top,$name,$lines) =@_;
+ open MMP, "<$name" or print "error: $name $top\n" and return 0;
+ my @mmplines=<MMP>;
+ close MMP;
+
+ foreach my $line (@mmplines)
+ {
+ push @$lines, $line;
+ if ($line =~/^\#include\s+(\"|\<)([^"<]+)(\"|\>)/)
+ {
+ my $currentdir = getcwd();
+ my $includename = $2;
+ if (-f $2)
+ {
+ # name exists relative to current directory
+ }
+ elsif (-f "$ENV{EPOCROOT}epoc32/include/$includename")
+ {
+ $includename = "$ENV{EPOCROOT}epoc32/include/$includename";
+ }
+ else
+ {
+ print "Can't locate $2 from $currentdir/$name $top\n";
+ push @$lines, "#INCLUDE_FAILURE";
+ next;
+ }
+ my ($newname, $newdir, $newext) = fileparse($includename, '\..*');
+ chdir($newdir);
+ read_mmp("from $name $top", "$newname$newext", $lines);
+ chdir($currentdir);
+ }
+ }
+ return 1;
+ }
+
+sub mmpgrep
+ {
+ my $fullname = $File::Find::name;
+ return if (defined($patternsbyfile{$fullname}));
+
+ my ($name,$dir,$ext) = fileparse($fullname,'\..*');
+ return unless (lc($ext) eq '.mmp');
+
+ my %found = ();
+ my @lines = ();
+ return if (read_mmp("", "$name$ext", \@lines)==0);
+
+ $mmpcount++;
+ my $line;
+ LINE: foreach $line (@lines)
+ {
+ $line = uc $line;
+ foreach (@patterns)
+ {
+ if ($line =~/^\s*$_/)
+ {
+ $found{$_} = 1;
+ next LINE;
+ }
+ }
+ }
+ close MMP;
+ foreach (keys %found)
+ {
+ @{$instances{$_}} = () if (!defined $instances{$_});
+ push @{$instances{$_}}, $fullname;
+ }
+ @{$patternsbyfile{$fullname}} = sort keys %found;
+ }
+
+# Scan the tree, processing each filename with mmpgrep
+
+my @scanlist = ();
+if ($Options{f})
+ {
+ open FILELIST, "<$Options{f}" or die "Cannot open $Options{f}\n";
+ my $line;
+ while ($line = <FILELIST>)
+ {
+ $line =~ s/#.*$//; # remove comments
+ $line =~ s/\s*$//; # remove trailing ws
+ $line =~ s/^\s*//; # remove leading ws
+ next if ($line eq "");
+ push @scanlist, $line;
+ }
+ close FILELIST;
+ }
+push @scanlist, @ARGV;
+find (\&mmpgrep,@scanlist);
+
+# Report the results
+
+print "$mmpcount mmp files processed\n";
+
+my $pattern;
+print "\nSummary by pattern\n";
+foreach $pattern (@patterns)
+ {
+ my $count=0;
+ my $list = $instances{$pattern};
+ $count = scalar @{$list} if (defined $list);
+ printf "%-30s %5d\n", $pattern, $count;
+ }
+
+print "\nDetail\n";
+foreach $pattern (sort keys %instances)
+ {
+ my $list = $instances{$pattern};
+ my $title = $pattern;
+ $title =~ s/\\s\+/ /;
+ print "\n$title:\n";
+ foreach my $file (@{$list})
+ {
+ print " $file\n";
+ }
+ }
+
+foreach (sort keys %patternsbyfile)
+ {
+ print "\n$_ : ", join(" ",@{$patternsbyfile{$_}});
+ }
+
+print "\n";