tools/static_dependencies.pl
changeset 12 ab7598bdae30
child 16 58fdbe891c31
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/static_dependencies.pl	Sun Oct 10 13:45:56 2010 +0100
@@ -0,0 +1,138 @@
+# Copyright (c) 2010 Symbian Foundation Ltd.
+# 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:
+# Symbian Foundation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+# This script generates a list of static dependencies for files in a ROM
+
+use strict;
+
+my %romfiles;
+my @contents;
+
+my $line;
+while ($line = <>)
+	{
+  my ($romfile,$hostfile,@columns) = split /,/, $line;		# first two fields are guaranteed to be simple
+	next if (!defined $hostfile);
+	next if ($romfile eq "ROM file");		# skip header line
+	
+	push @contents, "$romfile\t$hostfile";		# for use with "grep" later
+	$romfiles{lc $romfile} = $romfile;
+	}
+
+my %dependents;
+
+sub print_dependency($$@)
+	{
+	my ($romfile,$hostfile,@dependencies) = @_;
+	print "$romfile\t$hostfile\t", join(":",@dependencies), "\n";
+	
+	# Create inverted table 
+	foreach my $dependent (@dependencies)
+		{
+		next if ($dependent =~ /^sid=/);
+		$dependent = lc $dependent;
+		
+		$dependent =~ s/^sys\\bin\\//;	# no directory => sys\bin anyway
+		$dependent =~ s/\[\S+\]//;	# ignore the UIDs for now
+		
+		if (!defined $dependents{$dependent})
+			{
+			$dependents{$dependent} = $romfile;
+			}
+		else
+			{
+			$dependents{$dependent} .= "\t$romfile";
+			}
+		}
+	}
+
+sub generate_elftran_dependencies($$)
+	{
+	my ($romfile,$hostfile) = @_;
+	
+	return if ($hostfile =~ /\/z\//); 	# data files in armv5\urel\z
+	return if ($hostfile =~ /\.sis$/);	# not an e32 image file
+
+	my @elftran = `elftran $hostfile`;
+	
+	my $sid;
+	my @imports;
+	foreach my $line (@elftran)
+		{
+		if ($line =~ /imports from (\S+)\{000a0000\}(\S+)$/)
+			{
+			push @imports, $1.$2;
+			next;
+			}
+		if ($line =~ /^Secure ID: (\S+)$/)
+			{
+			$sid = $1; 	# presumably owns private/$sid  and various $sid.etxn files
+			next;
+			}
+		}
+	print_dependency($romfile,$hostfile,"sid=$sid",@imports);
+	}
+
+sub find_dependency_in_sys_bin($$$)
+	{
+	my ($romfile,$hostfile,$basename) = @_;
+	$basename = lc $basename;
+	foreach my $extension (".exe",".dll")
+		{
+		my $dependency = "sys\\bin\\$basename$extension";
+		if (defined $romfiles{$dependency})
+			{
+			print_dependency($romfile,$hostfile,$romfiles{$dependency});
+			return;
+			}
+		}
+	# grep in the contents list?
+	# print_dependency($romfile,$hostfile,"unmatched sys\\bin\\$basename");
+	}
+
+foreach $line (@contents)
+	{
+	my ($romfile,$hostfile) = split /\t/, $line;
+	
+	if ($hostfile =~ /epoc32.release.arm/i)
+		{
+		generate_elftran_dependencies($romfile,$hostfile);
+		next;
+		}
+	
+	# App registration files
+	if ($romfile =~ /private.10003a3f.*apps\\(.*)_reg\.rsc$/i)
+		{
+		my $dependency = "sys\\bin\\$1.exe";
+		print_dependency($romfile,$hostfile,$dependency);
+		next;
+		}
+	# app resources
+	if ($romfile =~ /resource.apps\\(.*)(\.mif|\.mbm|\.rsc)$/)
+		{
+		my $executable = $1;
+		$executable =~ s/_aif$//; 	# xxx_aif.mif
+		$executable =~ s/_loc$//; 	# xxx_loc.rsc
+		
+		find_dependency_in_sys_bin($romfile,$hostfile,$executable);
+		next;
+		}
+
+	# Assume that the rest don't depend on anything, and leave them out.
+	}
+
+print "\n";
+foreach my $inverted (sort keys %dependents)
+	{
+	print "x\t$inverted\t$dependents{$inverted}\n";
+	}