diff -r c7c26511138f -r 360bd6b35136 imgtools/buildrom/tools/externaltools.pm --- a/imgtools/buildrom/tools/externaltools.pm Wed Jun 16 16:51:40 2010 +0300 +++ b/imgtools/buildrom/tools/externaltools.pm Wed Jun 23 16:56:47 2010 +0800 @@ -1,165 +1,189 @@ -# -# Copyright (c) 2005-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: -# This package invokes single and multiple external tools -# - -package externaltools; - -require Exporter; -@ISA=qw (Exporter); -@EXPORT=qw ( - loadTools - runExternalTool - -); - -use Modload; # Dynamically loads the module -my %invocations; # Indexed by invocation name; - -#Set the Module path to load perl modules -{ - my $epocToolsPath = $ENV{EPOCROOT}."epoc32\\tools\\"; - Load_SetModulePath($epocToolsPath); -} - -# Get all the external tool perl module files to load them -sub loadTools{ - - my $toolList = shift; - my @toolModules = split(/,/,$toolList); - foreach my $tool (@toolModules) { - # An optional command line can be passed to the tool if it is of the form "[:]" - if ($tool !~ /^([^:]+)(:(.*))?$/) { - print "No tool specified as parameter for external tool invocation\n"; - } - my $toolName = $1; - my $toolCmdLine = $3; - &Load_ModuleL($toolName); - my $toolDetailsMap = $toolName.'::' . $toolName.'_info'; - update(&$toolDetailsMap, $toolCmdLine); - } -} - -#Initialises information from external tool -sub update -{ - my ($info, $toolCmdLine) = @_; - my $toolName; - my $toolStage; - - # name - name of the tool. used to associate with appropriate oby tool - # keyword - # invocation - stage when tool shall be invoked. - # multiple - routine to invoke for multiple invocation - # single - routine to invoke for single invocation - # initialize - optional routine to initialize tool before main invocation. - # - if (defined ($info->{name})) { - $toolName = $info->{name}; - } - if (defined ($info->{invocation})) { - $toolStage = lc $info->{invocation}; - } - - push @{$invocations{$toolStage}}, $info; - - if (defined ($info->{initialize})) - { - &{$$info{'initialize'}}($toolCmdLine); - } -} - -# Called between the buildrom stage to invoke single or multiple invocation -sub runExternalTool { - - my ($stageName,$OBYData) = @_; - $stageName = lc $stageName; - my @toolInfoList = @{$invocations{$stageName}}; # Collect Tools with respect to its stagename. - - foreach my $tool (@toolInfoList) { # Traverse for the tools - - if (exists($tool->{single})) {#Check if single invocation exists - if (defined ($OBYData)) { - invoke_single($OBYData, $tool); - } - else { - print "Empty OBYData array reference in Single Invocation\n"; - } - - }#End Single if - - if (exists($tool->{multiple})) { #Check if multiple invocation exists - if (defined ($OBYData)) { - # Called from appropriate stage to invoke multiple invocation - invoke_multiple($OBYData, $tool); - } - else { - print "Empty OBYData Line in Multiple Invocation\n"; - } - - }#End Multiple if - - }#End of tool traversal - -}#End of Method - -#Runs Tool for each line of the OBY file -#Gets modified line and adds to OBY line data reference -sub invoke_multiple -{ - my ($OBYDataRef,$tool) = @_; - my $modifiedOBYLine; - my $toolName; - my $index = 0;# Index each OBY line - my $arrayLength = scalar(@$OBYDataRef); - my $OBYLineRef; - - while ($index < $arrayLength) { - - $OBYLineRef = \$OBYDataRef->[$index];# Get the line reference - - if ($$OBYLineRef =~/tool=(\w+)/){ # Match for 'tool' keyword - $toolName = $1; - - if ($toolName eq $tool->{name}) {# Match the tool name - my $routine=$tool->{multiple}; - $modifiedOBYLine = &$routine($$OBYLineRef); #Invoke multiple Invocation, get modified line - - if (defined ($modifiedOBYLine)) { # If line is not empty - $$OBYLineRef = $modifiedOBYLine; # Modify the line reference with new line - } - - }#End of if toolname match - - }#End of if 'tool' keyword match - - $index++; # For each line of OBY file. - - }#End of oby line traversal - -} - -#Runs Tool only once. -#Add new data to the obydata array reference. -sub invoke_single { - - my ($OBYDataRef,$tool) = @_; - my $routine = $tool->{single}; - &$routine($OBYDataRef);#Invoke single Invocation, update new data -} - - - -1; \ No newline at end of file +# +# Copyright (c) 2005-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: +# This package invokes single and multiple external tools +# + +package externaltools; + +require Exporter; +@ISA=qw (Exporter); +@EXPORT=qw ( + loadTools + runExternalTool + +); + +use flexmodload; # Dynamically loads the module +use IPC::Open3; +my %invocations; # Indexed by invocation name; + +# Get all the external tool perl module files to load them +sub loadTools{ + + my $toolList = shift; + my @toolModules = split(/,/,$toolList); + foreach my $tool (@toolModules) { + # An optional command line can be passed to the tool if it is of the form "[:]" + if ($tool !~ /^([^:]+)(:(.*))?$/) { + print "No tool specified as parameter for external tool invocation\n"; + } + my $toolName = $1; + my $toolCmdLine = $3; + if($toolName =~ /configpaging/i){ + my %info = (name=>"configpaging", args=>$toolCmdLine ); + push @{$invocations{"invocationpoint2"}}, \%info; + }else{ + &FlexLoad_ModuleL($toolName); + my $toolDetailsMap = $toolName.'::' . $toolName.'_info'; + update(&$toolDetailsMap, $toolCmdLine); + } + + } +} + +#Initialises information from external tool +sub update +{ + my ($info, $toolCmdLine) = @_; + my $toolName; + my $toolStage; + + # name - name of the tool. used to associate with appropriate oby tool + # keyword + # invocation - stage when tool shall be invoked. + # multiple - routine to invoke for multiple invocation + # single - routine to invoke for single invocation + # initialize - optional routine to initialize tool before main invocation. + # + if (defined ($info->{name})) { + $toolName = $info->{name}; + } + if (defined ($info->{invocation})) { + $toolStage = lc $info->{invocation}; + } + + push @{$invocations{$toolStage}}, $info; + + if (defined ($info->{initialize})) + { + &{$$info{'initialize'}}($toolCmdLine); + } +} + +# Called between the buildrom stage to invoke single or multiple invocation +sub runExternalTool { + + my ($stageName,$OBYData) = @_; + $stageName = lc $stageName; + my @toolInfoList = @{$invocations{$stageName}}; # Collect Tools with respect to its stagename. + + foreach my $tool (@toolInfoList) { # Traverse for the tools + if($tool->{name} eq "configpaging"){ + my $pid ; + my $args = $tool->{args}; + + open CONFIG, "| configpaging $args >cfgp_out.oby" or die "* Can't execute cpp"; + + foreach (@$OBYData){ + chomp ; + print CONFIG $_."\n"; + } + print CONFIG ":q\n"; #terminate the program + + close CONFIG; + + my $config_status = $?; + die "* configpaging failed\n" if ($config_status != 0 || !-f "cfgp_out.oby"); + + if(open(INTF,"cfgp_out.oby")){ + @$OBYData = ; + close INTF; + } + unlink("cfgp_out.oby") or die "cannot delete cfgp_out.oby"; + next ; + } + if (exists($tool->{single})) {#Check if single invocation exists + if (defined ($OBYData)) { + invoke_single($OBYData, $tool); + } + else { + print "Empty OBYData array reference in Single Invocation\n"; + } + + }#End Single if + + if (exists($tool->{multiple})) { #Check if multiple invocation exists + if (defined ($OBYData)) { + # Called from appropriate stage to invoke multiple invocation + invoke_multiple($OBYData, $tool); + } + else { + print "Empty OBYData Line in Multiple Invocation\n"; + } + + }#End Multiple if + + }#End of tool traversal + +}#End of Method + +#Runs Tool for each line of the OBY file +#Gets modified line and adds to OBY line data reference +sub invoke_multiple +{ + my ($OBYDataRef,$tool) = @_; + my $modifiedOBYLine; + my $toolName; + my $index = 0;# Index each OBY line + my $arrayLength = scalar(@$OBYDataRef); + my $OBYLineRef; + + while ($index < $arrayLength) { + + $OBYLineRef = \$OBYDataRef->[$index];# Get the line reference + + if ($$OBYLineRef =~/tool=(\w+)/){ # Match for 'tool' keyword + $toolName = $1; + + if ($toolName eq $tool->{name}) {# Match the tool name + my $routine=$tool->{multiple}; + $modifiedOBYLine = &$routine($$OBYLineRef); #Invoke multiple Invocation, get modified line + + if (defined ($modifiedOBYLine)) { # If line is not empty + $$OBYLineRef = $modifiedOBYLine; # Modify the line reference with new line + } + + }#End of if toolname match + + }#End of if 'tool' keyword match + + $index++; # For each line of OBY file. + + }#End of oby line traversal + +} + +#Runs Tool only once. +#Add new data to the obydata array reference. +sub invoke_single { + + my ($OBYDataRef,$tool) = @_; + my $routine = $tool->{single}; + &$routine($OBYDataRef);#Invoke single Invocation, update new data +} + + + +1;