sbsv2/raptor/python/raptor_utilities.py
changeset 0 044383f39525
child 3 e1eecf4d390d
child 590 360bd6b35136
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv2/raptor/python/raptor_utilities.py	Tue Oct 27 16:36:35 2009 +0000
@@ -0,0 +1,191 @@
+#
+# Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "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: 
+# raptor_utilities module
+# Useful wrapper functions and classes used in Raptor processing
+#
+
+import generic_path
+import os.path
+import re
+import sys
+
+dosSlashRegEx = re.compile(r'\\')
+unixSlashRegEx = re.compile(r'/')
+dosDriveRegEx = re.compile("^([A-Za-z]{1}):")
+
+def getOSPlatform():
+	return sys.platform.lower()
+
+def getOSFileSystem():
+	if getOSPlatform().startswith("win"):
+		return "cygwin"
+	else:
+		return "unix"
+
+def convertToUnixSlash(aReference):
+	return dosSlashRegEx.sub(r'/', aReference)
+
+def convertToDOSSlash(aReference):
+	return unixSlashRegEx.sub(r'\\', aReference)
+
+def absPathFromPath(aPathRoot, aReference):
+	pathRoot = convertToUnixSlash(aPathRoot)
+	reference = convertToUnixSlash(aReference)
+	
+	if os.path.isabs(reference):
+		reference = reference.lstrip(r'/')
+	
+	joined = os.path.join(pathRoot, reference)
+	
+	return os.path.abspath(joined)
+   
+
+def absPathFromFile(aFileRoot, aReference):
+	pathRoot = os.path.dirname(aFileRoot)
+	return absPathFromPath(pathRoot, aReference)
+
+def sanitise(aPotentialFilename):
+	"Take a string and return a version suitable for use as a filename."
+	return re.sub("(\\\\|\/|:|;| )", "_", aPotentialFilename)
+
+def resolveSymbianPath(aFileRoot, aReference, aMainType="", aSubType="", aEPOCROOT="$(EPOCROOT)"):
+	""" Convert raw Symbian metadata path/file references into absolute makefile references, or list of references
+
+	<drive>-prefix	: maps to an emulated drive depending on the following cases:
+							(a) If the drive is C:, it maps to the *two* locations
+								$(EPOCROOT)/epoc32/data/<drive>/<path> and
+								$(EPOCROOT)/epoc32/winscw/<drive>/<path>
+							(b) If the drive is A:, B:, or D: to Z:, it maps to the *three* locations
+								$(EPOCROOT)/epoc32/data/<drive>/<path> and
+								$(EPOCROOT)/epoc32/release/winscw/udeb/<drive>/<path> and
+								$(EPOCROOT)/epoc32/release/winscw/urel/<drive>/<path>
+	Absolute 		: true absolute if:
+							(a) PRJ_*EXPORTS destination or DEFFILE location and
+							(b) not starting with an 'epoc32'
+						otherwise relative to $(EPOCROOT)
+	Relative 		: relative to $(EPOCROOT)/epoc32/include if:
+							(a) PRJ_EXPORTS destination and
+							(b) not a :zip statement,
+					  relative to $(EPOCROOT) if:
+							(a) PRJ_(TEST)EXPORTS destination and
+							(b) a :zip statement,
+						otherwise relative to aFileRoot
+	|-prefix 		: relative to aFileRoot
+	+-prefix 		: relative to $(EPOCROOT)/epoc32"""
+	
+	# Both reference and fileroot can have backslashes - so convert them.
+	reference = convertToUnixSlash(aReference)
+	fileroot = convertToUnixSlash(aFileRoot)
+	
+	# Remove Trailing backslashes so that the expansions doesnt mess up the shell
+	if reference.endswith('/') and len(reference) > 1:
+		reference = reference.rstrip('/')
+
+	emulatedDrive = dosDriveRegEx.match(reference)	
+	if emulatedDrive:
+		# Emulated drive C:/ Z:/ and the like
+		# C: drive 
+		if reference.lower().startswith("c"):
+			resolvedPath = []
+			resolvedPath.append(dosDriveRegEx.sub(aEPOCROOT+'/epoc32/data/'+emulatedDrive.group(1), reference))
+			resolvedPath.append(dosDriveRegEx.sub(aEPOCROOT+'/epoc32/winscw/'+emulatedDrive.group(1), reference))
+		else: # Other letters: A, B and D to Z
+			resolvedPath = []
+			resolvedPath.append(dosDriveRegEx.sub(aEPOCROOT+'/epoc32/data/'+emulatedDrive.group(1), reference))
+			resolvedPath.append(dosDriveRegEx.sub(aEPOCROOT+'/epoc32/release/winscw/udeb/'+emulatedDrive.group(1), reference))
+			resolvedPath.append(dosDriveRegEx.sub(aEPOCROOT+'/epoc32/release/winscw/urel/'+emulatedDrive.group(1), reference))
+	elif os.path.isabs(reference):
+		# Absolute
+		if re.search("(DEFFILE|PRJ_(TEST)?EXPORTS)", aMainType, re.I) and not re.search("^\/epoc32\/", reference, re.I):
+			# Ensures prepending of drive if on Windows
+			resolvedPath = os.path.abspath(reference)
+		else:
+			resolvedPath = aEPOCROOT + reference
+		
+	elif reference.startswith("+"):
+		# '+' prefix
+		reference = reference.lstrip(r'+')
+		resolvedPath = aEPOCROOT + '/epoc32'+reference
+	elif reference.startswith("|"):
+		# '|' prefix
+		reference = reference.lstrip(r'|')
+		resolvedPath = absPathFromFile(fileroot, reference)
+	else:
+		# Relative
+		if aMainType == "PRJ_EXPORTS" and aSubType != ":zip":
+			resolvedPath = aEPOCROOT + '/epoc32/include/'+reference
+		elif aSubType == ":zip":
+			resolvedPath = aEPOCROOT + '/' + reference
+		else:
+			resolvedPath = absPathFromFile(fileroot, aReference)
+	
+	if isinstance(resolvedPath, list):
+		# In this case, this is a list of export destinations, 
+		makefilePath = map(lambda x: str(generic_path.Path(x)), resolvedPath)
+	else:
+		makefilePath = str(generic_path.Path(resolvedPath))
+	
+	return makefilePath # Note this is either a list of strings, or a single string
+
+
+class ExternalTool(object):
+	""" Generic wrapper for an external tool
+	
+	Provides the basic means to wrap up a tool that is external to Raptor with a
+	consistent interface for both invocation and the capture of output."""
+	
+	def __init__(self, aTool):
+		self.__Tool = aTool
+		self.__Output = []
+
+	def call(self, aArgs):		
+		print "RUNNNING: %s %s" %(self.__Tool, aArgs)
+		(input, output) = os.popen2(self.__Tool + " " + aArgs)
+		self.__Output = output.read()
+		return output.close() 
+	
+	def getTool(self):
+		return self.__Tool
+
+	def getOutput(self):
+		return self.__Output
+		
+	def getOutputLines(self):
+		return self.__Output.split("\n")
+
+
+class NullLog(object):
+	""" If your class has these methods then it can act as a log """
+	def Info(self, format, *extras):
+		"Send an information message to the configured channel"
+		return
+
+	def ClockInfo(self):
+		"Print a timestamp in seconds"
+		return
+
+	def Debug(self, format, *extras):
+		"Send a debugging message to the configured channel"
+		return
+
+	def Warn(self, format, *extras):
+		"Send a warning message to the configured channel"
+		return
+
+	def Error(self, format, *extras):
+		"Send an error message to the configured channel"
+		return
+
+nulllog = NullLog()