946 lines
		
	
	
		
			35 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			946 lines
		
	
	
		
			35 KiB
		
	
	
	
		
			Python
		
	
	
	
""" 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.
 | 
						|
 | 
						|
    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 shutil       # High-level operations on files and collections of files
 | 
						|
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: "
 | 
						|
strErrMsgLLDBPyFileNotNotFound = "Unable to locate lldb.py at path '%s'"
 | 
						|
strMsgCopyLLDBPy = "Copying lldb.py from '%s' to '%s'"
 | 
						|
strErrMsgFrameWkPyDirNotExist = "Unable to find the LLDB.framework directory '%s'"
 | 
						|
strMsgCreatePyPkgCopyPkgFile = "create_py_pkg: Copied file '%s' to folder '%s'"
 | 
						|
strMsgCreatePyPkgInitFile = "create_py_pkg: Creating pakage init file '%s'"
 | 
						|
strMsgCreatePyPkgMkDir = "create_py_pkg: Created folder '%s'"
 | 
						|
strMsgConfigBuildDir = "Configuration build directory located at '%s'"
 | 
						|
strMsgFoundLldbFrameWkDir = "Found '%s'"
 | 
						|
strMsgPyFileLocatedHere = "Python file will be put in '%s'"
 | 
						|
strMsgFrameWkPyExists = "Python output folder '%s' already exists"
 | 
						|
strMsgFrameWkPyMkDir = "Python output folder '%s' will be created"
 | 
						|
strErrMsgCreateFrmWkPyDirFailed = "Unable to create directory '%s' error: %s"
 | 
						|
strMsgSymlinkExists = "Symlink for '%s' already exists"
 | 
						|
strMsgSymlinkMk = "Creating symlink for %s  (%s -> %s)"
 | 
						|
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"
 | 
						|
strMsgCopySixPy = "Copying six.py from '%s' to '%s'"
 | 
						|
strErrMsgCopySixPyFailed = "Unable to copy '%s' to '%s'"
 | 
						|
 | 
						|
 | 
						|
def is_debug_interpreter():
 | 
						|
    return hasattr(sys, 'gettotalrefcount')
 | 
						|
 | 
						|
#++---------------------------------------------------------------------------
 | 
						|
# 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 = os.path.join(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 = os.path.normpath(vDictArgs["--srcRoot"])
 | 
						|
    strSrc = os.path.join(
 | 
						|
        strRoot,
 | 
						|
        "examples",
 | 
						|
        "darwin",
 | 
						|
        "heap_find",
 | 
						|
        "heap",
 | 
						|
        "heap_find.cpp")
 | 
						|
    shutil.copy(strSrc, strHeapDir)
 | 
						|
    strSrc = os.path.join(
 | 
						|
        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)
 | 
						|
    bDbg = "-d" in vDictArgs
 | 
						|
 | 
						|
    bOk = True
 | 
						|
    strMsg = ""
 | 
						|
 | 
						|
    if vstrPkgDir.__len__() != 0 and vstrPkgDir[0] != "/":
 | 
						|
        bOk = False
 | 
						|
        strMsg = strErrMsgCreatePyPkgMissingSlash
 | 
						|
        return (bOk, strMsg)
 | 
						|
 | 
						|
    strPkgName = vstrPkgDir
 | 
						|
    strPkgName = "lldb" + strPkgName.replace("/", ".")
 | 
						|
 | 
						|
    strPkgDir = vstrFrameworkPythonDir
 | 
						|
    strPkgDir += vstrPkgDir
 | 
						|
    strPkgDir = os.path.normcase(strPkgDir)
 | 
						|
 | 
						|
    if not(os.path.exists(strPkgDir) and os.path.isdir(strPkgDir)):
 | 
						|
        if bDbg:
 | 
						|
            print((strMsgCreatePyPkgMkDir % strPkgDir))
 | 
						|
        os.makedirs(strPkgDir)
 | 
						|
 | 
						|
    for strPkgFile in vListPkgFiles:
 | 
						|
        if os.path.exists(strPkgFile) and os.path.isfile(strPkgFile):
 | 
						|
            if bDbg:
 | 
						|
                print((strMsgCreatePyPkgCopyPkgFile % (strPkgFile, strPkgDir)))
 | 
						|
            shutil.copy(strPkgFile, strPkgDir)
 | 
						|
 | 
						|
    # Create a packet init files if there wasn't one
 | 
						|
    strPkgIniFile = os.path.normpath(os.path.join(strPkgDir, "__init__.py"))
 | 
						|
    if os.path.exists(strPkgIniFile) and os.path.isfile(strPkgIniFile):
 | 
						|
        return (bOk, strMsg)
 | 
						|
 | 
						|
    strPyScript = "__all__ = ["
 | 
						|
    strDelimiter = ""
 | 
						|
    for strPkgFile in vListPkgFiles:
 | 
						|
        if os.path.exists(strPkgFile) and os.path.isfile(strPkgFile):
 | 
						|
            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
 | 
						|
 | 
						|
    if bDbg:
 | 
						|
        print((strMsgCreatePyPkgInitFile % strPkgIniFile))
 | 
						|
    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:     vDictArgs               - (R) Program input parameters.
 | 
						|
#           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(
 | 
						|
        vDictArgs,
 | 
						|
        vstrFrameworkPythonDir,
 | 
						|
        vstrCfgBldDir):
 | 
						|
    dbg = utilsDebug.CDebugFnVerbose(
 | 
						|
        "Python script copy_lldbpy_file_to_lldb_pkg_dir()")
 | 
						|
    bOk = True
 | 
						|
    bDbg = "-d" in vDictArgs
 | 
						|
    strMsg = ""
 | 
						|
 | 
						|
    strSrc = os.path.join(vstrCfgBldDir, "lldb.py")
 | 
						|
    strSrc = os.path.normcase(strSrc)
 | 
						|
    strDst = os.path.join(vstrFrameworkPythonDir, "__init__.py")
 | 
						|
    strDst = os.path.normcase(strDst)
 | 
						|
 | 
						|
    if not os.path.exists(strSrc):
 | 
						|
        strMsg = strErrMsgLLDBPyFileNotNotFound % strSrc
 | 
						|
        return (bOk, strMsg)
 | 
						|
 | 
						|
    try:
 | 
						|
        if bDbg:
 | 
						|
            print((strMsgCopyLLDBPy % (strSrc, strDst)))
 | 
						|
        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 link on a Windows platform.
 | 
						|
# Args:     vstrSrcFile             - (R) Source file name.
 | 
						|
#           vstrTargetFile          - (R) Destination file name.
 | 
						|
# Returns:  Bool - True = function success, False = failure.
 | 
						|
#           Str - Error description on task failure.
 | 
						|
# Throws:   None.
 | 
						|
#--
 | 
						|
 | 
						|
 | 
						|
def make_symlink_windows(vstrSrcPath, vstrTargetPath):
 | 
						|
    print(("Making symlink from %s to %s" % (vstrSrcPath, vstrTargetPath)))
 | 
						|
    dbg = utilsDebug.CDebugFnVerbose("Python script make_symlink_windows()")
 | 
						|
    bOk = True
 | 
						|
    strErrMsg = ""
 | 
						|
    # If the src file doesn't exist, this is an error and we should throw.
 | 
						|
    src_stat = os.stat(vstrSrcPath)
 | 
						|
 | 
						|
    try:
 | 
						|
        target_stat = os.stat(vstrTargetPath)
 | 
						|
        # If the target file exists but refers to a different file, delete it so that we can
 | 
						|
        # re-create the link.  This can happen if you run this script once (creating a link)
 | 
						|
        # and then delete the source file (so that a brand new file gets created the next time
 | 
						|
        # you compile and link), and then re-run this script, so that both the target hardlink
 | 
						|
        # and the source file exist, but the target refers to an old copy of
 | 
						|
        # the source.
 | 
						|
        if (target_stat.st_ino == src_stat.st_ino) and (
 | 
						|
                target_stat.st_dev == src_stat.st_dev):
 | 
						|
            return (bOk, strErrMsg)
 | 
						|
 | 
						|
        os.remove(vstrTargetPath)
 | 
						|
    except:
 | 
						|
        # If the target file don't exist, ignore this exception, we will link
 | 
						|
        # it shortly.
 | 
						|
        pass
 | 
						|
 | 
						|
    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(vstrTargetPath, vstrSrcPath, 0) == 0:
 | 
						|
            raise ctypes.WinError()
 | 
						|
    except Exception as e:
 | 
						|
        if e.errno != 17:
 | 
						|
            bOk = False
 | 
						|
            strErrMsg = "WinError(%d): %s %s" % (
 | 
						|
                e.errno, e.strerror, strErrMsgMakeSymlink)
 | 
						|
            strErrMsg += " Src:'%s' Target:'%s'" % (
 | 
						|
                vstrSrcPath, vstrTargetPath)
 | 
						|
 | 
						|
    return (bOk, strErrMsg)
 | 
						|
 | 
						|
#++---------------------------------------------------------------------------
 | 
						|
# Details:  Make the symbolic link on a UNIX style platform.
 | 
						|
# Args:     vstrSrcFile             - (R) Source file name.
 | 
						|
#           vstrTargetFile          - (R) Destination file name.
 | 
						|
# Returns:  Bool - True = function success, False = failure.
 | 
						|
#           Str - Error description on task failure.
 | 
						|
# Throws:   None.
 | 
						|
#--
 | 
						|
 | 
						|
 | 
						|
def make_symlink_other_platforms(vstrSrcPath, vstrTargetPath):
 | 
						|
    dbg = utilsDebug.CDebugFnVerbose(
 | 
						|
        "Python script make_symlink_other_platforms()")
 | 
						|
    bOk = True
 | 
						|
    strErrMsg = ""
 | 
						|
 | 
						|
    try:
 | 
						|
        os.symlink(vstrSrcPath, vstrTargetPath)
 | 
						|
    except OSError as e:
 | 
						|
        bOk = False
 | 
						|
        strErrMsg = "OSError(%d): %s %s" % (
 | 
						|
            e.errno, e.strerror, strErrMsgMakeSymlink)
 | 
						|
        strErrMsg += " Src:'%s' Target:'%s'" % (vstrSrcPath, vstrTargetPath)
 | 
						|
    except:
 | 
						|
        bOk = False
 | 
						|
        strErrMsg = strErrMsgUnexpected % sys.exec_info()[0]
 | 
						|
 | 
						|
    return (bOk, strErrMsg)
 | 
						|
 | 
						|
 | 
						|
def make_symlink_native(vDictArgs, strSrc, strTarget):
 | 
						|
    eOSType = utilsOsType.determine_os_type()
 | 
						|
    bDbg = "-d" in vDictArgs
 | 
						|
    bOk = True
 | 
						|
    strErrMsg = ""
 | 
						|
 | 
						|
    target_filename = os.path.basename(strTarget)
 | 
						|
    if eOSType == utilsOsType.EnumOsType.Unknown:
 | 
						|
        bOk = False
 | 
						|
        strErrMsg = strErrMsgOsTypeUnknown
 | 
						|
    elif eOSType == utilsOsType.EnumOsType.Windows:
 | 
						|
        if bDbg:
 | 
						|
            print((strMsgSymlinkMk % (target_filename, strSrc, strTarget)))
 | 
						|
        bOk, strErrMsg = make_symlink_windows(strSrc,
 | 
						|
                                              strTarget)
 | 
						|
    else:
 | 
						|
        if os.path.islink(strTarget):
 | 
						|
            if bDbg:
 | 
						|
                print((strMsgSymlinkExists % target_filename))
 | 
						|
            return (bOk, strErrMsg)
 | 
						|
        if bDbg:
 | 
						|
            print((strMsgSymlinkMk % (target_filename, strSrc, strTarget)))
 | 
						|
        bOk, strErrMsg = make_symlink_other_platforms(strSrc,
 | 
						|
                                                      strTarget)
 | 
						|
 | 
						|
    return (bOk, strErrMsg)
 | 
						|
 | 
						|
#++---------------------------------------------------------------------------
 | 
						|
# Details:  Make the symbolic link.
 | 
						|
# Args:     vDictArgs               - (R) Program input parameters.
 | 
						|
#           vstrFrameworkPythonDir  - (R) Python framework directory.
 | 
						|
#           vstrSrcFile             - (R) Source file name.
 | 
						|
#           vstrTargetFile          - (R) Destination file name.
 | 
						|
# Returns:  Bool - True = function success, False = failure.
 | 
						|
#           Str - Error description on task failure.
 | 
						|
# Throws:   None.
 | 
						|
#--
 | 
						|
 | 
						|
 | 
						|
def make_symlink(
 | 
						|
        vDictArgs,
 | 
						|
        vstrFrameworkPythonDir,
 | 
						|
        vstrSrcFile,
 | 
						|
        vstrTargetFile):
 | 
						|
    dbg = utilsDebug.CDebugFnVerbose("Python script make_symlink()")
 | 
						|
    bOk = True
 | 
						|
    strErrMsg = ""
 | 
						|
    bDbg = "-d" in vDictArgs
 | 
						|
    strTarget = os.path.join(vstrFrameworkPythonDir, vstrTargetFile)
 | 
						|
    strTarget = os.path.normcase(strTarget)
 | 
						|
    strSrc = ""
 | 
						|
 | 
						|
    os.chdir(vstrFrameworkPythonDir)
 | 
						|
    bMakeFileCalled = "-m" in vDictArgs
 | 
						|
    eOSType = utilsOsType.determine_os_type()
 | 
						|
    if not bMakeFileCalled:
 | 
						|
        strBuildDir = os.path.join("..", "..", "..")
 | 
						|
    else:
 | 
						|
        # Resolve vstrSrcFile path relatively the build directory
 | 
						|
        if eOSType == utilsOsType.EnumOsType.Windows:
 | 
						|
            # On a Windows platform the vstrFrameworkPythonDir looks like:
 | 
						|
            # llvm\\build\\Lib\\site-packages\\lldb
 | 
						|
            strBuildDir = os.path.join("..", "..", "..")
 | 
						|
        else:
 | 
						|
            # On a UNIX style platform the vstrFrameworkPythonDir looks like:
 | 
						|
            # llvm/build/lib/python2.7/site-packages/lldb
 | 
						|
            strBuildDir = os.path.join("..", "..", "..", "..")
 | 
						|
    strSrc = os.path.normcase(os.path.join(strBuildDir, vstrSrcFile))
 | 
						|
 | 
						|
    return make_symlink_native(vDictArgs, strSrc, strTarget)
 | 
						|
 | 
						|
 | 
						|
#++---------------------------------------------------------------------------
 | 
						|
# Details:  Make the symbolic that the script bridge for Python will need in
 | 
						|
#           the Python framework directory.
 | 
						|
# Args:     vDictArgs               - (R) Program input parameters.
 | 
						|
#           vstrFrameworkPythonDir  - (R) Python framework directory.
 | 
						|
#           vstrLiblldbName         - (R) File name for _lldb library.
 | 
						|
#           vstrLiblldbDir          - (R) liblldb directory.
 | 
						|
# Returns:  Bool - True = function success, False = failure.
 | 
						|
#           Str - Error description on task failure.
 | 
						|
# Throws:   None.
 | 
						|
#--
 | 
						|
def make_symlink_liblldb(
 | 
						|
        vDictArgs,
 | 
						|
        vstrFrameworkPythonDir,
 | 
						|
        vstrLiblldbFileName,
 | 
						|
        vstrLldbLibDir):
 | 
						|
    dbg = utilsDebug.CDebugFnVerbose("Python script make_symlink_liblldb()")
 | 
						|
    bOk = True
 | 
						|
    strErrMsg = ""
 | 
						|
    strTarget = vstrLiblldbFileName
 | 
						|
    strSrc = ""
 | 
						|
 | 
						|
    eOSType = utilsOsType.determine_os_type()
 | 
						|
    if eOSType == utilsOsType.EnumOsType.Windows:
 | 
						|
        # When importing an extension module using a debug version of python, you
 | 
						|
        # write, for example, "import foo", but the interpreter searches for
 | 
						|
        # "foo_d.pyd"
 | 
						|
        if is_debug_interpreter():
 | 
						|
            strTarget += "_d"
 | 
						|
        strTarget += ".pyd"
 | 
						|
    else:
 | 
						|
        strTarget += ".so"
 | 
						|
 | 
						|
    bMakeFileCalled = "-m" in vDictArgs
 | 
						|
    if not bMakeFileCalled:
 | 
						|
        strSrc = "LLDB"
 | 
						|
    else:
 | 
						|
        strLibFileExtn = ""
 | 
						|
        if eOSType == utilsOsType.EnumOsType.Windows:
 | 
						|
            strSrc = os.path.join("bin", "liblldb.dll")
 | 
						|
        else:
 | 
						|
            if eOSType == utilsOsType.EnumOsType.Darwin:
 | 
						|
                strLibFileExtn = ".dylib"
 | 
						|
            else:
 | 
						|
                strLibFileExtn = ".so"
 | 
						|
            strSrc = os.path.join(vstrLldbLibDir, "liblldb" + strLibFileExtn)
 | 
						|
 | 
						|
    bOk, strErrMsg = make_symlink(
 | 
						|
        vDictArgs, vstrFrameworkPythonDir, strSrc, strTarget)
 | 
						|
 | 
						|
    return (bOk, strErrMsg)
 | 
						|
 | 
						|
#++---------------------------------------------------------------------------
 | 
						|
# Details:  Make the symbolic link to the lldb-argdumper.
 | 
						|
# Args:     vDictArgs               - (R) Program input parameters.
 | 
						|
#           vstrFrameworkPythonDir  - (R) Python framework directory.
 | 
						|
#           vstrArgdumperFileName   - (R) File name for lldb-argdumper.
 | 
						|
# Returns:  Bool - True = function success, False = failure.
 | 
						|
#           Str - Error description on task failure.
 | 
						|
# Throws:   None.
 | 
						|
#--
 | 
						|
 | 
						|
 | 
						|
def make_symlink_lldb_argdumper(
 | 
						|
        vDictArgs,
 | 
						|
        vstrFrameworkPythonDir,
 | 
						|
        vstrArgdumperFileName):
 | 
						|
    dbg = utilsDebug.CDebugFnVerbose(
 | 
						|
        "Python script make_symlink_lldb_argdumper()")
 | 
						|
    bOk = True
 | 
						|
    strErrMsg = ""
 | 
						|
    strTarget = vstrArgdumperFileName
 | 
						|
    strSrc = ""
 | 
						|
 | 
						|
    eOSType = utilsOsType.determine_os_type()
 | 
						|
    if eOSType == utilsOsType.EnumOsType.Windows:
 | 
						|
        strTarget += ".exe"
 | 
						|
 | 
						|
    bMakeFileCalled = "-m" in vDictArgs
 | 
						|
    if not bMakeFileCalled:
 | 
						|
        return (bOk, strErrMsg)
 | 
						|
    else:
 | 
						|
        strExeFileExtn = ""
 | 
						|
        if eOSType == utilsOsType.EnumOsType.Windows:
 | 
						|
            strExeFileExtn = ".exe"
 | 
						|
        strSrc = os.path.join("bin", "lldb-argdumper" + strExeFileExtn)
 | 
						|
 | 
						|
    bOk, strErrMsg = make_symlink(
 | 
						|
        vDictArgs, vstrFrameworkPythonDir, strSrc, strTarget)
 | 
						|
 | 
						|
    return (bOk, strErrMsg)
 | 
						|
 | 
						|
#++---------------------------------------------------------------------------
 | 
						|
# 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.
 | 
						|
#           vstrLldbLibDir          - (R) liblldb directory.
 | 
						|
# Returns:  Bool - True = function success, False = failure.
 | 
						|
#           strErrMsg - Error description on task failure.
 | 
						|
# Throws:   None.
 | 
						|
#--
 | 
						|
 | 
						|
 | 
						|
def create_symlinks(vDictArgs, vstrFrameworkPythonDir, vstrLldbLibDir):
 | 
						|
    dbg = utilsDebug.CDebugFnVerbose("Python script create_symlinks()")
 | 
						|
    bOk = True
 | 
						|
    strErrMsg = ""
 | 
						|
    eOSType = utilsOsType.determine_os_type()
 | 
						|
 | 
						|
    # Make symlink for _lldb
 | 
						|
    strLibLldbFileName = "_lldb"
 | 
						|
    if bOk:
 | 
						|
        bOk, strErrMsg = make_symlink_liblldb(vDictArgs,
 | 
						|
                                              vstrFrameworkPythonDir,
 | 
						|
                                              strLibLldbFileName,
 | 
						|
                                              vstrLldbLibDir)
 | 
						|
 | 
						|
    # Make symlink for lldb-argdumper
 | 
						|
    strArgdumperFileName = "lldb-argdumper"
 | 
						|
    if bOk:
 | 
						|
        bOk, strErrMsg = make_symlink_lldb_argdumper(vDictArgs,
 | 
						|
                                                     vstrFrameworkPythonDir,
 | 
						|
                                                     strArgdumperFileName)
 | 
						|
 | 
						|
    return (bOk, strErrMsg)
 | 
						|
 | 
						|
 | 
						|
def copy_six(vDictArgs, vstrFrameworkPythonDir):
 | 
						|
    dbg = utilsDebug.CDebugFnVerbose("Python script copy_six()")
 | 
						|
    bDbg = "-d" in vDictArgs
 | 
						|
    bOk = True
 | 
						|
    strMsg = ""
 | 
						|
    site_packages_dir = os.path.dirname(vstrFrameworkPythonDir)
 | 
						|
    six_module_filename = "six.py"
 | 
						|
    src_file = os.path.join(
 | 
						|
        vDictArgs['--srcRoot'],
 | 
						|
        "third_party",
 | 
						|
        "Python",
 | 
						|
        "module",
 | 
						|
        "six",
 | 
						|
        six_module_filename)
 | 
						|
    src_file = os.path.normpath(src_file)
 | 
						|
    target = os.path.join(site_packages_dir, six_module_filename)
 | 
						|
 | 
						|
    if bDbg:
 | 
						|
        print((strMsgCopySixPy % (src_file, target)))
 | 
						|
    try:
 | 
						|
        shutil.copyfile(src_file, target)
 | 
						|
    except:
 | 
						|
        bOk = False
 | 
						|
        strMsg = strErrMsgCopySixPyFailed % (src_file, target)
 | 
						|
 | 
						|
    return (bOk, strMsg)
 | 
						|
 | 
						|
#++---------------------------------------------------------------------------
 | 
						|
# 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 = "-d" in vDictArgs
 | 
						|
 | 
						|
    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 = "--cfgBldDir" in vDictArgs
 | 
						|
    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 = "--prefix" in vDictArgs
 | 
						|
    if bHaveArgPrefix:
 | 
						|
        strPythonInstallDir = os.path.normpath(vDictArgs["--prefix"])
 | 
						|
 | 
						|
    bHaveArgCmakeBuildConfiguration = "--cmakeBuildConfiguration" in vDictArgs
 | 
						|
    if bHaveArgCmakeBuildConfiguration:
 | 
						|
        strPythonInstallDir = os.path.join(
 | 
						|
            strPythonInstallDir,
 | 
						|
            vDictArgs["--cmakeBuildConfiguration"])
 | 
						|
 | 
						|
    if strPythonInstallDir.__len__() != 0:
 | 
						|
        strWkDir = get_python_lib(True, False, strPythonInstallDir)
 | 
						|
    else:
 | 
						|
        strWkDir = get_python_lib(True, False)
 | 
						|
    strWkDir = os.path.normcase(os.path.join(strWkDir, "lldb"))
 | 
						|
 | 
						|
    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 = "-d" in vDictArgs
 | 
						|
 | 
						|
    bMakeFileCalled = "-m" in vDictArgs
 | 
						|
    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 = os.path.join(strWkDir, "LLDB.framework")
 | 
						|
        if os.path.exists(strWkDir):
 | 
						|
            if bDbg:
 | 
						|
                print((strMsgFoundLldbFrameWkDir % strWkDir))
 | 
						|
            strWkDir = os.path.join(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:  Retrieve the liblldb directory path, if it exists and is valid.
 | 
						|
# Args:     vDictArgs               - (R) Program input parameters.
 | 
						|
# Returns:  Bool - True = function success, False = failure.
 | 
						|
#           Str - liblldb directory path.
 | 
						|
#           strErrMsg - Error description on task failure.
 | 
						|
# Throws:   None.
 | 
						|
#--
 | 
						|
 | 
						|
 | 
						|
def get_liblldb_dir(vDictArgs):
 | 
						|
    dbg = utilsDebug.CDebugFnVerbose("Python script get_liblldb_dir()")
 | 
						|
    bOk = True
 | 
						|
    strErrMsg = ""
 | 
						|
 | 
						|
    strLldbLibDir = ""
 | 
						|
    bHaveLldbLibDir = "--lldbLibDir" in vDictArgs
 | 
						|
    if bHaveLldbLibDir:
 | 
						|
        strLldbLibDir = vDictArgs["--lldbLibDir"]
 | 
						|
    if (bHaveLldbLibDir == False) or (strLldbLibDir.__len__() == 0):
 | 
						|
        strLldbLibDir = "lib"
 | 
						|
 | 
						|
    return (bOk, strLldbLibDir, 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.
 | 
						|
            --lldbLibDir    The name of the directory containing liblldb.so.
 | 
						|
            (optional)      "lib" by default.
 | 
						|
    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 = "-d" in vDictArgs
 | 
						|
 | 
						|
    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))
 | 
						|
        print((strMsgConfigBuildDir % strCfgBldDir))
 | 
						|
 | 
						|
    if bOk:
 | 
						|
        bOk, strLldbLibDir, strMsg = get_liblldb_dir(vDictArgs)
 | 
						|
 | 
						|
    if bOk:
 | 
						|
        bOk, strMsg = find_or_create_python_dir(
 | 
						|
            vDictArgs, strFrameworkPythonDir)
 | 
						|
 | 
						|
    if bOk:
 | 
						|
        bOk, strMsg = create_symlinks(
 | 
						|
            vDictArgs, strFrameworkPythonDir, strLldbLibDir)
 | 
						|
 | 
						|
    bUseSystemSix = "--useSystemSix" in vDictArgs
 | 
						|
 | 
						|
    if not bUseSystemSix and bOk:
 | 
						|
        bOk, strMsg = copy_six(vDictArgs, strFrameworkPythonDir)
 | 
						|
 | 
						|
    if bOk:
 | 
						|
        bOk, strMsg = copy_lldbpy_file_to_lldb_pkg_dir(vDictArgs,
 | 
						|
                                                       strFrameworkPythonDir,
 | 
						|
                                                       strCfgBldDir)
 | 
						|
    strRoot = os.path.normpath(vDictArgs["--srcRoot"])
 | 
						|
    if bOk:
 | 
						|
        # lldb
 | 
						|
        listPkgFiles = [
 | 
						|
            os.path.join(
 | 
						|
                strRoot,
 | 
						|
                "source",
 | 
						|
                "Interpreter",
 | 
						|
                "embedded_interpreter.py")]
 | 
						|
        bOk, strMsg = create_py_pkg(
 | 
						|
            vDictArgs, strFrameworkPythonDir, "", listPkgFiles)
 | 
						|
 | 
						|
    if bOk:
 | 
						|
        # lldb/formatters/cpp
 | 
						|
        listPkgFiles = [
 | 
						|
            os.path.join(
 | 
						|
                strRoot,
 | 
						|
                "examples",
 | 
						|
                "synthetic",
 | 
						|
                "gnu_libstdcpp.py"),
 | 
						|
            os.path.join(
 | 
						|
                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 = [
 | 
						|
            os.path.join(
 | 
						|
                strRoot, "examples", "summaries", "cocoa", "cache.py"), os.path.join(
 | 
						|
                strRoot, "examples", "summaries", "synth.py"), os.path.join(
 | 
						|
                strRoot, "examples", "summaries", "cocoa", "metrics.py"), os.path.join(
 | 
						|
                    strRoot, "examples", "summaries", "cocoa", "attrib_fromdict.py"), os.path.join(
 | 
						|
                        strRoot, "examples", "summaries", "cocoa", "Logger.py")]
 | 
						|
        bOk, strMsg = create_py_pkg(
 | 
						|
            vDictArgs, strFrameworkPythonDir, "/formatters", listPkgFiles)
 | 
						|
 | 
						|
    if bOk:
 | 
						|
        # lldb/utils
 | 
						|
        listPkgFiles = [
 | 
						|
            os.path.join(
 | 
						|
                strRoot,
 | 
						|
                "examples",
 | 
						|
                "python",
 | 
						|
                "symbolication.py")]
 | 
						|
        bOk, strMsg = create_py_pkg(
 | 
						|
            vDictArgs, strFrameworkPythonDir, "/utils", listPkgFiles)
 | 
						|
 | 
						|
    if bOk and (eOSType == utilsOsType.EnumOsType.Darwin):
 | 
						|
        # lldb/macosx
 | 
						|
        listPkgFiles = [
 | 
						|
            os.path.join(
 | 
						|
                strRoot,
 | 
						|
                "examples",
 | 
						|
                "python",
 | 
						|
                "crashlog.py"),
 | 
						|
            os.path.join(
 | 
						|
                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 = [
 | 
						|
            os.path.join(
 | 
						|
                strRoot,
 | 
						|
                "examples",
 | 
						|
                "python",
 | 
						|
                "diagnose_unwind.py"),
 | 
						|
            os.path.join(
 | 
						|
                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")
 |