diff options
| author | ruki <[email protected]> | 2026-05-14 16:08:19 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-05-14 16:08:19 +0800 |
| commit | 027524d15cb05aad924b6cdc0a35c1d2b54551d8 (patch) | |
| tree | 2be626f087c799caf63ed82167c37f3b8ef2b1a2 | |
| parent | f4531fd69f74791d3f395b381ce21bc5acafba41 (diff) | |
| parent | 3bec35b897ad20929bd4f9234393591eadea2d3b (diff) | |
Merge pull request #7542 from xmake-io/mergelib
Merge libs from packages
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()) |
