sbsv1/abld/platform/winutl.pm
changeset 599 fa7a3cc6effd
equal deleted inserted replaced
596:9f25be3da657 599:fa7a3cc6effd
       
     1 
       
     2 # Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 # All rights reserved.
       
     4 # This component and the accompanying materials are made available
       
     5 # under the terms of "Eclipse Public License v1.0"
       
     6 # which accompanies this distribution, and is available
       
     7 # at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 #
       
     9 # Initial Contributors:
       
    10 # Nokia Corporation - initial contribution.
       
    11 #
       
    12 # Contributors:
       
    13 #
       
    14 # Description:
       
    15 # this package does various ancillary things for windows modules
       
    16 # 
       
    17 #
       
    18 
       
    19 package Winutl;
       
    20 
       
    21 my $BaseAddress='';
       
    22 my @Win32LibList=();
       
    23 my $Win32Resrc='';
       
    24 my $CopyForStaticLinkage=0;
       
    25 my $Win32StdHeaders=0;
       
    26 my $MSVCVer=0;
       
    27 my $MSVCSubVer=0;
       
    28 
       
    29 require Exporter;
       
    30 @ISA=qw(Exporter);
       
    31 @EXPORT=qw(
       
    32 	Winutl_Help_Mmp
       
    33 
       
    34 	Winutl_DoMmp_Parse
       
    35 	Winutl_DoMmp
       
    36 
       
    37 	Winutl_BaseAddress
       
    38 	Winutl_Win32LibList
       
    39 	Winutl_Win32Resrc
       
    40 	Winutl_CopyForStaticLinkage
       
    41 	Winutl_Win32StdHeaders
       
    42 
       
    43 	Winutl_AdjustTargetPath
       
    44 
       
    45 	Winutl_MSVCVer
       
    46 	Winutl_MSVCSubVer
       
    47 
       
    48 	Winutl_CheckSourceMMPMetaData
       
    49 );
       
    50 
       
    51 use Genutl;
       
    52 use E32Variant;
       
    53 use CheckSource;
       
    54 use Pathutl;
       
    55 use Cwd;
       
    56 
       
    57 my %CheckSourceMMPMetaData;
       
    58 
       
    59 sub Winutl_Help_Mmp {
       
    60 # provide the help text for START <windows platforms> END blocks
       
    61 
       
    62 	print
       
    63 		"BASEADDRESS    [base address for dll loading]\n",
       
    64 		"WIN32_LIBRARY  [win32 libraries]\n",
       
    65 		"WIN32_RESOURCE  [win32 resource]\n",
       
    66 		"COPY_FOR_STATIC_LINKAGE   // copy dll from emulated Z drive\n",
       
    67 		"WIN32_HEADERS // instruct compiler to look into standard header directories\n",
       
    68 		"              // (implied by WIN32_LIBRARY)\n"
       
    69 	;
       
    70 }
       
    71 
       
    72 sub Winutl_DoMmp_Parse ($$) {
       
    73 	# takes reference to platform text and semicolon-separated list
       
    74 	# of compiler-specific include directories
       
    75 	my @PlatTxt=@{$_[0]};
       
    76 	my $CompilerIncPaths=$_[1];
       
    77 
       
    78 # process the START <windows platforms> END blocks
       
    79 
       
    80 	my $BaseTrg=&main::BaseTrg;
       
    81 	my $BasicTrgType=&main::BasicTrgType;
       
    82 	my $MakeFilePath=&main::MakeFilePath;
       
    83 	my $MMPFILE=&main::MmpFile;
       
    84 
       
    85 	# set up START WINS ... END block module variables
       
    86 	my @MmpWarn=();
       
    87 	my $Line;
       
    88 	LINE: foreach $Line (@PlatTxt) {
       
    89 		my $LineInfo=shift @$Line;
       
    90 
       
    91 		$LineInfo =~ /^(.+)\((\d+)\)$/;
       
    92 		my $CurFile = $1;
       
    93 		my $LineNum = $2;
       
    94 		my $BldInfDir = cwd;
       
    95 		$BldInfDir =~ s/\//\\/g;
       
    96 		$BldInfDir =~ s/^\w+://;
       
    97 		$BldInfDir .= "\\";
       
    98 		
       
    99 		$_=shift @$Line;
       
   100 		
       
   101 		if (/^BASEADDRESS$/oi) {
       
   102 			if (@$Line) {
       
   103 				$BaseAddress=shift @$Line;
       
   104 				$BaseAddress=~s/X/x/o;
       
   105 				next LINE;
       
   106 			}
       
   107 			push @MmpWarn, "$LineInfo : No base address specified for keyword BASEADDRESS\n";
       
   108 			next LINE;
       
   109 		}
       
   110 		if (/^WIN32_LIBRARY$/oi) {
       
   111 			if (@$Line)
       
   112 				{
       
   113 				$Win32StdHeaders = 1;
       
   114 
       
   115 				foreach (@$Line)
       
   116 					{
       
   117 					if (/^\./)
       
   118 						{
       
   119 						# local - check for UNIX slash and physical consistency of file as it exists relative to the bld.inf
       
   120 						CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, "WIN32_LIBRARY", $_, $LineNum, $CheckSource_PhysicalCheck, $BldInfDir);
       
   121 						}
       
   122 					else
       
   123 						{
       
   124 						# global - check for UNIX slash and assume that it must be lower case
       
   125 						CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, "WIN32_LIBRARY", $_, $LineNum);
       
   126 						}
       
   127 					$_ = &Path_Norm($_);
       
   128 					push @Win32LibList, $_;
       
   129 					}
       
   130 				}
       
   131 			else
       
   132 				{
       
   133 				push @MmpWarn, "$LineInfo : No libraries specified for keyword WIN32_LIBRARY\n";
       
   134 				}
       
   135 			next LINE;
       
   136 		}
       
   137 		if (/^WIN32_RESOURCE$/oi) {
       
   138 			if (@$Line) {
       
   139 				$Win32Resrc=shift @$Line;
       
   140 
       
   141 				CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, "WIN32_RESOURCE", $Win32Resrc, $LineNum, $CheckSource_PhysicalCheck);
       
   142 				$Win32Resrc = &Path_Norm($Win32Resrc);
       
   143 				
       
   144 				$Win32Resrc=&main::Path_MakeAbs($MMPFILE, $Win32Resrc);
       
   145 				next LINE;
       
   146 			}
       
   147 			push @MmpWarn, "$LineInfo : No resource specified for keyword WIN32_RESOURCE\n";
       
   148 			next LINE;
       
   149 		}
       
   150 		if (/^COPY_FOR_STATIC_LINKAGE$/oi) {
       
   151 			if ($BasicTrgType!~/^DLL$/oi) {
       
   152 				push @MmpWarn, "$LineInfo : COPY_FOR_STATIC_LINKAGE only applies to DLLs\n";
       
   153 				next LINE;
       
   154 			}
       
   155 			if (&main::TrgPath eq "") {
       
   156 				push @MmpWarn, "$LineInfo : COPY_FOR_STATIC_LINKAGE requires TARGETPATH\n";
       
   157 				next LINE;
       
   158 			}
       
   159 			$CopyForStaticLinkage=1;
       
   160 			next LINE;
       
   161 		}
       
   162 		if (/^WIN32_HEADERS$/oi) {
       
   163 			$Win32StdHeaders = 1;
       
   164 			next LINE;
       
   165 		}
       
   166 		
       
   167 		push @MmpWarn, "$LineInfo : Unrecognised Keyword \"$_\"\n";
       
   168 	}
       
   169 
       
   170 	undef $Line;
       
   171 	if (@MmpWarn) {
       
   172 		warn
       
   173 			"\nMMPFILE \"",$MMPFILE,"\"\n",
       
   174 			"START .. END BLOCK WARNINGS(S)\n",
       
   175 			@MmpWarn,
       
   176 			"\n"
       
   177 		;
       
   178 	}
       
   179 	undef @MmpWarn;
       
   180 
       
   181 	# if Win32 Libraries required - set the Windows standard include paths
       
   182 	if ($Win32StdHeaders || $Win32Resrc || &main::Plat eq 'TOOLS' || &main::Plat eq 'CWTOOLS'
       
   183 		|| &main::Plat eq 'TOOLS2')
       
   184 	{	# show where to find win32 libraries
       
   185 		# include env variable takes everything between ';', including spaces and '"', as part of path
       
   186 		my @StdIncPaths=split ';', $CompilerIncPaths;
       
   187 		my $path;
       
   188 		foreach $path (@StdIncPaths) {
       
   189 			$path =~ s-/-\\-go;	# for those working with UNIX shells
       
   190 			if ($path =~ /^\+/) {
       
   191 				# expand CodeWarrior "recursive" entries
       
   192 				$path =~ s-^\+--go;		# remove the + from the current entry
       
   193 				if (opendir DIR, $path) {
       
   194 					my @list = grep !/^\.\.?$/, readdir DIR;
       
   195 					closedir DIR;
       
   196 					foreach (@list) {
       
   197 						my $newpath="$path\\$_";
       
   198 						if (-d $newpath) {
       
   199 							push @StdIncPaths,"+$newpath";	# add subdirs for later expansion
       
   200 						}
       
   201 					}
       
   202 				}
       
   203 			}
       
   204 		}
       
   205 		&main::SetStdIncPaths(@StdIncPaths);
       
   206 		&main::AddPlatMacros('WIN32','_WINDOWS');
       
   207 	}
       
   208 }
       
   209 
       
   210 sub Winutl_DoMmp ($$) {
       
   211 	# takes reference to platform text and semicolon-separated list
       
   212 	# of compiler-specific include directories
       
   213 	my @PlatTxt=@{$_[0]};
       
   214 	my $CompilerIncPaths=$_[1];
       
   215 
       
   216 	my $Plat=&main::Plat;
       
   217 	if ($Plat ne "WINSCW" and $Plat ne "CWTOOLS" and $Plat ne "TOOLS2") {
       
   218 		#	check that we're using VC6 SP3
       
   219 		&Winutl_MSVCVer();
       
   220 	}
       
   221 
       
   222 	&Winutl_DoMmp_Parse(\@PlatTxt, $CompilerIncPaths);
       
   223 	
       
   224 	my $BaseTrg=&main::BaseTrg;
       
   225 	my $BasicTrgType=&main::BasicTrgType;
       
   226 	my $MakeFilePath=&main::MakeFilePath;
       
   227 	my $MMPFILE=&main::MmpFile;
       
   228 	my @UidList=&main::UidList;
       
   229 	
       
   230 	if ($BasicTrgType=~/^(EXE|DLL)$/oi) {
       
   231 		# create the UID source file
       
   232 		my $priority = "EPriorityForeground";
       
   233 		if (&main::ProcessPriority) {
       
   234 			$priority="EPriority".&main::ProcessPriority;
       
   235 		}
       
   236 
       
   237 		my $UidText=join(
       
   238 			"\n",
       
   239 			'// Makmake-generated uid source file',
       
   240 			'#include <e32cmn.h>',
       
   241 			'#pragma data_seg(".SYMBIAN")',
       
   242 			'__EMULATOR_IMAGE_HEADER2('
       
   243 		);
       
   244 		foreach (@UidList) {
       
   245 			$UidText.="$_,";
       
   246 		}
       
   247 		my $vstr = "0x".&Genutl_VersionToHexString(&main::Version);
       
   248 		my $vid = &main::VendorId;
       
   249 		if(!$vid) { $vid="0"; }
       
   250 		$UidText.="$priority,".(&main::CapabilityFlags)[0]."u,".(&main::CapabilityFlags)[1]."u,".&main::SecureId.",".$vid.",$vstr,";	# second capability word always 0 for now
       
   251 		if (&main::AllowDllData) {
       
   252 			$UidText.="1,";
       
   253 		} else {
       
   254 			$UidText.="0,";
       
   255 		}
       
   256 		chop $UidText;
       
   257 		$UidText.=")\n";
       
   258 		$UidText.="#pragma data_seg()\n";
       
   259 		unless (&main::Plat eq 'TOOLS' || &main::Plat eq 'CWTOOLS' || &main::Plat eq 'TOOLS2' ) {
       
   260 			&main::AddSrc("$MakeFilePath$BaseTrg.UID.CPP", $UidText);
       
   261 		};
       
   262 	}
       
   263 
       
   264 }
       
   265 
       
   266 sub Winutl_BaseAddress () {
       
   267 	$BaseAddress;
       
   268 }
       
   269 
       
   270 sub Winutl_Win32LibList () {
       
   271 	@Win32LibList;
       
   272 }
       
   273 
       
   274 sub Winutl_Win32Resrc () {
       
   275 	$Win32Resrc;
       
   276 }
       
   277 
       
   278 sub Winutl_CopyForStaticLinkage () {
       
   279 	$CopyForStaticLinkage;
       
   280 }
       
   281 
       
   282 sub Winutl_Win32StdHeaders () {
       
   283 	$Win32StdHeaders;
       
   284 }
       
   285 
       
   286 sub Winutl_AdjustTargetPath () {
       
   287 	my ($TrgPathRef) = @_;
       
   288 
       
   289 	if (&main::EPOCSecurePlatform) {
       
   290 
       
   291 		my $plan=1;
       
   292 		my @macros = &Variant_GetMacroList;
       
   293 		foreach my $macro (@macros) {
       
   294 			if ($macro =~ m/^SYMBIAN_IGNORE_BIN_TARGETPATH.*/) {
       
   295 				$plan = 2;
       
   296 				last;
       
   297 			}
       
   298 		}
       
   299 
       
   300 		if ($plan == 1) {
       
   301 			# Intermediate step: TARGETPATH => COPY_FOR_STATIC_LINKAGE
       
   302 			$CopyForStaticLinkage = 1 if ($$TrgPathRef ne "");
       
   303 		} else {
       
   304 			# Finally: Ignore TARGETPATH and COPY_FOR_STATIC_LINKAGE
       
   305 			# unless it's a subdir of sys\bin
       
   306 			if (&main::TrgPath !~ /^Z\\sys\\bin\\.+/i) {
       
   307 				$$TrgPathRef = "";
       
   308 				$CopyForStaticLinkage = 0;
       
   309 			}
       
   310 		}
       
   311 	}
       
   312 }
       
   313 
       
   314 sub Winutl_MSVCVer ($) {
       
   315 	my $platcommand=shift;
       
   316 	if(!defined $platcommand) {
       
   317 		$platcommand=0; }
       
   318 	open PIPE, "LINK.EXE 2>&1 |" or die "ERROR: Can't invoke LINK.EXE\n";
       
   319 	my $DoneCheck=0;
       
   320 	while (<PIPE>) {
       
   321 		unless ($DoneCheck) {
       
   322 			if (/^.+\s+Version\s+(\d)\.(\d{2})\.((\d{4})|(\d{5})(.\d{2}))\s*$/o) {
       
   323 				if (($1<6) or ($1==6 and $2<0) or ($1==6 and $2==0 and $3<8447)) {
       
   324 					warn "WARNING: Should install MSVC6 Service Pack 3\n";
       
   325 				}
       
   326 				$MSVCVer = $1;
       
   327 				$MSVCSubVer = $2;
       
   328 				$DoneCheck=1;
       
   329 			}
       
   330 		}
       
   331 	}
       
   332 	close PIPE;
       
   333 	# Do not throw any error when link.exe not present  while displaying
       
   334 	# a list of the supported platforms using bldmake plat command.
       
   335 	if (!$DoneCheck && !$platcommand) {
       
   336 		# Couldn't find version information? Might not have link.exe at all
       
   337 		die "ERROR: failed to find version information for LINK.EXE\n";
       
   338 	}
       
   339 
       
   340 	$MSVCVer;
       
   341 }
       
   342 
       
   343 sub Winutl_MSVCSubVer ($) {
       
   344 	my $platcommand=@_;
       
   345 	&Winutl_MSVCVer($platcommand);
       
   346 
       
   347 	$MSVCSubVer;
       
   348 }
       
   349 
       
   350 sub Winutl_CheckSourceMMPMetaData () {
       
   351 	%CheckSourceMMPMetaData;
       
   352 }
       
   353 
       
   354 1;