diff options
| author | gibbz00 <[email protected]> | 2026-05-08 09:10:44 +0200 |
|---|---|---|
| committer | ruki <[email protected]> | 2026-05-14 10:53:37 +0800 |
| commit | 1f661ce90b9f3184f8fc1d0159db30b27f81393d (patch) | |
| tree | 13e41bec7712882cea03d61d367defc6ec3ddd73 | |
| parent | dbeb4d42a17cf6de1e6c52a7fc4c9453859f7b31 (diff) | |
feat: include packages in "build.merge_archive"
| -rw-r--r-- | xmake/modules/private/utils/target.lua | 11 | ||||
| -rw-r--r-- | xmake/rules/utils/inherit_links/inherit_links.lua | 25 | ||||
| -rw-r--r-- | xmake/rules/utils/merge_archive/xmake.lua | 25 |
3 files changed, 48 insertions, 13 deletions
diff --git a/xmake/modules/private/utils/target.lua b/xmake/modules/private/utils/target.lua index 8790b25fc..a655c67d6 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(tostring(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..565db32c4 100644 --- a/xmake/rules/utils/inherit_links/inherit_links.lua +++ b/xmake/rules/utils/inherit_links/inherit_links.lua @@ -18,17 +18,7 @@ -- @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 +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 +98,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..4d4382b02 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) @@ -43,14 +45,28 @@ rule("utils.merge.archive") end) after_link(function (target, opt) + -- Returns full path of a given link archive, if found. + local function _resolve_link(linkdirs, link) + -- HELP: assume that 'linkpath' does not exists in multiple directories? + for _, linkdir in ipairs(linkdirs) do + local file_extension = target:is_plat("windows") and ".lib" or ".a" + local link_path = path.join(linkdir, "lib" .. link .. file_extension) + if os.exists(link_path) then + return link_path + end + end + end + if not target:is_static() then return end local sourcefiles = target:data("merge_archive.sourcefiles") if target:policy("build.merge_archive") or sourcefiles then + import("private.utils.target", {alias = "target_utils"}) import("utils.archive.merge_staticlib") import("core.project.depend") import("utils.progress") + local libraryfiles = {} if sourcefiles then table.join2(libraryfiles, sourcefiles) @@ -60,6 +76,15 @@ rule("utils.merge.archive") table.insert(libraryfiles, dep:targetfile()) end end + + -- TODO: what about syslinkdirs and syslinks? + local linkdirs = target_utils.get_values_from_target(target, "linkdirs") + for _, link in ipairs(target_utils.get_values_from_target(target, "links")) do + local link_path = _resolve_link(linkdirs, link) + if link_path then + table.insert(libraryfiles, link_path) + end + end end if #libraryfiles > 0 then table.insert(libraryfiles, target:targetfile()) |
