summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2026-05-14 16:08:19 +0800
committerGitHub <[email protected]>2026-05-14 16:08:19 +0800
commit027524d15cb05aad924b6cdc0a35c1d2b54551d8 (patch)
tree2be626f087c799caf63ed82167c37f3b8ef2b1a2
parentf4531fd69f74791d3f395b381ce21bc5acafba41 (diff)
parent3bec35b897ad20929bd4f9234393591eadea2d3b (diff)
Merge pull request #7542 from xmake-io/mergelib
Merge libs from packages
-rw-r--r--tests/projects/other/merge_archive/src/add.c3
-rw-r--r--tests/projects/other/merge_archive/src/mul.c3
-rw-r--r--tests/projects/other/merge_archive/src/sub.c3
-rw-r--r--tests/projects/other/merge_archive2/src/add.c4
-rw-r--r--tests/projects/other/merge_archive2/src/mul.c4
-rw-r--r--tests/projects/other/merge_archive2/src/sub.c4
-rw-r--r--tests/projects/other/merge_archive_deps/src/add.c3
-rw-r--r--tests/projects/other/merge_archive_deps/src/main.c (renamed from tests/projects/other/merge_archive2/src/main.c)3
-rw-r--r--tests/projects/other/merge_archive_deps/src/mul.c3
-rw-r--r--tests/projects/other/merge_archive_deps/src/sub.c3
-rw-r--r--tests/projects/other/merge_archive_deps/src/subdir/add.c (renamed from tests/projects/other/merge_archive2/src/subdir/add.c)0
-rw-r--r--tests/projects/other/merge_archive_deps/src/subdir/sub.c (renamed from tests/projects/other/merge_archive2/src/subdir/sub.c)0
-rw-r--r--tests/projects/other/merge_archive_deps/test.lua (renamed from tests/projects/other/merge_archive2/test.lua)0
-rw-r--r--tests/projects/other/merge_archive_deps/xmake.lua (renamed from tests/projects/other/merge_archive2/xmake.lua)0
-rw-r--r--tests/projects/other/merge_archive_packages/src/main.c8
-rw-r--r--tests/projects/other/merge_archive_packages/src/png.c5
-rw-r--r--tests/projects/other/merge_archive_packages/test.lua7
-rw-r--r--tests/projects/other/merge_archive_packages/xmake.lua15
-rw-r--r--xmake/modules/private/utils/target.lua11
-rw-r--r--xmake/rules/utils/inherit_links/inherit_links.lua26
-rw-r--r--xmake/rules/utils/merge_archive/xmake.lua18
21 files changed, 90 insertions, 33 deletions
diff --git a/tests/projects/other/merge_archive/src/add.c b/tests/projects/other/merge_archive/src/add.c
index be1e084fc..59aab4983 100644
--- a/tests/projects/other/merge_archive/src/add.c
+++ b/tests/projects/other/merge_archive/src/add.c
@@ -1,4 +1,3 @@
-int add(int a, int b)
-{
+int add(int a, int b) {
return a + b;
}
diff --git a/tests/projects/other/merge_archive/src/mul.c b/tests/projects/other/merge_archive/src/mul.c
index c4292f9aa..0c01379d4 100644
--- a/tests/projects/other/merge_archive/src/mul.c
+++ b/tests/projects/other/merge_archive/src/mul.c
@@ -1,4 +1,3 @@
-int mul(int a, int b)
-{
+int mul(int a, int b) {
return a * b;
}
diff --git a/tests/projects/other/merge_archive/src/sub.c b/tests/projects/other/merge_archive/src/sub.c
index b151ec4bc..a6ffbba20 100644
--- a/tests/projects/other/merge_archive/src/sub.c
+++ b/tests/projects/other/merge_archive/src/sub.c
@@ -1,4 +1,3 @@
-int sub(int a, int b)
-{
+int sub(int a, int b) {
return a - b;
}
diff --git a/tests/projects/other/merge_archive2/src/add.c b/tests/projects/other/merge_archive2/src/add.c
deleted file mode 100644
index be1e084fc..000000000
--- a/tests/projects/other/merge_archive2/src/add.c
+++ /dev/null
@@ -1,4 +0,0 @@
-int add(int a, int b)
-{
- return a + b;
-}
diff --git a/tests/projects/other/merge_archive2/src/mul.c b/tests/projects/other/merge_archive2/src/mul.c
deleted file mode 100644
index c4292f9aa..000000000
--- a/tests/projects/other/merge_archive2/src/mul.c
+++ /dev/null
@@ -1,4 +0,0 @@
-int mul(int a, int b)
-{
- return a * b;
-}
diff --git a/tests/projects/other/merge_archive2/src/sub.c b/tests/projects/other/merge_archive2/src/sub.c
deleted file mode 100644
index b151ec4bc..000000000
--- a/tests/projects/other/merge_archive2/src/sub.c
+++ /dev/null
@@ -1,4 +0,0 @@
-int sub(int a, int b)
-{
- return a - b;
-}
diff --git a/tests/projects/other/merge_archive_deps/src/add.c b/tests/projects/other/merge_archive_deps/src/add.c
new file mode 100644
index 000000000..59aab4983
--- /dev/null
+++ b/tests/projects/other/merge_archive_deps/src/add.c
@@ -0,0 +1,3 @@
+int add(int a, int b) {
+ return a + b;
+}
diff --git a/tests/projects/other/merge_archive2/src/main.c b/tests/projects/other/merge_archive_deps/src/main.c
index 927c9173e..df9eef6ac 100644
--- a/tests/projects/other/merge_archive2/src/main.c
+++ b/tests/projects/other/merge_archive_deps/src/main.c
@@ -6,8 +6,7 @@ int mul(int a, int b);
int subdir_add(int a, int b);
int subdir_sub(int a, int b);
-int main(int argc, char** argv)
-{
+int main(int argc, char** argv) {
printf("%d\n", add(1, 1));
printf("%d\n", sub(1, 1));
printf("%d\n", mul(1, 1));
diff --git a/tests/projects/other/merge_archive_deps/src/mul.c b/tests/projects/other/merge_archive_deps/src/mul.c
new file mode 100644
index 000000000..0c01379d4
--- /dev/null
+++ b/tests/projects/other/merge_archive_deps/src/mul.c
@@ -0,0 +1,3 @@
+int mul(int a, int b) {
+ return a * b;
+}
diff --git a/tests/projects/other/merge_archive_deps/src/sub.c b/tests/projects/other/merge_archive_deps/src/sub.c
new file mode 100644
index 000000000..a6ffbba20
--- /dev/null
+++ b/tests/projects/other/merge_archive_deps/src/sub.c
@@ -0,0 +1,3 @@
+int sub(int a, int b) {
+ return a - b;
+}
diff --git a/tests/projects/other/merge_archive2/src/subdir/add.c b/tests/projects/other/merge_archive_deps/src/subdir/add.c
index 318ed98f8..318ed98f8 100644
--- a/tests/projects/other/merge_archive2/src/subdir/add.c
+++ b/tests/projects/other/merge_archive_deps/src/subdir/add.c
diff --git a/tests/projects/other/merge_archive2/src/subdir/sub.c b/tests/projects/other/merge_archive_deps/src/subdir/sub.c
index 68c4d13ae..68c4d13ae 100644
--- a/tests/projects/other/merge_archive2/src/subdir/sub.c
+++ b/tests/projects/other/merge_archive_deps/src/subdir/sub.c
diff --git a/tests/projects/other/merge_archive2/test.lua b/tests/projects/other/merge_archive_deps/test.lua
index 88594b1d5..88594b1d5 100644
--- a/tests/projects/other/merge_archive2/test.lua
+++ b/tests/projects/other/merge_archive_deps/test.lua
diff --git a/tests/projects/other/merge_archive2/xmake.lua b/tests/projects/other/merge_archive_deps/xmake.lua
index be1f45de0..be1f45de0 100644
--- a/tests/projects/other/merge_archive2/xmake.lua
+++ b/tests/projects/other/merge_archive_deps/xmake.lua
diff --git a/tests/projects/other/merge_archive_packages/src/main.c b/tests/projects/other/merge_archive_packages/src/main.c
new file mode 100644
index 000000000..e2f6f2c31
--- /dev/null
+++ b/tests/projects/other/merge_archive_packages/src/main.c
@@ -0,0 +1,8 @@
+#include <stdio.h>
+
+extern char const* get_png_version();
+
+int main(void) {
+ printf("libpng version: %s\n", get_png_version());
+ return 0;
+}
diff --git a/tests/projects/other/merge_archive_packages/src/png.c b/tests/projects/other/merge_archive_packages/src/png.c
new file mode 100644
index 000000000..231ea6928
--- /dev/null
+++ b/tests/projects/other/merge_archive_packages/src/png.c
@@ -0,0 +1,5 @@
+#include "png.h"
+
+char const* get_png_version() {
+ return png_get_libpng_ver(NULL);
+}
diff --git a/tests/projects/other/merge_archive_packages/test.lua b/tests/projects/other/merge_archive_packages/test.lua
new file mode 100644
index 000000000..88594b1d5
--- /dev/null
+++ b/tests/projects/other/merge_archive_packages/test.lua
@@ -0,0 +1,7 @@
+function main(t)
+ -- Solaris ar does not support merging archives with duplicate object file names
+ if is_host("solaris") then
+ return
+ end
+ t:build()
+end
diff --git a/tests/projects/other/merge_archive_packages/xmake.lua b/tests/projects/other/merge_archive_packages/xmake.lua
new file mode 100644
index 000000000..711f326cb
--- /dev/null
+++ b/tests/projects/other/merge_archive_packages/xmake.lua
@@ -0,0 +1,15 @@
+add_rules("mode.debug", "mode.release")
+
+-- we must use disable libraries
+add_requires("libpng", {system = false})
+add_requireconfs("libpng.*", {system = false, override = true})
+
+target("foo")
+ set_kind("static")
+ add_files("src/png.c")
+ add_packages("libpng")
+ set_policy("build.merge_archive", true)
+
+target("test")
+ add_files("src/main.c")
+ add_deps("foo")
diff --git a/xmake/modules/private/utils/target.lua b/xmake/modules/private/utils/target.lua
index 8790b25fc..6d1ad3907 100644
--- a/xmake/modules/private/utils/target.lua
+++ b/xmake/modules/private/utils/target.lua
@@ -289,3 +289,14 @@ function get_target_libfiles(target, libfiles, binaryfile, refs, opt)
end
end
+-- get values from target
+function get_values_from_target(target, name)
+ local values = table.clone(table.wrap(target:get(name)))
+ for _, value in ipairs((target:get_from(name, "option::*"))) do
+ table.join2(values, value)
+ end
+ for _, value in ipairs((target:get_from(name, "package::*"))) do
+ table.join2(values, value)
+ end
+ return values
+end
diff --git a/xmake/rules/utils/inherit_links/inherit_links.lua b/xmake/rules/utils/inherit_links/inherit_links.lua
index b4b293d66..641104082 100644
--- a/xmake/rules/utils/inherit_links/inherit_links.lua
+++ b/xmake/rules/utils/inherit_links/inherit_links.lua
@@ -18,17 +18,8 @@
-- @file inherit_links.lua
--
--- get values from target
-function _get_values_from_target(target, name)
- local values = table.clone(table.wrap(target:get(name)))
- for _, value in ipairs((target:get_from(name, "option::*"))) do
- table.join2(values, value)
- end
- for _, value in ipairs((target:get_from(name, "package::*"))) do
- table.join2(values, value)
- end
- return values
-end
+-- imports
+import("private.utils.target", {alias = "target_utils"})
-- @note we cannot directly set `{interface = true}`, because it will overwrite the previous configuration
-- https://github.com/xmake-io/xmake/issues/1465
@@ -108,8 +99,17 @@ function main(target)
--
if target:data("inherit.links.exportlinks") ~= false then
if target:is_static() or target:is_object() then
- for _, name in ipairs({"rpathdirs", "frameworkdirs", "frameworks", "linkdirs", "links", "syslinks", "ldflags", "shflags"}) do
- local values = _get_values_from_target(target, name)
+ local export_values = {"rpathdirs", "frameworkdirs", "frameworks", "syslinks", "shflags"};
+
+ if target:data("inherit.links.export_static") ~= false then
+ local link_settings = {"linkdirs", "links", "ldflags"}
+ for _, link_setting in ipairs(link_settings) do
+ table.insert(export_values, link_setting)
+ end
+ end
+
+ for _, name in ipairs(export_values) do
+ local values = target_utils.get_values_from_target(target, name)
if values and #values > 0 then
_add_export_values(target, name, values)
end
diff --git a/xmake/rules/utils/merge_archive/xmake.lua b/xmake/rules/utils/merge_archive/xmake.lua
index ad5039a89..456008182 100644
--- a/xmake/rules/utils/merge_archive/xmake.lua
+++ b/xmake/rules/utils/merge_archive/xmake.lua
@@ -26,6 +26,8 @@ rule("utils.merge.archive")
--
-- @see https://github.com/xmake-io/xmake/issues/3404
if target:policy("build.merge_archive") then
+ target:data_set("inherit.links.export_static", false)
+
for _, dep in ipairs(target:orderdeps()) do
if dep:is_static() then
dep:data_set("inherit.links.deplink", false)
@@ -51,15 +53,31 @@ rule("utils.merge.archive")
import("utils.archive.merge_staticlib")
import("core.project.depend")
import("utils.progress")
+
local libraryfiles = {}
if sourcefiles then
table.join2(libraryfiles, sourcefiles)
else
+
+ -- merge libraryfiles from deps
for _, dep in ipairs(target:orderdeps()) do
if dep:is_static() then
table.insert(libraryfiles, dep:targetfile())
end
end
+
+ -- merge libraryfiles from packages
+ -- @see https://github.com/xmake-io/xmake/issues/7531
+ for _, pkg in ipairs(target:orderpkgs()) do
+ if pkg:has_static() then
+ local libfiles = pkg:libraryfiles()
+ for _, libfile in ipairs(libfiles) do
+ if libfile:endswith(".a") or libfile:endswith(".lib") then
+ table.insert(libraryfiles, libfile)
+ end
+ end
+ end
+ end
end
if #libraryfiles > 0 then
table.insert(libraryfiles, target:targetfile())