Author: zturner
Date: Thu Jul 10 18:47:42 2014
New Revision: 212785

URL: http://llvm.org/viewvc/llvm-project?rev=212785&view=rev
Log:
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

Modified:
    lldb/trunk/CMakeLists.txt
    lldb/trunk/include/lldb/lldb-python.h
    lldb/trunk/scripts/Python/finishSwigPythonLLDB.py
    lldb/trunk/source/CMakeLists.txt
    lldb/trunk/source/Interpreter/ScriptInterpreterPython.cpp

Modified: lldb/trunk/CMakeLists.txt
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/CMakeLists.txt?rev=212785&r1=212784&r2=212785&view=diff
==============================================================================
--- lldb/trunk/CMakeLists.txt (original)
+++ lldb/trunk/CMakeLists.txt Thu Jul 10 18:47:42 2014
@@ -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()

Modified: lldb/trunk/include/lldb/lldb-python.h
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-python.h?rev=212785&r1=212784&r2=212785&view=diff
==============================================================================
--- lldb/trunk/include/lldb/lldb-python.h (original)
+++ lldb/trunk/include/lldb/lldb-python.h Thu Jul 10 18:47:42 2014
@@ -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_

Modified: lldb/trunk/scripts/Python/finishSwigPythonLLDB.py
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/finishSwigPythonLLDB.py?rev=212785&r1=212784&r2=212785&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/finishSwigPythonLLDB.py (original)
+++ lldb/trunk/scripts/Python/finishSwigPythonLLDB.py Thu Jul 10 18:47:42 2014
@@ -71,7 +71,7 @@ strMsgFrameWkPyExists = "Python output f
 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, vstrFramew
 
        strPkgName = vstrPkgDir;
        strPkgName = "lldb" + strPkgName.replace( "/", "." );
-       strPkgName = os.path.normcase( strPkgName );
        
        strPkgDir = vstrFrameworkPythonDir;
        strPkgDir += vstrPkgDir;
@@ -148,10 +147,9 @@ def create_py_pkg( vDictArgs, vstrFramew
                
        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, vstrFramew
        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, vst
                return (bOk, strMsg);
 
        if bDbg:
-               print strMsglldbsoMk;
+               print strMsglldbsoMk % (os.path.abspath(strSrc), 
os.path.abspath(strTarget));
                
        try:
                csl = ctypes.windll.kernel32.CreateHardLinkW

Modified: lldb/trunk/source/CMakeLists.txt
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/CMakeLists.txt?rev=212785&r1=212784&r2=212785&view=diff
==============================================================================
--- lldb/trunk/source/CMakeLists.txt (original)
+++ lldb/trunk/source/CMakeLists.txt Thu Jul 10 18:47:42 2014
@@ -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

Modified: lldb/trunk/source/Interpreter/ScriptInterpreterPython.cpp
URL: 
http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/ScriptInterpreterPython.cpp?rev=212785&r1=212784&r2=212785&view=diff
==============================================================================
--- lldb/trunk/source/Interpreter/ScriptInterpreterPython.cpp (original)
+++ lldb/trunk/source/Interpreter/ScriptInterpreterPython.cpp Thu Jul 10 
18:47:42 2014
@@ -2621,7 +2621,7 @@ ScriptInterpreterPython::InitializePriva
         }
     }
 
-    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)


_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits

Reply via email to