diff -r a151135b0cf9 -r aa2539c91954 tracesrv/tracecompiler/tracecompiler/tracecompiler.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tracesrv/tracecompiler/tracecompiler/tracecompiler.pl Fri Oct 08 14:56:39 2010 +0300 @@ -0,0 +1,296 @@ +# +# Copyright (c) 2009-2010 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: +# +# Finds MMP paths from component makefiles and forwards them to MMP parser +# +#!perl -w +use FindBin; +my $trace_compiler_path; + +BEGIN +{ + # Get current directory as TraceCompiler path + $trace_compiler_path = $FindBin::Bin; # e.g. X:/epoc32/tools + $trace_compiler_path =~ s/\\/\//g; # Replace all "\" with "/" + $trace_compiler_path =~ s/\/$//; # Remove possible trailing slash +} + +use lib $trace_compiler_path; + +use strict; +use env; +use Cwd; +use tracecompiler; +use tracecompiler_mmp_data; + +# EPOC root is two levels down from TraceCompiler level +my $epocroot = tracecompiler::concatenatePath($trace_compiler_path, "../../"); +$epocroot =~ s/\/$//; # Remove possible trailing slash +my $drive = substr($epocroot, 0, 2); +my $build_target; +my $project_name; +my $action = "RUN"; + +# Get Java command or EXIT if not found +my $java_command = tracecompiler::getJavaCommand(); + +if (not defined $java_command) +{ + print STDERR "Java 1.5 or newer required!\n"; + exit; +} + +#------------------------------------------------------- +# Go through command line arguments +#------------------------------------------------------- +while ( @ARGV ) +{ + my $arg = shift(@ARGV); + + # Print version information + if ($arg eq "-v") + { + my $version = tracecompiler::getTraceCompilerVersion(); + print $version; + exit; + } + # Clean TraceCompiler generated files + elsif ($arg eq "-clean") + { + $action = "CLEAN"; + } + # Finalize TraceCompiler running + elsif ($arg eq "-final") + { + $action = "FINAL"; + } + # Build target (e.g. armv5) + elsif (not defined $build_target) + { + $build_target = $arg; + } + # Project name (e.g. MyComponent) + else + { + $project_name = $arg; + } +} + +#------------------------------------------------------- +# Build target must now be defined or print usage info +#------------------------------------------------------- +if (not defined $build_target) +{ + my $version = tracecompiler::getTraceCompilerVersion(); + print $version; + print "\nUsage: tracecompiler.pl build_target in the folder containing bld.inf. bldmake bldfiles must be run before this.\n"; + print "Example: tracecompiler.pl armv5\n"; + exit; +} + +my $return_string = ""; + +#------------------------------------------------------- +# Find component makefile path from abld.bat +#------------------------------------------------------- +tracecompiler::debugTraceCompilerVersion(); +tracecompiler::debugMsg("Find component makefile path from abld.bat"); +open(ABLD, ") +{ + if (/ABLD.PL/) + { + my $makefilepath = $_; + $makefilepath =~ s/perl -S ABLD.PL "(.*)\\" .*$/$1/; + chop($makefilepath); + + # Change all "\" characters to "/" + $makefilepath =~ s/\\/\//g; + + $makefilepath = "$epocroot/epoc32/build".$makefilepath; + $makefile = $makefilepath.$build_target.".MAKE"; + } +} +close ABLD or die $!; + +#------------------------------------------------------- +# Find project makefile paths from component makefile +#------------------------------------------------------- +my @projectmakefiles; +my $mmps; + +tracecompiler::debugMsg("Find project makefile paths from component makefile $makefile"); + +open(MAKEFILE, "<$makefile") or (print STDERR "Cannot open makefile $makefile\n" and exit); +while () +{ + my $line = $_; + + if ($line =~ /\"([^\"]+?)\"\s+\"PRJ_.*MMPFILES\s+MMP\"\s+\"([^\"]+?)\"/i) + { + my $bldinf = $1; + my $mmp = $2; + + tracecompiler::debugMsg("Found BLD file: $bldinf"); + + # Remove bld.inf from the end of the path + $bldinf =~ s/(.*)[\\\/].*/$1\//; + + my $mmp_file = tracecompiler::concatenatePath($bldinf, $mmp); + + # Change all "//" to "/" + $mmp_file =~ s/\/\//\//g; + + # If .mmp is missing from the end, add it + if ($mmp_file !~ /\.mmp$/i) + { + $mmp_file .= ".mmp"; + } + + tracecompiler::debugMsg("Found MMP file: $drive$mmp_file\n"); + + # If project name is defined, only add that MMP to the list of mmp files + if (defined $project_name) + { + if ($mmp_file =~ /($project_name.mmp)$/i) + { + $mmps .= $drive . $mmp_file . " "; + } + } + else + { + $mmps .= $drive . $mmp_file . " "; + } + } + +} +close MAKEFILE or die $!; + +#------------------------------------------------------- +# Call the MMP parser for each MMP (or clean / final) +#------------------------------------------------------- +if (defined $mmps) +{ + foreach my $mmp (split(" ", $mmps)) + { + # Pass MMP file path to Parse MMP + if ($action eq "RUN") + { + my $command = "perl $trace_compiler_path/tracecompiler_parse_mmp.pl $mmp"; + tracecompiler::debugMsg("Call the MMP parser. Command: $command\n"); + print qx($command); + } + + # Clean files using this MMP + elsif ($action eq "CLEAN") + { + my $mmpObject = tracecompiler_mmp_data->new($mmp); + cleanTraceCompilerFiles($mmpObject); + } + + # Finalize files using this MMP + elsif ($action eq "FINAL") + { + my $mmpObject = tracecompiler_mmp_data->new($mmp); + finalizeTraceCompilerRun($mmpObject); + } + } +} +else +{ + tracecompiler::debugMsg("Could not find any MMP files!"); +} + + + + + +#-------------------------------------------------------# +#-------------------------------------------------------# +#--------------------SUBROUTINES------------------------# +#-------------------------------------------------------# +#-------------------------------------------------------# + +#------------------------------------------------------- +# Cleans TraceCompiler generated files +#------------------------------------------------------- +sub cleanTraceCompilerFiles +{ + tracecompiler::debugMsg("Clean TraceCompiler Files"); + my $mmpObj = $_[0]; + if($mmpObj->{tracespaths}) { + foreach my $tracesFolder (@{$mmpObj->{tracespaths}}) + { + if (-e $tracesFolder and opendir(DIR, $tracesFolder)) + { + while (defined(my $file = readdir(DIR))) + { + # Delete files ending with *Traces.h + if ($file =~ /Traces\.h$/i) + { + print "Cleaning: " . $tracesFolder . "/" . $file . "\n"; + unlink $tracesFolder . "/" . $file || print $!; + } + # Delete cache files + elsif ($file =~ /\.cache$/i) + { + print "Cleaning: " . $tracesFolder . "/" . $file . "\n"; + unlink $tracesFolder . "/" . $file || print $!; + } + } + closedir(DIR); + } + } + } + + tracecompiler::debugMsg("Cleaning TraceCompiler Files ready\n"); + + # Finalize TraceCompiler run + finalizeTraceCompilerRun($mmpObj); +} + +#------------------------------------------------------- +# Finalizes TraceCompiler run +#------------------------------------------------------- +sub finalizeTraceCompilerRun +{ + tracecompiler::debugMsg("Finalize TraceCompiler Run"); + my $mmpObj = $_[0]; + if($mmpObj->{tracespaths}) { + foreach my $tracesFolder (@{$mmpObj->{tracespaths}}) + { + my $defFile = $tracesFolder . "/" . "OstTraceDefinitions.h"; + # Open OstTraceDefinitions.h and read stuff to array + if (-e $defFile and open(FILE,"<$defFile")) + { + my @lines = ; + close(FILE); + + # Write stuff back to OstTraceDefinitions.h + open(FILE,">$defFile") || exit; + foreach my $line (@lines) + { + # Comment out the define + $line =~ s/(.*)#define OST_TRACE_COMPILER_IN_USE/\/\/ #define OST_TRACE_COMPILER_IN_USE/; + print FILE $line; + } + close(FILE); + } + } +} + +tracecompiler::debugMsg("Finalizing TraceCompiler Run ready\n"); +}