""" Python SWIG post process script for each language

	--------------------------------------------------------------------------
	File: 			finishSwigPythonLLDB.py

	Overview: 		Python script(s) to post process SWIG Python C++ Script 
					Bridge wrapper code on the Windows/LINUX/OSX platform.    
					The Python scripts are equivalent to the shell script (.sh)  
					files.
					For the Python script interpreter (external to liblldb) to 
					be able to import and use the lldb module, there must be 
					two files, lldb.py and _lldb.so, that it can find. lldb.py 
					is generated by SWIG at the same time it generates the C++ 
					file.  _lldb.so is actually a symlink file that points to 
					the LLDB shared library/framework.
					The Python script interpreter needs to be able to 
					automatically find these two files. On Darwin systems it 
					searches in the LLDB.framework, as well as in all the normal 
					Python search paths.  On non-Darwin systems these files will 
					need to be put some place where Python will find them.
					This shell script creates the _lldb.so symlink in the 
					appropriate place, and copies the lldb.py (and 
					embedded_interpreter.py) file to the correct directory.
				
	Environment:	OS:			Windows Vista or newer, LINUX, OSX.
					IDE: 	    Visual Studio 2013 Plugin Python Tools (PTVS)
					Script:		Python 2.6/2.7.5 x64 
					Other:		None.

	Gotchas:		Python debug complied pythonXX_d.lib is required for SWIG
					to build correct LLDBWrapperPython.cpp in order for Visual
					Studio to compile successfully. The release version of the 
					Python lib will not work (20/12/2013). 
					LLDB (dir) CMakeLists.txt uses windows environmental
					variables $PYTHON_INCLUDE and $PYTHON_LIB to locate
					Python files required for the build.

	Copyright:		None.
	--------------------------------------------------------------------------
	
"""

# Python modules:
import os			# Provide directory and file handling, determine OS information
import sys			# System specific parameters and functions
import errno		# OS error results
import shutil		# High-level operations on files and collections of files
import subprocess 	# Call external programs
import ctypes		# Invoke Windows API for creating symlinks

# Third party modules:

# In-house modules:
import utilsOsType		# Determine the OS type this script is running on
import utilsDebug 		# Debug Python scripts

# User facing text:
strMsgOsVersion = "The current OS is %s";
strMsgPyVersion = "The Python version is %d.%d";
strErrMsgProgFail = "Program failure: ";     
strErrMsgFrameWkPyDirNotExist = "Unable to find the LLDB.framework directory '%s'";
strMsgFoundLldbFrameWkDir = "Found '%s'";
strMsgPyFileLocatedHere = "Python file will be put in '%s'";
strMsgFrameWkPyExists = "'%s' already exists";
strMsgFrameWkPyMkDir = "Making directory '%s'";
strErrMsgCreateFrmWkPyDirFailed = "Unable to create directory '%s' error: %s";
strMsglldbsoExists = "'%s' already exists";
strMsglldbsoMk = "Creating symlink for _lldb.so";
strErrMsgCpLldbpy = "copying lldb to lldb package directory";
strErrMsgCreatePyPkgMissingSlash = "Parameter 3 fn create_py_pkg() missing slash"; 
strErrMsgMkLinkExecute = "Command mklink failed: %s";
strErrMsgMakeSymlink = "creating symbolic link";
strErrMsgUnexpected = "Unexpected error: %s";
	
#++---------------------------------------------------------------------------
# Details:	Copy files needed by lldb/macosx/heap.py to build libheap.dylib.
# Args:		vDictArgs				- (R) Program input parameters.
#			vstrFrameworkPythonDir	- (R) Python framework directory.
# Returns:	Bool - True = function success, False = failure.
#			Str - Error description on task failure.
# Throws:	None.
#--
def macosx_copy_file_for_heap( vDictArgs, vstrFrameworkPythonDir ):
	dbg = utilsDebug.CDebugFnVerbose( "Python script macosx_copy_file_for_heap()" );
	bOk = True;
	strMsg = "";
	
	eOSType = utilsOsType.determine_os_type();
	if eOSType != utilsOsType.EnumOsType.Darwin:
		return (bOk, strMsg);
		
	strHeapDir = vstrFrameworkPythonDir + "/macosx/heap";
	strHeapDir = os.path.normcase( strHeapDir );
	if (os.path.exists( strHeapDir ) and os.path.isdir( strHeapDir )):
		return (bOk, strMsg);
		
	os.makedirs( strHeapDir );
	
	strRoot = vDictArgs[ "--srcRoot" ];
	strSrc = strRoot + "/examples/darwin/heap_find/heap/heap_find.cpp";
	shutil.copy( strSrc, strHeapDir );
	strSrc = strRoot + "/examples/darwin/heap_find/heap/Makefile";
	shutil.copy( strSrc, strHeapDir );
		
	return (bOk, strMsg);

#++---------------------------------------------------------------------------
# Details:	Create Python packages and Python __init__ files.
# Args:		vDictArgs				- (R) Program input parameters.
#			vstrFrameworkPythonDir	- (R) Python framework directory.
#			vstrPkgDir				- (R) Destination for copied Python files.
#			vListPkgFiles			- (R) List of source Python files.
# Returns:	Bool - True = function success, False = failure.
#			Str - Error description on task failure.
# Throws:	None.
#--
def create_py_pkg( vDictArgs, vstrFrameworkPythonDir, vstrPkgDir, vListPkgFiles ):
	dbg = utilsDebug.CDebugFnVerbose( "Python script create_py_pkg()" );
	dbg.dump_object( "Package file(s):", vListPkgFiles );
		
	bOk = True;
	strMsg = "";
	
	if vstrPkgDir.__len__() != 0 and vstrPkgDir[ 0 ] != "/":
		bOk = False;
		strMsg = strErrMsgCreatePyPkgMissingSlash;
		return (bOk, strMsg);

	strPkgName = vstrPkgDir;
	strPkgName = "lldb" + strPkgName.replace( "/", "." );
	strPkgName = os.path.normcase( strPkgName );
	
	strPkgDir = vstrFrameworkPythonDir;
	strPkgDir += vstrPkgDir;
	strPkgDir = os.path.normcase( strPkgDir );
	
	if not(os.path.exists( strPkgDir ) and os.path.isdir( strPkgDir )):
		os.makedirs( strPkgDir );
		
	for strPkgFile in vListPkgFiles:
		if os.path.exists( strPkgFile ) and os.path.isfile( strPkgFile ):
			strPyFile = os.path.normcase( strPkgFile );
			shutil.copy( strPyFile, strPkgDir );
	
	# Create a packet init files if there wasn't one
	strPkgIniFile = strPkgDir + "/__init__.py";
	strPkgIniFile = os.path.normcase( strPkgIniFile );
	if os.path.exists( strPkgIniFile ) and os.path.isfile( strPkgIniFile ):
		return (bOk, strMsg);
	
	strPyScript = "__all__ = [";
	strDelimiter = "";
	for strPkgFile in vListPkgFiles:
		strPyFile = os.path.normcase( strPkgFile );
		if os.path.exists( strPyFile ) and os.path.isfile( strPyFile ):
			strBaseName = os.path.basename( strPkgFile );
			nPos = strBaseName.find( "." );
			if nPos != -1:
				strBaseName = strBaseName[ 0 : nPos ];
			strPyScript += "%s\"%s\"" % (strDelimiter, strBaseName);
			strDelimiter = ",";
	strPyScript += "]\n";		
	strPyScript += "for x in __all__:\n";
	strPyScript += "\t__import__('%s.' + x)" % strPkgName;
	
	file = open( strPkgIniFile, "w" );
	file.write( strPyScript );
	file.close();
		
	return (bOk, strMsg);

#++---------------------------------------------------------------------------
# Details:	Copy the lldb.py file into the lldb package directory and rename 
#			to __init_.py.
# Args:		vstrFrameworkPythonDir	- (R) Python framework directory.
#			vstrCfgBldDir			- (R) Config directory path.
# Returns:	Bool - True = function success, False = failure.
#			Str - Error description on task failure.
# Throws:	None.
#--
def copy_lldbpy_file_to_lldb_pkg_dir( vstrFrameworkPythonDir, vstrCfgBldDir ):
	dbg = utilsDebug.CDebugFnVerbose( "Python script copy_lldbpy_file_to_lldb_pkg_dir()" );
	bOk = True;
	strMsg = "";
	
	strSrc = vstrCfgBldDir + "/lldb.py";
	strSrc = os.path.normcase( strSrc );
	strDst = vstrFrameworkPythonDir + "/__init__.py";
	strDst = os.path.normcase( strDst );
	
	if not os.path.exists( strSrc ):
		return (bOk, strMsg);
	
	try:
		shutil.copyfile( strSrc, strDst );
	except IOError as e:
		bOk = False;
		strMsg = "I/O error( %d ): %s %s" % (e.errno, e.strerror, strErrMsgCpLldbpy);
		if e.errno == 2:
			strMsg += " Src:'%s' Dst:'%s'" % (strSrc, strDst);
	except:
		bOk = False;
		strMsg = strErrMsgUnexpected % sys.exec_info()[ 0 ];
	
	return (bOk, strMsg);

#++---------------------------------------------------------------------------
# Details:	Make the symbolic that the script bridge for Python will need in 
# 			the Python framework directory. Code for specific to Windows.
# Args:		vDictArgs				- (R) Program input parameters.
#			vstrFrameworkPythonDir	- (R) Python framework directory.
#			vstrDllName				- (R) File name for _lldb.dll.
# Returns:	Bool - True = function success, False = failure.
#			Str - Error description on task failure.
# Throws:	None.
#--
def make_symlink_windows( vDictArgs, vstrFrameworkPythonDir, vstrDllName ):
	dbg = utilsDebug.CDebugFnVerbose( "Python script make_symlink_windows()" );
	bOk = True;
	strMsg = "";

	bDbg = vDictArgs.has_key( "-d" );
	strTarget = vstrDllName + ".pyd";
	strDLLPath = "%s\\%s" % (vstrFrameworkPythonDir, strTarget);
	strTarget = os.path.normcase( strDLLPath );
	strSrc = "";

	os.chdir( vstrFrameworkPythonDir );
	bMakeFileCalled = vDictArgs.has_key( "-m" );
	if not bMakeFileCalled:
		strSrc = os.path.normcase( "../../../LLDB" );
	else:
		strLibFileExtn = ".dll";
		strSrc = os.path.normcase( "../../../bin/liblldb%s" % strLibFileExtn );

	if os.path.isfile( strTarget ):
		if bDbg:
			print strMsglldbsoExists % strTarget;
		return (bOk, strMsg);

	if bDbg:
		print strMsglldbsoMk;
		
	try:
		csl = ctypes.windll.kernel32.CreateHardLinkW
		csl.argtypes = (ctypes.c_wchar_p, ctypes.c_wchar_p, ctypes.c_uint32)
		csl.restype = ctypes.c_ubyte
		if csl(strTarget, strSrc, 0) == 0:
			raise ctypes.WinError()
	except Exception as e:
		bOk = False;
		strMsg = "WinError( %d ): %s %s" % (e.errno, e.strerror, strErrMsgMakeSymlink);
		strMsg += " Src:'%s' Target:'%s'" % (strSrc, strTarget);

	return (bOk, strMsg);
	
#++---------------------------------------------------------------------------
# Details:	Make the symbolic link that the script bridge for Python will need in 
# 			the Python framework directory. Code for all platforms apart from
#			Windows.
# Args:		vDictArgs				- (R) Program input parameters.
#			vstrFrameworkPythonDir	- (R) Python framework directory.
#			vstrSoName				- (R) File name for _lldb.so.
# Returns:	Bool - True = function success, False = failure.
#			Str - Error description on task failure.
# Throws:	None.
#--
def make_symlink_other_platforms( vDictArgs, vstrFrameworkPythonDir, vstrSoPath ):
	dbg = utilsDebug.CDebugFnVerbose( "Python script make_symlink_other_platforms()" );
	bOk = True;
	strMsg = "";
	bDbg = vDictArgs.has_key( "-d" );
	strTarget = vstrSoPath + ".so";
	strSoPath = "%s/%s" % (vstrFrameworkPythonDir, strTarget);
	strTarget = os.path.normcase( strSoPath );
	strSrc = "";
			
	os.chdir( vstrFrameworkPythonDir );
	bMakeFileCalled = vDictArgs.has_key( "-m" );
	if not bMakeFileCalled:
		strSrc = os.path.normcase( "../../../LLDB" );
	else:
		strLibFileExtn = "";
		eOSType = utilsOsType.determine_os_type();
		if eOSType == utilsOsType.EnumOsType.Linux:
			strLibFileExtn = ".so";
		elif eOSType == utilsOsType.EnumOsType.Darwin:
			strLibFileExtn = ".dylib";
		strSrc = os.path.normcase( "../../../liblldb%s" % strLibFileExtn );

	if os.path.islink( strTarget ):
		if bDbg:
			print strMsglldbsoExists % strTarget;
		return (bOk, strMsg);
	
	if bDbg:
		print strMsglldbsoMk;
		
	try:
		os.symlink( strSrc, strTarget );
	except OSError as e:
		bOk = False;
		strMsg = "OSError( %d ): %s %s" % (e.errno, e.strerror, strErrMsgMakeSymlink);
		strMsg += " Src:'%s' Target:'%s'" % (strSrc, strTarget);
	except:
		bOk = False;
		strMsg = strErrMsgUnexpected % sys.exec_info()[ 0 ];
	
	return (bOk, strMsg);
	
#++---------------------------------------------------------------------------
# Details:	Make the symlink that the script bridge for Python will need in 
# 			the Python framework directory.
# Args:		vDictArgs				- (R) Program input parameters.
# 			vstrFrameworkPythonDir	- (R) Python framework directory.
# Returns:	Bool - True = function success, False = failure.
#			strErrMsg - Error description on task failure.
# Throws:	None.
#--
def make_symlink( vDictArgs, vstrFrameworkPythonDir ):
	dbg = utilsDebug.CDebugFnVerbose( "Python script make_symlink()" );
	bOk = True;
	strWkDir = "";
	strErrMsg = "";
	strSoFileName = "_lldb";
	 
	eOSType = utilsOsType.determine_os_type();
	if eOSType == utilsOsType.EnumOsType.Unknown:
		bOk = False;
		strErrMsg = strErrMsgOsTypeUnknown;
	elif eOSType == utilsOsType.EnumOsType.Windows:
		bOk, strErrMsg = make_symlink_windows( vDictArgs, 
											   vstrFrameworkPythonDir,
											   strSoFileName );
	else:
		bOk, strErrMsg = make_symlink_other_platforms( vDictArgs, 
													   vstrFrameworkPythonDir,
													   strSoFileName );		
	return (bOk, strErrMsg);

#++---------------------------------------------------------------------------
# Details:	Look for the directory in which to put the Python files; if it 
#			does not already exist, attempt to make it.
# Args:		vDictArgs				- (R) Program input parameters.
#			vstrFrameworkPythonDir	- (R) Python framework directory.
# Returns:	Bool - True = function success, False = failure.
#			Str - Error description on task failure.
# Throws:	None.
#--
def find_or_create_python_dir( vDictArgs, vstrFrameworkPythonDir ):
	dbg = utilsDebug.CDebugFnVerbose( "Python script find_or_create_python_dir()" );
	bOk = True;
	strMsg = "";
	bDbg = vDictArgs.has_key( "-d" );
	
	if os.path.isdir( vstrFrameworkPythonDir ):
		if bDbg:
			print strMsgFrameWkPyExists % vstrFrameworkPythonDir;
		return (bOk, strMsg);
		
	if bDbg:
		print strMsgFrameWkPyMkDir % vstrFrameworkPythonDir;
		
	try:
		os.makedirs( vstrFrameworkPythonDir );
	except OSError as exception:
		bOk = False;
		strMsg = strErrMsgCreateFrmWkPyDirFailed % (vstrFrameworkPythonDir,
													os.strerror( exception.errno ));
	
	return (bOk, strMsg);
	
#++---------------------------------------------------------------------------
# Details:	Retrieve the configuration build path if present and valid (using
#			parameter --cfgBlddir or copy the Python Framework directory.
# Args:		vDictArgs				- (R) Program input parameters.
#			vstrFrameworkPythonDir	- (R) Python framework directory.
# Returns:	Bool - True = function success, False = failure.
#			Str	- Config directory path.
#			strErrMsg - Error description on task failure.
# Throws:	None.
#--
def get_config_build_dir( vDictArgs, vstrFrameworkPythonDir ):
	dbg = utilsDebug.CDebugFnVerbose( "Python script get_config_build_dir()" );
	bOk = True;
	strErrMsg = "";
	
	strConfigBldDir = "";
	bHaveConfigBldDir = vDictArgs.has_key( "--cfgBldDir" );
	if bHaveConfigBldDir:
		strConfigBldDir = vDictArgs[ "--cfgBldDir" ];
	if (bHaveConfigBldDir == False) or (strConfigBldDir.__len__() == 0):
		strConfigBldDir = vstrFrameworkPythonDir;
	
	return (bOk, strConfigBldDir, strErrMsg);

#++---------------------------------------------------------------------------
# Details:	Determine where to put the files. Retrieve the directory path for 
#			Python's dist_packages/	site_package folder on a Windows platform.
# Args:		vDictArgs	- (R) Program input parameters.
# Returns:	Bool - True = function success, False = failure.
#			Str	- Python Framework directory path.
#			strErrMsg - Error description on task failure.
# Throws:	None.
#--
def get_framework_python_dir_windows( vDictArgs ):
	dbg = utilsDebug.CDebugFnVerbose( "Python script get_framework_python_dir_windows()" );
	bOk = True;
	strWkDir = "";
	strErrMsg = "";
	 
	# We are being built by LLVM, so use the PYTHON_INSTALL_DIR argument,
	# and append the python version directory to the end of it.  Depending 
	# on the system other stuff may need to be put here as well.
	from distutils.sysconfig import get_python_lib;
	strPythonInstallDir = "";
	bHaveArgPrefix = vDictArgs.has_key( "--prefix" );
	if bHaveArgPrefix: 
		strPythonInstallDir = vDictArgs[ "--prefix" ];

	bHaveArgCmakeBuildConfiguration = vDictArgs.has_key( "--cmakeBuildConfiguration" );
	if bHaveArgCmakeBuildConfiguration:
		strPythonInstallDir += '/' + vDictArgs[ "--cmakeBuildConfiguration" ];

	if strPythonInstallDir.__len__() != 0:
		strWkDir = get_python_lib( True, False, strPythonInstallDir );
	else:
		strWkDir = get_python_lib( True, False );
	strWkDir += "/lldb";
	strWkDir = os.path.normcase( strWkDir );
	
	return (bOk, strWkDir, strErrMsg);

#++---------------------------------------------------------------------------
# Details:	Retrieve the directory path for Python's dist_packages/
#			site_package folder on a UNIX style platform.
# Args:		vDictArgs	- (R) Program input parameters.
# Returns:	Bool - True = function success, False = failure.
#			Str	- Python Framework directory path.
#			strErrMsg - Error description on task failure.
# Throws:	None.
#--
def get_framework_python_dir_other_platforms( vDictArgs ):
	dbg = utilsDebug.CDebugFnVerbose( "Python script get_framework_python_dir_other_platform()" );
	bOk = True;
	strWkDir = "";
	strErrMsg = "";
	bDbg = vDictArgs.has_key( "-d" );
	
	bMakeFileCalled = vDictArgs.has_key( "-m" );
	if bMakeFileCalled:
		dbg.dump_text( "Built by LLVM" );
		return get_framework_python_dir_windows( vDictArgs );
	else:
		dbg.dump_text( "Built by XCode" );
		# We are being built by XCode, so all the lldb Python files can go
		# into the LLDB.framework/Resources/Python subdirectory.
		strWkDir = vDictArgs[ "--targetDir" ];
		strWkDir += "/LLDB.framework";
		if os.path.exists( strWkDir ):
			if bDbg:
				print strMsgFoundLldbFrameWkDir % strWkDir;
			strWkDir += "/Resources/Python/lldb";
			strWkDir = os.path.normcase( strWkDir );
		else:
			bOk = False;
			strErrMsg = strErrMsgFrameWkPyDirNotExist % strWkDir;	
	
	return (bOk, strWkDir, strErrMsg);

#++---------------------------------------------------------------------------
# Details:	Retrieve the directory path for Python's dist_packages/
#			site_package folder depending on the type of OS platform being 
#			used.
# Args:		vDictArgs	- (R) Program input parameters.
# Returns:	Bool - True = function success, False = failure.
#			Str	- Python Framework directory path.
#			strErrMsg - Error description on task failure.
# Throws:	None.
#--
def get_framework_python_dir( vDictArgs ):
	dbg = utilsDebug.CDebugFnVerbose( "Python script get_framework_python_dir()" );
	bOk = True;
	strWkDir = "";
	strErrMsg = "";
	 
	eOSType = utilsOsType.determine_os_type();
	if eOSType == utilsOsType.EnumOsType.Unknown:
		bOk = False;
		strErrMsg = strErrMsgOsTypeUnknown;
	elif eOSType == utilsOsType.EnumOsType.Windows:
		bOk, strWkDir, strErrMsg = get_framework_python_dir_windows( vDictArgs );
	else:
		bOk, strWkDir, strErrMsg = get_framework_python_dir_other_platforms( vDictArgs );
			
	return (bOk, strWkDir, strErrMsg);

#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------

""" Details: Program main entry point fn. Called by another Python script.
	
	--------------------------------------------------------------------------
	Details: This script is to be called by another Python script. It is not
			 intended to be called directly i.e from the command line.
	Args:	vDictArgs	- (R) Map of parameter names to values.
			-d (optional)	Determines whether or not this script 
							outputs additional information when running.
			-m (optional) 	Specify called from Makefile system. If given locate
							the LLDBWrapPython.cpp in --srcRoot/source folder 
							else in the	--targetDir folder.
			--srcRoot		The root of the lldb source tree.
			--targetDir 	Where the lldb framework/shared library gets put.
			--cfgBlddir 	Where the buildSwigPythonLLDB.py program will 
			(optional) 		put the lldb.py file it generated from running 
							SWIG.
			--prefix  		Is the root directory used to determine where 
			(optional)		third-party modules for scripting languages should 
							be installed. Where non-Darwin systems want to put 
							the .py and .so files so that Python can find them 
							automatically. Python install directory.
	Results:	0 		Success
				-100+	Error from this script to the caller script.
				-100	Error program failure with optional message.
				
	--------------------------------------------------------------------------
							
"""
def main( vDictArgs ):
	dbg = utilsDebug.CDebugFnVerbose( "Python script main()" );
	bOk = True;
	strMsg = "";
	strErrMsgProgFail = "";
	
	bDbg = vDictArgs.has_key( "-d" );
	
	eOSType = utilsOsType.determine_os_type();
	if bDbg:
		pyVersion = sys.version_info;
		print strMsgOsVersion % utilsOsType.EnumOsType.name_of( eOSType );
		print strMsgPyVersion % (pyVersion[ 0 ], pyVersion[ 1 ]);
	
	bOk, strFrameworkPythonDir, strMsg = get_framework_python_dir( vDictArgs );

	if bOk:
		bOk, strCfgBldDir, strMsg = get_config_build_dir( vDictArgs, strFrameworkPythonDir );
	if bOk and bDbg:
		print strMsgPyFileLocatedHere % strFrameworkPythonDir;
	
	if bOk:
		bOk, strMsg = find_or_create_python_dir( vDictArgs, strFrameworkPythonDir );
	
	if bOk:
		bOk, strMsg = make_symlink( vDictArgs, strFrameworkPythonDir );
	
	if bOk:
		bOk, strMsg = copy_lldbpy_file_to_lldb_pkg_dir( strFrameworkPythonDir,
														strCfgBldDir );
	strRoot = vDictArgs[ "--srcRoot" ];
	if bOk:
		# lldb
		listPkgFiles = [ strRoot + "/source/Interpreter/embedded_interpreter.py" ];
		bOk, strMsg = create_py_pkg( vDictArgs, strFrameworkPythonDir, "", listPkgFiles );
	
	if bOk:
		# lldb/formatters/cpp
		listPkgFiles = [ strRoot + "/examples/synthetic/gnu_libstdcpp.py",
						 strRoot + "/examples/synthetic/libcxx.py" ];
		bOk, strMsg = create_py_pkg( vDictArgs, strFrameworkPythonDir, "/formatters/cpp", listPkgFiles );
	
	if bOk:
		# Make an empty __init__.py in lldb/runtime as this is required for 
		# Python to recognize lldb.runtime as a valid package (and hence,
		# lldb.runtime.objc as a valid contained package)
		listPkgFiles = [];
		bOk, strMsg = create_py_pkg( vDictArgs, strFrameworkPythonDir, "/runtime", listPkgFiles );
	
	if bOk:
		# lldb/formatters
		# Having these files copied here ensure that lldb/formatters is a 
		# valid package itself
		listPkgFiles = [ strRoot + "/examples/summaries/cocoa/cache.py", 
						 strRoot + "/examples/summaries/cocoa/metrics.py",
						 strRoot + "/examples/summaries/cocoa/attrib_fromdict.py",
						 strRoot + "/examples/summaries/cocoa/Logger.py" ];
		bOk, strMsg = create_py_pkg( vDictArgs, strFrameworkPythonDir, "/formatters", listPkgFiles );
	
	if bOk:
		# lldb/utils
		listPkgFiles = [ strRoot + "/examples/python/symbolication.py" ];
		bOk, strMsg = create_py_pkg( vDictArgs, strFrameworkPythonDir, "/utils", listPkgFiles );
	
	if bOk and (eOSType == utilsOsType.EnumOsType.Darwin):
		# lldb/macosx
		listPkgFiles = [ strRoot + "/examples/python/crashlog.py",
						 strRoot + "/examples/darwin/heap_find/heap.py" ];
		bOk, strMsg = create_py_pkg( vDictArgs, strFrameworkPythonDir, "/macosx", listPkgFiles );
	
	if bOk and (eOSType == utilsOsType.EnumOsType.Darwin):
		# lldb/diagnose
		listPkgFiles = [ strRoot + "/examples/python/diagnose_unwind.py",
						 strRoot + "/examples/python/diagnose_nsstring.py" ];
		bOk, strMsg = create_py_pkg( vDictArgs, strFrameworkPythonDir, "/diagnose", listPkgFiles );
	
	if bOk:
		bOk, strMsg = macosx_copy_file_for_heap( vDictArgs, strFrameworkPythonDir );
	
	if bOk:
		return (0, strMsg );
	else:
		strErrMsgProgFail += strMsg;
		return (-100, strErrMsgProgFail );

	
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------

# This script can be called by another Python script by calling the main() 
# function directly
if __name__ == "__main__":
	print "Script cannot be called directly, called by finishSwigWrapperClasses.py";
	
