[Lldb-commits] [lldb] r374953 - [lldb] Creates _liblldb symlink from cmake
Haibo Huang via lldb-commits
lldb-commits at lists.llvm.org
Tue Oct 15 14:58:45 PDT 2019
Author: hhb
Date: Tue Oct 15 14:58:45 2019
New Revision: 374953
URL: http://llvm.org/viewvc/llvm-project?rev=374953&view=rev
Log:
[lldb] Creates _liblldb symlink from cmake
Summary:
This is another attempt of D67993.
This change removed hard coded relative paths. This way we can generate correct result when get_python_lib() returns a different path, or LLDB_PYTHON_RELATIVE_PATH is specified directly.
By moving things out of python, we are also able to correctly process more cross compile situations. E.g. .pyd vs .so for Windows.
Subscribers: lldb-commits, mgorny
Tags: #lldb
Differential Revision: https://reviews.llvm.org/D68858
Modified:
lldb/trunk/CMakeLists.txt
lldb/trunk/scripts/Python/finishSwigPythonLLDB.py
Modified: lldb/trunk/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/CMakeLists.txt?rev=374953&r1=374952&r2=374953&view=diff
==============================================================================
--- lldb/trunk/CMakeLists.txt (original)
+++ lldb/trunk/CMakeLists.txt Tue Oct 15 14:58:45 2019
@@ -204,7 +204,6 @@ if (NOT LLDB_DISABLE_PYTHON)
else()
set(lldb_python_build_path "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${LLDB_PYTHON_RELATIVE_PATH}/lldb")
endif()
- get_filename_component(lldb_python_build_path ${lldb_python_build_path} ABSOLUTE)
# Add a Post-Build Event to copy over Python files and create the symlink
# to liblldb.so for the Python API(hardlink on Windows).
@@ -225,6 +224,43 @@ if (NOT LLDB_DISABLE_PYTHON)
DEPENDS ${lldb_scripts_dir}/lldb.py
COMMENT "Python script sym-linking LLDB Python API")
+ function(create_relative_symlink target dest_file output_dir output_name)
+ get_filename_component(dest_file ${dest_file} ABSOLUTE)
+ get_filename_component(output_dir ${output_dir} ABSOLUTE)
+ file(RELATIVE_PATH rel_dest_file ${output_dir} ${dest_file})
+ if(CMAKE_HOST_UNIX)
+ set(LLVM_LINK_OR_COPY create_symlink)
+ else()
+ set(LLVM_LINK_OR_COPY copy)
+ endif()
+ add_custom_command(TARGET ${target} POST_BUILD VERBATIM
+ COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} ${rel_dest_file} ${output_name}
+ WORKING_DIRECTORY ${output_dir})
+ endfunction()
+
+ if(LLDB_BUILD_FRAMEWORK)
+ set(LIBLLDB_SYMLINK_DEST "${liblldb_build_dir}/LLDB.framework/LLDB")
+ else()
+ set(LIBLLDB_SYMLINK_DEST "${LLVM_SHLIB_OUTPUT_INTDIR}/liblldb${CMAKE_SHARED_LIBRARY_SUFFIX}")
+ endif()
+ if(WIN32)
+ if(CMAKE_BUILD_TYPE STREQUAL Debug)
+ set(LIBLLDB_SYMLINK_OUTPUT_FILE "_lldb_d.pyd")
+ else()
+ set(LIBLLDB_SYMLINK_OUTPUT_FILE "_lldb.pyd")
+ endif()
+ else()
+ set(LIBLLDB_SYMLINK_OUTPUT_FILE "_lldb.so")
+ endif()
+ create_relative_symlink(finish_swig ${LIBLLDB_SYMLINK_DEST}
+ ${lldb_python_build_path} ${LIBLLDB_SYMLINK_OUTPUT_FILE})
+
+ if(NOT LLDB_BUILD_FRAMEWORK)
+ set(LLDB_ARGDUMPER_FILENAME "lldb-argdumper${CMAKE_EXECUTABLE_SUFFIX}")
+ create_relative_symlink(finish_swig "${LLVM_RUNTIME_OUTPUT_INTDIR}/${LLDB_ARGDUMPER_FILENAME}"
+ ${lldb_python_build_path} ${LLDB_ARGDUMPER_FILENAME})
+ endif()
+
add_dependencies(finish_swig swig_wrapper liblldb lldb-argdumper)
set_target_properties(finish_swig swig_wrapper PROPERTIES FOLDER "lldb misc")
Modified: lldb/trunk/scripts/Python/finishSwigPythonLLDB.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/finishSwigPythonLLDB.py?rev=374953&r1=374952&r2=374953&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/finishSwigPythonLLDB.py (original)
+++ lldb/trunk/scripts/Python/finishSwigPythonLLDB.py Tue Oct 15 14:58:45 2019
@@ -245,284 +245,6 @@ def copy_lldbpy_file_to_lldb_pkg_dir(
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()")
- 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()")
@@ -723,10 +445,6 @@ def main(vDictArgs):
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:
More information about the lldb-commits
mailing list