forked from OSchip/llvm-project
Get the python scripting interface working on Windows.
This patch fixes a number of issues with embedded Python on Windows. In particular: 1) The script that builds the python modules was normalizing the case of python filenames during copies. The module name is the filename, and is case-sensitive, so this was breaking code. 2) Changes the build to not attempt to link against python27.lib (e.g. the release library) when linking against msvcrt debug library. Doing a debug build of LLDB with embedded python support now requires you to provide your own self-compiled debug version of python. 3) Don't import termios when initializing the interpreter. This is part of a larger effort to remove the dependency on termios since it is not available on Windows. This particular instance was unnecessary and unused. Reviewed by: Todd Fiala Differential Revision: http://reviews.llvm.org/D4441 llvm-svn: 212785
This commit is contained in:
parent
0902a51baf
commit
0ab4b48992
|
@ -108,10 +108,6 @@ macro(add_lldb_definitions)
|
|||
endmacro(add_lldb_definitions)
|
||||
|
||||
if (NOT LLDB_DISABLE_PYTHON)
|
||||
if (MSVC)
|
||||
# this definition will stop python from auto linking python27_d.lib when Python.h is included
|
||||
add_definitions( -DSWIG_PYTHON_INTERPRETER_NO_DEBUG )
|
||||
endif()
|
||||
find_package(PythonLibs REQUIRED)
|
||||
include_directories(${PYTHON_INCLUDE_DIRS})
|
||||
endif()
|
||||
|
|
|
@ -15,44 +15,17 @@
|
|||
#ifdef LLDB_DISABLE_PYTHON
|
||||
// Python is disabled in this build
|
||||
#else
|
||||
// If this is a visual studio build
|
||||
#if defined( _MSC_VER )
|
||||
// Special case for debug build since python unfortunately
|
||||
// adds library to the linker path through a #pragma directive
|
||||
#if defined( _DEBUG )
|
||||
// Python forces a header link to python27_d.lib when building debug.
|
||||
// To get around this (because most python packages for Windows
|
||||
// don't come with debug python libraries), we undefine _DEBUG, include
|
||||
// python.h and then restore _DEBUG.
|
||||
|
||||
// The problem with this is that any system level headers included from
|
||||
// python.h were also effectively included in 'release' mode when we undefined
|
||||
// _DEBUG. To work around this we include headers that python includes
|
||||
// before undefining _DEBUG.
|
||||
# include <stdlib.h>
|
||||
// Undefine to force python to link against the release distro
|
||||
# undef _DEBUG
|
||||
# include <Python.h>
|
||||
# define _DEBUG
|
||||
|
||||
#else
|
||||
#include <Python.h>
|
||||
#endif
|
||||
|
||||
#else
|
||||
#if defined(__linux__)
|
||||
// features.h will define _POSIX_C_SOURCE if _GNU_SOURCE is defined. This value
|
||||
// may be different from the value that Python defines it to be which results
|
||||
// in a warning. Undefine _POSIX_C_SOURCE before including Python.h The same
|
||||
// holds for _XOPEN_SOURCE.
|
||||
#undef _POSIX_C_SOURCE
|
||||
#undef _XOPEN_SOURCE
|
||||
#endif
|
||||
|
||||
// Include python for non windows machines
|
||||
#include <Python.h>
|
||||
|
||||
#if defined(__linux__)
|
||||
// features.h will define _POSIX_C_SOURCE if _GNU_SOURCE is defined. This value
|
||||
// may be different from the value that Python defines it to be which results
|
||||
// in a warning. Undefine _POSIX_C_SOURCE before including Python.h The same
|
||||
// holds for _XOPEN_SOURCE.
|
||||
#undef _POSIX_C_SOURCE
|
||||
#undef _XOPEN_SOURCE
|
||||
#endif
|
||||
|
||||
// Include python for non windows machines
|
||||
#include <Python.h>
|
||||
#endif // LLDB_DISABLE_PYTHON
|
||||
|
||||
#endif // LLDB_lldb_python_h_
|
||||
|
|
|
@ -71,7 +71,7 @@ strMsgFrameWkPyExists = "Python output folder '%s' already exists";
|
|||
strMsgFrameWkPyMkDir = "Python output folder '%s' will be created";
|
||||
strErrMsgCreateFrmWkPyDirFailed = "Unable to create directory '%s' error: %s";
|
||||
strMsglldbsoExists = "Symlink '%s' already exists";
|
||||
strMsglldbsoMk = "Creating symlink for _lldb.so";
|
||||
strMsglldbsoMk = "Creating symlink for _lldb.so (%s -> %s)";
|
||||
strErrMsgCpLldbpy = "copying lldb to lldb package directory";
|
||||
strErrMsgCreatePyPkgMissingSlash = "Parameter 3 fn create_py_pkg() missing slash";
|
||||
strErrMsgMkLinkExecute = "Command mklink failed: %s";
|
||||
|
@ -135,7 +135,6 @@ def create_py_pkg( vDictArgs, vstrFrameworkPythonDir, vstrPkgDir, vListPkgFiles
|
|||
|
||||
strPkgName = vstrPkgDir;
|
||||
strPkgName = "lldb" + strPkgName.replace( "/", "." );
|
||||
strPkgName = os.path.normcase( strPkgName );
|
||||
|
||||
strPkgDir = vstrFrameworkPythonDir;
|
||||
strPkgDir += vstrPkgDir;
|
||||
|
@ -148,10 +147,9 @@ def create_py_pkg( vDictArgs, vstrFrameworkPythonDir, vstrPkgDir, vListPkgFiles
|
|||
|
||||
for strPkgFile in vListPkgFiles:
|
||||
if os.path.exists( strPkgFile ) and os.path.isfile( strPkgFile ):
|
||||
strPyFile = os.path.normcase( strPkgFile );
|
||||
if bDbg:
|
||||
print(strMsgCreatePyPkgCopyPkgFile % (strPkgFile, strPkgDir));
|
||||
shutil.copy( strPyFile, strPkgDir );
|
||||
shutil.copy( strPkgFile, strPkgDir );
|
||||
|
||||
# Create a packet init files if there wasn't one
|
||||
strPkgIniFile = strPkgDir + "/__init__.py";
|
||||
|
@ -162,8 +160,7 @@ def create_py_pkg( vDictArgs, vstrFrameworkPythonDir, vstrPkgDir, vListPkgFiles
|
|||
strPyScript = "__all__ = [";
|
||||
strDelimiter = "";
|
||||
for strPkgFile in vListPkgFiles:
|
||||
strPyFile = os.path.normcase( strPkgFile );
|
||||
if os.path.exists( strPyFile ) and os.path.isfile( strPyFile ):
|
||||
if os.path.exists( strPkgFile ) and os.path.isfile( strPkgFile ):
|
||||
strBaseName = os.path.basename( strPkgFile );
|
||||
nPos = strBaseName.find( "." );
|
||||
if nPos != -1:
|
||||
|
@ -257,7 +254,7 @@ def make_symlink_windows( vDictArgs, vstrFrameworkPythonDir, vstrDllName ):
|
|||
return (bOk, strMsg);
|
||||
|
||||
if bDbg:
|
||||
print strMsglldbsoMk;
|
||||
print strMsglldbsoMk % (os.path.abspath(strSrc), os.path.abspath(strTarget));
|
||||
|
||||
try:
|
||||
csl = ctypes.windll.kernel32.CreateHardLinkW
|
||||
|
|
|
@ -327,6 +327,18 @@ endif ()
|
|||
# FIXME: implement svn/git revision and repository parsing solution on Windows. There is an SVN-only
|
||||
# revision parsing solution in tools/clang/lib/Basic/CMakelists.txt.
|
||||
|
||||
if ( LLDB_ENABLE_PYTHON_SCRIPTS_SWIG_API_GENERATION )
|
||||
# Add a Post-Build Event to copy over Python files and create the symlink to liblldb.so for the Python API(hardlink on Windows)
|
||||
if ( NOT LLDB_DISABLE_PYTHON )
|
||||
message("Adding post build step to run finishSwigWrapperClasses.py")
|
||||
add_custom_command( TARGET liblldb
|
||||
POST_BUILD
|
||||
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/finishSwigWrapperClasses.py
|
||||
COMMAND python ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/finishSwigWrapperClasses.py "--srcRoot=${LLDB_SOURCE_DIR}" "--targetDir=${CMAKE_CURRENT_BINARY_DIR}/../scripts" "--cfgBldDir=${CMAKE_CURRENT_BINARY_DIR}/../scripts" "--prefix=${CMAKE_BINARY_DIR}" "--cmakeBuildConfiguration=${CMAKE_CFG_INTDIR}" -m
|
||||
COMMENT "Python script sym-linking LLDB Python API")
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
install(TARGETS liblldb
|
||||
RUNTIME DESTINATION bin
|
||||
LIBRARY DESTINATION lib
|
||||
|
|
|
@ -2621,7 +2621,7 @@ ScriptInterpreterPython::InitializePrivate ()
|
|||
}
|
||||
}
|
||||
|
||||
PyRun_SimpleString ("sys.dont_write_bytecode = 1; import lldb.embedded_interpreter; from lldb.embedded_interpreter import run_python_interpreter; from lldb.embedded_interpreter import run_one_line; from termios import *");
|
||||
PyRun_SimpleString ("sys.dont_write_bytecode = 1; import lldb.embedded_interpreter; from lldb.embedded_interpreter import run_python_interpreter; from lldb.embedded_interpreter import run_one_line");
|
||||
|
||||
if (threads_already_initialized) {
|
||||
if (log)
|
||||
|
|
Loading…
Reference in New Issue