deprecated/buildtools/buildsystemtools/GenBuild.pm
changeset 662 60be34e1b006
parent 655 3f65fd25dfd4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/buildtools/buildsystemtools/GenBuild.pm	Wed Oct 27 16:03:51 2010 +0800
@@ -0,0 +1,850 @@
+# Copyright (c) 2003-2009 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:
+#
+
+package GenBuild;
+
+use strict;
+use Carp;
+use IO::File;
+
+# Global Variables
+
+my @components;
+my $iIDCount;
+my $iStageCount;
+my %arm_assplist;
+my $savespace="";
+my $keepgoing="";
+my $build_tools=0;
+my $build_cwtools=0;
+my $build_winc=0;
+my $build_thumb=0;
+my $build_armi=0;
+my $build_arm4=0;
+my $build_arm4t=0;
+my $build_armv5=0;
+my $build_arm3=0;
+my $epoc_only=0;
+my $build_winscw=0;
+my $build_wins=0;
+my $build_bootstrap;
+my $basename;
+my $iSourceDir;
+my $build_UREL=0;
+my $build_UDEB=0;
+my $build_urel_udeb="";
+my $build_test=0;
+
+my ($XMLFileH, $gLogFileH);
+
+my ($gHiResTimer) = 0; #Flag - true (1) if HiRes Timer module available
+
+# Check if HiRes Timer is available
+if (eval "require Time::HiRes;") {
+  $gHiResTimer = 1;
+} else {
+  print "Cannot load HiResTimer Module\n";
+}
+
+sub Start
+{
+  my ($iDataSource, $iDataOutput, $iLogFile, $iSourceDir, $iReallyClean, $iClean) = @_;
+
+  # Copied from genbuild.pl
+
+  # Check for EPOCROOT
+  # It's not used directly by GENBUILD, but this is a good early stage at which
+  # to discover that it hasn't been set...
+
+  my $epocroot = $ENV{EPOCROOT};
+  die "ERROR: Must set the EPOCROOT environment variable\n" if (!defined($epocroot));
+  $epocroot =~ s-/-\\-go;	# for those working with UNIX shells
+  die "ERROR: EPOCROOT must not include a drive letter\n" if ($epocroot =~ /^.:/);
+  die "ERROR: EPOCROOT must be an absolute path without a drive letter\n" if ($epocroot !~ /^\\/);
+  die "ERROR: EPOCROOT must not be a UNC path\n" if ($epocroot =~ /^\\\\/);
+  die "ERROR: EPOCROOT must end with a backslash\n" if ($epocroot !~ /\\$/);
+  die "ERROR: EPOCROOT must specify an existing directory\n" if (!-d $epocroot);
+
+  # $iSourceDir must en in a \
+  # Add a \ if not present
+  if ($iSourceDir !~ /\\$/)
+  {
+    $iSourceDir .= "\\";
+  }
+
+  for(my $j = 0; $j < scalar(@$iDataSource); $j++)
+  {
+    $GenBuild::basename .= " " if ($j > 0);
+    my ($iFile) = @$iDataSource[$j] =~ m#.*([\\\/]|^)(.*?)\..*$#;
+    $GenBuild::basename .= @$iDataSource[$j];
+  }
+
+  #Set the global iSourceDir
+  $GenBuild::iSourceDir = $iSourceDir;
+
+  # Open Log file
+  $GenBuild::gLogFileH = IO::File->new("> $iLogFile")
+    or croak "Couldn't open $iLogFile for writing: $!\n";
+
+  print $GenBuild::gLogFileH "===-------------------------------------------------\n";
+  print $GenBuild::gLogFileH "=== Genxml\n";
+  print $GenBuild::gLogFileH "===-------------------------------------------------\n";
+  print $GenBuild::gLogFileH "=== Genxml started ".localtime()."\n";
+
+  for(my $j = 0; $j < scalar(@$iDataSource); $j++)
+  {
+    # Open DataSource
+    my ($iFile) = @$iDataSource[$j];
+    open FILE, "< $iFile" or die "Can't read $iFile\n";
+
+    print $GenBuild::gLogFileH "=== Genxml == $iFile\n";
+
+    print $GenBuild::gLogFileH "-- Genxml\n";
+    # Add the per command start timestamp
+    print $GenBuild::gLogFileH "++ Started at ".localtime()."\n";
+    # Add the per command start HiRes timestamp if available
+    if ($gHiResTimer == 1)
+    {
+      print $GenBuild::gLogFileH "+++ HiRes Start ".Time::HiRes::time()."\n";
+    } else {
+      # Add the HiRes timer missing statement
+      print $GenBuild::gLogFileH "+++ HiRes Time Unavailable\n";
+    }
+
+    # Process the Txt file in the same manner as the old genbuild
+    # Note:
+    # Additional options 'udeb', 'urel' and 'test' were added in response 
+    # to a specific request, but are not otherwise supported by Symbian.
+    while (<FILE>)
+    {
+    s/\s*#.*$//;
+    s/^\s*//;
+    my $line = lc $_;
+    if ($line =~ /^$/)
+      {
+      next;
+      }
+
+    if ($line =~ /<option (\w+)\s*(.*)>/)
+      {
+      my $option = $1;
+      my $optargs= $2;
+      if ($option =~ "savespace")
+        {
+        $GenBuild::savespace = "-savespace";
+        next;
+        }
+      if ($option =~ "keepgoing")
+        {
+        $GenBuild::keepgoing = "-keepgoing";
+        next;
+        }
+      if ($option =~ "tools")
+        {
+        $GenBuild::build_tools = 1;
+        next;
+        }
+      if ($option eq "cwtools")
+        {
+        $GenBuild::build_cwtools = 1;
+        next;
+        }
+      if ($option =~ "winc")
+        {
+        $GenBuild::build_winc = 1;
+        next;
+        }
+
+      # Do not build winc, wins or winscw
+      if ($option =~ "epoconly")
+        {
+        $GenBuild::build_winc = 0;
+        $GenBuild::epoc_only = 1;
+        next;
+        }
+      if ($option =~ "thumb")
+        {
+        $GenBuild::build_thumb = 1;
+        next;
+        }
+
+      # ARMI option
+      if ($option =~ "armi")
+        {
+        $GenBuild::build_armi = 1;
+        next;
+        }
+
+      # ARM4
+      if ($option eq "arm4")
+        {
+        $GenBuild::build_arm4 = 1;
+        next;
+        }
+
+      # ARM4T
+      if ($option eq "arm4t")
+        {
+        $GenBuild::build_arm4t = 1;
+        next;
+        }
+
+      # ARMv5
+      if ($option =~ "armv5")
+        {
+        $GenBuild::build_armv5 = 1;
+        next;
+        }
+
+      if ($option =~ "arm3")
+        {
+        $GenBuild::build_arm3 = 1;
+        next;
+        }
+
+      # Use Visual Studio
+      if ($option eq "wins")
+        {
+        $GenBuild::build_wins = 1;
+        next;
+        }
+
+      # Use CodeWarrior
+      if ($option eq "winscw")
+        {
+        $GenBuild::build_winscw = 1;
+        next;
+        }
+
+      if ($option eq "udeb") 
+        {
+        $GenBuild::build_UDEB = 1;
+        next;
+        }
+
+      if ($option eq "urel") 
+        {
+        $GenBuild::build_UREL = 1;
+        next;
+        }
+
+      if ($option eq "test") 
+        {
+        $GenBuild::build_test = 1;
+        next;
+        }
+
+      if ($option =~ "arm_assp")
+        {
+        $GenBuild::arm_assplist{$optargs} = 1;
+        next;
+        }
+
+
+      print "Option $1 not yet implemented\n";
+      next;
+      }
+    if ($line =~ /^([^<]\S+)\s+(\S+)/)
+    {
+      if (!-e "$GenBuild::iSourceDir$2\\bld.inf")
+      {
+        print $GenBuild::gLogFileH "MISSING COMPONENT $1: can't find $GenBuild::iSourceDir$2\\bld.inf\n";
+        next;
+      }
+    }
+    if ($line =~ /<special bldfiles e32toolp group>/)
+    {
+      # Handle Special
+      $GenBuild::build_bootstrap = 1;
+      next;
+    }
+
+    push @GenBuild::components, $line;
+    }
+
+    close(FILE);
+    # Add the per command end HiRes timestamp if available
+    print $GenBuild::gLogFileH "+++ HiRes End ".Time::HiRes::time()."\n" if ($gHiResTimer == 1);
+    # Add the per command end timestamp
+    print $GenBuild::gLogFileH "++ Finished at ".localtime()."\n";
+  }
+
+  print $GenBuild::gLogFileH "=== Genxml == Output\n";
+
+  print $GenBuild::gLogFileH "-- Genxml\n";
+  # Add the per command start timestamp
+  print $GenBuild::gLogFileH "++ Started at ".localtime()."\n";
+  # Add the per command start HiRes timestamp if available
+  if ($gHiResTimer == 1)
+  {
+    print $GenBuild::gLogFileH "+++ HiRes Start ".Time::HiRes::time()."\n";
+  } else {
+    # Add the HiRes timer missing statement
+    print $GenBuild::gLogFileH "+++ HiRes Missing\n";
+  }
+
+  &PBuildLevels($iDataOutput);
+
+  # Generate additional ReallyClean and Clean XML files if required
+  &GenReallyClean($iReallyClean) if (defined $iReallyClean);
+  &GenClean($iClean) if (defined $iClean);
+
+  # Close file handles
+  close($GenBuild::gLogFileH);
+
+}
+
+# PBuildLevels
+#
+# Inputs
+# $iDataOutput - Filename for normal build xml
+#
+# Outputs
+#
+# Description
+# This function generates a xml file to run normal buildon all components
+sub PBuildLevels
+{
+  my ($iDataOutput) = @_;
+  # Print the XML file
+  $GenBuild::XMLFileH = IO::File->new("> $iDataOutput")
+    or croak "Couldn't open $iDataOutput for writing: $!\n";
+
+  $GenBuild::iIDCount = 1;
+  $GenBuild::iStageCount = 1;
+
+  my ($epocroot) = $ENV{'EPOCROOT'};
+
+  &PrintXMLHeader($GenBuild::XMLFileH);
+
+  if (($GenBuild::build_UREL) && (!$GenBuild::build_UDEB)) 
+  {
+	$GenBuild::build_urel_udeb = " UREL";
+  }
+  elsif ((!$GenBuild::build_UREL) && ($GenBuild::build_UDEB)) 
+  {
+	$GenBuild::build_urel_udeb = " UDEB";
+  }
+
+  if ($GenBuild::build_bootstrap)
+  {
+    # Do the BootStrapping
+    # Temporary workaround for non-common code between old setup and Beech
+    # Defaults to old setup
+    # This will be removed when final functionality is added
+    if ($ENV{'Platform'} eq 'beech')
+    {
+      print $GenBuild::XMLFileH qq{\t\t<Execute ID="$GenBuild::iIDCount" Stage="$GenBuild::iStageCount" Component="BootStrap" Cwd="$GenBuild::iSourceDir}.qq{beech\\generic\\tools\\e32toolp\\group" CommandLine="setupprj.bat"/>\n};
+    } elsif ($ENV{'Platform'} eq 'cedar') {
+      print $GenBuild::XMLFileH qq{\t\t<Execute ID="$GenBuild::iIDCount" Stage="$GenBuild::iStageCount" Component="BootStrap" Cwd="$GenBuild::iSourceDir}.qq{os\\buildtools\\sbsv1_os\\e32toolp\\group" CommandLine="setupprj.bat"/>\n};
+    } else {
+      print $GenBuild::XMLFileH qq{\t\t<Execute ID="$GenBuild::iIDCount" Stage="$GenBuild::iStageCount" Component="BootStrap" Cwd="$GenBuild::iSourceDir}.qq{tools\\e32toolp\\group" CommandLine="setupprj.bat"/>\n};
+    }
+    $GenBuild::iIDCount++;
+    $GenBuild::iStageCount++;
+    # Temporary workaround for non-common code between old setup and Beech
+    # Defaults to old setup
+    # This will be removed when final functionality is added
+    if ($ENV{'Platform'} eq 'beech')
+    {
+      print $GenBuild::XMLFileH qq{\t\t<Execute ID="$GenBuild::iIDCount" Stage="$GenBuild::iStageCount" Component="BootStrap" Cwd="$GenBuild::iSourceDir}.qq{beech\\generic\\tools\\e32toolp\\group" CommandLine="bld.bat rel"/>\n};
+    } elsif  ($ENV{'Platform'} eq 'cedar') {
+      print $GenBuild::XMLFileH qq{\t\t<Execute ID="$GenBuild::iIDCount" Stage="$GenBuild::iStageCount" Component="BootStrap" Cwd="$GenBuild::iSourceDir}.qq{os\\buildtools\\sbsv1_os\\e32toolp\\group" CommandLine="bld.bat rel"/>\n};
+    } else {
+      print $GenBuild::XMLFileH qq{\t\t<Execute ID="$GenBuild::iIDCount" Stage="$GenBuild::iStageCount" Component="BootStrap" Cwd="$GenBuild::iSourceDir}.qq{tools\\e32toolp\\group" CommandLine="bld.bat rel"/>\n};
+    }
+    $GenBuild::iIDCount++;
+    $GenBuild::iStageCount++;
+  }
+
+  &BuildLevels("0", "bldmake bldfiles $GenBuild::keepgoing");
+  $GenBuild::iStageCount++;
+  &BuildLevels("0", "abld export $GenBuild::keepgoing");
+  &BuildLevels("0", "abld test export $GenBuild::keepgoing") if ($GenBuild::build_test);
+  $GenBuild::iStageCount++;
+
+  if ($GenBuild::build_tools)
+  {
+    &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "tools");
+    $GenBuild::iStageCount++;
+    &BuildLevels("1", "abld library $GenBuild::keepgoing", "tools");
+    &BuildLevels("1", "abld target $GenBuild::keepgoing $GenBuild::savespace", "tools", "rel");
+    &BuildLevels("0", "abld -what build", "tools", "rel");
+    &BuildLevels("0", "abld -check build", "tools", "rel");
+    $GenBuild::iStageCount++;
+  }
+
+  if ($GenBuild::build_cwtools)
+  {
+    &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "cwtools");
+    $GenBuild::iStageCount++;
+    &BuildLevels("1", "abld library $GenBuild::keepgoing", "cwtools");
+    &BuildLevels("1", "abld target $GenBuild::keepgoing $GenBuild::savespace", "cwtools", "rel");
+    &BuildLevels("0", "abld -what build", "cwtools", "rel");
+    &BuildLevels("0", "abld -check build", "cwtools", "rel");
+    $GenBuild::iStageCount++;
+  }
+
+  if ($GenBuild::build_winc)
+  {
+    &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "winc");
+    $GenBuild::iStageCount++;
+    &BuildLevels("1", "abld library $GenBuild::keepgoing", "winc");
+    &BuildLevels("1", "abld target $GenBuild::keepgoing $GenBuild::savespace", "winc");
+    &BuildLevels("0", "abld -what build", "winc");
+    &BuildLevels("0", "abld -check build", "winc");
+    $GenBuild::iStageCount++;
+
+  }
+
+  unless ($epoc_only)
+  {
+    # Emulator things, WINS, up to resources
+    if ($GenBuild::build_wins)
+    {
+      &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "wins");
+	  &BuildLevels("0", "abld test makefile $GenBuild::keepgoing $GenBuild::savespace", "wins") if ($GenBuild::build_test);
+      $GenBuild::iStageCount++;
+      &BuildLevels("1", "abld resource $GenBuild::keepgoing", "wins$GenBuild::build_urel_udeb");
+	  &BuildLevels("1", "abld test resource $GenBuild::keepgoing", "wins$GenBuild::build_urel_udeb") if ($GenBuild::build_test);
+      &BuildLevels("1", "abld library $GenBuild::keepgoing", "wins");
+	  &BuildLevels("1", "abld test library $GenBuild::keepgoing", "wins") if ($GenBuild::build_test);
+    }
+
+    # Emulator things, WINSCW, up to resources
+    if ($GenBuild::build_winscw)
+    {
+      &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "winscw");
+	  &BuildLevels("0", "abld test makefile $GenBuild::keepgoing $GenBuild::savespace", "winscw") if ($GenBuild::build_test);
+      $GenBuild::iStageCount++;
+      &BuildLevels("1", "abld resource $GenBuild::keepgoing", "winscw$GenBuild::build_urel_udeb");
+	  &BuildLevels("1", "abld test resource $GenBuild::keepgoing", "winscw$GenBuild::build_urel_udeb") if ($GenBuild::build_test);
+      &BuildLevels("1", "abld library $GenBuild::keepgoing", "winscw");
+	  &BuildLevels("1", "abld test library $GenBuild::keepgoing", "winscw") if ($GenBuild::build_test);
+    }
+  }
+  # Arm Stuff
+  if ($GenBuild::build_arm4)
+  {
+    &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "arm4");
+	&BuildLevels("0", "abld test makefile $GenBuild::keepgoing $GenBuild::savespace", "arm4") if ($GenBuild::build_test);
+    $GenBuild::iStageCount++;
+  }
+  if ($GenBuild::build_arm4t)
+  {
+    &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "arm4t");
+	&BuildLevels("0", "abld test makefile $GenBuild::keepgoing $GenBuild::savespace", "arm4t") if ($GenBuild::build_test);
+    $GenBuild::iStageCount++;
+  }
+  if ($GenBuild::build_armv5)
+  {
+    &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "armv5");
+	&BuildLevels("0", "abld test makefile $GenBuild::keepgoing $GenBuild::savespace", "arm5") if ($GenBuild::build_test);
+    $GenBuild::iStageCount++;
+  }
+  if ($GenBuild::build_armi)
+  {
+    &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "armi");
+	&BuildLevels("0", "abld test makefile $GenBuild::keepgoing $GenBuild::savespace", "armi") if ($GenBuild::build_test);
+    $GenBuild::iStageCount++;
+  }
+  if ($GenBuild::build_thumb)
+  {
+    &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "thumb");
+	&BuildLevels("0", "abld test makefile $GenBuild::keepgoing $GenBuild::savespace", "thumb") if ($GenBuild::build_test);
+    $GenBuild::iStageCount++;
+  }
+  if ($GenBuild::build_arm3)
+  {
+    &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", "arm3");
+	&BuildLevels("0", "abld test makefile $GenBuild::keepgoing $GenBuild::savespace", "arm3") if ($GenBuild::build_test);
+    $GenBuild::iStageCount++;
+  }
+  foreach my $iAssp (sort keys %GenBuild::arm_assplist)
+  {
+    &BuildLevels("0", "abld makefile $GenBuild::keepgoing $GenBuild::savespace", $iAssp);
+	&BuildLevels("0", "abld test makefile $GenBuild::keepgoing $GenBuild::savespace", $iAssp) if ($GenBuild::build_test);
+    $GenBuild::iStageCount++;
+  }
+
+  &BuildLevels("1", "abld resource $GenBuild::keepgoing", "arm4$GenBuild::build_urel_udeb") if ($GenBuild::build_arm4);
+  &BuildLevels("1", "abld test resource $GenBuild::keepgoing", "arm4$GenBuild::build_urel_udeb") if (($GenBuild::build_arm4) && ($GenBuild::build_test));
+  &BuildLevels("1", "abld resource $GenBuild::keepgoing", "arm4t$GenBuild::build_urel_udeb") if ($GenBuild::build_arm4t);
+  &BuildLevels("1", "abld test resource $GenBuild::keepgoing", "arm4t$GenBuild::build_urel_udeb") if (($GenBuild::build_arm4t) && ($GenBuild::build_test));
+  &BuildLevels("1", "abld resource $GenBuild::keepgoing", "armv5$GenBuild::build_urel_udeb") if ($GenBuild::build_armv5);
+  &BuildLevels("1", "abld test resource $GenBuild::keepgoing", "armv5$GenBuild::build_urel_udeb") if (($GenBuild::build_armv5) && ($GenBuild::build_test));
+  &BuildLevels("1", "abld resource $GenBuild::keepgoing", "armi$GenBuild::build_urel_udeb") if ($GenBuild::build_armi);
+  &BuildLevels("1", "abld test resource $GenBuild::keepgoing", "armi$GenBuild::build_urel_udeb") if (($GenBuild::build_armi) && ($GenBuild::build_test));
+  &BuildLevels("1", "abld resource $GenBuild::keepgoing", "thumb$GenBuild::build_urel_udeb") if ($GenBuild::build_thumb);
+  &BuildLevels("1", "abld test resource $GenBuild::keepgoing", "thumb$GenBuild::build_urel_udeb") if (($GenBuild::build_thumb) && ($GenBuild::build_test));
+  &BuildLevels("1", "abld resource $GenBuild::keepgoing", "arm3$GenBuild::build_urel_udeb") if ($GenBuild::build_arm3);
+  &BuildLevels("1", "abld test resource $GenBuild::keepgoing", "arm3$GenBuild::build_urel_udeb") if (($GenBuild::build_arm3) && ($GenBuild::build_test));
+
+  foreach my $iAssp (sort keys %GenBuild::arm_assplist)
+  {
+    &BuildLevels("1", "abld resource $GenBuild::keepgoing", "$iAssp$GenBuild::build_urel_udeb");
+	&BuildLevels("1", "abld test resource $GenBuild::keepgoing", "$iAssp$GenBuild::build_urel_udeb") if ($GenBuild::build_test);
+  }
+
+  &BuildLevels("1", "abld library $GenBuild::keepgoing", "arm4") if ($GenBuild::build_arm4);
+  &BuildLevels("1", "abld test library $GenBuild::keepgoing", "arm4") if (($GenBuild::build_arm4) &&($GenBuild::build_test));
+  &BuildLevels("1", "abld library $GenBuild::keepgoing", "arm4t") if ($GenBuild::build_arm4t);
+  &BuildLevels("1", "abld test library $GenBuild::keepgoing", "arm4t") if (($GenBuild::build_arm4t) && ($GenBuild::build_test));
+  &BuildLevels("1", "abld library $GenBuild::keepgoing", "armv5") if ($GenBuild::build_armv5);
+  &BuildLevels("1", "abld test library $GenBuild::keepgoing", "armv5") if (($GenBuild::build_armv5) && ($GenBuild::build_test));
+  &BuildLevels("1", "abld library $GenBuild::keepgoing", "armi") if ($GenBuild::build_armi);
+  &BuildLevels("1", "abld test library $GenBuild::keepgoing", "armi") if (($GenBuild::build_armi) && ($GenBuild::build_test));
+  &BuildLevels("1", "abld library $GenBuild::keepgoing", "thumb") if ($GenBuild::build_thumb);
+  &BuildLevels("1", "abld test library $GenBuild::keepgoing", "thumb") if (($GenBuild::build_thumb) && ($GenBuild::build_test));
+  &BuildLevels("1", "abld library $GenBuild::keepgoing", "arm3") if ($GenBuild::build_arm3);
+  &BuildLevels("1", "abld test library $GenBuild::keepgoing", "arm3") if (($GenBuild::build_arm3) && ($GenBuild::build_test));
+
+  foreach my $iAssp (sort keys %GenBuild::arm_assplist)
+  {
+    &BuildLevels("1", "abld library $GenBuild::keepgoing", $iAssp);
+	&BuildLevels("1", "abld test library $GenBuild::keepgoing", $iAssp) if ($GenBuild::build_test);
+  }
+
+  # Build all targets
+  my @iTargets;
+  # Push the defaults on
+  push @iTargets, "wins$GenBuild::build_urel_udeb" if (($GenBuild::build_wins) && (!$GenBuild::epoc_only));
+  push @iTargets, "arm4$GenBuild::build_urel_udeb" if ($GenBuild::build_arm4);
+  push @iTargets, "arm4t$GenBuild::build_urel_udeb" if ($GenBuild::build_arm4t);
+  push @iTargets, "armv5$GenBuild::build_urel_udeb"  if ($GenBuild::build_armv5);
+  push @iTargets, "armi$GenBuild::build_urel_udeb" if ($GenBuild::build_armi);
+  push @iTargets, "winscw$GenBuild::build_urel_udeb" if (($GenBuild::build_winscw) && (!$GenBuild::epoc_only));
+  push @iTargets, "thumb$GenBuild::build_urel_udeb" if ($GenBuild::build_thumb);
+  push @iTargets, "arm3$GenBuild::build_urel_udeb" if ($GenBuild::build_arm3);
+  foreach my $iAssp (sort keys %GenBuild::arm_assplist)
+  {
+    push @iTargets, "$iAssp$GenBuild::build_urel_udeb";
+  }
+  &BuildTargets("0", "abld target $GenBuild::keepgoing $GenBuild::savespace", @iTargets);
+  &BuildTargets("0", "abld test target $GenBuild::keepgoing $GenBuild::savespace", @iTargets) if ($GenBuild::build_test);
+
+  unless ($epoc_only)
+  {
+    if ($GenBuild::build_wins)
+    {
+      # Final Part of WINS
+      &BuildLevels("1", "abld final $GenBuild::keepgoing", "wins","$GenBuild::build_urel_udeb");
+	  &BuildLevels("1", "abld test final $GenBuild::keepgoing", "wins","$GenBuild::build_urel_udeb") if ($GenBuild::build_test);
+      &BuildLevels("0", "abld -what build", "wins","$GenBuild::build_urel_udeb");
+	  &BuildLevels("0", "abld test -what build", "wins","$GenBuild::build_urel_udeb") if ($GenBuild::build_test);
+      $GenBuild::iStageCount++;
+      &BuildLevels("0", "abld -check build", "wins","$GenBuild::build_urel_udeb");
+	  &BuildLevels("0", "abld test -check build", "wins","$GenBuild::build_urel_udeb") if ($GenBuild::build_test);
+      $GenBuild::iStageCount++;
+    }
+
+    if ($GenBuild::build_winscw)
+    {
+      # Final Part of WINSCW
+      &BuildLevels("1", "abld final $GenBuild::keepgoing", "winscw$GenBuild::build_urel_udeb");
+	  &BuildLevels("1", "abld test final $GenBuild::keepgoing", "winscw$GenBuild::build_urel_udeb") if ($GenBuild::build_test);
+      &BuildLevels("0", "abld -what build", "winscw$GenBuild::build_urel_udeb");
+	  &BuildLevels("0", "abld test -what build", "winscw$GenBuild::build_urel_udeb") if ($GenBuild::build_test);
+      $GenBuild::iStageCount++;
+      &BuildLevels("0", "abld -check build", "winscw$GenBuild::build_urel_udeb");
+	  &BuildLevels("0", "abld test -check build", "winscw$GenBuild::build_urel_udeb") if ($GenBuild::build_test);
+      $GenBuild::iStageCount++;
+    }
+  }
+
+  # Other Final Parts
+  &BuildLevels("1", "abld final $GenBuild::keepgoing", "arm4$GenBuild::build_urel_udeb") if ($GenBuild::build_arm4);
+  &BuildLevels("1", "abld test final $GenBuild::keepgoing", "arm4$GenBuild::build_urel_udeb") if (($GenBuild::build_arm4) && ($GenBuild::build_test));
+  &BuildLevels("1", "abld final $GenBuild::keepgoing", "arm4t$GenBuild::build_urel_udeb") if ($GenBuild::build_arm4t);
+  &BuildLevels("1", "abld test final $GenBuild::keepgoing", "arm4t$GenBuild::build_urel_udeb") if (($GenBuild::build_arm4t) && ($GenBuild::build_test));
+  &BuildLevels("1", "abld final $GenBuild::keepgoing", "armv5$GenBuild::build_urel_udeb") if ($GenBuild::build_armv5);
+  &BuildLevels("1", "abld test final $GenBuild::keepgoing", "armv5$GenBuild::build_urel_udeb") if (($GenBuild::build_armv5) && ($GenBuild::build_test));
+  &BuildLevels("1", "abld final $GenBuild::keepgoing", "armi$GenBuild::build_urel_udeb") if ($GenBuild::build_armi);
+  &BuildLevels("1", "abld test final $GenBuild::keepgoing", "armi$GenBuild::build_urel_udeb") if (($GenBuild::build_armi) && ($GenBuild::build_test));
+  &BuildLevels("1", "abld final $GenBuild::keepgoing", "thumb$GenBuild::build_urel_udeb") if ($GenBuild::build_thumb);
+  &BuildLevels("1", "abld test final $GenBuild::keepgoing", "thumb$GenBuild::build_urel_udeb") if (($GenBuild::build_thumb) && ($GenBuild::build_test));
+  &BuildLevels("1", "abld final $GenBuild::keepgoing", "arm3$GenBuild::build_urel_udeb") if ($GenBuild::build_arm3);
+  &BuildLevels("1", "abld test final $GenBuild::keepgoing", "arm3$GenBuild::build_urel_udeb") if (($GenBuild::build_arm3) && ($GenBuild::build_test));
+  foreach my $iAssp (sort keys %GenBuild::arm_assplist)
+  {
+    &BuildLevels("1", "abld final $GenBuild::keepgoing", $iAssp);
+	&BuildLevels("1", "abld test final $GenBuild::keepgoing", $iAssp) if ($GenBuild::build_test);
+  }
+
+  &BuildLevels("0", "abld -what build", "arm4$GenBuild::build_urel_udeb") if ($GenBuild::build_arm4);
+  &BuildLevels("0", "abld test -what build", "arm4$GenBuild::build_urel_udeb") if (($GenBuild::build_arm4) && ($GenBuild::build_test));
+  &BuildLevels("0", "abld -what build", "arm4t$GenBuild::build_urel_udeb") if ($GenBuild::build_arm4t);
+  &BuildLevels("0", "abld test -what build", "arm4t$GenBuild::build_urel_udeb") if (($GenBuild::build_arm4t) && ($GenBuild::build_test));
+  &BuildLevels("0", "abld -what build", "armv5$GenBuild::build_urel_udeb") if ($GenBuild::build_armv5);
+  &BuildLevels("0", "abld test -what build", "armv5$GenBuild::build_urel_udeb") if (($GenBuild::build_armv5) && ($GenBuild::build_test));
+  &BuildLevels("0", "abld -what build", "armi$GenBuild::build_urel_udeb") if ($GenBuild::build_armi);
+  &BuildLevels("0", "abld test -what build", "armi$GenBuild::build_urel_udeb") if (($GenBuild::build_armi) && ($GenBuild::build_test));
+  &BuildLevels("0", "abld -what build", "thumb$GenBuild::build_urel_udeb") if ($GenBuild::build_thumb);
+  &BuildLevels("0", "abld test -what build", "thumb$GenBuild::build_urel_udeb") if (($GenBuild::build_thumb) && ($GenBuild::build_test));
+  &BuildLevels("0", "abld -what build", "arm3$GenBuild::build_urel_udeb") if ($GenBuild::build_arm3);
+  &BuildLevels("0", "abld test -what build", "arm3$GenBuild::build_urel_udeb") if (($GenBuild::build_arm3) && ($GenBuild::build_test));
+
+  foreach my $iAssp (sort keys %GenBuild::arm_assplist)
+  {
+    &BuildLevels("0", "abld -what build", $iAssp);
+	&BuildLevels("0", "abld test -what build", $iAssp) if ($GenBuild::build_test);
+  }
+  $GenBuild::iStageCount++;
+
+  &BuildLevels("0", "abld -check build", "arm4$GenBuild::build_urel_udeb") if ($GenBuild::build_arm4);
+  &BuildLevels("0", "abld test -check build", "arm4$GenBuild::build_urel_udeb") if (($GenBuild::build_arm4) && ($GenBuild::build_test));
+  &BuildLevels("0", "abld -check build", "arm4t$GenBuild::build_urel_udeb") if ($GenBuild::build_arm4t);
+  &BuildLevels("0", "abld test -check build", "arm4t$GenBuild::build_urel_udeb") if (($GenBuild::build_arm4t) && ($GenBuild::build_test));
+  &BuildLevels("0", "abld -check build", "armv5$GenBuild::build_urel_udeb") if ($GenBuild::build_armv5);  
+  &BuildLevels("0", "abld test -check build", "armv5$GenBuild::build_urel_udeb") if (($GenBuild::build_armv5) && ($GenBuild::build_test));
+  &BuildLevels("0", "abld -check build", "armi$GenBuild::build_urel_udeb") if ($GenBuild::build_armi);  
+  &BuildLevels("0", "abld test -check build", "armi$GenBuild::build_urel_udeb") if (($GenBuild::build_armi) && ($GenBuild::build_test));
+  &BuildLevels("0", "abld -check build", "thumb$GenBuild::build_urel_udeb") if ($GenBuild::build_thumb);
+  &BuildLevels("0", "abld test -check build", "thumb$GenBuild::build_urel_udeb") if (($GenBuild::build_thumb) && ($GenBuild::build_test));
+  &BuildLevels("0", "abld -check build", "arm3$GenBuild::build_urel_udeb") if ($GenBuild::build_arm3);
+  &BuildLevels("0", "abld test -check build", "arm3$GenBuild::build_urel_udeb") if (($GenBuild::build_arm3) && ($GenBuild::build_test));
+
+  foreach my $iAssp (sort keys %GenBuild::arm_assplist)
+  {
+    &BuildLevels("0", "abld -check build", $iAssp);
+	&BuildLevels("0", "abld test -check build", $iAssp) if ($GenBuild::build_test);
+  }
+
+  # Print the XML Footer
+  print $GenBuild::XMLFileH qq{\t</Commands>\n</Product>};
+
+  # Add the per command end HiRes timestamp if available
+  print $GenBuild::gLogFileH "+++ HiRes End ".Time::HiRes::time()."\n" if ($gHiResTimer == 1);
+  # Add the per command end timestamp
+  print $GenBuild::gLogFileH "++ Finished at ".localtime()."\n";
+
+  # Print Genxml log footer
+  print $GenBuild::gLogFileH "=== Genxml finished ".localtime()."\n";
+
+  # Close XML File
+  close($GenBuild::XMLFileH);
+}
+
+sub BuildLevels
+{
+  my ($iIncStage, $action, $arg1, $arg2, $arg3) = @_;
+
+  for(my $j = 0; $j < scalar(@GenBuild::components); $j++)
+  {
+    my $line = $GenBuild::components[$j];
+    my @MyList;
+    my $tempvar;
+
+    @MyList = split(/\s+/,$line);
+    $tempvar= lc $MyList[$#MyList];
+    $tempvar =~ s/\\group//;
+    push @MyList, $tempvar;
+
+    print $GenBuild::XMLFileH qq{\t\t<Execute ID="$GenBuild::iIDCount" Stage="$GenBuild::iStageCount" Component="$MyList[2]" Cwd="$GenBuild::iSourceDir$MyList[1]" CommandLine="$action $arg1 $arg2 $arg3"/>\n};
+    $GenBuild::iIDCount++;
+
+    if ( $iIncStage )
+    {
+      $GenBuild::iStageCount++;
+    }
+  }
+
+}
+
+sub BuildTargets
+{
+  my ($iIncStage, $action, @iTargets) = @_;
+
+
+  for(my $j = 0; $j < scalar(@GenBuild::components); $j++)
+  {
+    my $line = $GenBuild::components[$j];
+    my @MyList;
+    my $tempvar;
+
+    @MyList = split(/\s+/,$line);
+    $tempvar= lc $MyList[$#MyList];
+    $tempvar =~ s/\\group//;
+    push @MyList, $tempvar;
+
+    # Process target list
+    foreach my $iTarget (@iTargets)
+    {
+      print $GenBuild::XMLFileH qq{\t\t<Execute ID="$GenBuild::iIDCount" Stage="$GenBuild::iStageCount" Component="$MyList[2]" Cwd="$GenBuild::iSourceDir$MyList[1]" CommandLine="$action $iTarget"/>\n};
+      $GenBuild::iIDCount++;
+    }
+    if ( $iIncStage )
+    {
+      $GenBuild::iStageCount++;
+    }
+  }
+  $GenBuild::iStageCount++ if (!$iIncStage);
+
+}
+
+# GenReallyClean
+#
+# Inputs
+# $iReallyClean - Filename for reallyclean xml
+#
+# Outputs
+#
+# Description
+# This function generates a xml file to run abld reallyclean on all components
+sub GenReallyClean
+{
+  my ($iReallyClean) = @_;
+
+  # Reset ID and Stage Counf for New XML File
+  $GenBuild::iIDCount = 1;
+  $GenBuild::iStageCount = 1;
+
+
+  # Add the section header
+  print $GenBuild::gLogFileH "=== Genxml == ReallyClean\n";
+
+  print $GenBuild::gLogFileH "-- Genxml\n";
+  # Add the per command start timestamp
+  print $GenBuild::gLogFileH "++ Started at ".localtime()."\n";
+  # Add the per command start HiRes timestamp if available
+  if ($gHiResTimer == 1)
+  {
+    print $GenBuild::gLogFileH "+++ HiRes Start ".Time::HiRes::time()."\n";
+  } else {
+    # Add the HiRes timer missing statement
+    print $GenBuild::gLogFileH "+++ HiRes Missing\n";
+  }
+
+  # Open XML file
+  $GenBuild::XMLFileH = IO::File->new("> $iReallyClean")
+    or croak "Couldn't open $iReallyClean for writing: $!\n";
+
+  # Write Header
+  &PrintXMLHeader($GenBuild::XMLFileH);
+  # Generate XML file
+  &BuildLevels("0", "abld reallyclean");
+  # Write Footer and Close XML File
+  print $GenBuild::XMLFileH qq{\t</Commands>\n</Product>};
+  close($GenBuild::XMLFileH);
+
+
+  # Add the per command end HiRes timestamp if available
+  print $GenBuild::gLogFileH "+++ HiRes End ".Time::HiRes::time()."\n" if ($gHiResTimer == 1);
+  # Add the per command end timestamp
+  print $GenBuild::gLogFileH "++ Finished at ".localtime()."\n";
+
+  # Print Genxml log footer
+  print $GenBuild::gLogFileH "=== Genxml finished ".localtime()."\n";
+}
+
+# GenClean
+#
+# Inputs
+# $iClean - Filename for reallyclean xml
+#
+# Outputs
+#
+# Description
+# This function generates a xml file to run abld reallyclean on all components
+sub GenClean
+{
+  my ($iClean) = @_;
+
+  # Reset ID and Stage Counf for New XML File
+  $GenBuild::iIDCount = 1;
+  $GenBuild::iStageCount = 1;
+
+  # Add the section header
+  print $GenBuild::gLogFileH "=== Genxml == Clean\n";
+
+  print $GenBuild::gLogFileH "-- Genxml\n";
+  # Add the per command start timestamp
+  print $GenBuild::gLogFileH "++ Started at ".localtime()."\n";
+  # Add the per command start HiRes timestamp if available
+  if ($gHiResTimer == 1)
+  {
+    print $GenBuild::gLogFileH "+++ HiRes Start ".Time::HiRes::time()."\n";
+  } else {
+    # Add the HiRes timer missing statement
+    print $GenBuild::gLogFileH "+++ HiRes Missing\n";
+  }
+
+  # Open XML file
+  $GenBuild::XMLFileH = IO::File->new("> $iClean")
+    or croak "Couldn't open $iClean for writing: $!\n";
+
+  # Write Header
+  &PrintXMLHeader($GenBuild::XMLFileH);
+  # Generate XML file
+  &BuildLevels("0", "abld clean");
+
+  # Write Footer and Close XML File
+  print $GenBuild::XMLFileH qq{\t</Commands>\n</Product>};
+  close($GenBuild::XMLFileH);
+
+
+  # Add the per command end HiRes timestamp if available
+  print $GenBuild::gLogFileH "+++ HiRes End ".Time::HiRes::time()."\n" if ($gHiResTimer == 1);
+  # Add the per command end timestamp
+  print $GenBuild::gLogFileH "++ Finished at ".localtime()."\n";
+
+  # Print Genxml log footer
+  print $GenBuild::gLogFileH "=== Genxml finished ".localtime()."\n";
+}
+
+# PrintXMLHeader
+#
+# Inputs
+# $iFileHandle
+#
+# Outputs
+#
+# Description
+# This function print the common start of the XML File
+sub PrintXMLHeader
+{
+  my ($iFileHandle) = @_;
+
+  my ($epocroot) = $ENV{'EPOCROOT'};
+
+  # Print the XML Header
+  print $iFileHandle qq{<?xml version="1.0"?>\n};
+  print $iFileHandle <<DTD_EOF;
+<!DOCTYPE Build  [
+  <!ELEMENT Product (Commands)>
+  <!ATTLIST Product name CDATA #REQUIRED>
+  <!ELEMENT Commands (Execute+ | SetEnv*)>
+  <!ELEMENT Execute EMPTY>
+  <!ATTLIST Execute ID CDATA #REQUIRED>
+  <!ATTLIST Execute Stage CDATA #REQUIRED>
+  <!ATTLIST Execute Component CDATA #REQUIRED>
+  <!ATTLIST Execute Cwd CDATA #REQUIRED>
+  <!ATTLIST Execute CommandLine CDATA #REQUIRED>
+  <!ELEMENT SetEnv EMPTY>
+  <!ATTLIST SetEnv Order ID #REQUIRED>
+  <!ATTLIST SetEnv Name CDATA #REQUIRED>
+  <!ATTLIST SetEnv Value CDATA #REQUIRED>
+]>
+DTD_EOF
+  print $iFileHandle qq{<Product Name="$GenBuild::basename">\n\t<Commands>\n};
+
+  #Set EPOCROOT
+  print $iFileHandle qq{\t\t<SetEnv Order="1" Name="EPOCROOT" Value="$epocroot"/>\n};
+
+  #Add Tools to the path using EPOCROOT
+  print $iFileHandle qq{\t\t<SetEnv Order="2" Name="PATH" Value="}.$epocroot.qq{epoc32\\gcc\\bin;}.$epocroot.qq{epoc32\\tools;%PATH%"/>\n};
+
+}
+1;