@@ -404,7 +404,7 @@ endfunction(set_windows_version_resource_properties)
404404# )
405405function (llvm_add_library name )
406406 cmake_parse_arguments (ARG
407- "MODULE;SHARED;STATIC;OBJECT;DISABLE_LLVM_LINK_LLVM_DYLIB;SONAME;NO_INSTALL_RPATH;COMPONENT_LIB;ENABLE_PLUGINS "
407+ "MODULE;SHARED;STATIC;OBJECT;DISABLE_LLVM_LINK_LLVM_DYLIB;SONAME;NO_INSTALL_RPATH;COMPONENT_LIB"
408408 "OUTPUT_NAME;PLUGIN_TOOL;ENTITLEMENTS;BUNDLE_PATH"
409409 "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS"
410410 ${ARGN} )
@@ -418,9 +418,6 @@ function(llvm_add_library name)
418418 else ()
419419 llvm_process_sources(ALL_FILES ${ARG_UNPARSED_ARGUMENTS} ${ARG_ADDITIONAL_HEADERS} )
420420 endif ()
421- if (ARG_ENABLE_PLUGINS)
422- set_property (GLOBAL APPEND PROPERTY LLVM_PLUGIN_TARGETS ${name} )
423- endif ()
424421
425422 if (ARG_MODULE)
426423 if (ARG_SHARED OR ARG_STATIC)
@@ -753,7 +750,7 @@ endmacro(add_llvm_library name)
753750
754751macro (add_llvm_executable name )
755752 cmake_parse_arguments (ARG
756- "DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH;SUPPORT_PLUGINS;ENABLE_PLUGINS "
753+ "DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH;SUPPORT_PLUGINS"
757754 "ENTITLEMENTS;BUNDLE_PATH"
758755 "DEPENDS"
759756 ${ARGN} )
@@ -840,9 +837,6 @@ macro(add_llvm_executable name)
840837 # API for all shared libaries loaded by this executable.
841838 target_link_libraries (${name} PRIVATE ${LLVM_PTHREAD_LIB} )
842839 endif ()
843- if (ARG_ENABLE_PLUGINS)
844- set_property (GLOBAL APPEND PROPERTY LLVM_PLUGIN_TARGETS ${name} )
845- endif ()
846840
847841 llvm_codesign(${name} ENTITLEMENTS ${ARG_ENTITLEMENTS} BUNDLE_PATH ${ARG_BUNDLE_PATH} )
848842endmacro (add_llvm_executable name )
@@ -915,18 +909,18 @@ function(process_llvm_pass_plugins)
915909 include (LLVMConfigExtensions)
916910 endif ()
917911
918- # Add static plugins to each plugin target.
912+ # Add static plugins to the Extension component
919913 foreach (llvm_extension ${LLVM_STATIC_EXTENSIONS} )
920- get_property (llvm_plugin_targets GLOBAL PROPERTY LLVM_PLUGIN_TARGETS)
921- foreach (llvm_plugin_target ${llvm_plugin_targets} )
922- set_property (TARGET ${llvm_plugin_target} APPEND PROPERTY LINK_LIBRARIES ${llvm_extension} )
923- set_property (TARGET ${llvm_plugin_target} APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${llvm_extension} )
924- endforeach ()
914+ set_property (TARGET LLVMExtensions APPEND PROPERTY LINK_LIBRARIES ${llvm_extension} )
915+ set_property (TARGET LLVMExtensions APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${llvm_extension} )
925916 endforeach ()
926917
927- # Eventually generate the extension header , and store config to a cmake file
918+ # Eventually generate the extension headers , and store config to a cmake file
928919 # for usage in third-party configuration.
929920 if (ARG_GEN_CONFIG)
921+
922+ ## Part 1: Extension header to be included whenever we need extension
923+ # processing.
930924 set (LLVM_INSTALL_PACKAGE_DIR lib${LLVM_LIBDIR_SUFFIX} /cmake/llvm)
931925 set (llvm_cmake_builddir "${LLVM_BINARY_DIR} /${LLVM_INSTALL_PACKAGE_DIR} " )
932926 file (WRITE
@@ -949,6 +943,57 @@ function(process_llvm_pass_plugins)
949943 "${ExtensionDef} .tmp"
950944 "${ExtensionDef} " )
951945 file (REMOVE "${ExtensionDef} .tmp" )
946+
947+ ## Part 2: Extension header that captures each extension dependency, to be
948+ # used by llvm-config.
949+ set (ExtensionDeps "${LLVM_BINARY_DIR} /tools/llvm-config/ExtensionDependencies.inc" )
950+
951+ # Max needed to correctly size the required library array.
952+ set (llvm_plugin_max_deps_length 0)
953+ foreach (llvm_extension ${LLVM_STATIC_EXTENSIONS} )
954+ get_property (llvm_plugin_deps TARGET ${llvm_extension} PROPERTY LINK_LIBRARIES )
955+ list (LENGTH llvm_plugin_deps llvm_plugin_deps_length)
956+ if (llvm_plugin_deps_length GREATER llvm_plugin_max_deps_length)
957+ set (llvm_plugin_max_deps_length ${llvm_plugin_deps_length} )
958+ endif ()
959+ endforeach ()
960+
961+ list (LENGTH LLVM_STATIC_EXTENSIONS llvm_static_extension_count)
962+ file (WRITE
963+ "${ExtensionDeps} .tmp"
964+ "#include <array>\n\
965+ struct ExtensionDescriptor {\n\
966+ const char* Name;\n\
967+ const char* const RequiredLibraries[1 + 1 + ${llvm_plugin_max_deps_length} ];\n\
968+ };\n\
969+ std::array<ExtensionDescriptor, ${llvm_static_extension_count} > AvailableExtensions{\n " )
970+
971+ foreach (llvm_extension ${LLVM_STATIC_EXTENSIONS} )
972+ get_property (llvm_plugin_deps TARGET ${llvm_extension} PROPERTY LINK_LIBRARIES )
973+
974+ file (APPEND "${ExtensionDeps} .tmp" "{\" ${llvm_extension} \" , {" )
975+ foreach (llvm_plugin_dep ${llvm_plugin_deps} )
976+ # Turn library dependency back to component name, if possible.
977+ # That way llvm-config can avoid redundant dependencies.
978+ STRING (REGEX REPLACE "^-l" "" plugin_dep_name ${llvm_plugin_dep} )
979+ STRING (REGEX MATCH "^LLVM" is_llvm_library ${plugin_dep_name} )
980+ if (is_llvm_library)
981+ STRING (REGEX REPLACE "^LLVM" "" plugin_dep_name ${plugin_dep_name} )
982+ STRING (TOLOWER ${plugin_dep_name} plugin_dep_name)
983+ endif ()
984+ file (APPEND "${ExtensionDeps} .tmp" "\" ${plugin_dep_name} \" , " )
985+ endforeach ()
986+
987+ # Self + mandatory trailing null, because the number of RequiredLibraries differs between extensions.
988+ file (APPEND "${ExtensionDeps} .tmp" \"${llvm_extension} \", "nullptr}},\n " )
989+ endforeach ()
990+ file (APPEND "${ExtensionDeps} .tmp" "};\n " )
991+
992+ # only replace if there's an actual change
993+ execute_process (COMMAND ${CMAKE_COMMAND} -E copy_if_different
994+ "${ExtensionDeps} .tmp"
995+ "${ExtensionDeps} " )
996+ file (REMOVE "${ExtensionDeps} .tmp" )
952997 endif ()
953998endfunction ()
954999
0 commit comments