From ab3dff12a7b10c20e7c4b2478095de0351e9fbd4 Mon Sep 17 00:00:00 2001 From: Samuel Ayala Date: Sun, 4 Feb 2024 20:47:17 -0500 Subject: add ldflags to export attributes loop --- xmake/rules/utils/inherit_links/inherit_links.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xmake/rules/utils/inherit_links/inherit_links.lua b/xmake/rules/utils/inherit_links/inherit_links.lua index 0c643fdd2..4a2c0b969 100644 --- a/xmake/rules/utils/inherit_links/inherit_links.lua +++ b/xmake/rules/utils/inherit_links/inherit_links.lua @@ -86,7 +86,7 @@ function main(target) -- if target:data("inherit.links.exportlinks") ~= false then if targetkind == "static" then - for _, name in ipairs({"rpathdirs", "frameworkdirs", "frameworks", "linkdirs", "links", "syslinks"}) do + for _, name in ipairs({"rpathdirs", "frameworkdirs", "frameworks", "linkdirs", "links", "syslinks", "ldflags"}) do local values = _get_values_from_target(target, name) if values and #values > 0 then target:add(name, values, {public = true}) -- cgit v1.3.1 From f07072ae14dc0f4a0b6500b80d391fee86349420 Mon Sep 17 00:00:00 2001 From: ruki Date: Mon, 5 Feb 2024 10:44:18 +0800 Subject: Update builder.lua --- xmake/core/tool/builder.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/xmake/core/tool/builder.lua b/xmake/core/tool/builder.lua index 255b69ca1..89014759e 100644 --- a/xmake/core/tool/builder.lua +++ b/xmake/core/tool/builder.lua @@ -222,9 +222,12 @@ end -- add flags from the target packages function builder:_add_flags_from_targetpkgs(flags, target) - for _, pkg in ipairs(target:orderpkgs()) do - for _, flagkind in ipairs(self:_flagkinds()) do - table.join2(flags, self:_mapflags(pkg:get(flagkind), flagkind, target)) + for _, flagkind in ipairs(self:_flagkinds()) do + local result = target:get_from(flagkind, "package::*") + if result then + for _, values in ipairs(result) do + table.join2(flags, self:_mapflags(values, flagkind, target)) + end end end end -- cgit v1.3.1 From 56f085c08abb87909eb8738429083455c04b22f0 Mon Sep 17 00:00:00 2001 From: ruki Date: Mon, 5 Feb 2024 22:47:55 +0800 Subject: improve to get option flags from target --- xmake/core/tool/builder.lua | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/xmake/core/tool/builder.lua b/xmake/core/tool/builder.lua index 89014759e..b86bf9637 100644 --- a/xmake/core/tool/builder.lua +++ b/xmake/core/tool/builder.lua @@ -213,9 +213,12 @@ end -- add flags from the target options function builder:_add_flags_from_targetopts(flags, target) - for _, opt in ipairs(target:orderopts()) do - for _, flagkind in ipairs(self:_flagkinds()) do - self:_add_flags_from_flagkind(flags, opt, flagkind) + for _, flagkind in ipairs(self:_flagkinds()) do + local result = target:get_from(flagkind, "option::*") + if result then + for _, values in ipairs(table.wrap(result)) do + table.join2(flags, self:_mapflags(values, flagkind, target)) + end end end end @@ -225,7 +228,7 @@ function builder:_add_flags_from_targetpkgs(flags, target) for _, flagkind in ipairs(self:_flagkinds()) do local result = target:get_from(flagkind, "package::*") if result then - for _, values in ipairs(result) do + for _, values in ipairs(table.wrap(result)) do table.join2(flags, self:_mapflags(values, flagkind, target)) end end -- cgit v1.3.1 From 4310eaa1a4c0b1459172b4763c0641c62dbba994 Mon Sep 17 00:00:00 2001 From: ruki Date: Mon, 5 Feb 2024 22:56:00 +0800 Subject: fix depinherit #4689 --- xmake/core/base/private/instance_deps.lua | 34 +++++++++------ xmake/core/project/target.lua | 52 +++++++++++++---------- xmake/core/tool/builder.lua | 9 ++-- xmake/rules/utils/inherit_links/inherit_links.lua | 5 +-- 4 files changed, 55 insertions(+), 45 deletions(-) diff --git a/xmake/core/base/private/instance_deps.lua b/xmake/core/base/private/instance_deps.lua index 080e040fa..2f5c52a7c 100644 --- a/xmake/core/base/private/instance_deps.lua +++ b/xmake/core/base/private/instance_deps.lua @@ -38,7 +38,7 @@ local table = require("base/table") -- -- if they're targets, their links order is reverse(orderdeps), e.g. foo: a -> b -> c -> d -- -function instance_deps.load_deps(instance, instances, deps, orderdeps, depspath) +function instance_deps.load_deps(instance, instances, deps, orderdeps, depspath, walkdep) local plaindeps = table.wrap(instance:get("deps")) local total = #plaindeps for idx, _ in ipairs(plaindeps) do @@ -47,21 +47,27 @@ function instance_deps.load_deps(instance, instances, deps, orderdeps, depspath) local depname = plaindeps[total + 1 - idx] local depinst = instances[depname] if depinst then - local depspath_sub - if depspath then - for idx, name in ipairs(depspath) do - if name == depname then - local circular_deps = table.slice(depspath, idx) - table.insert(circular_deps, depname) - os.raise("circular dependency(%s) detected!", table.concat(circular_deps, ", ")) + local continue_walk = true + if walkdep then + continue_walk = walkdep(instance, depinst) + end + if continue_walk then + local depspath_sub + if depspath then + for idx, name in ipairs(depspath) do + if name == depname then + local circular_deps = table.slice(depspath, idx) + table.insert(circular_deps, depname) + os.raise("circular dependency(%s) detected!", table.concat(circular_deps, ", ")) + end end + depspath_sub = table.join(depspath, depname) + end + instance_deps.load_deps(depinst, instances, deps, orderdeps, depspath_sub, walkdep) + if not deps[depname] then + deps[depname] = depinst + table.insert(orderdeps, depinst) end - depspath_sub = table.join(depspath, depname) - end - instance_deps.load_deps(depinst, instances, deps, orderdeps, depspath_sub) - if not deps[depname] then - deps[depname] = depinst - table.insert(orderdeps, depinst) end end end diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua index 8cc2ff824..b9266ca35 100644 --- a/xmake/core/project/target.lua +++ b/xmake/core/project/target.lua @@ -324,16 +324,23 @@ function _instance:_invalidate(name) elseif name == "deps" then self._DEPS = nil self._ORDERDEPS = nil + self._INHERITDEPS = nil end end -- build deps function _instance:_build_deps() if target._project() then - local instances = target._project().targets() - self._DEPS = self._DEPS or {} - self._ORDERDEPS = self._ORDERDEPS or {} + local instances = target._project().targets() + self._DEPS = self._DEPS or {} + self._ORDERDEPS = self._ORDERDEPS or {} + self._INHERITDEPS = self._INHERITDEPS or {} instance_deps.load_deps(self, instances, self._DEPS, self._ORDERDEPS, {self:name()}) + -- @see https://github.com/xmake-io/xmake/issues/4689 + instance_deps.load_deps(self, instances, {}, self._INHERITDEPS, {self:name()}, function (t, dep) + local depinherit = t:extraconf("deps", dep:name(), "inherit") + return depinherit == nil or depinherit + end) end end @@ -344,26 +351,23 @@ end -- get values from target deps with {interface|public = ...} function _instance:_get_from_deps(name, result_values, result_sources, opt) - local orderdeps = self:orderdeps() + local orderdeps = self:orderdeps({inherit = true}) local total = #orderdeps for idx, _ in ipairs(orderdeps) do local dep = orderdeps[total + 1 - idx] - local depinherit = self:extraconf("deps", dep:name(), "inherit") - if depinherit == nil or depinherit then - local values = dep:get(name, opt) - if values ~= nil then - table.insert(result_values, values) - table.insert(result_sources, "dep::" .. dep:name()) - end - local dep_values = {} - local dep_sources = {} - dep:_get_from_options(name, dep_values, dep_sources, opt) - dep:_get_from_packages(name, dep_values, dep_sources, opt) - for idx, values in ipairs(dep_values) do - local dep_source = dep_sources[idx] - table.insert(result_values, values) - table.insert(result_sources, "dep::" .. dep:name() .. "/" .. dep_source) - end + local values = dep:get(name, opt) + if values ~= nil then + table.insert(result_values, values) + table.insert(result_sources, "dep::" .. dep:name()) + end + local dep_values = {} + local dep_sources = {} + dep:_get_from_options(name, dep_values, dep_sources, opt) + dep:_get_from_packages(name, dep_values, dep_sources, opt) + for idx, values in ipairs(dep_values) do + local dep_source = dep_sources[idx] + table.insert(result_values, values) + table.insert(result_sources, "dep::" .. dep:name() .. "/" .. dep_source) end end end @@ -550,6 +554,9 @@ function _instance:clone() if self._ORDERDEPS then instance._ORDERDEPS = table.clone(self._ORDERDEPS) end + if self._INHERITDEPS then + instance._INHERITDEPS = table.clone(self._INHERITDEPS) + end if self._RULES then instance._RULES = table.clone(self._RULES) end @@ -1127,14 +1134,15 @@ function _instance:deps() end -- get target ordered deps -function _instance:orderdeps() +function _instance:orderdeps(opt) + opt = opt or {} if not self:_is_loaded() then os.raise("please call target:orderdeps() in after_load()!") end if self._DEPS == nil then self:_build_deps() end - return self._ORDERDEPS + return opt.inherit and self._INHERITDEPS or self._ORDERDEPS end -- get target rules diff --git a/xmake/core/tool/builder.lua b/xmake/core/tool/builder.lua index b86bf9637..4ef3e8576 100644 --- a/xmake/core/tool/builder.lua +++ b/xmake/core/tool/builder.lua @@ -145,15 +145,12 @@ end -- add_cflags("", {interface = true}) -- function builder:_inherit_flags_from_targetdeps(flags, target) - local orderdeps = target:orderdeps() + local orderdeps = target:orderdeps({inherit = true}) local total = #orderdeps for idx, _ in ipairs(orderdeps) do local dep = orderdeps[total + 1 - idx] - local depinherit = target:extraconf("deps", dep:name(), "inherit") - if depinherit == nil or depinherit then - for _, flagkind in ipairs(self:_flagkinds()) do - self:_add_flags_from_flagkind(flags, dep, flagkind, {interface = true}) - end + for _, flagkind in ipairs(self:_flagkinds()) do + self:_add_flags_from_flagkind(flags, dep, flagkind, {interface = true}) end end end diff --git a/xmake/rules/utils/inherit_links/inherit_links.lua b/xmake/rules/utils/inherit_links/inherit_links.lua index 4a2c0b969..0b181b265 100644 --- a/xmake/rules/utils/inherit_links/inherit_links.lua +++ b/xmake/rules/utils/inherit_links/inherit_links.lua @@ -99,9 +99,8 @@ function main(target) -- export rpathdirs for all shared library if targetkind == "binary" then local targetdir = target:targetdir() - for _, dep in ipairs(target:orderdeps()) do - local depinherit = target:extraconf("deps", dep:name(), "inherit") - if dep:kind() == "shared" and (depinherit == nil or depinherit) then + for _, dep in ipairs(target:orderdeps({inherit = true})) do + if dep:kind() == "shared" then local rpathdir = "@loader_path" local subdir = path.relative(path.directory(dep:targetfile()), targetdir) if subdir and subdir ~= '.' then -- cgit v1.3.1 From ef7fc4639a82257fd1672e66c1792177b3d0212e Mon Sep 17 00:00:00 2001 From: ruki Date: Mon, 5 Feb 2024 22:56:28 +0800 Subject: inherit shflags --- xmake/rules/utils/inherit_links/inherit_links.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xmake/rules/utils/inherit_links/inherit_links.lua b/xmake/rules/utils/inherit_links/inherit_links.lua index 0b181b265..bc1472b8e 100644 --- a/xmake/rules/utils/inherit_links/inherit_links.lua +++ b/xmake/rules/utils/inherit_links/inherit_links.lua @@ -86,7 +86,7 @@ function main(target) -- if target:data("inherit.links.exportlinks") ~= false then if targetkind == "static" then - for _, name in ipairs({"rpathdirs", "frameworkdirs", "frameworks", "linkdirs", "links", "syslinks", "ldflags"}) do + for _, name in ipairs({"rpathdirs", "frameworkdirs", "frameworks", "linkdirs", "links", "syslinks", "ldflags", "shflags"}) do local values = _get_values_from_target(target, name) if values and #values > 0 then target:add(name, values, {public = true}) -- cgit v1.3.1