[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