瀏覽代碼

improve abseil links (#2961)

ruki 1 年之前
父節點
當前提交
303ce83156
共有 1 個文件被更改,包括 25 次插入19 次删除
  1. 25 19
      packages/a/abseil/xmake.lua

+ 25 - 19
packages/a/abseil/xmake.lua

@@ -16,21 +16,6 @@ package("abseil")
 
     add_deps("cmake")
 
-    add_linkorders("absl_strings", "absl_base")
-    add_linkorders("absl_strings", "absl_raw_logging_internal")
-    add_linkorders("absl_strings_internal", "absl_base")
-    add_linkorders("absl_strings_internal", "absl_raw_logging_internal")
-    add_linkorders("absl_str_format_internal", "absl_base")
-    add_linkorders("absl_str_format_internal", "absl_raw_logging_internal")
-    add_linkorders("absl_str_format_internal", "absl_strings")
-    add_linkorders("absl_flags", "absl_base")
-    add_linkorders("absl_synchronization", "absl_base")
-    add_linkorders("absl_synchronization", "absl_stacktrace")
-    add_linkorders("absl_hash", "absl_city")
-    add_linkorders("absl_base", "absl_time")
-    add_linkorders("absl_kernel_timeout_internal", "absl_time")
-    add_linkorders("absl_time", "absl_time_zone")
-
     if is_plat("macosx") then
         add_frameworks("CoreFoundation")
     end
@@ -38,10 +23,6 @@ package("abseil")
     on_load(function (package)
         if package:is_plat("windows") and package:config("shared") then
             package:add("defines", "ABSL_CONSUME_DLL")
-            package:add("links", "abseil_dll")
-        end
-        if package:version():eq("20230802.1") then
-            package:add("linkorders", "absl_synchronization", "absl_kernel_timeout_internal")
         end
     end)
 
@@ -54,6 +35,31 @@ package("abseil")
         table.insert(configs, "-DCMAKE_BUILD_TYPE=" .. (package:debug() and "Debug" or "Release"))
         table.insert(configs, "-DBUILD_SHARED_LIBS=" .. (package:config("shared") and "ON" or "OFF"))
         import("package.tools.cmake").install(package, configs, {buildir = os.tmpfile() .. ".dir"})
+
+        -- get links and ensure link order
+        import("core.base.graph")
+        local dag = graph.new(true)
+        local pkgconfigdir = package:installdir("lib", "pkgconfig")
+        for _, pcfile in ipairs(os.files(path.join(pkgconfigdir, "*.pc"))) do
+            local link = path.basename(pcfile)
+            local content = io.readfile(pcfile)
+            for _, line in ipairs(content:split("\n")) do
+                if line:startswith("Requires: ") then
+                    local requires = line:sub(10):split(",")
+                    for _, dep in ipairs(requires) do
+                        dep = dep:split("=")[1]:trim()
+                        dag:add_edge(link, dep)
+                    end
+                end
+            end
+        end
+        local links = dag:topological_sort()
+        package:add("links", links)
+
+        local cycle = dag:find_cycle()
+        if cycle then
+            wprint("cycle links found", cycle)
+        end
     end)
 
     on_test(function (package)