diff options
| author | ruki <[email protected]> | 2023-02-07 22:42:40 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2023-02-07 22:42:40 +0800 |
| commit | a08c8dd2de3c2e843a02323e45f8e69035c7c88f (patch) | |
| tree | c6574d3a0728d4ac7d9d41dba2339d0662933c61 | |
| parent | 3bc572e74f262d23263ecf0123c13ed9f214c4fd (diff) | |
improve deps
| -rw-r--r-- | xmake/core/base/private/instance_deps.lua | 57 | ||||
| -rw-r--r-- | xmake/core/project/project.lua | 7 | ||||
| -rw-r--r-- | xmake/core/project/target.lua | 6 |
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 |
