common/tools/analysis/depends.pl
changeset 1227 5f8149838262
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/common/tools/analysis/depends.pl	Mon Sep 20 14:23:42 2010 +0100
@@ -0,0 +1,72 @@
+#!perl -w
+# Copyright (c) 2010 Symbian Foundation Ltd
+# 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 Ltd - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Wrapper for dependency analysis tool (http://www.dependencywalker.com), which identifies missing dependencies. This script will
+# process a set of given binaries and produce a tab separated output in the following format
+#
+#   Missing DLL/EXE		(binary with broken dependancy)
+#
+# Note: 
+# 1) Requires minimum of v2.0 of depends.exe to be available in the path.
+# 2) Binaries are dealt with sequentially. Any parallelisation should be dealt with by whoever calls this tool.
+#
+# Usage:
+# perl depends.pl <file pattern>
+#
+# Example:
+# perl depends.pl M:\epoc32\release\winscw\udeb\avkon.dll
+# perl depends.pl M:\epoc32\release\winscw\udeb\libOpenV* 
+# perl depends.pl M:\epoc32\release\winscw\udeb\*
+#
+use Text::CSV;
+my %missing_binaries;
+my $debug = 0;
+
+sub walk_binary($)
+{
+  my $filename = shift;
+  my $walk_cmd = "depends.exe /oc:$filename.csv /c $filename";
+  my $ret = system("$walk_cmd");
+  print "$walk_cmd --DONE\n" if $debug==1;
+
+  # Load CSV
+  
+  my $csv = Text::CSV->new();
+  my @rows;
+  
+  open my $csvText, "<", $filename.".csv" or die;
+  while ( my $row = $csv->getline( $csvText ) ) 
+  {
+     # column 0 is "?" if unknown dependency
+     if ($row->[0] =~ m/^\?$/)
+	 {
+         # column 1 contains missing dependency	
+	 print "MISSING: $filename is missing $row->[1]\n" if $debug==1;
+	 $missing_binaries{"$row->[1] \t\t($filename)"} = 1;
+	 } 
+  }
+  $csv->eof or $csv->error_diag();
+  # cleanup
+  close $csvText;
+  system("del $filename.csv");
+  
+}
+
+
+my @files = map(glob,@ARGV);
+foreach my $file (@files)
+{
+  print "Walking $file...\n" if $debug==1;
+  walk_binary($file);
+}
+print join("\n", sort keys %missing_binaries, "");