summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorruki <[email protected]>2024-05-05 21:33:40 +0800
committerGitHub <[email protected]>2024-05-05 21:33:40 +0800
commit960411212943dc80244487a3b4fc6fd8d48c5f78 (patch)
tree30a60ce13258a690c41bd13cf3facc38b3c497b4
parent382b22c3d6ec529bf085aaa7498c39dd83758e69 (diff)
parentfe2b2cd36b20ec41fd0569ff387c58e822fa1b56 (diff)
Merge pull request #5061 from xmake-io/sortdeps
improve to sort instances
-rw-r--r--xmake/actions/config/main.lua18
-rw-r--r--xmake/core/base/private/instance_deps.lua54
2 files changed, 38 insertions, 34 deletions
diff --git a/xmake/actions/config/main.lua b/xmake/actions/config/main.lua
index b35bd08e6..327094039 100644
--- a/xmake/actions/config/main.lua
+++ b/xmake/actions/config/main.lua
@@ -101,20 +101,24 @@ function _need_check(changed)
end
-- check target
-function _check_target(target)
- for _, depname in ipairs(target:get("deps")) do
- assert(depname ~= target:name(), "the target(%s) cannot depend self!", depname)
- local deptarget = project.target(depname)
- assert(deptarget, "unknown target(%s) for %s.deps!", depname, target:name())
- _check_target(deptarget)
+function _check_target(target, checked_targets)
+ if not checked_targets[target:name()] then
+ checked_targets[target:name()] = target
+ for _, depname in ipairs(target:get("deps")) do
+ assert(depname ~= target:name(), "the target(%s) cannot depend self!", depname)
+ local deptarget = project.target(depname)
+ assert(deptarget, "unknown target(%s) for %s.deps!", depname, target:name())
+ _check_target(deptarget, checked_targets)
+ end
end
end
-- check targets
function _check_targets()
assert(not project.is_loaded(), "project and targets may have been loaded early!")
+ local checked_targets = {}
for _, target in pairs(project.targets()) do
- _check_target(target)
+ _check_target(target, checked_targets)
end
end
diff --git a/xmake/core/base/private/instance_deps.lua b/xmake/core/base/private/instance_deps.lua
index 2f5c52a7c..17145ac6f 100644
--- a/xmake/core/base/private/instance_deps.lua
+++ b/xmake/core/base/private/instance_deps.lua
@@ -52,20 +52,20 @@ function instance_deps.load_deps(instance, instances, deps, orderdeps, depspath,
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
+ 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)
table.insert(orderdeps, depinst)
end
end
@@ -75,25 +75,25 @@ end
-- 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 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, ", "))
+ if not instancerefs[instance:name()] then
+ instancerefs[instance:name()] = true
+ for _, depname in ipairs(table.wrap(instance:get("deps"))) do
+ 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
- depspath_sub = table.join(depspath, depname)
+ instance_deps._sort_instance(depinst, instances, orderinstances, instancerefs, depspath_sub)
end
- instance_deps._sort_instance(depinst, instances, orderinstances, instancerefs, depspath_sub)
end
- end
- if not instancerefs[instance:name()] then
- instancerefs[instance:name()] = true
table.insert(orderinstances, instance)
end
end