1set(SWIG_EXTRA_FLAGS -c++ -threads -python) 2 3if ("${SWIG_VERSION}" VERSION_LESS "4.1.0") 4 set(SWIG_EXTRA_FLAGS ${SWIG_EXTRA_FLAGS} -py3) 5 message(STATUS "SWIG version ${SWIG_VERSION} uses `-py3` flag.") 6endif() 7 8add_custom_command( 9 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/LLDBWrapPython.cpp 10 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lldb.py 11 DEPENDS ${SWIG_SOURCES} 12 DEPENDS ${SWIG_INTERFACES} 13 DEPENDS ${SWIG_HEADERS} 14 DEPENDS lldb-sbapi-dwarf-enums 15 COMMAND ${SWIG_EXECUTABLE} 16 ${SWIG_COMMON_FLAGS} 17 -I${CMAKE_CURRENT_SOURCE_DIR} 18 ${SWIG_EXTRA_FLAGS} 19 -outdir ${CMAKE_CURRENT_BINARY_DIR} 20 -o ${CMAKE_CURRENT_BINARY_DIR}/LLDBWrapPython.cpp 21 ${CMAKE_CURRENT_SOURCE_DIR}/python.swig 22 VERBATIM 23 COMMENT "Building LLDB Python wrapper") 24 25add_custom_target(swig_wrapper_python ALL DEPENDS 26 ${CMAKE_CURRENT_BINARY_DIR}/LLDBWrapPython.cpp 27 ${CMAKE_CURRENT_BINARY_DIR}/lldb.py 28) 29 30if (NOT WIN32) 31add_custom_command( 32 OUTPUT ${LLVM_RUNTIME_OUTPUT_INTDIR}/lldb-python 33 VERBATIM 34 COMMAND ${CMAKE_COMMAND} -E copy lldb-python ${LLVM_RUNTIME_OUTPUT_INTDIR}/lldb-python 35 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 36) 37add_custom_target(lldb-python-wrapper ALL DEPENDS 38 ${LLVM_RUNTIME_OUTPUT_INTDIR}/lldb-python 39) 40endif() 41 42function(create_python_package swig_target working_dir pkg_dir) 43 cmake_parse_arguments(ARG "NOINIT" "" "FILES" ${ARGN}) 44 if(ARG_FILES) 45 set(copy_cmd COMMAND ${CMAKE_COMMAND} -E copy ${ARG_FILES} ${pkg_dir}) 46 endif() 47 if(NOT ARG_NOINIT) 48 set(init_cmd COMMAND ${Python3_EXECUTABLE} 49 "${LLDB_SOURCE_DIR}/bindings/python/createPythonInit.py" 50 "${pkg_dir}" ${ARG_FILES}) 51 endif() 52 add_custom_command(TARGET ${swig_target} POST_BUILD VERBATIM 53 COMMAND ${CMAKE_COMMAND} -E make_directory ${pkg_dir} 54 ${copy_cmd} 55 ${init_cmd} 56 WORKING_DIRECTORY ${working_dir}) 57endfunction() 58 59function(finish_swig_python swig_target lldb_python_bindings_dir lldb_python_target_dir) 60 # Add a Post-Build Event to copy over Python files and create the symlink to 61 # liblldb.so for the Python API(hardlink on Windows). 62 add_custom_target(${swig_target} ALL VERBATIM 63 COMMAND ${CMAKE_COMMAND} -E make_directory ${lldb_python_target_dir} 64 DEPENDS ${lldb_python_bindings_dir}/lldb.py 65 COMMENT "Python script sym-linking LLDB Python API") 66 67 add_custom_command(TARGET ${swig_target} POST_BUILD VERBATIM 68 COMMAND ${CMAKE_COMMAND} -E copy 69 "${lldb_python_bindings_dir}/lldb.py" 70 "${lldb_python_target_dir}/__init__.py") 71 72 add_custom_command(TARGET ${swig_target} POST_BUILD VERBATIM 73 COMMAND ${CMAKE_COMMAND} -E copy 74 "${LLDB_SOURCE_DIR}/source/Interpreter/embedded_interpreter.py" 75 "${lldb_python_target_dir}") 76 77 # Distribute the examples as python packages. 78 create_python_package( 79 ${swig_target} 80 ${lldb_python_target_dir} 81 "formatters/cpp" 82 FILES "${LLDB_SOURCE_DIR}/examples/synthetic/gnu_libstdcpp.py" 83 "${LLDB_SOURCE_DIR}/examples/synthetic/libcxx.py") 84 85 create_python_package( 86 ${swig_target} 87 ${lldb_python_target_dir} 88 "formatters" 89 FILES "${LLDB_SOURCE_DIR}/examples/summaries/cocoa/cache.py" 90 "${LLDB_SOURCE_DIR}/examples/summaries/synth.py" 91 "${LLDB_SOURCE_DIR}/examples/summaries/cocoa/metrics.py" 92 "${LLDB_SOURCE_DIR}/examples/summaries/cocoa/attrib_fromdict.py" 93 "${LLDB_SOURCE_DIR}/examples/summaries/cocoa/Logger.py") 94 95 create_python_package( 96 ${swig_target} 97 ${lldb_python_target_dir} 98 "utils" 99 FILES "${LLDB_SOURCE_DIR}/examples/python/in_call_stack.py" 100 "${LLDB_SOURCE_DIR}/examples/python/symbolication.py" 101 ) 102 103 create_python_package( 104 ${swig_target} 105 ${lldb_python_target_dir} 106 "plugins" 107 FILES 108 "${LLDB_SOURCE_DIR}/examples/python/templates/parsed_cmd.py" 109 "${LLDB_SOURCE_DIR}/examples/python/templates/scripted_process.py" 110 "${LLDB_SOURCE_DIR}/examples/python/templates/scripted_platform.py" 111 "${LLDB_SOURCE_DIR}/examples/python/templates/operating_system.py" 112 "${LLDB_SOURCE_DIR}/examples/python/templates/scripted_thread_plan.py" 113 ) 114 115 if(APPLE) 116 create_python_package( 117 ${swig_target} 118 ${lldb_python_target_dir} "macosx" 119 FILES "${LLDB_SOURCE_DIR}/examples/python/crashlog.py" 120 "${LLDB_SOURCE_DIR}/examples/python/crashlog_scripted_process.py" 121 "${LLDB_SOURCE_DIR}/examples/darwin/heap_find/heap.py") 122 123 create_python_package( 124 ${swig_target} 125 ${lldb_python_target_dir} "macosx/heap" 126 FILES "${LLDB_SOURCE_DIR}/examples/darwin/heap_find/heap/heap_find.cpp" 127 "${LLDB_SOURCE_DIR}/examples/darwin/heap_find/heap/Makefile" 128 NOINIT) 129 130 create_python_package( 131 ${swig_target} 132 ${lldb_python_target_dir} "diagnose" 133 FILES "${LLDB_SOURCE_DIR}/examples/python/diagnose_unwind.py" 134 "${LLDB_SOURCE_DIR}/examples/python/diagnose_nsstring.py") 135 endif() 136 137 if(LLDB_BUILD_FRAMEWORK) 138 set(LIBLLDB_SYMLINK_DEST "${LLDB_FRAMEWORK_ABSOLUTE_BUILD_DIR}/LLDB.framework/LLDB") 139 else() 140 set(LIBLLDB_SYMLINK_DEST "${LLVM_SHLIB_OUTPUT_INTDIR}/liblldb${CMAKE_SHARED_LIBRARY_SUFFIX}") 141 endif() 142 set(LIBLLDB_SYMLINK_OUTPUT_FILE "_lldb${LLDB_PYTHON_EXT_SUFFIX}") 143 create_relative_symlink(${swig_target} ${LIBLLDB_SYMLINK_DEST} 144 ${lldb_python_target_dir} ${LIBLLDB_SYMLINK_OUTPUT_FILE}) 145 146 147 if (NOT WIN32) 148 add_dependencies(${swig_target} lldb-python-wrapper) 149 endif() 150 151 if(NOT LLDB_BUILD_FRAMEWORK) 152 set(LLDB_ARGDUMPER_FILENAME "lldb-argdumper${CMAKE_EXECUTABLE_SUFFIX}") 153 create_relative_symlink(${swig_target} "${LLVM_RUNTIME_OUTPUT_INTDIR}/${LLDB_ARGDUMPER_FILENAME}" 154 ${lldb_python_target_dir} ${LLDB_ARGDUMPER_FILENAME}) 155 endif() 156 157 add_dependencies(${swig_target} swig_wrapper_python liblldb lldb-argdumper) 158 set_target_properties(${swig_target} swig_wrapper_python PROPERTIES FOLDER "lldb misc") 159 160 # Ensure we do the python post-build step when building lldb. 161 add_dependencies(lldb ${swig_target}) 162 163 # Install the LLDB python module 164 if(LLDB_BUILD_FRAMEWORK) 165 set(LLDB_PYTHON_INSTALL_PATH ${LLDB_FRAMEWORK_INSTALL_DIR}/LLDB.framework/Versions/${LLDB_FRAMEWORK_VERSION}/Resources/Python) 166 else() 167 set(LLDB_PYTHON_INSTALL_PATH ${LLDB_PYTHON_RELATIVE_PATH}) 168 endif() 169 if (NOT CMAKE_CFG_INTDIR STREQUAL ".") 170 string(REPLACE ${CMAKE_CFG_INTDIR} "\$\{CMAKE_INSTALL_CONFIG_NAME\}" LLDB_PYTHON_INSTALL_PATH ${LLDB_PYTHON_INSTALL_PATH}) 171 string(REPLACE ${CMAKE_CFG_INTDIR} "\$\{CMAKE_INSTALL_CONFIG_NAME\}" lldb_python_target_dir ${lldb_python_target_dir}) 172 endif() 173 set(python_scripts_target "${swig_target}-scripts") 174 set(python_scripts_install_target "install-${python_scripts_target}") 175 add_custom_target(${python_scripts_target}) 176 add_dependencies(${python_scripts_target} ${swig_target}) 177 install(DIRECTORY ${lldb_python_target_dir}/../ 178 DESTINATION ${LLDB_PYTHON_INSTALL_PATH} 179 COMPONENT ${python_scripts_target}) 180 if (NOT LLVM_ENABLE_IDE) 181 add_llvm_install_targets(${python_scripts_install_target} 182 COMPONENT ${python_scripts_target} 183 DEPENDS ${python_scripts_target}) 184 endif() 185 186 # Add a Post-Build Event to copy the custom Python DLL to the lldb binaries dir so that Windows can find it when launching 187 # lldb.exe or any other executables that were linked with liblldb. 188 if (WIN32 AND NOT "${PYTHON_DLL}" STREQUAL "") 189 # When using the Visual Studio CMake generator the lldb binaries end up in Release/bin, Debug/bin etc. 190 file(TO_NATIVE_PATH "${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin" LLDB_BIN_DIR) 191 file(TO_NATIVE_PATH "${PYTHON_DLL}" PYTHON_DLL_NATIVE_PATH) 192 add_custom_command( 193 TARGET ${swig_target} 194 POST_BUILD 195 COMMAND ${CMAKE_COMMAND} -E copy ${PYTHON_DLL_NATIVE_PATH} ${LLDB_BIN_DIR} VERBATIM 196 COMMENT "Copying Python DLL to LLDB binaries directory.") 197 endif() 198endfunction() 199