374 lines · plain
1get_property(LLDB_ALL_PLUGINS GLOBAL PROPERTY LLDB_PLUGINS)2 3if(LLDB_BUILD_FRAMEWORK)4 set(option_install_prefix INSTALL_PREFIX ${LLDB_FRAMEWORK_INSTALL_DIR})5 set(option_framework FRAMEWORK)6endif()7 8if(LLDB_ENABLE_PYTHON)9 if (APPLE AND LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY)10 # Work around an issue with the Python headers, which have a modular include11 # inside an extern "C" block.12 remove_module_flags()13 endif()14 get_target_property(python_bindings_dir swig_wrapper_python BINARY_DIR)15 set(lldb_python_wrapper ${python_bindings_dir}/LLDBWrapPython.cpp)16endif()17 18if(LLDB_ENABLE_LUA)19 get_target_property(lua_bindings_dir swig_wrapper_lua BINARY_DIR)20 set(lldb_lua_wrapper ${lua_bindings_dir}/LLDBWrapLua.cpp)21endif()22 23# Generate SBLanguages.h from Dwarf.def.24set(sb_languages_file25 ${CMAKE_CURRENT_BINARY_DIR}/../../include/lldb/API/SBLanguages.h)26set(sb_languages_generator27 ${LLDB_SOURCE_DIR}/scripts/generate-sbapi-dwarf-enum.py)28add_custom_command(29 COMMENT "Generating SBLanguages.h from Dwarf.def"30 COMMAND "${Python3_EXECUTABLE}"31 ${sb_languages_generator}32 ${LLVM_MAIN_INCLUDE_DIR}/llvm/BinaryFormat/Dwarf.def33 -o ${sb_languages_file}34 OUTPUT ${sb_languages_file}35 DEPENDS ${LLVM_MAIN_INCLUDE_DIR}/llvm/BinaryFormat/Dwarf.def36 ${sb_languages_generator}37 WORKING_DIRECTORY ${LLVM_LIBRARY_OUTPUT_INTDIR}38)39add_custom_target(lldb-sbapi-dwarf-enums40 DEPENDS ${sb_languages_file})41set_target_properties(lldb-sbapi-dwarf-enums PROPERTIES FOLDER "LLDB/Tablegenning")42 43add_lldb_library(liblldb SHARED ${option_framework}44 SBAddress.cpp45 SBAddressRange.cpp46 SBAddressRangeList.cpp47 SBAttachInfo.cpp48 SBBlock.cpp49 SBBreakpoint.cpp50 SBBreakpointLocation.cpp51 SBBreakpointName.cpp52 SBBreakpointOptionCommon.cpp53 SBBroadcaster.cpp54 SBCommandInterpreter.cpp55 SBCommandInterpreterRunOptions.cpp56 SBCommandReturnObject.cpp57 SBCommunication.cpp58 SBCompileUnit.cpp59 SBData.cpp60 SBDebugger.cpp61 SBDeclaration.cpp62 SBEnvironment.cpp63 SBError.cpp64 SBEvent.cpp65 SBExecutionContext.cpp66 SBExpressionOptions.cpp67 SBFile.cpp68 SBFileSpec.cpp69 SBFileSpecList.cpp70 SBFormat.cpp71 SBFrame.cpp72 SBFrameList.cpp73 SBFunction.cpp74 SBHostOS.cpp75 SBInstruction.cpp76 SBInstructionList.cpp77 SBLanguageRuntime.cpp78 SBLaunchInfo.cpp79 SBLineEntry.cpp80 SBListener.cpp81 SBMemoryRegionInfo.cpp82 SBMemoryRegionInfoList.cpp83 SBModule.cpp84 SBModuleSpec.cpp85 SBMutex.cpp86 SBPlatform.cpp87 SBProcess.cpp88 SBProcessInfo.cpp89 SBProcessInfoList.cpp90 SBProgress.cpp91 SBQueue.cpp92 SBQueueItem.cpp93 SBReproducer.cpp94 SBSaveCoreOptions.cpp95 SBScriptObject.cpp96 SBSection.cpp97 SBSourceManager.cpp98 SBStatisticsOptions.cpp99 SBStream.cpp100 SBStringList.cpp101 SBStructuredData.cpp102 SBSymbol.cpp103 SBSymbolContext.cpp104 SBSymbolContextList.cpp105 SBTarget.cpp106 SBThread.cpp107 SBThreadCollection.cpp108 SBThreadPlan.cpp109 SBTrace.cpp110 SBTraceCursor.cpp111 SBType.cpp112 SBTypeCategory.cpp113 SBTypeEnumMember.cpp114 SBTypeFilter.cpp115 SBTypeFormat.cpp116 SBTypeNameSpecifier.cpp117 SBTypeSummary.cpp118 SBTypeSynthetic.cpp119 SBUnixSignals.cpp120 SBValue.cpp121 SBValueList.cpp122 SBVariablesOptions.cpp123 SBWatchpoint.cpp124 SBWatchpointOptions.cpp125 SystemInitializerFull.cpp126 ${lldb_python_wrapper}127 ${lldb_lua_wrapper}128 129 ADDITIONAL_HEADER_DIRS130 ${LLDB_INCLUDE_DIR}/lldb/API131 DEPENDS132 lldb-sbapi-dwarf-enums133 134 LINK_COMPONENTS135 Support136 LINK_LIBS137 lldbBreakpoint138 lldbCore139 lldbDataFormatters140 lldbExpression141 lldbHost142 lldbInitialization143 lldbInterpreter144 lldbSymbol145 lldbTarget146 lldbUtility147 lldbValueObject148 lldbVersion149 ${LLDB_ALL_PLUGINS}150 151 ${option_install_prefix}152)153 154# lib/pythonX.Y/dist-packages/lldb/_lldb.so is a symlink to lib/liblldb.so,155# which depends on lib/libLLVM*.so (BUILD_SHARED_LIBS) or lib/libLLVM-10git.so156# (LLVM_LINK_LLVM_DYLIB). Add an additional rpath $ORIGIN/../../../../lib so157# that _lldb.so can be loaded from Python.158if(LLDB_ENABLE_PYTHON AND (BUILD_SHARED_LIBS OR LLVM_LINK_LLVM_DYLIB) AND UNIX AND NOT APPLE)159 set_property(TARGET liblldb APPEND PROPERTY INSTALL_RPATH "\$ORIGIN/../../../../lib${LLVM_LIBDIR_SUFFIX}")160endif()161 162if(Python3_RPATH)163 set_property(TARGET liblldb APPEND PROPERTY INSTALL_RPATH "${Python3_RPATH}")164 set_property(TARGET liblldb APPEND PROPERTY BUILD_RPATH "${Python3_RPATH}")165endif()166 167 168if(LLDB_ENABLE_PYTHON)169 add_dependencies(liblldb swig_wrapper_python)170 171 if (MSVC)172 set_property(SOURCE ${lldb_python_wrapper} APPEND_STRING PROPERTY COMPILE_FLAGS " /W0")173 else()174 set_property(SOURCE ${lldb_python_wrapper} APPEND_STRING PROPERTY COMPILE_FLAGS " -w")175 endif()176 177 set_source_files_properties(${lldb_python_wrapper} PROPERTIES GENERATED ON)178 if (CLANG_CL)179 set_property(SOURCE ${lldb_python_wrapper} APPEND_STRING180 PROPERTY COMPILE_FLAGS " -Wno-unused-function")181 endif()182 if (LLVM_COMPILER_IS_GCC_COMPATIBLE AND183 NOT "${CMAKE_SYSTEM_NAME}" MATCHES "Darwin")184 set_property(SOURCE ${lldb_python_wrapper} APPEND_STRING185 PROPERTY COMPILE_FLAGS " -Wno-sequence-point -Wno-cast-qual")186 endif ()187endif()188 189if(LLDB_ENABLE_LUA)190 add_dependencies(liblldb swig_wrapper_lua)191 target_include_directories(liblldb PRIVATE ${LUA_INCLUDE_DIR})192 193 if (MSVC)194 set_property(SOURCE ${lldb_lua_wrapper} APPEND_STRING PROPERTY COMPILE_FLAGS " /W0")195 else()196 set_property(SOURCE ${lldb_lua_wrapper} APPEND_STRING PROPERTY COMPILE_FLAGS " -w")197 endif()198 199 set_source_files_properties(${lldb_lua_wrapper} PROPERTIES GENERATED ON)200endif()201 202set_target_properties(liblldb203 PROPERTIES204 VERSION ${LLDB_VERSION}205)206 207target_compile_definitions(liblldb PRIVATE LLDB_IN_LIBLLDB)208if (NOT CMAKE_SYSTEM_NAME MATCHES "Windows")209 if (NOT LLDB_EXPORT_ALL_SYMBOLS)210 # If we're not exporting all symbols, we'll want to explicitly set211 # the exported symbols here. This prevents 'log enable --stack ...'212 # from working on some systems but limits the liblldb size.213 message(STATUS "Symbols (liblldb): exporting all symbols from the lldb namespace")214 add_llvm_symbol_exports(liblldb ${CMAKE_CURRENT_SOURCE_DIR}/liblldb.exports)215 elseif (NOT LLDB_EXPORT_ALL_SYMBOLS_EXPORTS_FILE)216 # Don't use an explicit export. Instead, tell the linker to export all symbols.217 message(STATUS "Symbols (liblldb): exporting all symbols from the lldb and lldb_private namespaces")218 message(WARNING "Private LLDB symbols frequently change and no API stability is guaranteed. "219 "Only the SB API is guaranteed to be stable.")220 add_llvm_symbol_exports(liblldb ${CMAKE_CURRENT_SOURCE_DIR}/liblldb-private.exports)221 else ()222 message(STATUS "Symbols (liblldb): exporting all symbols specified in the exports "223 " file '${LLDB_EXPORT_ALL_SYMBOLS_EXPORTS_FILE}'")224 message(WARNING "Private LLDB symbols frequently change and no API stability is guaranteed. "225 "Only the SB API is guaranteed to be stable.")226 add_llvm_symbol_exports(liblldb "${LLDB_EXPORT_ALL_SYMBOLS_EXPORTS_FILE}")227 endif()228elseif (LLDB_EXPORT_ALL_SYMBOLS)229 message(STATUS "Symbols (liblldb): exporting all symbols from the lldb and lldb_private namespaces")230 231 # Pull out the various lldb libraries linked into liblldb, these will be used232 # when looking for symbols to extract. We ignore most plugin libraries here,233 # because we may expose more symbols than the DLL limit and these symbols234 # aren't useful to expose.235 get_target_property(all_liblldb_libs liblldb LINK_LIBRARIES)236 set(lldb_libs "")237 foreach(lib ${all_liblldb_libs})238 if(TARGET ${lib} AND ${lib} MATCHES "^lldb" AND239 (${lib} IN_LIST LLDB_EXPORT_ALL_SYMBOLS_PLUGINS OR240 NOT ${lib} MATCHES "^lldbPlugin"))241 get_target_property(lib_type ${lib} TYPE)242 if("${lib_type}" STREQUAL "STATIC_LIBRARY")243 list(APPEND lldb_libs ${lib})244 endif()245 endif()246 endforeach(lib)247 list(REMOVE_DUPLICATES lldb_libs)248 249 # Extract all of the private symbols and produce a single file we can use for250 # the exports.251 set(exported_symbol_file ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/liblldb_private.symbols)252 get_host_tool_path(llvm-nm LLVM_NM llvm_nm_exe llvm_nm_target)253 add_custom_command(254 OUTPUT ${exported_symbol_file}255 COMMAND "${Python3_EXECUTABLE}"256 ${LLDB_SOURCE_DIR}/scripts/msvc_extract_private_symbols.py257 ${lldb_libs} -o ${exported_symbol_file} --nm=${llvm_nm_exe}258 WORKING_DIRECTORY ${LLVM_LIBRARY_OUTPUT_INTDIR}259 DEPENDS ${LLDB_SOURCE_DIR}/scripts/msvc_extract_private_symbols.py260 ${lldb_libs} ${llvm_nm_target}261 VERBATIM262 COMMENT "Generating liblldb private export list"263 )264 265 add_llvm_symbol_exports(liblldb ${exported_symbol_file})266endif()267 268if (NOT MSVC)269 set_target_properties(liblldb270 PROPERTIES271 OUTPUT_NAME lldb272 )273endif()274 275# The Clang expression parser in LLDB requires the Clang resource directory to function.276if (TARGET clang-resource-headers)277 # If building alongside Clang, just add a dependency to ensure it is build together with liblldb.278 add_dependencies(liblldb clang-resource-headers)279else()280 # In a standalone build create a symlink from the LLDB library directory that points to the281 # resource directory in the Clang library directory. LLDB searches relative to its install path,282 # and the symlink is created in the same relative path as the resource directory of Clang when283 # building alongside Clang.284 # When building the LLDB framework, this isn't necessary as there we copy everything we need into285 # the framework (including the Clang resourece directory).286 if(NOT LLDB_BUILD_FRAMEWORK)287 set(LLDB_CLANG_RESOURCE_DIR "$<TARGET_FILE_DIR:liblldb>/clang")288 add_custom_command(TARGET liblldb POST_BUILD289 COMMENT "Linking Clang resource dir into LLDB build directory: ${LLDB_CLANG_RESOURCE_DIR}"290 COMMAND ${CMAKE_COMMAND} -E create_symlink291 "${LLDB_EXTERNAL_CLANG_RESOURCE_DIR}" "${LLDB_CLANG_RESOURCE_DIR}"292 )293 endif()294endif()295 296# Stage all headers in the include directory in the build dir.297file(GLOB public_headers ${LLDB_SOURCE_DIR}/include/lldb/API/*.h)298set(lldb_header_staging_dir ${CMAKE_BINARY_DIR}/include/lldb)299set(generated_public_headers ${LLDB_OBJ_DIR}/include/lldb/API/SBLanguages.h)300file(GLOB root_public_headers ${LLDB_SOURCE_DIR}/include/lldb/lldb-*.h)301file(GLOB root_private_headers ${LLDB_SOURCE_DIR}/include/lldb/lldb-private*.h)302list(REMOVE_ITEM root_public_headers ${root_private_headers})303# Skip the initial copy of lldb-defines.h. The fixed version is generated at build time.304list(REMOVE_ITEM root_public_headers ${LLDB_SOURCE_DIR}/include/lldb/lldb-defines.h)305 306find_program(unifdef_EXECUTABLE unifdef)307 308add_custom_target(liblldb-header-staging)309 310if (LLDB_BUILD_FRAMEWORK)311 add_custom_target(lldb-framework-fixup-all-headers)312 add_dependencies(lldb-framework-fixup-all-headers liblldb-header-staging)313 add_dependencies(liblldb lldb-framework-fixup-all-headers)314endif()315 316foreach(header317 ${public_headers}318 ${generated_public_headers}319 ${root_public_headers})320 get_filename_component(basename ${header} NAME)321 set(staged_header ${lldb_header_staging_dir}/${basename})322 323 if(unifdef_EXECUTABLE)324 # unifdef returns 0 when the file is unchanged and 1 if something was changed.325 # That means if we successfully remove SWIG code, the build system believes326 # that the command has failed and stops. This is undesirable.327 set(copy_command ${unifdef_EXECUTABLE} -USWIG ${header} > ${staged_header} || (exit 0))328 else()329 set(copy_command ${CMAKE_COMMAND} -E copy ${header} ${staged_header})330 endif()331 332 add_custom_target(liblldb-stage-header-${basename} DEPENDS ${staged_header})333 add_dependencies(liblldb-stage-header-${basename} lldb-sbapi-dwarf-enums)334 add_dependencies(liblldb-header-staging liblldb-stage-header-${basename})335 add_custom_command(336 DEPENDS ${header} OUTPUT ${staged_header}337 COMMAND ${copy_command}338 COMMENT "LLDB headers: stage LLDB headers in include directory")339 340 list(APPEND lldb_staged_headers ${staged_header})341 342 if (LLDB_BUILD_FRAMEWORK)343 set(output_header $<TARGET_FILE_DIR:liblldb>/Headers/${basename})344 345 add_custom_target(lldb-framework-fixup-header-${basename} DEPENDS ${staged_header})346 add_dependencies(lldb-framework-fixup-header-${basename} liblldb-stage-header-${basename})347 add_dependencies(lldb-framework-fixup-all-headers lldb-framework-fixup-header-${basename})348 349 add_custom_command(TARGET lldb-framework-fixup-header-${basename} POST_BUILD350 COMMAND "${Python3_EXECUTABLE}" ${LLDB_SOURCE_DIR}/scripts/framework-header-fix.py -f lldb_main -i ${staged_header} -o ${output_header}351 COMMENT "LLDB.framework: Fix up and copy framework headers"352 )353 endif()354endforeach()355 356add_custom_command(TARGET liblldb-header-staging POST_BUILD357 COMMAND "${Python3_EXECUTABLE}" ${LLDB_SOURCE_DIR}/scripts/version-header-fix.py -i ${LLDB_SOURCE_DIR}/include/lldb/lldb-defines.h -o ${lldb_header_staging_dir}/lldb-defines.h -m ${LLDB_VERSION_MAJOR} -n ${LLDB_VERSION_MINOR} -p ${LLDB_VERSION_PATCH}358)359add_dependencies(liblldb liblldb-header-staging)360 361if(LLDB_BUILD_FRAMEWORK)362 include(LLDBFramework)363 364 if (TARGET install-liblldb)365 add_dependencies(install-liblldb366 lldb-framework-cleanup)367 endif()368 369 if (TARGET install-liblldb-stripped)370 add_dependencies(install-liblldb-stripped371 lldb-framework-cleanup)372 endif()373endif()374