diff -r 000000000000 -r 83f4b4db085c bldsystemtools/commonbldutils/InstallDevKit.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bldsystemtools/commonbldutils/InstallDevKit.pl Tue Feb 02 01:39:43 2010 +0200 @@ -0,0 +1,732 @@ +#!perl + +# InstallDevKit.pl - Source Code Integration Script + +# Copyright (c) 1997-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: +# Versions: +# 1.0 Initial +# +# + + +use strict; +use Win32::Registry; +use Getopt::Long; +use File::Path; +use File::Glob; + +my $Platform = ""; + + +# ------------------------------------- Global variables ----------------------------------- + +# main array. Each element contains: display text for this option +# list of DevKit packages to be installed by this option + + +my @AllTheOptions=( + ["GT source", + ["com.symbian.src.GT-general", + "com.symbian.src.GT-restricted-part1", + "com.symbian.src.GT-restricted-part2", + "com.symbian.src.GT-restricted-part3", + "com.symbian.src.GT-restricted-part4", + "com.symbian.src.GT-restricted-part5", + "com.symbian.src.GT-restricted-part6"], + + ["com.symbian.src.confidential", + "com.symbian.src.GT-confidential-networking"] ], + + + ["UI source", + ["com.symbian.src.TechView-restricted", + "com.symbian.src.TechView-general"], + + ["com.symbian.src.TechView-confidential-networking"] ], + + + ["GT WINS binaries", + ["com.symbian.api.GT-restricted", + "com.symbian.api.GT-shared", + "com.symbian.api.GT-wins", + "com.symbian.api.StrongCrypto", + + "com.symbian.bin.GT-restricted", + "com.symbian.bin.GT-restricted-data", + + "com.symbian.bin.GT-shared", + "com.symbian.bin.GT-shared-data", + + "com.symbian.bin.GT-wins-shared", + "com.symbian.bin.GT-wins-udeb", + "com.symbian.bin.GT-wins-urel", + + "com.symbian.bin.StrongCrypto-wins-udeb", + "com.symbian.bin.StrongCrypto-wins-urel", + + "com.symbian.debug.GT-wins", + + "com.symbian.tools.cpp", + "com.symbian.tools.cpp-custom", + "com.symbian.tools.java", + "com.symbian.tools.libraries", + "com.symbian.tools.shared", + "com.symbian.tools.shared-custom", + "com.symbian.tools.wins"], + + ["com.symbian.bin.GT-confidential", + "com.symbian.bin.TechView-confidential"] ], + + + ["GT WINSCW binaries", + ["com.symbian.api.GT-restricted", + "com.symbian.api.GT-winscw", + "com.symbian.api.GT-shared", + "com.symbian.api.StrongCrypto", + + "com.symbian.bin.GT-winscw-shared", + "com.symbian.bin.GT-winscw-udeb", + "com.symbian.bin.GT-winscw-urel", + + "com.symbian.bin.StrongCrypto-winscw-udeb", + "com.symbian.bin.StrongCrypto-winscw-urel", + + "com.symbian.bin.GT-restricted", + "com.symbian.bin.GT-restricted-data", + + "com.symbian.bin.GT-shared", + "com.symbian.bin.GT-shared-data", + + "com.symbian.debug.GT-winscw", + + "com.symbian.tools.cpp", + "com.symbian.tools.cpp-custom", + "com.symbian.tools.java", + "com.symbian.tools.libraries", + "com.symbian.tools.shared", + "com.symbian.tools.shared-custom", + "com.symbian.tools.winscw"], + + ["com.symbian.bin.GT-confidential", + "com.symbian.bin.TechView-confidential"] ], + + ["GT ARM binaries", + ["com.symbian.api.GT-restricted", + "com.symbian.api.GT-arm", + "com.symbian.api.GT-shared", + "com.symbian.api.StrongCrypto", + + "com.symbian.bin.GT-arm", + "com.symbian.bin.GT-arm-data", + + "com.symbian.bin.StrongCrypto-arm", + + "com.symbian.bin.GT-restricted", + "com.symbian.bin.GT-restricted-data", + + "com.symbian.bin.GT-shared", + "com.symbian.bin.GT-shared-data", + + "com.symbian.bin.GT-romimages", + + "com.symbian.tools.boardsupport", + "com.symbian.tools.cpp", + "com.symbian.tools.cpp-custom", + "com.symbian.tools.java", + "com.symbian.tools.libraries", + "com.symbian.tools.shared", + "com.symbian.tools.shared-custom", + "com.symbian.tools.arm"], + + ["com.symbian.bin.GT-confidential", + "com.symbian.bin.TechView-confidential"] ], + + + ["UI WINS binaries (needs GT to run)", + ["com.symbian.api.TechView-restricted", + "com.symbian.api.TechView-shared", + "com.symbian.api.TechView-wins", + + "com.symbian.debug.TechView-wins", + + "com.symbian.bin.TechView-wins-shared", + "com.symbian.bin.TechView-wins-udeb", + "com.symbian.bin.TechView-wins-urel", + + "com.symbian.bin.Techview-restricted", + "com.symbian.bin.Techview-restricted-data", + "com.symbian.bin.Techview-shared", + "com.symbian.bin.Techview-shared-data", + + "com.symbian.tools.cpp", + "com.symbian.tools.cpp-custom", + "com.symbian.tools.java", + "com.symbian.tools.libraries", + "com.symbian.tools.shared", + "com.symbian.tools.shared-custom", + "com.symbian.tools.wins"], + + [] ], + + + ["UI WINSCW binaries (needs GT to run)", + ["com.symbian.api.TechView-restricted", + "com.symbian.api.TechView-shared", + + "com.symbian.debug.TechView-winscw", + "com.symbian.api.TechView-winscw", + + "com.symbian.bin.TechView-winscw-shared", + "com.symbian.bin.TechView-winscw-udeb", + "com.symbian.bin.TechView-winscw-urel", + + "com.symbian.bin.Techview-restricted", + "com.symbian.bin.Techview-restricted-data", + "com.symbian.bin.Techview-shared", + "com.symbian.bin.Techview-shared-data", + + "com.symbian.tools.cpp", + "com.symbian.tools.cpp-custom", + "com.symbian.tools.java", + "com.symbian.tools.libraries", + "com.symbian.tools.shared", + "com.symbian.tools.shared-custom", + "com.symbian.tools.winscw"], + + [] ], + + + ["UI ARM binaries (needs GT to run)", + ["com.symbian.api.TechView-arm", + "com.symbian.api.TechView-restricted", + "com.symbian.api.TechView-shared", + + "com.symbian.bin.Techview-arm", + "com.symbian.bin.Techview-arm-data", + + "com.symbian.bin.Techview-restricted", + "com.symbian.bin.Techview-restricted-data", + "com.symbian.bin.Techview-shared", + "com.symbian.bin.Techview-shared-data", + + "com.symbian.bin.Techview-romimages", + + "com.symbian.tools.arm", + "com.symbian.tools.boardsupport", + "com.symbian.tools.cpp", + "com.symbian.tools.cpp-custom", + + "com.symbian.tools.java", + "com.symbian.tools.libraries", + "com.symbian.tools.shared", + "com.symbian.tools.shared-custom"], + + [] ], + + + + ["Documentation (html, examples, tool and source)", + ["com.symbian.doc.intro-pages", + "com.symbian.doc.sdl-connect-examples", + "com.symbian.doc.sdl-core", + "com.symbian.doc.sdl", + "com.symbian.doc.sdl-cpp-examples", + "com.symbian.doc.sdl-java-examples", + "com.symbian.doc.sdl-shared-examples", + "com.symbian.doc.system"], + + ["com.symbian.src.sdl", + "com.symbian.tools.xbuild"] ] + + + + ); + + +# Holds list of packages already installed +my %InstalledOptions=(); + + +my $UserChoices = ""; +my $DevKitPackagesDirectory = ""; +my $CustKitPackagesDirectory = ""; +my $TargetDirectory = ""; +my $InstallCustKit = ""; +my $BuildFromClean = 0; + +# start the program +main(); + + + + +# --------------------------------- Start of Main() ---------------------------------------- +sub main() +{ + if (@ARGV) + { + CommandLineInterface(); + } + else + { + UserInterface(); + } + + + # create target directory (copes with multiple-levels, not possible with unzip) + if ( ! (-e $TargetDirectory) ) + { + mkpath ($TargetDirectory); + } + + + # get user's options & sort numerically + my @ListOfUserChoices = sort { $a <=> $b } split(/ */, $UserChoices); + + # install options, ignoring duplicates + for (my $index = 0; $index < scalar(@ListOfUserChoices); $index++ ) + { + my $UserChoice = (@ListOfUserChoices)[$index]; + + if ( ($index > 0) && ($UserChoice eq (@ListOfUserChoices)[$index-1]) ) + { + next; # duplicate option and already dealt with it + } + + elsif ($UserChoice !~ /\d/) + { + print "\n\nIgnoring unrecognised option '$UserChoice' at index $index.\n"; + next; #invalid option - ignore + } + + + # install the option + print "\n\nInstalling option $UserChoice ($AllTheOptions[$UserChoice]->[0])\n"; + InstallOption($UserChoice); + + + } + + + + system("rd /q /s $TargetDirectory\\[sdkroot]") if (-e "$TargetDirectory\\[sdkroot]"); + + + CheckBuildPrerequisites(); + CheckKSA(); + CheckSupplementary(); + + #remove target directory at end of Devkit Install + print "\n\Removing target directory\n"; + system("rd /q /s $TargetDirectory"); + + + +} + +# --------------------------------- Start of CheckSupplementary() ---------------------------------------- + + +sub CheckSupplementary() +{#Call InstallSupplementaryKit.pl to test supplementary packages + my $scriptFileSupplementaryKits = "$ENV{ProductPath}\\SupplementaryProducts\\InstallSupplementaryKit.pl"; + my $JarFileDir = "$ENV{ProductPath}\\SupplementaryProducts"; + my $SuppTargetDirectory = "$TargetDirectory\\SuppKit"; + + if (-e $JarFileDir ) { + my @JarFiles = <$JarFileDir\\*.jar>; + if ( scalar(@JarFiles) > 0 ) { + foreach my $JarFile (@JarFiles) { + system("perl $scriptFileSupplementaryKits -p $Platform -t $SuppTargetDirectory -j $JarFile"); + } + } else { + print "Warning: No Supplementary Kits Packages exists in $JarFileDir \n"; + } + } else { + print "Warning: Supplementary Kits Path: $JarFileDir do not exist! \n"; + } +} + + +# --------------------------------- Start of CheckKSA() ---------------------------------------- + + +sub CheckKSA() +{#KSA files added in BuildKit::addKSA(); Only check the existence of Setup.exe + my $KSAFile="$DevKitPackagesDirectory\\Setup.exe"; + if ( ! ( -e $KSAFile ) ) + { + print "\n ERROR: KSA files does not exist: $KSAFile\n"; + die "ERROR: KSA files does not exist: $KSAFile \n"; + } +} + +# --------------------------------- Start of CheckBuildPrerequisites() ---------------------------------------- + + +sub CheckBuildPrerequisites() +# checks target system for: +# Perl 5 +# Java +# path environment variables: +# gcc/bin +# epoc32/tools +# vcvars having been executed (path to link.exe) + +{ + my $DisplayString = ""; + + my $RegObj = 0; + my $Value = ''; + my $Type = 0; + + my $REG_ACTIVE_PERL = "SOFTWARE\\ActiveState\\ActivePerl"; + my $REG_PERL_DIRECTORY = "SOFTWARE\\Perl"; + + my $REG_JAVA_RUNTIME = "SOFTWARE\\JavaSoft\\Java Runtime Environment\\1.3"; # look for 1.3 + my $REG_JAVA_RUNTIME_HOME = "JavaHome"; + my $path = $ENV{"Path"}; + + + # Check Perl key - should be able to assume it's installed as this is a Perl script! + + # look for directory entry first + if ( ( $HKEY_LOCAL_MACHINE->Open("$REG_PERL_DIRECTORY", $RegObj) ) && ( $RegObj->QueryValueEx("", $Type, $Value) ) ) + { + if (! -e $Value) # { print " The Perl directory listed in the registry at $Value does not exist\n"; } + { + $DisplayString = $DisplayString . " Perl installation required\n"; + } + } + else + { + $DisplayString = $DisplayString . " Perl installation required\n"; + } + $RegObj->Close(); + + + # Check Java key + if ( (! $HKEY_LOCAL_MACHINE->Open("$REG_JAVA_RUNTIME", $RegObj) ) || (! $RegObj->QueryValueEx($REG_JAVA_RUNTIME_HOME, $Type, $Value) ) ) + { + $DisplayString = $DisplayString . " Java 1.3 installation required\n"; + } + $RegObj->Close(); + + + + # check whether vcvars has been run (can link.exe be found on path?) + my $success = 0; #FALSE + foreach my $Directory (split(/;/, $path)) + { + if ( ( $Directory =~ m/bin/i ) && (-e "$Directory\\link.exe") ) + { + $success = 1; #TRUE + } + } + if (!$success) + { + $DisplayString = $DisplayString . "Run vcvars.bat\n"; + } + + # print info if anything to show + if ( $DisplayString ne "" ) + { + print "\n\nBuild requirements:\n$DisplayString\n"; + } + + + + +} + +# --------------------------------- Start ofCommandLineInterface() ---------------------------------------- + + +sub CommandLineInterface() +{ + my $help; + if ( (GetOptions( "options|o=s" => \$UserChoices, + "custkit|c=s" => \$CustKitPackagesDirectory, + "devkit|d=s" => \$DevKitPackagesDirectory, + "target|t=s" => \$TargetDirectory, + "help|h|?" => \$help, + "buildfromclean|b" => \$BuildFromClean, + "platform|p=s" => \$Platform ) == 0 ) || ($help == 1) ) + { + Usage(); + exit; + } + + # check values received + + # user options - exit if not numeric or letter A + if ( $UserChoices !~ m/^[Aa0-8]+$/) + { + print "\n ERROR: Non-valid option(s) supplied: $UserChoices\n"; + die "ERROR: Non-valid option(s) supplied: $UserChoices\n"; + } + + + # check that DevKit is in stated directory, exit if not found + my @Packages = <$DevKitPackagesDirectory//com.symbian.devkit.*.sdkpkg>; + if ( scalar(@Packages) == 0 ) + { + print "\n ERROR: DevKit packages not found in directory: $DevKitPackagesDirectory\n"; + die "ERROR: DevKit packages not found in directory: $DevKitPackagesDirectory\n"; + } + + + + # check that target location to write extracted files to is empty or non-existant + + while ( (substr($TargetDirectory, -1, 1) eq '\\') || (substr($TargetDirectory, -1, 1) eq '/') ) + { + chop($TargetDirectory); # remove final backslashes + } + + my @contents = <$TargetDirectory/*.*>; + if ( ( (-e $TargetDirectory) && (scalar(@contents) > 0) ) || ($TargetDirectory eq "" ) ) + { + print "\n ERROR: Non-empty or unspecified target location: $TargetDirectory\n"; + die "ERROR: Non-empty or unspecified target location: $TargetDirectory\n"; + } + + + if ( ($Platform eq "") && ($ENV{'Platform'} eq "") ) + { + Usage(); + print "\nN.B. -platform required\n"; + exit; + } + elsif ( ($Platform eq "") ) + { + $Platform = $ENV{'Platform'} ; + } + + + + + # print values for clarification/logging + print " Installing options: $UserChoices \n"; + print " DevKit in directory: $DevKitPackagesDirectory \n"; + print " Installing to directory: $TargetDirectory \n"; + + + # convert A in user options to numbers(after displaying) + $UserChoices =~ s/[aA]/012345678/g; + +} + + +# --------------------------------- Start of UserInterface() ---------------------------------------- + + +sub UserInterface() +{ + print "\n------------------------------------------------------\n\n"; + my $index = 0; + while ($index < scalar(@AllTheOptions)) + { + # display option number and text for this option + print $index . ". ".$AllTheOptions[$index]->[0]."\n"; + $index++; + } + + print "\n------------------------------------------------------\n\n"; + + # get user's choice - must be numeric or 'A' for all + do + { + print "Enter option numbers to install (no separator) or A for [A]ll: "; + chomp($UserChoices = ); + if ($UserChoices =~ m/[aA]/) + { + $UserChoices = "012345678"; + } + } while ($UserChoices =~ m/[^\d]/) ; + + + # check that Kit is in this directory + my @Packages = ; + while ( scalar(@Packages) == 0 ) + { + # if not, get location of the packages + print "Enter path to the DevKit's packages (*.sdkpkg files) : "; + chomp( $DevKitPackagesDirectory = ); + @Packages = <$DevKitPackagesDirectory//com.symbian.devkit.*.sdkpkg> + } + + + + + # get location to write extracted files to + print "Enter directory to extract files to (must be new or empty): "; + + my $invalid = 1; #TRUE + + do # ensure directory doesn't exist or is empty + { + chomp( $TargetDirectory = ); + while ( (substr($TargetDirectory, -1, 1) eq '\\') || (substr($TargetDirectory, -1, 1) eq '/') ) + { + chop($TargetDirectory); # remove final backslashes + } + + my @contents = <$TargetDirectory/*.*>; + if ( $invalid = ( (-e $TargetDirectory) && (scalar(@contents) > 0) ) || ($TargetDirectory eq "" ) ) + { + print "Invalid selection - enter the name of an empty or new directory : "; + } + } while ( $invalid ) ; + + + # get Platform name - try environment, else ask user + if ($ENV{'Platform'} eq "") + { + print "Enter platform name : "; + chomp( $Platform = ); + } + else + { + $Platform = $ENV{'Platform'} ; + } + + + print "\n------------------------------------------------------\n\n"; + +} + + +# --------------------------------- Start of InstallOption() ---------------------------------------- + +sub InstallOption() +{ + my $Option = $_[0] ; + + # get array of DevKit packages for this option + my $Entry = $AllTheOptions[$Option]->[1]; + + + # for each package, call InstallPackage() to install the files + foreach my $Package (@$Entry) + { + if (! $InstalledOptions{$Package}) + { + $InstalledOptions{$Package} = $Option ; + print " Installing $Package\n"; + InstallPackage ( $Option, $Package, ); + } + else + { + print " Already got $Package\n"; + } + } +} + + +# --------------------------------- Start of InstallPackage() ---------------------------------------- + +sub InstallPackage() +{ + my $Option = $_[0] ; + my $Package = $_[1] ; + + # ensure package exists & is uniquely identified + + # try in DevKit directory first + my $PackageName = $DevKitPackagesDirectory."\\".$Package."_*sdkpkg"; + my @Packages = glob($PackageName); + + # ensure the package exists + if ( scalar(@Packages) == 0 ) + { + # not found, so try the CustKit directory + $PackageName = $CustKitPackagesDirectory."\\".$Package."_*sdkpkg"; + @Packages = glob($PackageName); + if ( scalar(@Packages) == 0 ) + { + print "\n ERROR: Package $Package not found. \n"; + die " ERROR: Package $Package not found. \n"; + } + elsif ( scalar(@Packages) > 1 ) + { + print "\n ERROR: Package $Package name matched duplicate CustKit files \n"; + die " ERROR: Package $Package name matched duplicate CustKit files \n"; + } + } + elsif ( scalar(@Packages) > 1 ) + { + print "\n ERROR: Package $Package name matched duplicate files \n"; + die " ERROR: Package $Package name matched duplicate files \n"; + } + + + # now able to start reading package & copying files + + if (-e $Packages[0]) + { + + system("unzip -q -o $Packages[0] -x package.xml -d \"$TargetDirectory\""); + + } + +} + + + + + + + + +# -------------------------- Start of makepath() ------------------------------ + +sub makepath($) + { + my ($path) = @_; + + if (-d $path) + { + return -1; + } + else + { + return mkpath($path); + } + } + + +# --------------------------------- Start of Usage() ---------------------------------------- + +sub Usage() +{ + print < path to directory containing CustKit packages + -d[evkit] path to directory containing DevKit packages + -o[ptions] 012345678A functionality options (A selects all) + -p[latform] build platform - used to create binaries installation directory path + -t[arget] path to directory to unpack Kit into + +ENDOFUSAGETEXT +}