|  | function(add_lldb_library name) | 
|  | # 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" | 
|  | "" | 
|  | "EXTRA_CXXFLAGS;DEPENDS;LINK_LIBS;LINK_COMPONENTS" | 
|  | ${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() | 
|  | llvm_add_library(${name} ${libkind} ${srcs} LINK_LIBS | 
|  | ${PARAM_LINK_LIBS} | 
|  | DEPENDS ${PARAM_DEPENDS}) | 
|  |  | 
|  | if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "liblldb") | 
|  | if (PARAM_SHARED) | 
|  | set(out_dir lib${LLVM_LIBDIR_SUFFIX}) | 
|  | if(${name} STREQUAL "liblldb" AND LLDB_BUILD_FRAMEWORK) | 
|  | set(out_dir ${LLDB_FRAMEWORK_INSTALL_DIR}) | 
|  | endif() | 
|  | install(TARGETS ${name} | 
|  | COMPONENT ${name} | 
|  | RUNTIME DESTINATION bin | 
|  | LIBRARY DESTINATION ${out_dir} | 
|  | ARCHIVE DESTINATION ${out_dir}) | 
|  | else() | 
|  | install(TARGETS ${name} | 
|  | COMPONENT ${name} | 
|  | LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} | 
|  | ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}) | 
|  | endif() | 
|  | if (NOT CMAKE_CONFIGURATION_TYPES) | 
|  | add_llvm_install_targets(install-${name} | 
|  | DEPENDS ${name} | 
|  | COMPONENT ${name}) | 
|  | endif() | 
|  | 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. | 
|  | add_dependencies(${name} clang-tablegen-targets) | 
|  |  | 
|  | # Add in any extra C++ compilation flags for this library. | 
|  | target_compile_options(${name} PRIVATE ${PARAM_EXTRA_CXXFLAGS}) | 
|  |  | 
|  | set_target_properties(${name} PROPERTIES FOLDER "lldb libraries") | 
|  | endfunction(add_lldb_library) | 
|  |  | 
|  | function(add_lldb_executable name) | 
|  | cmake_parse_arguments(ARG | 
|  | "INCLUDE_IN_SUITE;GENERATE_INSTALL" | 
|  | "" | 
|  | "LINK_LIBS;LINK_COMPONENTS" | 
|  | ${ARGN} | 
|  | ) | 
|  |  | 
|  | list(APPEND LLVM_LINK_COMPONENTS ${ARG_LINK_COMPONENTS}) | 
|  | add_llvm_executable(${name} ${ARG_UNPARSED_ARGUMENTS}) | 
|  |  | 
|  | target_link_libraries(${name} PRIVATE ${ARG_LINK_LIBS}) | 
|  | set_target_properties(${name} PROPERTIES | 
|  | FOLDER "lldb executables") | 
|  |  | 
|  | if(ARG_INCLUDE_IN_SUITE) | 
|  | add_dependencies(lldb-suite ${name}) | 
|  | if(LLDB_BUILD_FRAMEWORK) | 
|  | if(NOT IOS) | 
|  | set(resource_dir "/Resources") | 
|  | set(resource_dots "../") | 
|  | endif() | 
|  | string(REGEX REPLACE "[^/]+" ".." _dots ${LLDB_FRAMEWORK_INSTALL_DIR}) | 
|  | set_target_properties(${name} PROPERTIES | 
|  | RUNTIME_OUTPUT_DIRECTORY $<TARGET_FILE_DIR:liblldb>${resource_dir} | 
|  | BUILD_WITH_INSTALL_RPATH On | 
|  | INSTALL_RPATH "@loader_path/../../../${resource_dots}${_dots}/${LLDB_FRAMEWORK_INSTALL_DIR}") | 
|  | endif() | 
|  | endif() | 
|  |  | 
|  | 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) | 
|  | set(out_dir "bin") | 
|  | if (LLDB_BUILD_FRAMEWORK AND ARG_INCLUDE_IN_SUITE) | 
|  | set(out_dir ${LLDB_FRAMEWORK_INSTALL_DIR}/${LLDB_FRAMEWORK_RESOURCE_DIR}) | 
|  | endif() | 
|  | install(TARGETS ${name} | 
|  | COMPONENT ${name} | 
|  | RUNTIME DESTINATION ${out_dir}) | 
|  | if (NOT CMAKE_CONFIGURATION_TYPES) | 
|  | add_llvm_install_targets(install-${name} | 
|  | DEPENDS ${name} | 
|  | COMPONENT ${name}) | 
|  | endif() | 
|  | endif() | 
|  |  | 
|  | if(ARG_INCLUDE_IN_SUITE AND LLDB_BUILD_FRAMEWORK) | 
|  | add_llvm_tool_symlink(${name} ${name} ALWAYS_GENERATE SKIP_INSTALL | 
|  | OUTPUT_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) | 
|  | endif() | 
|  | endfunction(add_lldb_executable) | 
|  |  | 
|  | function(add_lldb_tool name) | 
|  | add_lldb_executable(${name} GENERATE_INSTALL ${ARGN}) | 
|  | endfunction() | 
|  |  | 
|  | # Support appending linker flags to an existing target. | 
|  | # This will preserve the existing linker flags on the | 
|  | # target, if there are any. | 
|  | function(lldb_append_link_flags target_name new_link_flags) | 
|  | # Retrieve existing linker flags. | 
|  | get_target_property(current_link_flags ${target_name} LINK_FLAGS) | 
|  |  | 
|  | # If we had any linker flags, include them first in the new linker flags. | 
|  | if(current_link_flags) | 
|  | set(new_link_flags "${current_link_flags} ${new_link_flags}") | 
|  | endif() | 
|  |  | 
|  | # Now set them onto the target. | 
|  | set_target_properties(${target_name} PROPERTIES LINK_FLAGS ${new_link_flags}) | 
|  | endfunction() |