summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2023-02-07 22:42:40 +0800
committerruki <[email protected]>2023-02-07 22:42:40 +0800
commita08c8dd2de3c2e843a02323e45f8e69035c7c88f (patch)
treec6574d3a0728d4ac7d9d41dba2339d0662933c61
parent3bc572e74f262d23263ecf0123c13ed9f214c4fd (diff)
improve deps
-rw-r--r--xmake/core/base/private/instance_deps.lua57
-rw-r--r--xmake/core/project/project.lua7
-rw-r--r--xmake/core/project/target.lua6
3 files changed, 45 insertions, 25 deletions
diff --git a/xmake/core/base/private/instance_deps.lua b/xmake/core/base/private/instance_deps.lua
index 857e3a2e1..080e040fa 100644
--- a/xmake/core/base/private/instance_deps.lua
+++ b/xmake/core/base/private/instance_deps.lua
@@ -34,9 +34,9 @@ local table = require("base/table")
-- b.deps = c
-- foo.deps = a d
--
--- orderdeps: c -> b -> d -> a -> foo
+-- foo.orderdeps: d -> c -> b -> a
--
--- if they're target, their links order is reverse(orderdeps), e.g. foo-> a -> d -> b -> c
+-- 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)
local plaindeps = table.wrap(instance:get("deps"))
@@ -44,35 +44,46 @@ function instance_deps.load_deps(instance, instances, deps, orderdeps, depspath)
for idx, _ in ipairs(plaindeps) do
-- we reverse to get the flat dependencies in order to ensure the correct linking order
-- @see https://github.com/xmake-io/xmake/issues/3144
- local dep = plaindeps[total + 1 - idx]
- local depinst = instances[dep]
+ 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 == dep then
+ if name == depname then
local circular_deps = table.slice(depspath, idx)
- table.insert(circular_deps, dep)
+ table.insert(circular_deps, depname)
os.raise("circular dependency(%s) detected!", table.concat(circular_deps, ", "))
end
end
- depspath_sub = table.join(depspath, dep)
+ depspath_sub = table.join(depspath, depname)
end
instance_deps.load_deps(depinst, instances, deps, orderdeps, depspath_sub)
- if not deps[dep] then
- deps[dep] = depinst
+ if not deps[depname] then
+ deps[depname] = depinst
table.insert(orderdeps, depinst)
end
end
end
end
--- sort instances for all deps
-function instance_deps.sort_deps(instances, orderinstances, instancerefs, instance)
+-- sort the given instance with deps
+function instance_deps._sort_instance(instance, instances, orderinstances, instancerefs, depspath)
for _, depname in ipairs(table.wrap(instance:get("deps"))) do
- local instanceinst = instances[depname]
- if instanceinst then
- instance_deps.sort_deps(instances, orderinstances, instancerefs, instanceinst)
+ 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, ", "))
+ end
+ end
+ depspath_sub = table.join(depspath, depname)
+ end
+ instance_deps._sort_instance(depinst, instances, orderinstances, instancerefs, depspath_sub)
end
end
if not instancerefs[instance:name()] then
@@ -81,6 +92,24 @@ function instance_deps.sort_deps(instances, orderinstances, instancerefs, instan
end
end
+-- sort instances with deps
+--
+-- e.g.
+--
+-- a.deps = b
+-- b.deps = c
+-- foo.deps = a d
+--
+-- orderdeps: c -> b -> a -> d -> foo
+function instance_deps.sort(instances)
+ local refs = {}
+ local orderinstances = {}
+ for _, instance in table.orderpairs(instances) do
+ instance_deps._sort_instance(instance, instances, orderinstances, refs, {instance:name()})
+ end
+ return orderinstances
+end
+
-- return module
return instance_deps
diff --git a/xmake/core/project/project.lua b/xmake/core/project/project.lua
index 812ee9133..e2a9528c4 100644
--- a/xmake/core/project/project.lua
+++ b/xmake/core/project/project.lua
@@ -896,12 +896,7 @@ end
function project.ordertargets()
local ordertargets = project._memcache():get("ordertargets")
if not ordertargets then
- local targets = project.targets()
- ordertargets = {}
- local targetrefs = {}
- for _, t in table.orderpairs(targets) do
- instance_deps.sort_deps(targets, ordertargets, targetrefs, t)
- end
+ ordertargets = instance_deps.sort(project.targets())
project._memcache():set("ordertargets", ordertargets)
end
return ordertargets
diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua
index 6fc0efd3c..7e07503c8 100644
--- a/xmake/core/project/target.lua
+++ b/xmake/core/project/target.lua
@@ -780,11 +780,7 @@ function _instance:orderules()
local rules = self._RULES
local orderules = self._ORDERULES
if orderules == nil and rules then
- orderules = {}
- local rulerefs = {}
- for _, r in table.orderpairs(rules) do
- instance_deps.sort_deps(rules, orderules, rulerefs, r)
- end
+ orderules = instance_deps.sort(rules)
self._ORDERULES = orderules
end
return orderules