Introduce lldb-framework CMake target and centralize its logic

Summary:
In this patch I aim to do the following:

1) Create an lldb-framework target that acts as the target that handles generating LLDB.framework. Previously, liblldb acted as the target for generating the framework in addition to generating the actual lldb library. This made the target feel overloaded.
2) Centralize framework generation as much as it makes sense to do so.
3) Create a target lldb-suite, which depends on every tool and library that makes liblldb fully functional. One result of having this target is it makes tracking dependencies much clearer.

Differential Revision: https://reviews.llvm.org/D48060

llvm-svn: 334968
This commit is contained in:
Alex Langford 2018-06-18 18:27:16 +00:00
parent 68c9b8d6a1
commit 27510c18ad
9 changed files with 83 additions and 80 deletions

View File

@ -37,7 +37,18 @@ if(APPLE)
add_definitions(-DLLDB_USE_OS_LOG) add_definitions(-DLLDB_USE_OS_LOG)
endif() endif()
# lldb-suite is a dummy target that encompasses all the necessary tools and
# libraries for building a fully-functioning liblldb.
add_custom_target(lldb-suite)
option(LLDB_BUILD_FRAMEWORK "Build the Darwin LLDB.framework" Off)
if(LLDB_BUILD_FRAMEWORK) if(LLDB_BUILD_FRAMEWORK)
if (CMAKE_VERSION VERSION_LESS 3.7)
message(FATAL_ERROR "LLDB_BUILD_FRAMEWORK is not supported on CMake < 3.7")
endif()
if (NOT APPLE)
message(FATAL_ERROR "LLDB.framework can only be generated when targeting Apple platforms")
endif()
set(LLDB_FRAMEWORK_DIR set(LLDB_FRAMEWORK_DIR
${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${LLDB_FRAMEWORK_INSTALL_DIR}) ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${LLDB_FRAMEWORK_INSTALL_DIR})
endif() endif()
@ -129,6 +140,12 @@ if(LLDB_INCLUDE_TESTS)
add_subdirectory(utils/lldb-dotest) add_subdirectory(utils/lldb-dotest)
endif() endif()
if (LLDB_BUILD_FRAMEWORK)
add_custom_target(lldb-framework)
include(LLDBFramework)
add_dependencies(lldb-suite lldb-framework)
endif()
if (NOT LLDB_DISABLE_PYTHON) if (NOT LLDB_DISABLE_PYTHON)
# Add a Post-Build Event to copy over Python files and create the symlink # Add a Post-Build Event to copy over Python files and create the symlink
# to liblldb.so for the Python API(hardlink on Windows) # to liblldb.so for the Python API(hardlink on Windows)
@ -147,8 +164,9 @@ if (NOT LLDB_DISABLE_PYTHON)
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/scripts/finishSwigWrapperClasses.py DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/scripts/finishSwigWrapperClasses.py
DEPENDS ${LLDB_PYTHON_TARGET_DIR}/lldb.py DEPENDS ${LLDB_PYTHON_TARGET_DIR}/lldb.py
COMMENT "Python script sym-linking LLDB Python API") COMMENT "Python script sym-linking LLDB Python API")
# We depend on liblldb being built before we can do this step.
add_dependencies(finish_swig liblldb lldb-argdumper) # We depend on liblldb and lldb-argdumper being built before we can do this step.
add_dependencies(finish_swig lldb-suite)
# If we build the readline module, we depend on that happening # If we build the readline module, we depend on that happening
# first. # first.
@ -159,8 +177,8 @@ if (NOT LLDB_DISABLE_PYTHON)
# Ensure we do the python post-build step when building lldb. # Ensure we do the python post-build step when building lldb.
add_dependencies(lldb finish_swig) add_dependencies(lldb finish_swig)
if(LLDB_BUILD_FRAMEWORK) if (LLDB_BUILD_FRAMEWORK)
# The target to install libLLDB needs to depend on finish swig so that the # The target to install libLLDB needs to depend on finish_swig so that the
# framework build properly copies over the Python files. # framework build properly copies over the Python files.
add_dependencies(install-liblldb finish_swig) add_dependencies(install-liblldb finish_swig)
endif() endif()

View File

@ -86,7 +86,7 @@ endfunction(add_lldb_library)
function(add_lldb_executable name) function(add_lldb_executable name)
cmake_parse_arguments(ARG cmake_parse_arguments(ARG
"INCLUDE_IN_FRAMEWORK;GENERATE_INSTALL" "INCLUDE_IN_SUITE;GENERATE_INSTALL"
"" ""
"LINK_LIBS;LINK_COMPONENTS" "LINK_LIBS;LINK_COMPONENTS"
${ARGN} ${ARGN}
@ -99,8 +99,9 @@ function(add_lldb_executable name)
set_target_properties(${name} PROPERTIES set_target_properties(${name} PROPERTIES
FOLDER "lldb executables") FOLDER "lldb executables")
if(LLDB_BUILD_FRAMEWORK) if(ARG_INCLUDE_IN_SUITE)
if(ARG_INCLUDE_IN_FRAMEWORK) add_dependencies(lldb-suite ${name})
if(LLDB_BUILD_FRAMEWORK)
if(NOT IOS) if(NOT IOS)
set(resource_dir "/Resources") set(resource_dir "/Resources")
set(resource_dots "../") set(resource_dots "../")
@ -122,14 +123,16 @@ function(add_lldb_executable name)
add_custom_target(install-${name}-stripped DEPENDS ${name}) add_custom_target(install-${name}-stripped DEPENDS ${name})
add_dependencies(install-liblldb-stripped ${name}) add_dependencies(install-liblldb-stripped ${name})
endif() endif()
else()
set_target_properties(${name} PROPERTIES
BUILD_WITH_INSTALL_RPATH On
INSTALL_RPATH "@loader_path/../${LLDB_FRAMEWORK_INSTALL_DIR}")
endif() endif()
endif() endif()
if(ARG_GENERATE_INSTALL AND NOT (ARG_INCLUDE_IN_FRAMEWORK AND LLDB_BUILD_FRAMEWORK )) if(LLDB_BUILD_FRAMEWORK AND NOT ARG_INCLUDE_IN_SUITE)
set_target_properties(${name} PROPERTIES
BUILD_WITH_INSTALL_RPATH On
INSTALL_RPATH "@loader_path/../${LLDB_FRAMEWORK_INSTALL_DIR}")
endif()
if(ARG_GENERATE_INSTALL AND NOT (ARG_INCLUDE_IN_SUITE AND LLDB_BUILD_FRAMEWORK ))
install(TARGETS ${name} install(TARGETS ${name}
COMPONENT ${name} COMPONENT ${name}
RUNTIME DESTINATION bin) RUNTIME DESTINATION bin)
@ -140,7 +143,7 @@ function(add_lldb_executable name)
endif() endif()
endif() endif()
if(ARG_INCLUDE_IN_FRAMEWORK AND LLDB_BUILD_FRAMEWORK) if(ARG_INCLUDE_IN_SUITE AND LLDB_BUILD_FRAMEWORK)
add_llvm_tool_symlink(${name} ${name} ALWAYS_GENERATE SKIP_INSTALL add_llvm_tool_symlink(${name} ${name} ALWAYS_GENERATE SKIP_INSTALL
OUTPUT_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) OUTPUT_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR})
endif() endif()

View File

@ -0,0 +1,44 @@
file(GLOB public_headers ${LLDB_SOURCE_DIR}/include/lldb/API/*.h)
file(GLOB root_public_headers ${LLDB_SOURCE_DIR}/include/lldb/lldb-*.h)
file(GLOB root_private_headers ${LLDB_SOURCE_DIR}/include/lldb/lldb-private*.h)
list(REMOVE_ITEM root_public_headers ${root_private_headers})
foreach(header
${public_headers}
${root_public_headers}
${LLDB_SOURCE_DIR}/include/lldb/Utility/SharingPtr.h)
get_filename_component(basename ${header} NAME)
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/FrameworkHeaders/${basename}
DEPENDS ${header}
COMMAND ${CMAKE_COMMAND} -E copy ${header} ${CMAKE_CURRENT_BINARY_DIR}/FrameworkHeaders/${basename})
list(APPEND framework_headers ${CMAKE_CURRENT_BINARY_DIR}/FrameworkHeaders/${basename})
endforeach()
add_custom_target(lldb-framework-headers
DEPENDS ${framework_headers}
COMMAND ${LLDB_SOURCE_DIR}/scripts/framework-header-fix.sh ${CMAKE_CURRENT_BINARY_DIR} ${LLDB_VERSION})
if (NOT IOS)
if (NOT LLDB_BUILT_STANDALONE)
add_dependencies(lldb-framework clang-headers)
endif()
add_custom_command(TARGET lldb-framework POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/FrameworkHeaders $<TARGET_FILE_DIR:liblldb>/Headers
COMMAND ${CMAKE_COMMAND} -E create_symlink Versions/Current/Headers ${CMAKE_BINARY_DIR}/${LLDB_FRAMEWORK_INSTALL_DIR}/LLDB.framework/Headers
COMMAND ${CMAKE_COMMAND} -E create_symlink ${LLDB_FRAMEWORK_VERSION} ${CMAKE_BINARY_DIR}/${LLDB_FRAMEWORK_INSTALL_DIR}/LLDB.framework/Versions/Current
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/clang/${LLDB_VERSION} $<TARGET_FILE_DIR:liblldb>/Resources/Clang
)
else()
add_custom_command(TARGET lldb-framework POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/FrameworkHeaders $<TARGET_FILE_DIR:liblldb>/Headers
)
endif()
set_target_properties(liblldb PROPERTIES
OUTPUT_NAME LLDB
FRAMEWORK On
FRAMEWORK_VERSION ${LLDB_FRAMEWORK_VERSION}
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${LLDB_FRAMEWORK_INSTALL_DIR}
PUBLIC_HEADER "${framework_headers}")
add_dependencies(lldb-framework
liblldb
lldb-framework-headers)

View File

@ -2,16 +2,6 @@ if ( CMAKE_SYSTEM_NAME MATCHES "Windows" )
add_definitions( -DEXPORT_LIBLLDB ) add_definitions( -DEXPORT_LIBLLDB )
endif() endif()
option(LLDB_BUILD_FRAMEWORK "Build the Darwin LLDB.framework" Off)
if(LLDB_BUILD_FRAMEWORK AND CMAKE_VERSION VERSION_LESS 3.7)
message(FATAL_ERROR "LLDB_BUILD_FRAMEWORK is not supported on CMake < 3.7")
endif()
if (LLDB_BUILD_FRAMEWORK AND NOT APPLE)
message(FATAL_ERROR "LLDB.framework cannot be generated unless targeting Apple platforms.")
endif()
get_property(LLDB_ALL_PLUGINS GLOBAL PROPERTY LLDB_PLUGINS) get_property(LLDB_ALL_PLUGINS GLOBAL PROPERTY LLDB_PLUGINS)
add_lldb_library(liblldb SHARED add_lldb_library(liblldb SHARED
@ -159,47 +149,3 @@ endif()
if (LLDB_WRAP_PYTHON) if (LLDB_WRAP_PYTHON)
add_dependencies(liblldb swig_wrapper) add_dependencies(liblldb swig_wrapper)
endif() endif()
if(LLDB_BUILD_FRAMEWORK)
file(GLOB public_headers ${LLDB_SOURCE_DIR}/include/lldb/API/*.h)
file(GLOB root_public_headers ${LLDB_SOURCE_DIR}/include/lldb/lldb-*.h)
file(GLOB root_private_headers ${LLDB_SOURCE_DIR}/include/lldb/lldb-private*.h)
list(REMOVE_ITEM root_public_headers ${root_private_headers})
foreach(header ${public_headers} ${root_public_headers} ${LLDB_SOURCE_DIR}/include/lldb/Utility/SharingPtr.h)
get_filename_component(basename ${header} NAME)
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/FrameworkHeaders/${basename}
DEPENDS ${header}
COMMAND ${CMAKE_COMMAND} -E copy ${header} ${CMAKE_CURRENT_BINARY_DIR}/FrameworkHeaders/${basename})
list(APPEND framework_headers ${CMAKE_CURRENT_BINARY_DIR}/FrameworkHeaders/${basename})
endforeach()
add_custom_target(lldb-framework-headers DEPENDS ${framework_headers}
COMMAND ${LLDB_SOURCE_DIR}/scripts/framework-header-fix.sh ${CMAKE_CURRENT_BINARY_DIR}/FrameworkHeaders ${LLDB_VERSION})
add_dependencies(liblldb lldb-framework-headers)
set_target_properties(liblldb PROPERTIES
OUTPUT_NAME LLDB
FRAMEWORK On
FRAMEWORK_VERSION ${LLDB_FRAMEWORK_VERSION}
LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${LLDB_FRAMEWORK_INSTALL_DIR}
PUBLIC_HEADER "${framework_headers}")
if(NOT IOS)
if (NOT LLDB_BUILT_STANDALONE)
add_dependencies(liblldb clang-headers)
endif()
add_custom_command(TARGET liblldb POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/FrameworkHeaders $<TARGET_FILE_DIR:liblldb>/Headers
COMMAND ${CMAKE_COMMAND} -E create_symlink Versions/Current/Headers ${CMAKE_BINARY_DIR}/${LLDB_FRAMEWORK_INSTALL_DIR}/LLDB.framework/Headers
COMMAND ${CMAKE_COMMAND} -E create_symlink ${LLDB_FRAMEWORK_VERSION} ${CMAKE_BINARY_DIR}/${LLDB_FRAMEWORK_INSTALL_DIR}/LLDB.framework/Versions/Current
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX}/clang/${LLDB_VERSION} $<TARGET_FILE_DIR:liblldb>/Resources/Clang
)
else()
add_custom_command(TARGET liblldb POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_BINARY_DIR}/FrameworkHeaders $<TARGET_FILE_DIR:liblldb>/Headers
)
endif()
endif()

View File

@ -1,4 +1,4 @@
add_lldb_tool(lldb-argdumper INCLUDE_IN_FRAMEWORK add_lldb_tool(lldb-argdumper INCLUDE_IN_SUITE
argdumper.cpp argdumper.cpp
LINK_LIBS LINK_LIBS

View File

@ -1,3 +1,3 @@
add_lldb_tool(darwin-debug INCLUDE_IN_FRAMEWORK add_lldb_tool(darwin-debug INCLUDE_IN_SUITE
darwin-debug.cpp darwin-debug.cpp
) )

View File

@ -161,7 +161,7 @@ if(NOT SKIP_DEBUGSERVER)
COMPILE_DEFINITIONS HAVE_LIBCOMPRESSION) COMPILE_DEFINITIONS HAVE_LIBCOMPRESSION)
endif() endif()
set(LLVM_OPTIONAL_SOURCES ${lldbDebugserverCommonSources}) set(LLVM_OPTIONAL_SOURCES ${lldbDebugserverCommonSources})
add_lldb_tool(debugserver INCLUDE_IN_FRAMEWORK add_lldb_tool(debugserver INCLUDE_IN_SUITE
debugserver.cpp debugserver.cpp
LINK_LIBS LINK_LIBS

View File

@ -24,12 +24,4 @@ if ( CMAKE_SYSTEM_NAME MATCHES "Windows" )
add_definitions( -DIMPORT_LIBLLDB ) add_definitions( -DIMPORT_LIBLLDB )
endif() endif()
# Add lldb dependency on lldb-server if we can use it. add_dependencies(lldb lldb-suite)
if ( LLDB_CAN_USE_LLDB_SERVER )
add_dependencies(lldb lldb-server)
endif()
# Add lldb dependency on debugserver if we can use it.
if ( LLDB_CAN_USE_DEBUGSERVER )
add_dependencies(lldb debugserver)
endif()

View File

@ -42,7 +42,7 @@ else()
list(APPEND LLDB_PLUGINS lldbPluginObjectFileELF) list(APPEND LLDB_PLUGINS lldbPluginObjectFileELF)
endif() endif()
add_lldb_tool(lldb-server INCLUDE_IN_FRAMEWORK add_lldb_tool(lldb-server INCLUDE_IN_SUITE
Acceptor.cpp Acceptor.cpp
lldb-gdbserver.cpp lldb-gdbserver.cpp
lldb-platform.cpp lldb-platform.cpp