diff options
| author | ruki <[email protected]> | 2024-05-05 21:33:40 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-05-05 21:33:40 +0800 |
| commit | 960411212943dc80244487a3b4fc6fd8d48c5f78 (patch) | |
| tree | 30a60ce13258a690c41bd13cf3facc38b3c497b4 | |
| parent | 382b22c3d6ec529bf085aaa7498c39dd83758e69 (diff) | |
| parent | fe2b2cd36b20ec41fd0569ff387c58e822fa1b56 (diff) | |
Merge pull request #5061 from xmake-io/sortdeps
improve to sort instances
| -rw-r--r-- | xmake/actions/config/main.lua | 18 | ||||
| -rw-r--r-- | xmake/core/base/private/instance_deps.lua | 54 |
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 |
