diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -953,6 +953,49 @@ "${LLVM_BINARY_DIR}/include/llvm/Support/Extension.def.tmp" "${LLVM_BINARY_DIR}/include/llvm/Support/Extension.def") file(REMOVE "${LLVM_BINARY_DIR}/include/llvm/Support/Extension.def.tmp") + + # also generate build information for llvm-config + set(llvm_plugin_max_deps_length 0) + foreach(llvm_extension ${LLVM_STATIC_EXTENSIONS}) + get_property(llvm_plugin_deps TARGET ${llvm_extension} PROPERTY LINK_LIBRARIES) + list(LENGTH llvm_plugin_deps llvm_plugin_deps_length) + if(llvm_plugin_deps_length GREATER llvm_plugin_max_deps_length) + set(llvm_plugin_max_deps_length ${llvm_plugin_deps_length}) + endif() + endforeach() + + file(WRITE + "${LLVM_BINARY_DIR}/tools/llvm-config/ExtensionDependencies.inc.tmp" + "struct { const char* Name; const char* const RequiredLibraries[1 + 1 + ${llvm_plugin_max_deps_length}];} AvailableExtensions[] = {\n") + foreach(llvm_extension ${LLVM_STATIC_EXTENSIONS}) + get_property(llvm_plugin_deps TARGET ${llvm_extension} PROPERTY LINK_LIBRARIES) + file(APPEND + "${LLVM_BINARY_DIR}/tools/llvm-config/ExtensionDependencies.inc.tmp" + "\t{\"${llvm_extension}\", {\"${llvm_extension}\",") + foreach(llvm_plugin_dep ${llvm_plugin_deps}) + STRING(REGEX REPLACE "^-l" "" plugin_name ${llvm_plugin_dep}) + STRING(REGEX MATCH "^LLVM" is_llvm_lib ${plugin_name}) + # We don't want to add LLVM library as a dependency (?) + if(NOT is_llvm_lib) + file(APPEND + "${LLVM_BINARY_DIR}/tools/llvm-config/ExtensionDependencies.inc.tmp" + "\"${plugin_name}\", ") + endif() + endforeach() + file(APPEND + "${LLVM_BINARY_DIR}/tools/llvm-config/ExtensionDependencies.inc.tmp" + "nullptr}},\n") + endforeach() + file(APPEND + "${LLVM_BINARY_DIR}/tools/llvm-config/ExtensionDependencies.inc.tmp" + "};\n") + + # only replace if there's an actual change + execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${LLVM_BINARY_DIR}/tools/llvm-config/ExtensionDependencies.inc.tmp" + "${LLVM_BINARY_DIR}/tools/llvm-config/ExtensionDependencies.inc") + file(REMOVE + "${LLVM_BINARY_DIR}/tools/llvm-config/ExtensionDependencies.inc.tmp") endif() endfunction() diff --git a/llvm/tools/llvm-config/llvm-config.cpp b/llvm/tools/llvm-config/llvm-config.cpp --- a/llvm/tools/llvm-config/llvm-config.cpp +++ b/llvm/tools/llvm-config/llvm-config.cpp @@ -46,6 +46,10 @@ // create entries for pseudo groups like x86 or all-targets. #include "LibraryDependencies.inc" +// Extension also register their dependencies as a dependency of "passes" +// component. +#include "ExtensionDependencies.inc" + // LinkMode determines what libraries and flags are returned by llvm-config. enum LinkMode { // LinkModeAuto will link with the default link mode for the installation, @@ -127,6 +131,13 @@ } RequiredLibs.push_back(AC->Library); } + if (Name == "passes") { + for (auto const &AvailableExtension : AvailableExtensions) { + for (const char *const *Iter = &AvailableExtension.RequiredLibraries[0]; + *Iter; ++Iter) + RequiredLibs.push_back(*Iter); + } + } } /// Compute the list of required libraries for a given list of