summaryrefslogtreecommitdiff
path: root/xmake/rules/c++
diff options
context:
space:
mode:
authorruki <[email protected]>2025-03-20 23:16:51 +0800
committerruki <[email protected]>2025-04-08 15:31:54 +0800
commita278d3bd3e74027e7fd1f878c7d8c991caf1a75f (patch)
tree1ddcf6b69c37d1f89830ebfccff48f088113e69d /xmake/rules/c++
parent5b57870c2854f96c9fd2aebb6e9fe538b9a27b8c (diff)
improve to find cycle
Diffstat (limited to 'xmake/rules/c++')
-rw-r--r--xmake/rules/c++/modules/modules_support/dependency_scanner.lua25
1 files changed, 13 insertions, 12 deletions
diff --git a/xmake/rules/c++/modules/modules_support/dependency_scanner.lua b/xmake/rules/c++/modules/modules_support/dependency_scanner.lua
index 9d552d0fd..df8c85441 100644
--- a/xmake/rules/c++/modules/modules_support/dependency_scanner.lua
+++ b/xmake/rules/c++/modules/modules_support/dependency_scanner.lua
@@ -222,7 +222,7 @@ function _generate_dependencies(target, sourcebatch, opt)
local changed = false
if opt.batchjobs then
local jobs = option.get("jobs") or os.default_njob()
- runjobs(target:name() .. "_module_dependency_scanner", function(index)
+ runjobs(target:name() .. "_module_dependency_scanner", function(index)
local sourcefile = sourcebatch.sourcefiles[index]
changed = _dependency_scanner(target).generate_dependency_for(target, sourcefile, opt) or changed
end, {comax = jobs, total = #sourcebatch.sourcefiles})
@@ -415,19 +415,20 @@ function sort_modules_by_dependencies(target, objectfiles, modules, opt)
for _, e in ipairs(edges) do
dag:add_edge(e[1], e[2])
end
- local cycle = dag:find_cycle()
- if cycle then
- local names = {}
- for _, objectfile in ipairs(cycle) do
- local name, _, cppfile = compiler_support.get_provided_module(modules[objectfile])
+ local objectfiles_sorted, has_cycle = dag:topological_sort({reverse = true})
+ if has_cycle then
+ local cycle = dag:find_cycle()
+ if cycle then
+ local names = {}
+ for _, objectfile in ipairs(cycle) do
+ local name, _, cppfile = compiler_support.get_provided_module(modules[objectfile])
+ table.insert(names, name or cppfile)
+ end
+ local name, _, cppfile = compiler_support.get_provided_module(modules[cycle[1]])
table.insert(names, name or cppfile)
+ raise("circular modules dependency detected!\n%s", table.concat(names, "\n -> import "))
end
- local name, _, cppfile = compiler_support.get_provided_module(modules[cycle[1]])
- table.insert(names, name or cppfile)
- raise("circular modules dependency detected!\n%s", table.concat(names, "\n -> import "))
end
-
- local objectfiles_sorted = table.reverse(dag:topological_sort())
local objectfiles_sorted_set = hashset.from(objectfiles_sorted)
for _, objectfile in ipairs(objectfiles) do
if not objectfiles_sorted_set:has(objectfile) then
@@ -465,7 +466,7 @@ function sort_modules_by_dependencies(target, objectfiles, modules, opt)
end
end
end
- if insert then
+ if insert then
table.insert(build_objectfiles, objectfile)
table.insert(link_objectfiles, objectfile)
elseif external and not external.from_moduleonly then