[Lldb-commits] [lldb] r373991 - [lldb] Unifying lldb python path
Haibo Huang via lldb-commits
lldb-commits at lists.llvm.org
Mon Oct 7 16:49:01 PDT 2019
Author: hhb
Date: Mon Oct 7 16:49:01 2019
New Revision: 373991
URL: http://llvm.org/viewvc/llvm-project?rev=373991&view=rev
Log:
[lldb] Unifying lldb python path
Based on mgorny@'s D67890
There are 3 places where python site-package path is calculated
independently:
1. finishSwigPythonLLDB.py where files are written to site-packages.
2. lldb/scripts/CMakeLists.txt where site-packages are installed.
3. ScriptInterpreterPython.cpp where site-packages are added to
PYTHONPATH.
This change creates the path once and use it everywhere. So that they
will not go out of sync.
Also it provides a chance for cross compiling users to specify the right
path for site-packages.
Subscribers: lldb-commits
Tags: #lldb
Differential Revision: https://reviews.llvm.org/D68442
Removed:
lldb/trunk/scripts/get_relative_lib_dir.py
Modified:
lldb/trunk/CMakeLists.txt
lldb/trunk/scripts/CMakeLists.txt
lldb/trunk/scripts/Python/finishSwigPythonLLDB.py
lldb/trunk/scripts/finishSwigWrapperClasses.py
lldb/trunk/source/Plugins/ScriptInterpreter/Python/CMakeLists.txt
lldb/trunk/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
lldb/trunk/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h
Modified: lldb/trunk/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/CMakeLists.txt?rev=373991&r1=373990&r2=373991&view=diff
==============================================================================
--- lldb/trunk/CMakeLists.txt (original)
+++ lldb/trunk/CMakeLists.txt Mon Oct 7 16:49:01 2019
@@ -37,6 +37,16 @@ if (WIN32)
endif()
if (NOT LLDB_DISABLE_PYTHON)
+ execute_process(
+ COMMAND ${PYTHON_EXECUTABLE}
+ -c "import distutils.sysconfig; print(distutils.sysconfig.get_python_lib(False, False, ''))"
+ OUTPUT_VARIABLE LLDB_PYTHON_DEFAULT_RELATIVE_PATH
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+
+ file(TO_CMAKE_PATH ${LLDB_PYTHON_DEFAULT_RELATIVE_PATH} LLDB_PYTHON_DEFAULT_RELATIVE_PATH)
+ set(LLDB_PYTHON_RELATIVE_PATH ${LLDB_PYTHON_DEFAULT_RELATIVE_PATH}
+ CACHE STRING "Path where Python modules are installed, relative to install prefix")
+
add_subdirectory(scripts)
endif ()
@@ -195,6 +205,12 @@ if (NOT LLDB_DISABLE_PYTHON)
get_target_property(lldb_scripts_dir swig_wrapper BINARY_DIR)
get_target_property(liblldb_build_dir liblldb LIBRARY_OUTPUT_DIRECTORY)
+ if(LLDB_BUILD_FRAMEWORK)
+ set(lldb_python_build_path "${liblldb_build_dir}/LLDB.framework/Resources/Python/lldb")
+ else()
+ set(lldb_python_build_path "${CMAKE_BINARY_DIR}/${LLDB_PYTHON_RELATIVE_PATH}/lldb")
+ endif()
+
# Add a Post-Build Event to copy over Python files and create the symlink
# to liblldb.so for the Python API(hardlink on Windows).
add_custom_target(finish_swig ALL
@@ -206,6 +222,7 @@ if (NOT LLDB_DISABLE_PYTHON)
--prefix=${CMAKE_BINARY_DIR}
--cmakeBuildConfiguration=${CMAKE_CFG_INTDIR}
--lldbLibDir=lib${LLVM_LIBDIR_SUFFIX}
+ --lldbPythonPath=${lldb_python_build_path}
${use_python_wrapper_from_src_dir}
${use_six_py_from_system}
VERBATIM
@@ -219,6 +236,20 @@ if (NOT LLDB_DISABLE_PYTHON)
# Ensure we do the python post-build step when building lldb.
add_dependencies(lldb finish_swig)
+ if(NOT LLDB_BUILD_FRAMEWORK)
+ # Install the LLDB python module
+ add_custom_target(lldb-python-scripts)
+ add_dependencies(lldb-python-scripts finish_swig)
+ install(DIRECTORY ${CMAKE_BINARY_DIR}/${LLDB_PYTHON_RELATIVE_PATH}/
+ DESTINATION ${LLDB_PYTHON_RELATIVE_PATH}
+ COMPONENT lldb-scripts)
+ if (NOT LLVM_ENABLE_IDE)
+ add_llvm_install_targets(install-lldb-python-scripts
+ COMPONENT lldb-python-scripts
+ DEPENDS lldb-python-scripts)
+ endif()
+ endif()
+
# Add a Post-Build Event to copy the custom Python DLL to the lldb binaries dir so that Windows can find it when launching
# lldb.exe or any other executables that were linked with liblldb.
if (WIN32 AND NOT "${PYTHON_DLL}" STREQUAL "")
Modified: lldb/trunk/scripts/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/CMakeLists.txt?rev=373991&r1=373990&r2=373991&view=diff
==============================================================================
--- lldb/trunk/scripts/CMakeLists.txt (original)
+++ lldb/trunk/scripts/CMakeLists.txt Mon Oct 7 16:49:01 2019
@@ -55,28 +55,3 @@ add_custom_target(swig_wrapper ALL DEPEN
${CMAKE_CURRENT_BINARY_DIR}/lldb.py
)
-if(NOT LLDB_BUILD_FRAMEWORK)
- execute_process(
- COMMAND ${PYTHON_EXECUTABLE}
- -c "import distutils.sysconfig, sys; print(distutils.sysconfig.get_python_lib(True, False, sys.argv[1]))"
- ${CMAKE_BINARY_DIR}
- OUTPUT_VARIABLE SWIG_PYTHON_DIR
- OUTPUT_STRIP_TRAILING_WHITESPACE)
- execute_process(
- COMMAND ${PYTHON_EXECUTABLE}
- -c "import distutils.sysconfig; print(distutils.sysconfig.get_python_lib(True, False, ''))"
- OUTPUT_VARIABLE SWIG_INSTALL_DIR
- OUTPUT_STRIP_TRAILING_WHITESPACE)
-
- # Install the LLDB python module
- add_custom_target(lldb-python-scripts)
- add_dependencies(lldb-python-scripts finish_swig)
- install(DIRECTORY ${SWIG_PYTHON_DIR}/
- DESTINATION ${SWIG_INSTALL_DIR}
- COMPONENT lldb-scripts)
- if (NOT LLVM_ENABLE_IDE)
- add_llvm_install_targets(install-lldb-python-scripts
- COMPONENT lldb-python-scripts
- DEPENDS lldb-python-scripts)
- endif()
-endif()
Modified: lldb/trunk/scripts/Python/finishSwigPythonLLDB.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/finishSwigPythonLLDB.py?rev=373991&r1=373990&r2=373991&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/finishSwigPythonLLDB.py (original)
+++ lldb/trunk/scripts/Python/finishSwigPythonLLDB.py Mon Oct 7 16:49:01 2019
@@ -597,86 +597,6 @@ def get_config_build_dir(vDictArgs, vstr
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/
@@ -694,19 +614,8 @@ 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)
-
+ strWkDir = os.path.normpath(vDictArgs["--lldbPythonPath"])
return (bOk, strWkDir, strErrMsg)
#++---------------------------------------------------------------------------
Modified: lldb/trunk/scripts/finishSwigWrapperClasses.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/finishSwigWrapperClasses.py?rev=373991&r1=373990&r2=373991&view=diff
==============================================================================
--- lldb/trunk/scripts/finishSwigWrapperClasses.py (original)
+++ lldb/trunk/scripts/finishSwigWrapperClasses.py Mon Oct 7 16:49:01 2019
@@ -179,6 +179,7 @@ def validate_arguments(vArgv):
"prefix=",
"cmakeBuildConfiguration=",
"lldbLibDir=",
+ "lldbPythonPath=",
"argsFile",
"useSystemSix"]
dictArgReq = {"-h": "o", # o = optional, m = mandatory
@@ -191,7 +192,8 @@ def validate_arguments(vArgv):
"--cmakeBuildConfiguration": "o",
"--lldbLibDir": "o",
"--argsFile": "o",
- "--useSystemSix": "o"}
+ "--useSystemSix": "o",
+ "--lldbPythonPath": "m"}
# Check for mandatory parameters
nResult, dictArgs, strMsg = utilsArgsParse.parse(vArgv, strListArgs,
@@ -293,11 +295,9 @@ def run_post_process_for_each_script_sup
# Iterate script directory find any script language directories
for scriptLang in listDirs:
- # __pycache__ is a magic directory in Python 3 that holds .pyc files
- if scriptLang != "__pycache__" and scriptLang != "swig_bot_lib":
- dbg.dump_text("Executing language script for \'%s\'" % scriptLang)
- nResult, strStatusMsg = run_post_process(
- scriptLang, strFinishFileName, vDictArgs)
+ dbg.dump_text("Executing language script for \'%s\'" % scriptLang)
+ nResult, strStatusMsg = run_post_process(
+ scriptLang, strFinishFileName, vDictArgs)
if nResult < 0:
break
@@ -337,13 +337,6 @@ def main(vArgv):
if gbDbgFlag:
print_out_input_parameters(dictArgs)
- # Check to see if we were called from the Makefile system. If we were, check
- # if the caller wants SWIG to generate a dependency file.
- # Not used in this program, but passed through to the language script file
- # called by this program
- global gbMakeFileFlag
- gbMakeFileFlag = "-m" in dictArgs
-
nResult, strMsg = run_post_process_for_each_script_supported(dictArgs)
program_exit(nResult, strMsg)
Removed: lldb/trunk/scripts/get_relative_lib_dir.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/get_relative_lib_dir.py?rev=373990&view=auto
==============================================================================
--- lldb/trunk/scripts/get_relative_lib_dir.py (original)
+++ lldb/trunk/scripts/get_relative_lib_dir.py (removed)
@@ -1,44 +0,0 @@
-import distutils.sysconfig
-import os
-import platform
-import re
-import sys
-
-
-def get_python_relative_libdir():
- """Returns the appropropriate python libdir relative to the build directory.
-
- @param exe_path the path to the lldb executable
-
- @return the python path that needs to be added to sys.path (PYTHONPATH)
- in order to find the lldb python module.
- """
- if platform.system() != 'Linux':
- return None
-
- # We currently have a bug in lldb -P that does not account for
- # architecture variants in python paths for
- # architecture-specific modules. Handle the lookup here.
- # When that bug is fixed, we should just ask lldb for the
- # right answer always.
- arch_specific_libdir = distutils.sysconfig.get_python_lib(True, False)
- split_libdir = arch_specific_libdir.split(os.sep)
- lib_re = re.compile(r"^lib.*$")
-
- for i in range(len(split_libdir)):
- match = lib_re.match(split_libdir[i])
- if match is not None:
- # We'll call this the relative root of the lib dir.
- # Things like RHEL will have an arch-specific python
- # lib dir, which isn't 'lib' on x86_64.
- return os.sep.join(split_libdir[i:])
- # Didn't resolve it.
- return None
-
-if __name__ == '__main__':
- lib_dir = get_python_relative_libdir()
- if lib_dir is not None:
- sys.stdout.write(lib_dir)
- sys.exit(0)
- else:
- sys.exit(1)
Modified: lldb/trunk/source/Plugins/ScriptInterpreter/Python/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ScriptInterpreter/Python/CMakeLists.txt?rev=373991&r1=373990&r2=373991&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ScriptInterpreter/Python/CMakeLists.txt (original)
+++ lldb/trunk/source/Plugins/ScriptInterpreter/Python/CMakeLists.txt Mon Oct 7 16:49:01 2019
@@ -1,15 +1,7 @@
-if (NOT CMAKE_SYSTEM_NAME MATCHES "Windows")
- # Call a python script to gather the arch-specific libdir for
- # modules like the lldb module.
- execute_process(
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/../../../../scripts/get_relative_lib_dir.py
- RESULT_VARIABLE get_libdir_status
- OUTPUT_VARIABLE relative_libdir
- )
- if (get_libdir_status EQUAL 0)
- add_definitions(-DLLDB_PYTHON_RELATIVE_LIBDIR="${relative_libdir}")
- endif()
+if(NOT LLDB_PYTHON_RELATIVE_PATH)
+ message(FATAL_ERROR "LLDB_PYTHON_RELATIVE_PATH is not set.")
endif()
+add_definitions(-DLLDB_PYTHON_RELATIVE_LIBDIR="${LLDB_PYTHON_RELATIVE_PATH}")
add_lldb_library(lldbPluginScriptInterpreterPython PLUGIN
PythonDataObjects.cpp
Modified: lldb/trunk/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp?rev=373991&r1=373990&r2=373991&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp (original)
+++ lldb/trunk/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp Mon Oct 7 16:49:01 2019
@@ -305,39 +305,20 @@ void ScriptInterpreterPython::ComputePyt
auto rend = llvm::sys::path::rend(path_ref);
auto framework = std::find(rbegin, rend, "LLDB.framework");
if (framework == rend) {
- ComputePythonDirForPosix(path);
+ ComputePythonDir(path);
return;
}
path.resize(framework - rend);
llvm::sys::path::append(path, style, "LLDB.framework", "Resources", "Python");
}
-void ScriptInterpreterPython::ComputePythonDirForPosix(
+void ScriptInterpreterPython::ComputePythonDir(
llvm::SmallVectorImpl<char> &path) {
- auto style = llvm::sys::path::Style::posix;
-#if defined(LLDB_PYTHON_RELATIVE_LIBDIR)
// Build the path by backing out of the lib dir, then building with whatever
// the real python interpreter uses. (e.g. lib for most, lib64 on RHEL
- // x86_64).
- llvm::sys::path::remove_filename(path, style);
- llvm::sys::path::append(path, style, LLDB_PYTHON_RELATIVE_LIBDIR);
-#else
- llvm::sys::path::append(path, style,
- "python" + llvm::Twine(PY_MAJOR_VERSION) + "." +
- llvm::Twine(PY_MINOR_VERSION),
- "site-packages");
-#endif
-}
-
-void ScriptInterpreterPython::ComputePythonDirForWindows(
- llvm::SmallVectorImpl<char> &path) {
- auto style = llvm::sys::path::Style::windows;
- llvm::sys::path::remove_filename(path, style);
- llvm::sys::path::append(path, style, "lib", "site-packages");
-
- // This will be injected directly through FileSpec.GetDirectory().SetString(),
- // so we need to normalize manually.
- std::replace(path.begin(), path.end(), '\\', '/');
+ // x86_64, or bin on Windows).
+ llvm::sys::path::remove_filename(path);
+ llvm::sys::path::append(path, LLDB_PYTHON_RELATIVE_LIBDIR);
}
FileSpec ScriptInterpreterPython::GetPythonDir() {
@@ -350,11 +331,10 @@ FileSpec ScriptInterpreterPython::GetPyt
#if defined(__APPLE__)
ComputePythonDirForApple(path);
-#elif defined(_WIN32)
- ComputePythonDirForWindows(path);
#else
- ComputePythonDirForPosix(path);
+ ComputePythonDir(path);
#endif
+ llvm::sys::path::native(path);
spec.GetDirectory().SetString(path);
return spec;
}();
Modified: lldb/trunk/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h?rev=373991&r1=373990&r2=373991&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h (original)
+++ lldb/trunk/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.h Mon Oct 7 16:49:01 2019
@@ -48,8 +48,7 @@ public:
protected:
static void ComputePythonDirForApple(llvm::SmallVectorImpl<char> &path);
- static void ComputePythonDirForPosix(llvm::SmallVectorImpl<char> &path);
- static void ComputePythonDirForWindows(llvm::SmallVectorImpl<char> &path);
+ static void ComputePythonDir(llvm::SmallVectorImpl<char> &path);
};
} // namespace lldb_private
More information about the lldb-commits
mailing list