summaryrefslogtreecommitdiff
path: root/xmake/core/project/project.lua
diff options
context:
space:
mode:
authorruki <[email protected]>2021-08-10 22:42:35 +0800
committerruki <[email protected]>2021-08-10 22:42:35 +0800
commitfacf6f5b7be2266ca86015cafab3fe787cc18f94 (patch)
treeac7879fd6e9a4403c77f49caf4b5e9671ba3c8d3 /xmake/core/project/project.lua
parent726000c395eb190fcec40e2d60d2059aeddac196 (diff)
check circular deps
Diffstat (limited to 'xmake/core/project/project.lua')
-rw-r--r--xmake/core/project/project.lua23
1 files changed, 16 insertions, 7 deletions
diff --git a/xmake/core/project/project.lua b/xmake/core/project/project.lua
index 3ff962d7c..831c603bf 100644
--- a/xmake/core/project/project.lua
+++ b/xmake/core/project/project.lua
@@ -215,13 +215,22 @@ end
--
-- orderdeps: c -> b -> a
--
-function project._load_deps(instance, instances, deps, orderdeps)
-
- -- get dep instances
+function project._load_deps(instance, instances, deps, orderdeps, depspath)
for _, dep in ipairs(table.wrap(instance:get("deps"))) do
local depinst = instances[dep]
if depinst then
- project._load_deps(depinst, instances, deps, orderdeps)
+ local depspath_sub
+ if depspath then
+ for idx, name in ipairs(depspath) do
+ if name == dep then
+ local circular_deps = table.slice(depspath, idx)
+ table.insert(circular_deps, dep)
+ os.raise("circular dependency(%s) detected!", table.concat(circular_deps, ", "))
+ end
+ end
+ depspath_sub = table.join(depspath, dep)
+ end
+ project._load_deps(depinst, instances, deps, orderdeps, depspath_sub)
if not deps[dep] then
deps[dep] = depinst
table.insert(orderdeps, depinst)
@@ -316,7 +325,7 @@ function project._load_rules()
for _, instance in pairs(instances) do
instance._DEPS = instance._DEPS or {}
instance._ORDERDEPS = instance._ORDERDEPS or {}
- project._load_deps(instance, instances, instance._DEPS, instance._ORDERDEPS)
+ project._load_deps(instance, instances, instance._DEPS, instance._ORDERDEPS, {instance:name()})
end
return rules
end
@@ -403,7 +412,7 @@ function project._load_targets()
-- load deps
t._DEPS = t._DEPS or {}
t._ORDERDEPS = t._ORDERDEPS or {}
- project._load_deps(t, targets, t._DEPS, t._ORDERDEPS)
+ project._load_deps(t, targets, t._DEPS, t._ORDERDEPS, {t:name()})
-- load rules from target and language
--
@@ -547,7 +556,7 @@ function project._load_options(disable_filter)
for _, opt in pairs(options) do
opt._DEPS = opt._DEPS or {}
opt._ORDERDEPS = opt._ORDERDEPS or {}
- project._load_deps(opt, options, opt._DEPS, opt._ORDERDEPS)
+ project._load_deps(opt, options, opt._DEPS, opt._ORDERDEPS, {opt:name()})
end
-- ok?