releasing/makecbr/CStageRunner.pm
author Ross Qin <ross.qin@nokia.com>
Tue, 30 Nov 2010 14:05:41 +0800
changeset 713 7b7f0409fc00
parent 602 3145852acc89
permissions -rw-r--r--
merge
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
602
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     1
#!\bin\perl
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     2
# Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     3
# All rights reserved.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     4
# This component and the accompanying materials are made available
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     5
# under the terms of the License "Eclipse Public License v1.0"
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     6
# which accompanies this distribution, and is available
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     7
# at the URL "http://www.eclipse.org/legal/epl-v10.html".
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     8
#
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
     9
# Initial Contributors:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    10
# Nokia Corporation - initial contribution.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    11
#
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    12
# Contributors:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    13
#
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    14
# Description:
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    15
# CStageRunner
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    16
# 
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    17
#
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    18
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    19
package CStageRunner;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    20
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    21
use strict;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    22
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    23
use FindBin;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    24
use lib $FindBin::Bin."\\stages";
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    25
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    26
# CStageRunner New(listref aStageNames, CConfig aOptions) : constructor
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    27
sub New($$)
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    28
	{
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    29
	my $proto = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    30
	my ($aStageNames, $aOptions) = @_;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    31
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    32
	my $class = ref($proto) || $proto;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    33
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    34
	my $self = {};
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    35
	bless($self, $class);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    36
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    37
	if (!defined($aOptions))
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    38
		{
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    39
		$aOptions->Die("ERROR: CStageRunner takes an CConfig object as its second parameter.");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    40
		}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    41
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    42
	# Instantiate stages
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    43
	$self->{iStages} = [];
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    44
	my $stage;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    45
	my $okay = 1;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    46
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    47
  # Added scanlog compatibility
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    48
  $aOptions->PhaseStart("Initialising CStageRunner");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    49
	foreach my $stageName (@$aStageNames)
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    50
		{
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    51
		my $found = 0;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    52
		foreach my $path (@INC)
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    53
			{
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    54
			if (-e $path."\\$stageName.pm")
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    55
				{
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    56
				$found = 1;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    57
				}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    58
			}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    59
			
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    60
		if (!$found)
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    61
			{
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    62
			$aOptions->Error("Stage $stageName does not exist.");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    63
			$okay = 0;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    64
			}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    65
		elsif (eval("require $stageName"))
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    66
			{
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    67
			$stage = New $stageName($aOptions);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    68
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    69
			if (!defined($stage))
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    70
				{
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    71
				$aOptions->Error("Stage $stageName could not be started.");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    72
				$okay = 0;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    73
				}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    74
			else
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    75
				{
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    76
				push @{$self->{iStages}}, $stage;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    77
				}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    78
			}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    79
		else
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    80
			{
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    81
			$aOptions->Error("Stage $stageName could not be loaded:\n$@");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    82
			$okay = 0;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    83
			}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    84
		}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    85
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    86
	if (!$okay)
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    87
		{
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    88
		$aOptions->Die("");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    89
		}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    90
	else
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    91
		{
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    92
		$aOptions->Print("All stages loaded and options checked.");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    93
		}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    94
  # This flag triggers an error message if any stage produces errors
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    95
  # but does not die. The flag is used to emit a warning, once only,
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    96
  # that subsequent stages may be polluted buy the errors in previous stages.
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    97
  $self->{iWarnOnStageEerror} = 1;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    98
	$self->iOptions($aOptions);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
    99
  
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   100
  # Scanlog compatibility, we ignore the return value as that is covered by $okay
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   101
	$aOptions->PhaseEnd();
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   102
  return $self;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   103
	}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   104
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   105
# Getters/setters
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   106
sub iOptions()
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   107
	{
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   108
	my $self = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   109
	if (@_) { $self->{iOPTIONS} = shift; }
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   110
	return $self->{iOPTIONS};
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   111
	}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   112
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   113
# boolean Run()
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   114
sub Run()
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   115
	{
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   116
	my $self = shift;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   117
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   118
	my $okay = 1;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   119
  my $options;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   120
	
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   121
	foreach my $stage (@{$self->{iStages}})
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   122
		{
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   123
    $options = $self->iOptions();
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   124
    $options->PhaseStart($stage->iName());
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   125
		if ($stage->PreCheck())
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   126
			{
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   127
			$options->Status("Running ".$stage->iName());
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   128
			if ($stage->Run())
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   129
				{
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   130
        # Passed stage i.e. no fatal errors but check for 'normal' errors
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   131
        my $errors = $options->GetErrorCount();
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   132
        # Check if the stage had errors and write a precautionary
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   133
        # error message if this has not been done so already
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   134
        if ($errors > 0 && $self->{iWarnOnStageEerror} != 0)
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   135
          {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   136
          $options->Error("Stage errors mean that subsequent stages might be unreliable.");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   137
          # It is a write once error message so clear the internal flag
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   138
          $self->{iWarnOnStageEerror} = 0;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   139
          }
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   140
				}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   141
      else
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   142
        {
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   143
        # Stage signalled a fatal error by returning non-zero so bail out
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   144
        $options->Error("Fatal error received from ".$stage->iName()."::Run().");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   145
        $options->PhaseEnd();
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   146
				$okay = 0;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   147
        last;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   148
        }
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   149
			}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   150
		else
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   151
			{
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   152
      $options->Error("Stage failed PreCheck()");
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   153
			$okay = 0;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   154
      $options->PhaseEnd();
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   155
      last;
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   156
			}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   157
    $options->PhaseEnd();
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   158
		}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   159
		
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   160
	return ($okay == 1);
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   161
	}
3145852acc89 add releasing to new structure
jjkang
parents:
diff changeset
   162
1;