diff options
| author | ruki <[email protected]> | 2025-08-06 23:16:49 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-08-06 23:16:49 +0800 |
| commit | 58f011fb3257a963e607e0b0337f11031025d3ba (patch) | |
| tree | d2bc3e8b12dd82a4cae2d638c2886d0196a798aa | |
| parent | 248afd9bd01f8135e813616f6ce81467decd9dc1 (diff) | |
| parent | bf2c52a5260bf1fe3a9333599e18c4320e352a6b (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.cc | 5 | ||||
| -rw-r--r-- | tests/projects/c++/package_linkgroups/3rd/dpdk/src/add.h | 3 | ||||
| -rw-r--r-- | tests/projects/c++/package_linkgroups/3rd/dpdk/xmake.lua | 7 | ||||
| -rw-r--r-- | tests/projects/c++/package_linkgroups/3rd/spdk/src/mul.cc | 10 | ||||
| -rw-r--r-- | tests/projects/c++/package_linkgroups/3rd/spdk/src/mul.h | 3 | ||||
| -rw-r--r-- | tests/projects/c++/package_linkgroups/3rd/spdk/xmake.lua | 22 | ||||
| -rw-r--r-- | tests/projects/c++/package_linkgroups/src/main.cc | 9 | ||||
| -rw-r--r-- | tests/projects/c++/package_linkgroups/test.lua | 7 | ||||
| -rw-r--r-- | tests/projects/c++/package_linkgroups/xmake.lua | 35 | ||||
| -rw-r--r-- | xmake/core/package/package.lua | 2 | ||||
| -rw-r--r-- | xmake/core/tool/builder.lua | 28 |
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 |
