summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2025-08-06 23:16:49 +0800
committerGitHub <[email protected]>2025-08-06 23:16:49 +0800
commit58f011fb3257a963e607e0b0337f11031025d3ba (patch)
treed2bc3e8b12dd82a4cae2d638c2886d0196a798aa
parent248afd9bd01f8135e813616f6ce81467decd9dc1 (diff)
parentbf2c52a5260bf1fe3a9333599e18c4320e352a6b (diff)
Merge pull request #6674 from xmake-io/linkgroups
Attempt to fix linkgroups in package
-rw-r--r--tests/projects/c++/package_linkgroups/3rd/dpdk/src/add.cc5
-rw-r--r--tests/projects/c++/package_linkgroups/3rd/dpdk/src/add.h3
-rw-r--r--tests/projects/c++/package_linkgroups/3rd/dpdk/xmake.lua7
-rw-r--r--tests/projects/c++/package_linkgroups/3rd/spdk/src/mul.cc10
-rw-r--r--tests/projects/c++/package_linkgroups/3rd/spdk/src/mul.h3
-rw-r--r--tests/projects/c++/package_linkgroups/3rd/spdk/xmake.lua22
-rw-r--r--tests/projects/c++/package_linkgroups/src/main.cc9
-rw-r--r--tests/projects/c++/package_linkgroups/test.lua7
-rw-r--r--tests/projects/c++/package_linkgroups/xmake.lua35
-rw-r--r--xmake/core/package/package.lua2
-rw-r--r--xmake/core/tool/builder.lua28
11 files changed, 128 insertions, 3 deletions
diff --git a/tests/projects/c++/package_linkgroups/3rd/dpdk/src/add.cc b/tests/projects/c++/package_linkgroups/3rd/dpdk/src/add.cc
new file mode 100644
index 000000000..67b10df8c
--- /dev/null
+++ b/tests/projects/c++/package_linkgroups/3rd/dpdk/src/add.cc
@@ -0,0 +1,5 @@
+#include "add.h"
+
+int add(int x, int y) {
+ return x + y;
+}
diff --git a/tests/projects/c++/package_linkgroups/3rd/dpdk/src/add.h b/tests/projects/c++/package_linkgroups/3rd/dpdk/src/add.h
new file mode 100644
index 000000000..43073ff76
--- /dev/null
+++ b/tests/projects/c++/package_linkgroups/3rd/dpdk/src/add.h
@@ -0,0 +1,3 @@
+#pragma once
+
+int add(int x, int y);
diff --git a/tests/projects/c++/package_linkgroups/3rd/dpdk/xmake.lua b/tests/projects/c++/package_linkgroups/3rd/dpdk/xmake.lua
new file mode 100644
index 000000000..8b10c9c7a
--- /dev/null
+++ b/tests/projects/c++/package_linkgroups/3rd/dpdk/xmake.lua
@@ -0,0 +1,7 @@
+add_rules("mode.debug", "mode.release")
+
+target("dpdk_add")
+ set_kind("static")
+ add_files("src/add.cc")
+ add_headerfiles("src/*.h")
+
diff --git a/tests/projects/c++/package_linkgroups/3rd/spdk/src/mul.cc b/tests/projects/c++/package_linkgroups/3rd/spdk/src/mul.cc
new file mode 100644
index 000000000..d56a165a4
--- /dev/null
+++ b/tests/projects/c++/package_linkgroups/3rd/spdk/src/mul.cc
@@ -0,0 +1,10 @@
+#include "mul.h"
+#include "add.h"
+
+int mul(int x, int y) {
+ int result = 0;
+ for (int i = 0; i < y; i++) {
+ result = add(result, x);
+ }
+ return result;
+}
diff --git a/tests/projects/c++/package_linkgroups/3rd/spdk/src/mul.h b/tests/projects/c++/package_linkgroups/3rd/spdk/src/mul.h
new file mode 100644
index 000000000..a025f44bd
--- /dev/null
+++ b/tests/projects/c++/package_linkgroups/3rd/spdk/src/mul.h
@@ -0,0 +1,3 @@
+#pragma once
+
+int mul(int x, int y);
diff --git a/tests/projects/c++/package_linkgroups/3rd/spdk/xmake.lua b/tests/projects/c++/package_linkgroups/3rd/spdk/xmake.lua
new file mode 100644
index 000000000..329663840
--- /dev/null
+++ b/tests/projects/c++/package_linkgroups/3rd/spdk/xmake.lua
@@ -0,0 +1,22 @@
+add_rules("mode.debug", "mode.release")
+
+package("dpdk")
+ set_sourcedir(path.join(os.scriptdir(), "../../3rd/dpdk"))
+ on_install("linux", function (package)
+ import("package.tools.xmake").install(package)
+ end)
+ on_test(function (package)
+ assert(package:has_cxxincludes("add.h"))
+ end)
+package_end()
+
+add_includedirs("src")
+
+add_requires("dpdk")
+
+target("spdk_mul")
+ set_kind("static")
+ add_files("src/mul.cc")
+ add_headerfiles("src/*.h")
+ add_packages("dpdk")
+
diff --git a/tests/projects/c++/package_linkgroups/src/main.cc b/tests/projects/c++/package_linkgroups/src/main.cc
new file mode 100644
index 000000000..3115830fe
--- /dev/null
+++ b/tests/projects/c++/package_linkgroups/src/main.cc
@@ -0,0 +1,9 @@
+#include <iostream>
+#include "mul.h"
+
+
+int main(int argc, char** argv) {
+ int s = mul(3, 4);
+ std::cout << "hello world! " << s << std::endl;
+ return 0;
+}
diff --git a/tests/projects/c++/package_linkgroups/test.lua b/tests/projects/c++/package_linkgroups/test.lua
new file mode 100644
index 000000000..8ef455de2
--- /dev/null
+++ b/tests/projects/c++/package_linkgroups/test.lua
@@ -0,0 +1,7 @@
+function main(t)
+ if not is_host("linux") then
+ return
+ end
+ t:build()
+end
+
diff --git a/tests/projects/c++/package_linkgroups/xmake.lua b/tests/projects/c++/package_linkgroups/xmake.lua
new file mode 100644
index 000000000..fcc4b5edf
--- /dev/null
+++ b/tests/projects/c++/package_linkgroups/xmake.lua
@@ -0,0 +1,35 @@
+add_rules("mode.debug", "mode.release")
+
+package("dpdk")
+ set_sourcedir(path.join(os.scriptdir(), "3rd/dpdk"))
+ add_links("dpdk_add")
+ add_linkgroups("dpdk_add", {name = "dpdk", whole = true, group = true})
+ on_install("linux", function (package)
+ import("package.tools.xmake").install(package)
+ end)
+ on_test(function (package)
+ assert(package:has_cxxincludes("add.h"))
+ end)
+package_end()
+
+package("spdk")
+ set_sourcedir(path.join(os.scriptdir(), "3rd/spdk"))
+ add_deps("dpdk")
+ add_links("spdk_mul")
+ add_linkgroups("spdk_mul", {name = "dpdk", whole = true, group = true})
+ on_install("linux", function (package)
+ import("package.tools.xmake").install(package)
+ end)
+ on_test(function (package)
+ assert(package:has_cxxincludes("mul.h"))
+ end)
+package_end()
+
+add_requires("spdk")
+
+target("test")
+ set_kind("binary")
+ add_files("src/main.cc")
+ add_packages("spdk")
+ add_includedirs("src")
+
diff --git a/xmake/core/package/package.lua b/xmake/core/package/package.lua
index 29499663b..3caa0ac2f 100644
--- a/xmake/core/package/package.lua
+++ b/xmake/core/package/package.lua
@@ -2160,7 +2160,7 @@ function _instance:fetch_librarydeps()
if not fetchinfo then
return
end
- fetchinfo = table.copy(fetchinfo) -- avoid the cached fetchinfo be modified
+ fetchinfo = table.clone(fetchinfo, 3) -- avoid the cached fetchinfo be modified
local librarydeps = self:librarydeps()
if librarydeps then
for _, dep in ipairs(librarydeps) do
diff --git a/xmake/core/tool/builder.lua b/xmake/core/tool/builder.lua
index 920897576..cca77b7a9 100644
--- a/xmake/core/tool/builder.lua
+++ b/xmake/core/tool/builder.lua
@@ -475,6 +475,7 @@ function builder:_add_flags_from_language(flags, opt)
self:_add_items_from_toolchain(items, flagname, opt_)
end
end
+
end
-- sort links
@@ -591,12 +592,35 @@ function builder:_sort_links_of_items(items, opt)
local extra = self:_extraconf(extras, value)
local key = extra and extra.name or tostring(value)
table.insert(links, "linkgroup::" .. key)
- linkgroups_map[key] = value
extras_map[key] = extras
+ local oldvalue = linkgroups_map[key]
+ if oldvalue == nil then
+ linkgroups_map[key] = value
+ else
+ -- merge linkgroups if multiple groups have same group name
+ -- @see https://github.com/xmake-io/xmake/issues/5806
+ local oldvalue_wrap_unlock = table.clone(oldvalue)
+ table.wrap_unlock(oldvalue_wrap_unlock)
+ local value_wrap_unlock = table.clone(value)
+ table.wrap_unlock(value_wrap_unlock)
+ local newvalue = table.join(oldvalue_wrap_unlock, value_wrap_unlock)
+ table.wrap_lock(newvalue)
+ linkgroups_map[key] = newvalue
+
+ -- merge linkgroups extras
+ local extra_merged = {}
+ local group_name = extra.name
+ for k, v in pairs(extras) do
+ if v.name == group_name then
+ table.join2(extra_merged, v)
+ end
+ end
+ local newgroup_name = table.concat(newvalue, "_")
+ extras[newgroup_name] = extra_merged
+ end
end
end
end
-
links = table.reverse_unique(links)
end