forked from OSchip/llvm-project
357 lines
12 KiB
CMake
357 lines
12 KiB
CMake
include(GNUInstallDirs)
|
|
|
|
function(lldb_tablegen)
|
|
# Syntax:
|
|
# lldb_tablegen output-file [tablegen-arg ...] SOURCE source-file
|
|
# [[TARGET cmake-target-name] [DEPENDS extra-dependency ...]]
|
|
#
|
|
# Generates a custom command for invoking tblgen as
|
|
#
|
|
# tblgen source-file -o=output-file tablegen-arg ...
|
|
#
|
|
# and, if cmake-target-name is provided, creates a custom target for
|
|
# executing the custom command depending on output-file. It is
|
|
# possible to list more files to depend after DEPENDS.
|
|
|
|
cmake_parse_arguments(LTG "" "SOURCE;TARGET" "" ${ARGN})
|
|
|
|
if(NOT LTG_SOURCE)
|
|
message(FATAL_ERROR "SOURCE source-file required by lldb_tablegen")
|
|
endif()
|
|
|
|
set(LLVM_TARGET_DEFINITIONS ${LTG_SOURCE})
|
|
tablegen(LLDB ${LTG_UNPARSED_ARGUMENTS})
|
|
|
|
if(LTG_TARGET)
|
|
add_public_tablegen_target(${LTG_TARGET})
|
|
set_target_properties( ${LTG_TARGET} PROPERTIES FOLDER "LLDB tablegenning")
|
|
set_property(GLOBAL APPEND PROPERTY LLDB_TABLEGEN_TARGETS ${LTG_TARGET})
|
|
endif()
|
|
endfunction(lldb_tablegen)
|
|
|
|
function(add_lldb_library name)
|
|
include_directories(BEFORE
|
|
${CMAKE_CURRENT_BINARY_DIR}
|
|
)
|
|
|
|
# only supported parameters to this macro are the optional
|
|
# MODULE;SHARED;STATIC library type and source files
|
|
cmake_parse_arguments(PARAM
|
|
"MODULE;SHARED;STATIC;OBJECT;PLUGIN;FRAMEWORK"
|
|
"INSTALL_PREFIX;ENTITLEMENTS"
|
|
"EXTRA_CXXFLAGS;DEPENDS;LINK_LIBS;LINK_COMPONENTS;CLANG_LIBS"
|
|
${ARGN})
|
|
llvm_process_sources(srcs ${PARAM_UNPARSED_ARGUMENTS})
|
|
list(APPEND LLVM_LINK_COMPONENTS ${PARAM_LINK_COMPONENTS})
|
|
|
|
if(PARAM_PLUGIN)
|
|
set_property(GLOBAL APPEND PROPERTY LLDB_PLUGINS ${name})
|
|
endif()
|
|
|
|
if (MSVC_IDE OR XCODE)
|
|
string(REGEX MATCHALL "/[^/]+" split_path ${CMAKE_CURRENT_SOURCE_DIR})
|
|
list(GET split_path -1 dir)
|
|
file(GLOB_RECURSE headers
|
|
../../include/lldb${dir}/*.h)
|
|
set(srcs ${srcs} ${headers})
|
|
endif()
|
|
if (PARAM_MODULE)
|
|
set(libkind MODULE)
|
|
elseif (PARAM_SHARED)
|
|
set(libkind SHARED)
|
|
elseif (PARAM_OBJECT)
|
|
set(libkind OBJECT)
|
|
else ()
|
|
# PARAM_STATIC or library type unspecified. BUILD_SHARED_LIBS
|
|
# does not control the kind of libraries created for LLDB,
|
|
# only whether or not they link to shared/static LLVM/Clang
|
|
# libraries.
|
|
set(libkind STATIC)
|
|
endif()
|
|
|
|
#PIC not needed on Win
|
|
# FIXME: Setting CMAKE_CXX_FLAGS here is a no-op, use target_compile_options
|
|
# or omit this logic instead.
|
|
if (NOT WIN32)
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
|
|
endif()
|
|
|
|
if (PARAM_OBJECT)
|
|
add_library(${name} ${libkind} ${srcs})
|
|
else()
|
|
if(PARAM_ENTITLEMENTS)
|
|
set(pass_ENTITLEMENTS ENTITLEMENTS ${PARAM_ENTITLEMENTS})
|
|
endif()
|
|
|
|
if(LLDB_NO_INSTALL_DEFAULT_RPATH)
|
|
set(pass_NO_INSTALL_RPATH NO_INSTALL_RPATH)
|
|
endif()
|
|
|
|
llvm_add_library(${name} ${libkind} ${srcs}
|
|
LINK_LIBS ${PARAM_LINK_LIBS}
|
|
DEPENDS ${PARAM_DEPENDS}
|
|
${pass_ENTITLEMENTS}
|
|
${pass_NO_INSTALL_RPATH}
|
|
)
|
|
|
|
if(CLANG_LINK_CLANG_DYLIB)
|
|
target_link_libraries(${name} PRIVATE clang-cpp)
|
|
else()
|
|
target_link_libraries(${name} PRIVATE ${PARAM_CLANG_LIBS})
|
|
endif()
|
|
endif()
|
|
|
|
# A target cannot be changed to a FRAMEWORK after calling install() because
|
|
# this may result in the wrong install DESTINATION. The FRAMEWORK property
|
|
# must be set earlier.
|
|
if(PARAM_FRAMEWORK)
|
|
set_target_properties(liblldb PROPERTIES FRAMEWORK ON)
|
|
endif()
|
|
|
|
if(PARAM_SHARED)
|
|
set(install_dest "${CMAKE_INSTALL_LIBDIR}")
|
|
if(PARAM_INSTALL_PREFIX)
|
|
set(install_dest ${PARAM_INSTALL_PREFIX})
|
|
endif()
|
|
# RUNTIME is relevant for DLL platforms, FRAMEWORK for macOS
|
|
install(TARGETS ${name} COMPONENT ${name}
|
|
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
|
|
LIBRARY DESTINATION ${install_dest}
|
|
ARCHIVE DESTINATION ${install_dest}
|
|
FRAMEWORK DESTINATION ${install_dest})
|
|
if (NOT CMAKE_CONFIGURATION_TYPES)
|
|
add_llvm_install_targets(install-${name}
|
|
DEPENDS ${name}
|
|
COMPONENT ${name})
|
|
endif()
|
|
endif()
|
|
|
|
# Hack: only some LLDB libraries depend on the clang autogenerated headers,
|
|
# but it is simple enough to make all of LLDB depend on some of those
|
|
# headers without negatively impacting much of anything.
|
|
if(NOT LLDB_BUILT_STANDALONE)
|
|
add_dependencies(${name} clang-tablegen-targets)
|
|
endif()
|
|
|
|
# Add in any extra C++ compilation flags for this library.
|
|
target_compile_options(${name} PRIVATE ${PARAM_EXTRA_CXXFLAGS})
|
|
|
|
if(PARAM_PLUGIN)
|
|
get_property(parent_dir DIRECTORY PROPERTY PARENT_DIRECTORY)
|
|
if(EXISTS ${parent_dir})
|
|
get_filename_component(category ${parent_dir} NAME)
|
|
set_target_properties(${name} PROPERTIES FOLDER "lldb plugins/${category}")
|
|
endif()
|
|
else()
|
|
set_target_properties(${name} PROPERTIES FOLDER "lldb libraries")
|
|
endif()
|
|
endfunction(add_lldb_library)
|
|
|
|
function(add_lldb_executable name)
|
|
cmake_parse_arguments(ARG
|
|
"GENERATE_INSTALL"
|
|
"INSTALL_PREFIX;ENTITLEMENTS"
|
|
"LINK_LIBS;CLANG_LIBS;LINK_COMPONENTS;BUILD_RPATH;INSTALL_RPATH"
|
|
${ARGN}
|
|
)
|
|
|
|
if(ARG_ENTITLEMENTS)
|
|
set(pass_ENTITLEMENTS ENTITLEMENTS ${ARG_ENTITLEMENTS})
|
|
endif()
|
|
|
|
if(LLDB_NO_INSTALL_DEFAULT_RPATH)
|
|
set(pass_NO_INSTALL_RPATH NO_INSTALL_RPATH)
|
|
endif()
|
|
|
|
list(APPEND LLVM_LINK_COMPONENTS ${ARG_LINK_COMPONENTS})
|
|
add_llvm_executable(${name}
|
|
${pass_ENTITLEMENTS}
|
|
${pass_NO_INSTALL_RPATH}
|
|
${ARG_UNPARSED_ARGUMENTS}
|
|
)
|
|
|
|
target_link_libraries(${name} PRIVATE ${ARG_LINK_LIBS})
|
|
if(CLANG_LINK_CLANG_DYLIB)
|
|
target_link_libraries(${name} PRIVATE clang-cpp)
|
|
else()
|
|
target_link_libraries(${name} PRIVATE ${ARG_CLANG_LIBS})
|
|
endif()
|
|
set_target_properties(${name} PROPERTIES FOLDER "lldb executables")
|
|
|
|
if (ARG_BUILD_RPATH)
|
|
set_target_properties(${name} PROPERTIES BUILD_RPATH "${ARG_BUILD_RPATH}")
|
|
endif()
|
|
|
|
if (ARG_INSTALL_RPATH)
|
|
set_target_properties(${name} PROPERTIES
|
|
BUILD_WITH_INSTALL_RPATH OFF
|
|
INSTALL_RPATH "${ARG_INSTALL_RPATH}")
|
|
endif()
|
|
|
|
if(ARG_GENERATE_INSTALL)
|
|
set(install_dest bin)
|
|
if(ARG_INSTALL_PREFIX)
|
|
set(install_dest ${ARG_INSTALL_PREFIX})
|
|
endif()
|
|
install(TARGETS ${name} COMPONENT ${name}
|
|
RUNTIME DESTINATION ${install_dest}
|
|
LIBRARY DESTINATION ${install_dest}
|
|
BUNDLE DESTINATION ${install_dest}
|
|
FRAMEWORK DESTINATION ${install_dest})
|
|
if (NOT CMAKE_CONFIGURATION_TYPES)
|
|
add_llvm_install_targets(install-${name}
|
|
DEPENDS ${name}
|
|
COMPONENT ${name})
|
|
endif()
|
|
if(APPLE AND ARG_INSTALL_PREFIX)
|
|
lldb_add_post_install_steps_darwin(${name} ${ARG_INSTALL_PREFIX})
|
|
endif()
|
|
endif()
|
|
endfunction()
|
|
|
|
|
|
macro(add_lldb_tool_subdirectory name)
|
|
add_llvm_subdirectory(LLDB TOOL ${name})
|
|
endmacro()
|
|
|
|
function(add_lldb_tool name)
|
|
cmake_parse_arguments(ARG "ADD_TO_FRAMEWORK" "" "" ${ARGN})
|
|
if(LLDB_BUILD_FRAMEWORK AND ARG_ADD_TO_FRAMEWORK)
|
|
set(subdir LLDB.framework/Versions/${LLDB_FRAMEWORK_VERSION}/Resources)
|
|
add_lldb_executable(${name}
|
|
GENERATE_INSTALL
|
|
INSTALL_PREFIX ${LLDB_FRAMEWORK_INSTALL_DIR}/${subdir}
|
|
${ARG_UNPARSED_ARGUMENTS}
|
|
)
|
|
lldb_add_to_buildtree_lldb_framework(${name} ${subdir})
|
|
return()
|
|
endif()
|
|
|
|
add_lldb_executable(${name} GENERATE_INSTALL ${ARG_UNPARSED_ARGUMENTS})
|
|
endfunction()
|
|
|
|
# The test suite relies on finding LLDB.framework binary resources in the
|
|
# build-tree. Remove them before installing to avoid collisions with their
|
|
# own install targets.
|
|
function(lldb_add_to_buildtree_lldb_framework name subdir)
|
|
# Destination for the copy in the build-tree. While the framework target may
|
|
# not exist yet, it will exist when the generator expression gets expanded.
|
|
set(copy_dest "${LLDB_FRAMEWORK_ABSOLUTE_BUILD_DIR}/${subdir}/$<TARGET_FILE_NAME:${name}>")
|
|
|
|
# Copy into the given subdirectory for testing.
|
|
add_custom_command(TARGET ${name} POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${name}> ${copy_dest}
|
|
COMMENT "Copy ${name} to ${copy_dest}"
|
|
)
|
|
endfunction()
|
|
|
|
# Add extra install steps for dSYM creation and stripping for the given target.
|
|
function(lldb_add_post_install_steps_darwin name install_prefix)
|
|
if(NOT APPLE)
|
|
message(WARNING "Darwin-specific functionality; not currently available on non-Apple platforms.")
|
|
return()
|
|
endif()
|
|
|
|
get_target_property(output_name ${name} OUTPUT_NAME)
|
|
if(NOT output_name)
|
|
set(output_name ${name})
|
|
endif()
|
|
|
|
get_target_property(is_framework ${name} FRAMEWORK)
|
|
if(is_framework)
|
|
get_target_property(buildtree_dir ${name} LIBRARY_OUTPUT_DIRECTORY)
|
|
if(buildtree_dir)
|
|
set(bundle_subdir ${output_name}.framework/Versions/${LLDB_FRAMEWORK_VERSION}/)
|
|
else()
|
|
message(SEND_ERROR "Framework target ${name} missing property for output directory. Cannot generate post-install steps.")
|
|
return()
|
|
endif()
|
|
else()
|
|
get_target_property(target_type ${name} TYPE)
|
|
if(target_type STREQUAL "EXECUTABLE")
|
|
set(buildtree_dir ${LLVM_RUNTIME_OUTPUT_INTDIR})
|
|
else()
|
|
# Only ever install shared libraries.
|
|
set(output_name "lib${output_name}.dylib")
|
|
set(buildtree_dir ${LLVM_LIBRARY_OUTPUT_INTDIR})
|
|
endif()
|
|
endif()
|
|
|
|
# Generate dSYM
|
|
if(NOT LLDB_SKIP_DSYM)
|
|
set(dsym_name ${output_name}.dSYM)
|
|
if(is_framework)
|
|
set(dsym_name ${output_name}.framework.dSYM)
|
|
endif()
|
|
if(LLDB_DEBUGINFO_INSTALL_PREFIX)
|
|
# This makes the path absolute, so we must respect DESTDIR.
|
|
set(dsym_name "\$ENV\{DESTDIR\}${LLDB_DEBUGINFO_INSTALL_PREFIX}/${dsym_name}")
|
|
endif()
|
|
|
|
set(buildtree_name ${buildtree_dir}/${bundle_subdir}${output_name})
|
|
install(CODE "message(STATUS \"Externalize debuginfo: ${dsym_name}\")" COMPONENT ${name})
|
|
install(CODE "execute_process(COMMAND xcrun dsymutil -o=${dsym_name} ${buildtree_name})"
|
|
COMPONENT ${name})
|
|
endif()
|
|
|
|
if(NOT LLDB_SKIP_STRIP)
|
|
# Strip distribution binary with -ST (removing debug symbol table entries and
|
|
# Swift symbols). Avoid CMAKE_INSTALL_DO_STRIP and llvm_externalize_debuginfo()
|
|
# as they can't be configured sufficiently.
|
|
set(installtree_name "\$ENV\{DESTDIR\}${install_prefix}/${bundle_subdir}${output_name}")
|
|
install(CODE "message(STATUS \"Stripping: ${installtree_name}\")" COMPONENT ${name})
|
|
install(CODE "execute_process(COMMAND xcrun strip -ST ${installtree_name})"
|
|
COMPONENT ${name})
|
|
endif()
|
|
endfunction()
|
|
|
|
# CMake's set_target_properties() doesn't allow to pass lists for RPATH
|
|
# properties directly (error: "called with incorrect number of arguments").
|
|
# Instead of defining two list variables each time, use this helper function.
|
|
function(lldb_setup_rpaths name)
|
|
cmake_parse_arguments(LIST "" "" "BUILD_RPATH;INSTALL_RPATH" ${ARGN})
|
|
set_target_properties(${name} PROPERTIES
|
|
BUILD_WITH_INSTALL_RPATH OFF
|
|
BUILD_RPATH "${LIST_BUILD_RPATH}"
|
|
INSTALL_RPATH "${LIST_INSTALL_RPATH}"
|
|
)
|
|
endfunction()
|
|
|
|
function(lldb_find_system_debugserver path)
|
|
execute_process(COMMAND xcode-select -p
|
|
RESULT_VARIABLE exit_code
|
|
OUTPUT_VARIABLE xcode_dev_dir
|
|
ERROR_VARIABLE error_msg
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
if(exit_code)
|
|
message(WARNING "`xcode-select -p` failed:\n${error_msg}")
|
|
else()
|
|
set(subpath "LLDB.framework/Resources/debugserver")
|
|
set(path_shared "${xcode_dev_dir}/../SharedFrameworks/${subpath}")
|
|
set(path_private "${xcode_dev_dir}/Library/PrivateFrameworks/${subpath}")
|
|
|
|
if(EXISTS ${path_shared})
|
|
set(${path} ${path_shared} PARENT_SCOPE)
|
|
elseif(EXISTS ${path_private})
|
|
set(${path} ${path_private} PARENT_SCOPE)
|
|
else()
|
|
message(WARNING "System debugserver requested, but not found. "
|
|
"Candidates don't exist: ${path_shared}\n${path_private}")
|
|
endif()
|
|
endif()
|
|
endfunction()
|
|
|
|
# Removes all module flags from the current CMAKE_CXX_FLAGS. Used for
|
|
# the Objective-C++ code in lldb which we don't want to build with modules.
|
|
# Reasons for this are that modules with Objective-C++ would require that
|
|
# all LLVM/Clang modules are Objective-C++ compatible (which they are likely
|
|
# not) and we would have rebuild a second set of modules just for the few
|
|
# Objective-C++ files in lldb (which slows down the build process).
|
|
macro(remove_module_flags)
|
|
string(REGEX REPLACE "-fmodules-cache-path=[^ ]+" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
|
string(REGEX REPLACE "-fmodules-local-submodule-visibility" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
|
string(REGEX REPLACE "-fmodules" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
|
string(REGEX REPLACE "-gmodules" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
|
string(REGEX REPLACE "-fcxx-modules" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
|
|
endmacro()
|