--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/winutl.pm Fri Jun 25 17:29:25 2010 +0800
@@ -0,0 +1,354 @@
+
+# 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:
+# this package does various ancillary things for windows modules
+#
+#
+
+package Winutl;
+
+my $BaseAddress='';
+my @Win32LibList=();
+my $Win32Resrc='';
+my $CopyForStaticLinkage=0;
+my $Win32StdHeaders=0;
+my $MSVCVer=0;
+my $MSVCSubVer=0;
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+ Winutl_Help_Mmp
+
+ Winutl_DoMmp_Parse
+ Winutl_DoMmp
+
+ Winutl_BaseAddress
+ Winutl_Win32LibList
+ Winutl_Win32Resrc
+ Winutl_CopyForStaticLinkage
+ Winutl_Win32StdHeaders
+
+ Winutl_AdjustTargetPath
+
+ Winutl_MSVCVer
+ Winutl_MSVCSubVer
+
+ Winutl_CheckSourceMMPMetaData
+);
+
+use Genutl;
+use E32Variant;
+use CheckSource;
+use Pathutl;
+use Cwd;
+
+my %CheckSourceMMPMetaData;
+
+sub Winutl_Help_Mmp {
+# provide the help text for START <windows platforms> END blocks
+
+ print
+ "BASEADDRESS [base address for dll loading]\n",
+ "WIN32_LIBRARY [win32 libraries]\n",
+ "WIN32_RESOURCE [win32 resource]\n",
+ "COPY_FOR_STATIC_LINKAGE // copy dll from emulated Z drive\n",
+ "WIN32_HEADERS // instruct compiler to look into standard header directories\n",
+ " // (implied by WIN32_LIBRARY)\n"
+ ;
+}
+
+sub Winutl_DoMmp_Parse ($$) {
+ # takes reference to platform text and semicolon-separated list
+ # of compiler-specific include directories
+ my @PlatTxt=@{$_[0]};
+ my $CompilerIncPaths=$_[1];
+
+# process the START <windows platforms> END blocks
+
+ my $BaseTrg=&main::BaseTrg;
+ my $BasicTrgType=&main::BasicTrgType;
+ my $MakeFilePath=&main::MakeFilePath;
+ my $MMPFILE=&main::MmpFile;
+
+ # set up START WINS ... END block module variables
+ my @MmpWarn=();
+ my $Line;
+ LINE: foreach $Line (@PlatTxt) {
+ my $LineInfo=shift @$Line;
+
+ $LineInfo =~ /^(.+)\((\d+)\)$/;
+ my $CurFile = $1;
+ my $LineNum = $2;
+ my $BldInfDir = cwd;
+ $BldInfDir =~ s/\//\\/g;
+ $BldInfDir =~ s/^\w+://;
+ $BldInfDir .= "\\";
+
+ $_=shift @$Line;
+
+ if (/^BASEADDRESS$/oi) {
+ if (@$Line) {
+ $BaseAddress=shift @$Line;
+ $BaseAddress=~s/X/x/o;
+ next LINE;
+ }
+ push @MmpWarn, "$LineInfo : No base address specified for keyword BASEADDRESS\n";
+ next LINE;
+ }
+ if (/^WIN32_LIBRARY$/oi) {
+ if (@$Line)
+ {
+ $Win32StdHeaders = 1;
+
+ foreach (@$Line)
+ {
+ if (/^\./)
+ {
+ # local - check for UNIX slash and physical consistency of file as it exists relative to the bld.inf
+ CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, "WIN32_LIBRARY", $_, $LineNum, $CheckSource_PhysicalCheck, $BldInfDir);
+ }
+ else
+ {
+ # global - check for UNIX slash and assume that it must be lower case
+ CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, "WIN32_LIBRARY", $_, $LineNum);
+ }
+ $_ = &Path_Norm($_);
+ push @Win32LibList, $_;
+ }
+ }
+ else
+ {
+ push @MmpWarn, "$LineInfo : No libraries specified for keyword WIN32_LIBRARY\n";
+ }
+ next LINE;
+ }
+ if (/^WIN32_RESOURCE$/oi) {
+ if (@$Line) {
+ $Win32Resrc=shift @$Line;
+
+ CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, "WIN32_RESOURCE", $Win32Resrc, $LineNum, $CheckSource_PhysicalCheck);
+ $Win32Resrc = &Path_Norm($Win32Resrc);
+
+ $Win32Resrc=&main::Path_MakeAbs($MMPFILE, $Win32Resrc);
+ next LINE;
+ }
+ push @MmpWarn, "$LineInfo : No resource specified for keyword WIN32_RESOURCE\n";
+ next LINE;
+ }
+ if (/^COPY_FOR_STATIC_LINKAGE$/oi) {
+ if ($BasicTrgType!~/^DLL$/oi) {
+ push @MmpWarn, "$LineInfo : COPY_FOR_STATIC_LINKAGE only applies to DLLs\n";
+ next LINE;
+ }
+ if (&main::TrgPath eq "") {
+ push @MmpWarn, "$LineInfo : COPY_FOR_STATIC_LINKAGE requires TARGETPATH\n";
+ next LINE;
+ }
+ $CopyForStaticLinkage=1;
+ next LINE;
+ }
+ if (/^WIN32_HEADERS$/oi) {
+ $Win32StdHeaders = 1;
+ next LINE;
+ }
+
+ push @MmpWarn, "$LineInfo : Unrecognised Keyword \"$_\"\n";
+ }
+
+ undef $Line;
+ if (@MmpWarn) {
+ warn
+ "\nMMPFILE \"",$MMPFILE,"\"\n",
+ "START .. END BLOCK WARNINGS(S)\n",
+ @MmpWarn,
+ "\n"
+ ;
+ }
+ undef @MmpWarn;
+
+ # if Win32 Libraries required - set the Windows standard include paths
+ if ($Win32StdHeaders || $Win32Resrc || &main::Plat eq 'TOOLS' || &main::Plat eq 'CWTOOLS'
+ || &main::Plat eq 'TOOLS2')
+ { # show where to find win32 libraries
+ # include env variable takes everything between ';', including spaces and '"', as part of path
+ my @StdIncPaths=split ';', $CompilerIncPaths;
+ my $path;
+ foreach $path (@StdIncPaths) {
+ $path =~ s-/-\\-go; # for those working with UNIX shells
+ if ($path =~ /^\+/) {
+ # expand CodeWarrior "recursive" entries
+ $path =~ s-^\+--go; # remove the + from the current entry
+ if (opendir DIR, $path) {
+ my @list = grep !/^\.\.?$/, readdir DIR;
+ closedir DIR;
+ foreach (@list) {
+ my $newpath="$path\\$_";
+ if (-d $newpath) {
+ push @StdIncPaths,"+$newpath"; # add subdirs for later expansion
+ }
+ }
+ }
+ }
+ }
+ &main::SetStdIncPaths(@StdIncPaths);
+ &main::AddPlatMacros('WIN32','_WINDOWS');
+ }
+}
+
+sub Winutl_DoMmp ($$) {
+ # takes reference to platform text and semicolon-separated list
+ # of compiler-specific include directories
+ my @PlatTxt=@{$_[0]};
+ my $CompilerIncPaths=$_[1];
+
+ my $Plat=&main::Plat;
+ if ($Plat ne "WINSCW" and $Plat ne "CWTOOLS" and $Plat ne "TOOLS2") {
+ # check that we're using VC6 SP3
+ &Winutl_MSVCVer();
+ }
+
+ &Winutl_DoMmp_Parse(\@PlatTxt, $CompilerIncPaths);
+
+ my $BaseTrg=&main::BaseTrg;
+ my $BasicTrgType=&main::BasicTrgType;
+ my $MakeFilePath=&main::MakeFilePath;
+ my $MMPFILE=&main::MmpFile;
+ my @UidList=&main::UidList;
+
+ if ($BasicTrgType=~/^(EXE|DLL)$/oi) {
+ # create the UID source file
+ my $priority = "EPriorityForeground";
+ if (&main::ProcessPriority) {
+ $priority="EPriority".&main::ProcessPriority;
+ }
+
+ my $UidText=join(
+ "\n",
+ '// Makmake-generated uid source file',
+ '#include <e32cmn.h>',
+ '#pragma data_seg(".SYMBIAN")',
+ '__EMULATOR_IMAGE_HEADER2('
+ );
+ foreach (@UidList) {
+ $UidText.="$_,";
+ }
+ my $vstr = "0x".&Genutl_VersionToHexString(&main::Version);
+ my $vid = &main::VendorId;
+ if(!$vid) { $vid="0"; }
+ $UidText.="$priority,".(&main::CapabilityFlags)[0]."u,".(&main::CapabilityFlags)[1]."u,".&main::SecureId.",".$vid.",$vstr,"; # second capability word always 0 for now
+ if (&main::AllowDllData) {
+ $UidText.="1,";
+ } else {
+ $UidText.="0,";
+ }
+ chop $UidText;
+ $UidText.=")\n";
+ $UidText.="#pragma data_seg()\n";
+ unless (&main::Plat eq 'TOOLS' || &main::Plat eq 'CWTOOLS' || &main::Plat eq 'TOOLS2' ) {
+ &main::AddSrc("$MakeFilePath$BaseTrg.UID.CPP", $UidText);
+ };
+ }
+
+}
+
+sub Winutl_BaseAddress () {
+ $BaseAddress;
+}
+
+sub Winutl_Win32LibList () {
+ @Win32LibList;
+}
+
+sub Winutl_Win32Resrc () {
+ $Win32Resrc;
+}
+
+sub Winutl_CopyForStaticLinkage () {
+ $CopyForStaticLinkage;
+}
+
+sub Winutl_Win32StdHeaders () {
+ $Win32StdHeaders;
+}
+
+sub Winutl_AdjustTargetPath () {
+ my ($TrgPathRef) = @_;
+
+ if (&main::EPOCSecurePlatform) {
+
+ my $plan=1;
+ my @macros = &Variant_GetMacroList;
+ foreach my $macro (@macros) {
+ if ($macro =~ m/^SYMBIAN_IGNORE_BIN_TARGETPATH.*/) {
+ $plan = 2;
+ last;
+ }
+ }
+
+ if ($plan == 1) {
+ # Intermediate step: TARGETPATH => COPY_FOR_STATIC_LINKAGE
+ $CopyForStaticLinkage = 1 if ($$TrgPathRef ne "");
+ } else {
+ # Finally: Ignore TARGETPATH and COPY_FOR_STATIC_LINKAGE
+ # unless it's a subdir of sys\bin
+ if (&main::TrgPath !~ /^Z\\sys\\bin\\.+/i) {
+ $$TrgPathRef = "";
+ $CopyForStaticLinkage = 0;
+ }
+ }
+ }
+}
+
+sub Winutl_MSVCVer ($) {
+ my $platcommand=shift;
+ if(!defined $platcommand) {
+ $platcommand=0; }
+ open PIPE, "LINK.EXE 2>&1 |" or die "ERROR: Can't invoke LINK.EXE\n";
+ my $DoneCheck=0;
+ while (<PIPE>) {
+ unless ($DoneCheck) {
+ if (/^.+\s+Version\s+(\d)\.(\d{2})\.((\d{4})|(\d{5})(.\d{2}))\s*$/o) {
+ if (($1<6) or ($1==6 and $2<0) or ($1==6 and $2==0 and $3<8447)) {
+ warn "WARNING: Should install MSVC6 Service Pack 3\n";
+ }
+ $MSVCVer = $1;
+ $MSVCSubVer = $2;
+ $DoneCheck=1;
+ }
+ }
+ }
+ close PIPE;
+ # Do not throw any error when link.exe not present while displaying
+ # a list of the supported platforms using bldmake plat command.
+ if (!$DoneCheck && !$platcommand) {
+ # Couldn't find version information? Might not have link.exe at all
+ die "ERROR: failed to find version information for LINK.EXE\n";
+ }
+
+ $MSVCVer;
+}
+
+sub Winutl_MSVCSubVer ($) {
+ my $platcommand=@_;
+ &Winutl_MSVCVer($platcommand);
+
+ $MSVCSubVer;
+}
+
+sub Winutl_CheckSourceMMPMetaData () {
+ %CheckSourceMMPMetaData;
+}
+
+1;