blob: 1116b28e8957878a052494adb77c3d169100bda5 [file] [log] [blame] [edit]
foreach (scope DIRECTORY TARGET)
define_property(${scope} PROPERTY LLDB_PLUGIN_KIND INHERITED
BRIEF_DOCS "LLDB plugin kind (Process, SymbolFile, etc.)"
FULL_DOCS "See lldb/docs/resources/contributing.rst"
)
define_property(${scope} PROPERTY LLDB_ACCEPTABLE_PLUGIN_DEPENDENCIES INHERITED
BRIEF_DOCS "LLDB plugin kinds which the plugin can depend on"
FULL_DOCS "See lldb/docs/resources/contributing.rst"
)
define_property(${scope} PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES INHERITED
BRIEF_DOCS "LLDB plugin kinds which are depended on for historic reasons."
FULL_DOCS "See lldb/docs/resources/contributing.rst"
)
endforeach()
option(LLDB_GENERATE_PLUGIN_DEP_GRAPH OFF)
function(check_lldb_plugin_layering)
get_property(plugins GLOBAL PROPERTY LLDB_PLUGINS)
foreach (plugin ${plugins})
get_property(plugin_kind TARGET ${plugin} PROPERTY LLDB_PLUGIN_KIND)
get_property(acceptable_deps TARGET ${plugin}
PROPERTY LLDB_ACCEPTABLE_PLUGIN_DEPENDENCIES)
get_property(tolerated_deps TARGET ${plugin}
PROPERTY LLDB_TOLERATED_PLUGIN_DEPENDENCIES)
# A plugin is always permitted to depend on its own kind for the purposes
# subclassing. Ideally the intra-kind dependencies should not form a loop,
# but we're not checking that here.
list(APPEND acceptable_deps ${plugin_kind})
list(APPEND all_plugin_kinds ${plugin_kind})
get_property(link_libs TARGET ${plugin} PROPERTY LINK_LIBRARIES)
foreach (link_lib ${link_libs})
if(link_lib IN_LIST plugins)
get_property(lib_kind TARGET ${link_lib} PROPERTY LLDB_PLUGIN_KIND)
if (lib_kind)
if (lib_kind IN_LIST acceptable_deps)
set(dep_kind green)
elseif (lib_kind IN_LIST tolerated_deps)
set(dep_kind yellow)
else()
set(dep_kind red)
message(SEND_ERROR "Plugin ${plugin} cannot depend on ${lib_kind} "
"plugin ${link_lib}")
endif()
list(APPEND dep_${dep_kind}_${plugin_kind}_${lib_kind} ${plugin})
endif()
endif()
endforeach()
endforeach()
if (LLDB_GENERATE_PLUGIN_DEP_GRAPH)
set(dep_graph "digraph Plugins {\n")
list(REMOVE_DUPLICATES all_plugin_kinds)
foreach (from ${all_plugin_kinds})
foreach (to ${all_plugin_kinds})
foreach (dep_kind green yellow red)
if (dep_${dep_kind}_${from}_${to})
list(REMOVE_DUPLICATES dep_${dep_kind}_${from}_${to})
string(REGEX REPLACE "lldbPlugin|${from}" "" short_deps
"${dep_${dep_kind}_${from}_${to}}")
string(JOIN "\n" plugins ${short_deps})
string(APPEND dep_graph
" ${from}->${to}[color=\"${dep_kind}\" label=\"${plugins}\"];\n")
endif()
endforeach()
endforeach()
endforeach()
string(APPEND dep_graph "}\n")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/lldb-plugin-deps.dot" "${dep_graph}")
endif()
endfunction()