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()