@@ -409,7 +409,7 @@ endfunction(set_windows_version_resource_properties)
409409# )
410410function (llvm_add_library name )
411411 cmake_parse_arguments (ARG
412- "MODULE;SHARED;STATIC;OBJECT;DISABLE_LLVM_LINK_LLVM_DYLIB;SONAME;NO_INSTALL_RPATH;COMPONENT_LIB;ENABLE_PLUGINS "
412+ "MODULE;SHARED;STATIC;OBJECT;DISABLE_LLVM_LINK_LLVM_DYLIB;SONAME;NO_INSTALL_RPATH;COMPONENT_LIB"
413413 "OUTPUT_NAME;PLUGIN_TOOL;ENTITLEMENTS;BUNDLE_PATH"
414414 "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS"
415415 ${ARGN} )
@@ -423,9 +423,6 @@ function(llvm_add_library name)
423423 else ()
424424 llvm_process_sources(ALL_FILES ${ARG_UNPARSED_ARGUMENTS} ${ARG_ADDITIONAL_HEADERS} )
425425 endif ()
426- if (ARG_ENABLE_PLUGINS)
427- set_property (GLOBAL APPEND PROPERTY LLVM_PLUGIN_TARGETS ${name} )
428- endif ()
429426
430427 if (ARG_MODULE)
431428 if (ARG_SHARED OR ARG_STATIC)
@@ -758,7 +755,7 @@ endmacro(add_llvm_library name)
758755
759756macro (add_llvm_executable name )
760757 cmake_parse_arguments (ARG
761- "DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH;SUPPORT_PLUGINS;ENABLE_PLUGINS "
758+ "DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH;SUPPORT_PLUGINS"
762759 "ENTITLEMENTS;BUNDLE_PATH"
763760 "DEPENDS"
764761 ${ARGN} )
@@ -845,9 +842,6 @@ macro(add_llvm_executable name)
845842 # API for all shared libaries loaded by this executable.
846843 target_link_libraries (${name} PRIVATE ${LLVM_PTHREAD_LIB} )
847844 endif ()
848- if (ARG_ENABLE_PLUGINS)
849- set_property (GLOBAL APPEND PROPERTY LLVM_PLUGIN_TARGETS ${name} )
850- endif ()
851845
852846 llvm_codesign(${name} ENTITLEMENTS ${ARG_ENTITLEMENTS} BUNDLE_PATH ${ARG_BUNDLE_PATH} )
853847endmacro (add_llvm_executable name )
@@ -920,18 +914,18 @@ function(process_llvm_pass_plugins)
920914 include (LLVMConfigExtensions)
921915 endif ()
922916
923- # Add static plugins to each plugin target.
917+ # Add static plugins to the Extension component
924918 foreach (llvm_extension ${LLVM_STATIC_EXTENSIONS} )
925- get_property (llvm_plugin_targets GLOBAL PROPERTY LLVM_PLUGIN_TARGETS)
926- foreach (llvm_plugin_target ${llvm_plugin_targets} )
927- set_property (TARGET ${llvm_plugin_target} APPEND PROPERTY LINK_LIBRARIES ${llvm_extension} )
928- set_property (TARGET ${llvm_plugin_target} APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${llvm_extension} )
929- endforeach ()
919+ set_property (TARGET LLVMExtensions APPEND PROPERTY LINK_LIBRARIES ${llvm_extension} )
920+ set_property (TARGET LLVMExtensions APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${llvm_extension} )
930921 endforeach ()
931922
932- # Eventually generate the extension header , and store config to a cmake file
923+ # Eventually generate the extension headers , and store config to a cmake file
933924 # for usage in third-party configuration.
934925 if (ARG_GEN_CONFIG)
926+
927+ ## Part 1: Extension header to be included whenever we need extension
928+ # processing.
935929 set (LLVM_INSTALL_PACKAGE_DIR lib${LLVM_LIBDIR_SUFFIX} /cmake/llvm)
936930 set (llvm_cmake_builddir "${LLVM_BINARY_DIR} /${LLVM_INSTALL_PACKAGE_DIR} " )
937931 file (WRITE
@@ -954,6 +948,57 @@ function(process_llvm_pass_plugins)
954948 "${ExtensionDef} .tmp"
955949 "${ExtensionDef} " )
956950 file (REMOVE "${ExtensionDef} .tmp" )
951+
952+ ## Part 2: Extension header that captures each extension dependency, to be
953+ # used by llvm-config.
954+ set (ExtensionDeps "${LLVM_BINARY_DIR} /tools/llvm-config/ExtensionDependencies.inc" )
955+
956+ # Max needed to correctly size the required library array.
957+ set (llvm_plugin_max_deps_length 0)
958+ foreach (llvm_extension ${LLVM_STATIC_EXTENSIONS} )
959+ get_property (llvm_plugin_deps TARGET ${llvm_extension} PROPERTY LINK_LIBRARIES )
960+ list (LENGTH llvm_plugin_deps llvm_plugin_deps_length)
961+ if (llvm_plugin_deps_length GREATER llvm_plugin_max_deps_length)
962+ set (llvm_plugin_max_deps_length ${llvm_plugin_deps_length} )
963+ endif ()
964+ endforeach ()
965+
966+ list (LENGTH LLVM_STATIC_EXTENSIONS llvm_static_extension_count)
967+ file (WRITE
968+ "${ExtensionDeps} .tmp"
969+ "#include <array>\n\
970+ struct ExtensionDescriptor {\n\
971+ const char* Name;\n\
972+ const char* const RequiredLibraries[1 + 1 + ${llvm_plugin_max_deps_length} ];\n\
973+ };\n\
974+ std::array<ExtensionDescriptor, ${llvm_static_extension_count} > AvailableExtensions{\n " )
975+
976+ foreach (llvm_extension ${LLVM_STATIC_EXTENSIONS} )
977+ get_property (llvm_plugin_deps TARGET ${llvm_extension} PROPERTY LINK_LIBRARIES )
978+
979+ file (APPEND "${ExtensionDeps} .tmp" "{\" ${llvm_extension} \" , {" )
980+ foreach (llvm_plugin_dep ${llvm_plugin_deps} )
981+ # Turn library dependency back to component name, if possible.
982+ # That way llvm-config can avoid redundant dependencies.
983+ STRING (REGEX REPLACE "^-l" "" plugin_dep_name ${llvm_plugin_dep} )
984+ STRING (REGEX MATCH "^LLVM" is_llvm_library ${plugin_dep_name} )
985+ if (is_llvm_library)
986+ STRING (REGEX REPLACE "^LLVM" "" plugin_dep_name ${plugin_dep_name} )
987+ STRING (TOLOWER ${plugin_dep_name} plugin_dep_name)
988+ endif ()
989+ file (APPEND "${ExtensionDeps} .tmp" "\" ${plugin_dep_name} \" , " )
990+ endforeach ()
991+
992+ # Self + mandatory trailing null, because the number of RequiredLibraries differs between extensions.
993+ file (APPEND "${ExtensionDeps} .tmp" \"${llvm_extension} \", "nullptr}},\n " )
994+ endforeach ()
995+ file (APPEND "${ExtensionDeps} .tmp" "};\n " )
996+
997+ # only replace if there's an actual change
998+ execute_process (COMMAND ${CMAKE_COMMAND} -E copy_if_different
999+ "${ExtensionDeps} .tmp"
1000+ "${ExtensionDeps} " )
1001+ file (REMOVE "${ExtensionDeps} .tmp" )
9571002 endif ()
9581003endfunction ()
9591004
0 commit comments