tracesrv/tracecompiler/tracecompiler/tracecompiler_parse_mmp.pl
author hgs
Fri, 08 Oct 2010 14:56:39 +0300
changeset 56 aa2539c91954
parent 41 tracefw/tracecompiler/tracecompiler/tracecompiler_parse_mmp.pl@838cdffd57ce
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
41
hgs
parents:
diff changeset
     1
#
hgs
parents:
diff changeset
     2
# Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
# All rights reserved.
hgs
parents:
diff changeset
     4
# This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
# under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
# which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
#
hgs
parents:
diff changeset
     9
# Initial Contributors:
hgs
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
#
hgs
parents:
diff changeset
    12
# Contributors:
hgs
parents:
diff changeset
    13
#
hgs
parents:
diff changeset
    14
# Description:
hgs
parents:
diff changeset
    15
#
hgs
parents:
diff changeset
    16
# Parses UID and source files from given MMP files. Starts TraceCompiler Java application.
hgs
parents:
diff changeset
    17
#
hgs
parents:
diff changeset
    18
#!perl -w
hgs
parents:
diff changeset
    19
use FindBin;
hgs
parents:
diff changeset
    20
my $trace_compiler_path;
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
hgs
parents:
diff changeset
    23
BEGIN
hgs
parents:
diff changeset
    24
{
hgs
parents:
diff changeset
    25
  # Get current directory as TraceCompiler path
hgs
parents:
diff changeset
    26
  $trace_compiler_path = $FindBin::Bin; # e.g. X:/epoc32/tools
hgs
parents:
diff changeset
    27
  $trace_compiler_path =~ s/\\/\//g; # Replace all "\" with "/"
hgs
parents:
diff changeset
    28
  $trace_compiler_path =~ s/\/$//; # Remove possible trailing slash
hgs
parents:
diff changeset
    29
}
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
use lib $trace_compiler_path;
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
use strict;
hgs
parents:
diff changeset
    34
use warnings;
hgs
parents:
diff changeset
    35
use env;
hgs
parents:
diff changeset
    36
use FileHandle;
hgs
parents:
diff changeset
    37
use IPC::Open3;
hgs
parents:
diff changeset
    38
use tracecompiler;
hgs
parents:
diff changeset
    39
use tracecompiler_mmp_data;
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
my $java_command = tracecompiler::getJavaCommand();
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
if (not defined $java_command)
hgs
parents:
diff changeset
    44
{
hgs
parents:
diff changeset
    45
  print STDERR "Java 1.5 or newer required!\n";
hgs
parents:
diff changeset
    46
  exit;
hgs
parents:
diff changeset
    47
}
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
# Global variables
hgs
parents:
diff changeset
    50
my $project_name;
hgs
parents:
diff changeset
    51
my $traces_folder = "";
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
# run from class files
hgs
parents:
diff changeset
    55
hgs
parents:
diff changeset
    56
my $command = "$java_command -classpath $trace_compiler_path/tracecompiler com.nokia.tracecompiler.TraceCompilerMain";
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
# run from jar file
hgs
parents:
diff changeset
    59
#my $command = "$java_command  -jar $trace_compiler_path/tracecompiler/tracecompiler.jar";
hgs
parents:
diff changeset
    60
hgs
parents:
diff changeset
    61
# Open MMP file
hgs
parents:
diff changeset
    62
foreach my $mmp_file (@ARGV)
hgs
parents:
diff changeset
    63
{
hgs
parents:
diff changeset
    64
  $traces_folder = "";
hgs
parents:
diff changeset
    65
  $project_name = $mmp_file;
hgs
parents:
diff changeset
    66
  
hgs
parents:
diff changeset
    67
  # Take the module name from the MMP file path. e.g. "X:/temp/mycomponent.mmp" would create "mycomponent"
hgs
parents:
diff changeset
    68
  $project_name =~ s/.*\/([^\.]*).*/$1/;
hgs
parents:
diff changeset
    69
  
hgs
parents:
diff changeset
    70
  tracecompiler::debugMsg("Module name: $project_name");
hgs
parents:
diff changeset
    71
  
hgs
parents:
diff changeset
    72
  # Parse sources in an own function
hgs
parents:
diff changeset
    73
  my $mmpObject = tracecompiler_mmp_data->new($mmp_file);
hgs
parents:
diff changeset
    74
    
hgs
parents:
diff changeset
    75
  # There must be UID
hgs
parents:
diff changeset
    76
  if (!$mmpObject->{uid})
hgs
parents:
diff changeset
    77
  {
hgs
parents:
diff changeset
    78
    tracecompiler::debugMsg("UID is not defined, don't call TraceCompiler!"); 
hgs
parents:
diff changeset
    79
    exit;
hgs
parents:
diff changeset
    80
  }
hgs
parents:
diff changeset
    81
  if (!$mmpObject->{target})
hgs
parents:
diff changeset
    82
  {
hgs
parents:
diff changeset
    83
  	tracecompiler::debugMsg("Target not defined, don't call TraceCompiler!"); 
hgs
parents:
diff changeset
    84
  	exit;
hgs
parents:
diff changeset
    85
  }
hgs
parents:
diff changeset
    86
  if (!$mmpObject->{type})
hgs
parents:
diff changeset
    87
  {
hgs
parents:
diff changeset
    88
  	tracecompiler::debugMsg("Target type not defined, don't call TraceCompiler!"); 
hgs
parents:
diff changeset
    89
  	exit;
hgs
parents:
diff changeset
    90
  }
hgs
parents:
diff changeset
    91
  if (!$mmpObject->{ext})
hgs
parents:
diff changeset
    92
  {
hgs
parents:
diff changeset
    93
  	tracecompiler::debugMsg("Target extension not defined, don't call TraceCompiler!"); 
hgs
parents:
diff changeset
    94
  	exit;
hgs
parents:
diff changeset
    95
  }
hgs
parents:
diff changeset
    96
  
hgs
parents:
diff changeset
    97
  # find out the right traces folder to use if ther is more than one and set the project name accordingly.
hgs
parents:
diff changeset
    98
  # the following order of the code is very important.
hgs
parents:
diff changeset
    99
  my $tmp;
hgs
parents:
diff changeset
   100
  if ($mmpObject->{tracespaths})
hgs
parents:
diff changeset
   101
  {
hgs
parents:
diff changeset
   102
  	#Check if there is one of the expected format
hgs
parents:
diff changeset
   103
  	
hgs
parents:
diff changeset
   104
  	#search for /trace/<target>_<ext>
hgs
parents:
diff changeset
   105
  	$tmp = $mmpObject->{target} ."_" . $mmpObject->{ext};
hgs
parents:
diff changeset
   106
  	my @list = grep(/.*\/traces\/$tmp\s*$/i, @{$mmpObject->{tracespaths}});
hgs
parents:
diff changeset
   107
  	
hgs
parents:
diff changeset
   108
  	if (scalar @list > 0) 
hgs
parents:
diff changeset
   109
  	{
hgs
parents:
diff changeset
   110
  		$traces_folder = pop(@list);
hgs
parents:
diff changeset
   111
  		$project_name = $mmpObject->{target} ."_" . $mmpObject->{ext};
hgs
parents:
diff changeset
   112
  		tracecompiler::debugMsg("Found traces folder 1: $traces_folder" ); 
hgs
parents:
diff changeset
   113
  	}
hgs
parents:
diff changeset
   114
  	 
hgs
parents:
diff changeset
   115
  	if ($traces_folder eq "" ) 
hgs
parents:
diff changeset
   116
  	{
hgs
parents:
diff changeset
   117
  		#search for /traces_<target>_<type>
hgs
parents:
diff changeset
   118
  		$tmp = $mmpObject->{target} ."_" . $mmpObject->{type};
hgs
parents:
diff changeset
   119
  		@list = grep(/.*\/traces_$tmp\s*$/i, @{$mmpObject->{tracespaths}});
hgs
parents:
diff changeset
   120
  		if (scalar @list > 0) 
hgs
parents:
diff changeset
   121
  		{
hgs
parents:
diff changeset
   122
  			$traces_folder = pop(@list);
hgs
parents:
diff changeset
   123
  			$project_name = $mmpObject->{target} . "_" . $mmpObject->{type};
hgs
parents:
diff changeset
   124
  			tracecompiler::debugMsg("Found traces folder 2: $traces_folder" ); 
hgs
parents:
diff changeset
   125
  		}
hgs
parents:
diff changeset
   126
  	}
hgs
parents:
diff changeset
   127
  	
hgs
parents:
diff changeset
   128
  	if ($traces_folder eq "" ) 
hgs
parents:
diff changeset
   129
  	{
hgs
parents:
diff changeset
   130
  		#search for /traces_<mmpname>
hgs
parents:
diff changeset
   131
  		@list = grep(/.*\/traces_$project_name\s*$/i, @{$mmpObject->{tracespaths}});
hgs
parents:
diff changeset
   132
  		if (scalar @list > 0) 
hgs
parents:
diff changeset
   133
  		{
hgs
parents:
diff changeset
   134
  			$traces_folder = pop(@list);
hgs
parents:
diff changeset
   135
  			tracecompiler::debugMsg("Found traces folder 3: $traces_folder" ); 
hgs
parents:
diff changeset
   136
  		}
hgs
parents:
diff changeset
   137
  	}
hgs
parents:
diff changeset
   138
  		
hgs
parents:
diff changeset
   139
  	if ($traces_folder eq "" ) 
hgs
parents:
diff changeset
   140
  	{
hgs
parents:
diff changeset
   141
  		#search for /traces
hgs
parents:
diff changeset
   142
  		@list = grep(/.*\/traces\s*$/i, @{$mmpObject->{tracespaths}});
hgs
parents:
diff changeset
   143
  		if (scalar @list > 0) 
hgs
parents:
diff changeset
   144
  		{
hgs
parents:
diff changeset
   145
  			$traces_folder = pop(@list);
hgs
parents:
diff changeset
   146
  			tracecompiler::debugMsg("Found traces folder 4: $traces_folder" ); 
hgs
parents:
diff changeset
   147
  		}
hgs
parents:
diff changeset
   148
  	}
hgs
parents:
diff changeset
   149
  }
hgs
parents:
diff changeset
   150
  else 
hgs
parents:
diff changeset
   151
  {
hgs
parents:
diff changeset
   152
  	tracecompiler::debugMsg("No Traces folder was found in userinclude, don't call TraceCompiler!"); 
hgs
parents:
diff changeset
   153
  	exit;
hgs
parents:
diff changeset
   154
  }
hgs
parents:
diff changeset
   155
  
hgs
parents:
diff changeset
   156
  if (!$mmpObject->{sources})
hgs
parents:
diff changeset
   157
  {
hgs
parents:
diff changeset
   158
  	tracecompiler::debugMsg("No sources found!"); 
hgs
parents:
diff changeset
   159
  	exit; 	
hgs
parents:
diff changeset
   160
  }
hgs
parents:
diff changeset
   161
 
hgs
parents:
diff changeset
   162
 
hgs
parents:
diff changeset
   163
  # IMPORTANT NOTE:
hgs
parents:
diff changeset
   164
  # please note that IPC::open3() is the only suitable api available in the perl version 5.6.1 used in ONB
hgs
parents:
diff changeset
   165
  # but it has a limit. If the size of the command is more than 264, perl will crash and it seems to be a windows limit
hgs
parents:
diff changeset
   166
  # rather perl.
hgs
parents:
diff changeset
   167
  # Therefore we have to parse the mmp and the traces folder from the stdin (*WRITER in this case) and 
hgs
parents:
diff changeset
   168
  # relax the new TraceCompiler API to allow this if they are not specified on the command line.
hgs
parents:
diff changeset
   169
  # It's not an issue in Raptor as it calls TraceCompiler directly.
hgs
parents:
diff changeset
   170
  #
hgs
parents:
diff changeset
   171
  $command .= " --uid=" . $mmpObject->{uid} . " --project=" . $project_name;
hgs
parents:
diff changeset
   172
           
hgs
parents:
diff changeset
   173
  tracecompiler::debugMsg("\nCall the Java TraceCompiler. Command: $command\n");
hgs
parents:
diff changeset
   174
    
hgs
parents:
diff changeset
   175
  # Create TraceCompiler process
hgs
parents:
diff changeset
   176
  local (*READER, *WRITER);
hgs
parents:
diff changeset
   177
  my $ pid = open3(\*WRITER, \*READER, \*READER, $command);
hgs
parents:
diff changeset
   178
    
hgs
parents:
diff changeset
   179
  # Remove duplicates from the sources list
hgs
parents:
diff changeset
   180
  my %seen = ();
hgs
parents:
diff changeset
   181
  my @uniqueSources = ();
hgs
parents:
diff changeset
   182
  foreach my $item (@{$mmpObject->{sources}}) 
hgs
parents:
diff changeset
   183
  {
hgs
parents:
diff changeset
   184
    push(@uniqueSources, $item) unless $seen{$item}++;
hgs
parents:
diff changeset
   185
  }
hgs
parents:
diff changeset
   186
 
hgs
parents:
diff changeset
   187
  tracecompiler::debugMsg("Send mmp file: $mmp_file");
hgs
parents:
diff changeset
   188
  print WRITER "--mmp=$mmp_file\n";
hgs
parents:
diff changeset
   189
  
hgs
parents:
diff changeset
   190
  tracecompiler::debugMsg("Send traces folder path: $traces_folder");
hgs
parents:
diff changeset
   191
  print WRITER "--traces=$traces_folder\n";
hgs
parents:
diff changeset
   192
    
hgs
parents:
diff changeset
   193
    
hgs
parents:
diff changeset
   194
  # Send sources to the TraceCompiler     
hgs
parents:
diff changeset
   195
  foreach my $source (@uniqueSources)
hgs
parents:
diff changeset
   196
  {
hgs
parents:
diff changeset
   197
    tracecompiler::debugMsg("Send source: $source");
hgs
parents:
diff changeset
   198
    print WRITER "$source\n";
hgs
parents:
diff changeset
   199
   }
hgs
parents:
diff changeset
   200
    
hgs
parents:
diff changeset
   201
  # Send the end of the source files tag
hgs
parents:
diff changeset
   202
  print WRITER "*ENDOFSOURCEFILES*\n";
hgs
parents:
diff changeset
   203
  WRITER->autoflush(1);
hgs
parents:
diff changeset
   204
    
hgs
parents:
diff changeset
   205
  # Gather up the response from the TraceCompiler
hgs
parents:
diff changeset
   206
  my $compilerReturn = "";
hgs
parents:
diff changeset
   207
  foreach my $line (<READER>)
hgs
parents:
diff changeset
   208
  {
hgs
parents:
diff changeset
   209
    tracecompiler::debugMsg("Response line from TraceCompiler: $line");
hgs
parents:
diff changeset
   210
    $compilerReturn .= $line;
hgs
parents:
diff changeset
   211
  }       
hgs
parents:
diff changeset
   212
hgs
parents:
diff changeset
   213
  # If Compiler doesn't return anything or we get no class found error from Java, don't print anything
hgs
parents:
diff changeset
   214
  if ($compilerReturn ne "" and $compilerReturn !~ /NoClassDefFoundError/)
hgs
parents:
diff changeset
   215
  {
hgs
parents:
diff changeset
   216
    tracecompiler::debugMsg("TraceCompiler succeeded! Returned: $compilerReturn");
hgs
parents:
diff changeset
   217
    print "\n******************* TRACECOMPILER STARTS *******************\n\n";
hgs
parents:
diff changeset
   218
    print "Building traces for component $project_name. Component UID: 0x$mmpObject->{uid}.\n";
hgs
parents:
diff changeset
   219
    print $compilerReturn . "\n";
hgs
parents:
diff changeset
   220
    print "\n******************* TRACECOMPILER ENDS *********************\n\n";
hgs
parents:
diff changeset
   221
  }
hgs
parents:
diff changeset
   222
  else 
hgs
parents:
diff changeset
   223
  {
hgs
parents:
diff changeset
   224
    tracecompiler::debugMsg("No traces were generated. Returned:\n$compilerReturn\n");
hgs
parents:
diff changeset
   225
  }
hgs
parents:
diff changeset
   226
 }