forked from OSchip/llvm-project
769 lines
33 KiB
Python
769 lines
33 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 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: ";
|
|
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";
|
|
|
|
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 = vDictArgs.has_key( "-d" );
|
|
|
|
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 = vDictArgs.has_key( "-d" );
|
|
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 = "";
|
|
|
|
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);
|
|
|
|
#++---------------------------------------------------------------------------
|
|
# 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 = vDictArgs.has_key( "-d" );
|
|
strTarget = os.path.join(vstrFrameworkPythonDir, vstrTargetFile);
|
|
strTarget = os.path.normcase( strTarget );
|
|
strSrc = "";
|
|
|
|
os.chdir( vstrFrameworkPythonDir );
|
|
bMakeFileCalled = vDictArgs.has_key( "-m" );
|
|
eOSType = utilsOsType.determine_os_type();
|
|
if not bMakeFileCalled:
|
|
return (bOk, strErrMsg);
|
|
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));
|
|
strTargetDir = os.path.dirname(strTarget);
|
|
strSrc = os.path.relpath(os.path.abspath(strSrc), strTargetDir);
|
|
|
|
if eOSType == utilsOsType.EnumOsType.Unknown:
|
|
bOk = False;
|
|
strErrMsg = strErrMsgOsTypeUnknown;
|
|
elif eOSType == utilsOsType.EnumOsType.Windows:
|
|
if os.path.isfile( strTarget ):
|
|
if bDbg:
|
|
print strMsgSymlinkExists % vstrTargetFile;
|
|
return (bOk, strErrMsg);
|
|
if bDbg:
|
|
print strMsgSymlinkMk % (vstrTargetFile, strSrc, strTarget);
|
|
bOk, strErrMsg = make_symlink_windows( strSrc,
|
|
strTarget );
|
|
else:
|
|
if os.path.islink( strTarget ):
|
|
if bDbg:
|
|
print strMsgSymlinkExists % vstrTargetFile;
|
|
return (bOk, strErrMsg);
|
|
if bDbg:
|
|
print strMsgSymlinkMk % (vstrTargetFile, strSrc, strTarget);
|
|
bOk, strErrMsg = make_symlink_other_platforms( strSrc,
|
|
strTarget );
|
|
|
|
return (bOk, strErrMsg);
|
|
|
|
#++---------------------------------------------------------------------------
|
|
# 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.
|
|
# Returns: Bool - True = function success, False = failure.
|
|
# Str - Error description on task failure.
|
|
# Throws: None.
|
|
#--
|
|
def make_symlink_liblldb( vDictArgs, vstrFrameworkPythonDir, vstrLiblldbFileName ):
|
|
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 = vDictArgs.has_key( "-m" );
|
|
if not bMakeFileCalled:
|
|
strSrc = os.path.join("lib", "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("lib", "liblldb" + strLibFileExtn);
|
|
|
|
if eOSType != utilsOsType.EnumOsType.Windows:
|
|
# Create a symlink to the "lib" directory, to ensure liblldb's RPATH is
|
|
# effective.
|
|
bOk, strErrMsg = make_symlink( vDictArgs, vstrFrameworkPythonDir, "lib", os.path.join("../lib") );
|
|
if not bOk:
|
|
return (bOk, strErrMsg)
|
|
|
|
bOk, strErrMsg = make_symlink( vDictArgs, vstrFrameworkPythonDir, strSrc, strTarget );
|
|
|
|
return (bOk, strErrMsg);
|
|
|
|
#++---------------------------------------------------------------------------
|
|
# Details: Make the symbolic link to the darwin-debug.
|
|
# Args: vDictArgs - (R) Program input parameters.
|
|
# vstrFrameworkPythonDir - (R) Python framework directory.
|
|
# vstrDarwinDebugFileName - (R) File name for darwin-debug.
|
|
# Returns: Bool - True = function success, False = failure.
|
|
# Str - Error description on task failure.
|
|
# Throws: None.
|
|
#--
|
|
def make_symlink_darwin_debug( vDictArgs, vstrFrameworkPythonDir, vstrDarwinDebugFileName ):
|
|
dbg = utilsDebug.CDebugFnVerbose( "Python script make_symlink_darwin_debug()" );
|
|
bOk = True;
|
|
strErrMsg = "";
|
|
strTarget = vstrDarwinDebugFileName;
|
|
strSrc = "";
|
|
|
|
bMakeFileCalled = vDictArgs.has_key( "-m" );
|
|
if not bMakeFileCalled:
|
|
return (bOk, strErrMsg);
|
|
else:
|
|
strSrc = os.path.join("bin", "lldb-launcher");
|
|
|
|
bOk, strErrMsg = make_symlink( vDictArgs, vstrFrameworkPythonDir, strSrc, strTarget );
|
|
|
|
return (bOk, strErrMsg);
|
|
|
|
#++---------------------------------------------------------------------------
|
|
# Details: Make the symbolic link to the argdumper.
|
|
# Args: vDictArgs - (R) Program input parameters.
|
|
# vstrFrameworkPythonDir - (R) Python framework directory.
|
|
# vstrArgdumperFileName - (R) File name for argdumper.
|
|
# Returns: Bool - True = function success, False = failure.
|
|
# Str - Error description on task failure.
|
|
# Throws: None.
|
|
#--
|
|
def make_symlink_argdumper( vDictArgs, vstrFrameworkPythonDir, vstrArgdumperFileName ):
|
|
dbg = utilsDebug.CDebugFnVerbose( "Python script make_symlink_argdumper()" );
|
|
bOk = True;
|
|
strErrMsg = "";
|
|
strTarget = vstrArgdumperFileName;
|
|
strSrc = "";
|
|
|
|
eOSType = utilsOsType.determine_os_type();
|
|
if eOSType == utilsOsType.EnumOsType.Windows:
|
|
strTarget += ".exe";
|
|
|
|
bMakeFileCalled = vDictArgs.has_key( "-m" );
|
|
if not bMakeFileCalled:
|
|
return (bOk, strErrMsg);
|
|
else:
|
|
strExeFileExtn = "";
|
|
if eOSType == utilsOsType.EnumOsType.Windows:
|
|
strExeFileExtn = ".exe";
|
|
strSrc = os.path.join("bin", "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.
|
|
# Returns: Bool - True = function success, False = failure.
|
|
# strErrMsg - Error description on task failure.
|
|
# Throws: None.
|
|
#--
|
|
def create_symlinks( vDictArgs, vstrFrameworkPythonDir ):
|
|
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 );
|
|
|
|
# Make symlink for darwin-debug on Darwin
|
|
strDarwinDebugFileName = "darwin-debug"
|
|
if bOk and eOSType == utilsOsType.EnumOsType.Darwin:
|
|
bOk, strErrMsg = make_symlink_darwin_debug( vDictArgs,
|
|
vstrFrameworkPythonDir,
|
|
strDarwinDebugFileName );
|
|
|
|
# Make symlink for argdumper
|
|
strArgdumperFileName = "argdumper"
|
|
if bOk:
|
|
bOk, strErrMsg = make_symlink_argdumper( vDictArgs,
|
|
vstrFrameworkPythonDir,
|
|
strArgdumperFileName );
|
|
|
|
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 = os.path.normpath(vDictArgs[ "--prefix" ]);
|
|
|
|
bHaveArgCmakeBuildConfiguration = vDictArgs.has_key( "--cmakeBuildConfiguration" );
|
|
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 = 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 += 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: 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;
|
|
print strMsgConfigBuildDir % strCfgBldDir;
|
|
|
|
if bOk:
|
|
bOk, strMsg = find_or_create_python_dir( vDictArgs, strFrameworkPythonDir );
|
|
|
|
if bOk:
|
|
bOk, strMsg = create_symlinks( 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", "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";
|
|
|