#!perl# Copyright (c) 2003-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:# #use strict;use FindBin;use lib "$FindBin::Bin";use Getopt::Long;use IniData;use EnvDb;use Utils;## Globals.#my $verbose = 0;my $iniData = IniData->New();my $force;## Main.#ProcessCommandLine();Utils::QueryUnsupportedTool(undef, $force);my $ratings = ScanMrps();PrintReport($ratings);## Subs.#sub ProcessCommandLine { Getopt::Long::Configure ('bundling'); my $help; GetOptions('h' => \$help, 'v+' => \$verbose, 'f' => \$force); if ($help) { Usage(0); }}sub ScanMrps { my $envDb = EnvDb->Open($iniData, $verbose); my @comps = keys %{$envDb->{db}}; # This should go through an EnvDb interface - needs adding. my %ratings; foreach my $thisComp (@comps) { my $dbEntry = $envDb->{db}->{$thisComp}; if (-e $dbEntry->{mrpName}) { $ratings{$thisComp} = RateMrpFile($dbEntry->{mrpName}); } elsif ($verbose) { print "Warning: $thisComp\'s mrp file (\"$dbEntry->{mrpName}\") does not exit\n"; } } return \%ratings;}sub PrintReport { my $ratings = shift; my $tableData = [["Component", "Complexity Rating"]]; foreach my $thisComp (sort { $ratings->{$b} <=> $ratings->{$a} } keys %$ratings) { if ($ratings->{$thisComp} > 0) { push (@$tableData, [$thisComp, $ratings->{$thisComp}]); } } print "\n"; Utils::PrintTable($tableData, 1);}sub RateMrpFile { my $file = shift; my $rating = 0; print "Rating \"$file\"...\n" if ($verbose); open (MRP, $file) or die "Error: Couldn't open \"$file\": $!\n"; while (my $line = <MRP>) { chomp $line; $line =~ s/^\s*$//; $line =~ s/\s*#.*//; unless ($line) { # Nothing left. next; } my $keyWord; my $operand; if ($line =~ /(\S+)\s+(.*)/) { $keyWord = $1; $operand = $2; } else { die "Error: Invalid mrp file \"$file\""; } if ($keyWord eq 'binary') { if (-f $operand) { print "binary <file> statement found in \"$file\"\n" if ($verbose); ++$rating; } } elsif ($keyWord eq '-binary') { print "-binary statement found in \"$file\"\n" if ($verbose); ++$rating; } elsif ($keyWord eq 'source') { if (-f $operand) { print "source <file> statement found in \"$file\"\n" if ($verbose); ++$rating; } } elsif ($keyWord eq 'export_file') { print "export_file statement found in \"$file\"\n" if ($verbose); ++$rating; } elsif ($keyWord eq '-export_file') { print "-export_file statement found in \"$file\"\n" if ($verbose); ++$rating; } elsif ($keyWord eq 'testbinary') { print "testbinary statement found in \"$file\"\n" if ($verbose); ++$rating; } } close (MRP); return $rating;}sub Usage { my $exitCode = shift; Utils::PrintDeathMessage($exitCode, "\nUsage: mrpcomplexity [options] <file_name>options:-h help-v verbose output (-vv very verbose)-f force, skip warnings about unsupported-ness\n");}__END__=head1 NAMEMrpComplexity - Reports information on undesirable mrp constructs.=head1 SYNOPSIS MrpComplexity [options]options: -h help -v verbose output (-vv very verbose) -f force, skip warnings about unsupported-ness=head1 DESCRIPTIONUnder normal circumstances F<mrp> files should contain very little information regarding where to find binary files. This information is best placed within the build configuration files (F<bld.inf>s and F<.mmp>s), as doing so allows F<mrp> files to be relatively self-maintaining.However, F<mrp> files support a rich syntax. This was designed to make it possible to release a component even if is it not possible to change the build configuration files (perhaps due to ownership restraints). Under these conditions, F<mrp> files can often become complex and as a result time consuming to maintain.This command provides a report that can be used to identify overly complex F<mrp> files, so that the root cause of this complexity can be found and eliminated. For each component in the environment, if its F<mrp> file is available, it is parsed and rated. The rating each is assigned is determined from the number of the following constructs that are found: binary <file_name> -binary source <file_name> export_file -export_file testbinaryThe report is presented showing the components with the highest complexity rating first. Those with a rating of zero are not shown.=head1 STATUSUnsupported/experimental. If you find a problem, please send us a patch.=head1 KNOWN BUGSNone.=head1 COPYRIGHT Copyright (c) 2003-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:=cut