[PATCH] D78192: [WIP] tentative support of compiler extension in llvm-config

serge via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 15 03:47:22 PDT 2020


serge-sans-paille created this revision.
serge-sans-paille added a reviewer: Meinersbur.
Herald added subscribers: llvm-commits, mgorny.
Herald added a project: LLVM.

The approach here is to make compiler extension an implicit dependency of the passes component, and dump the actual extension dependency from the cmake target property.

Hopefully fixes https://bugs.llvm.org/show_bug.cgi?id=44870


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D78192

Files:
  llvm/cmake/modules/AddLLVM.cmake
  llvm/tools/llvm-config/llvm-config.cpp


Index: llvm/tools/llvm-config/llvm-config.cpp
===================================================================
--- llvm/tools/llvm-config/llvm-config.cpp
+++ 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
Index: llvm/cmake/modules/AddLLVM.cmake
===================================================================
--- llvm/cmake/modules/AddLLVM.cmake
+++ 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()
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D78192.257655.patch
Type: text/x-patch
Size: 3674 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200415/180f6371/attachment.bin>


More information about the llvm-commits mailing list