summaryrefslogtreecommitdiff
path: root/xmake/core/project/project.lua
diff options
context:
space:
mode:
authorruki <[email protected]>2020-10-06 00:50:32 +0800
committerruki <[email protected]>2020-10-06 00:50:32 +0800
commit461f42144aae7ab04d1c342d63ade05eda7a4338 (patch)
tree915575b1a8d92c5d4d3dce1c6a3069fded12667b /xmake/core/project/project.lua
parent6576473af7c58290402609c460eb1b1062f75d34 (diff)
fix load targets
Diffstat (limited to 'xmake/core/project/project.lua')
-rw-r--r--xmake/core/project/project.lua49
1 files changed, 37 insertions, 12 deletions
diff --git a/xmake/core/project/project.lua b/xmake/core/project/project.lua
index 3e11ece7f..33d8d4233 100644
--- a/xmake/core/project/project.lua
+++ b/xmake/core/project/project.lua
@@ -445,9 +445,16 @@ function project._load_targets()
end
end
+ -- sort targets for all deps
+ local targetrefs = {}
+ local ordertargets = {}
+ for _, t in pairs(targets) do
+ project._sort_targets(targets, ordertargets, targetrefs, t)
+ end
+
-- do load for each target
local ok = false
- for _, t in pairs(targets) do
+ for _, t in ipairs(ordertargets) do
ok, errors = t:_load()
if not ok then
break
@@ -456,11 +463,9 @@ function project._load_targets()
-- do load failed?
if not ok then
- return nil, errors
+ return nil, nil, errors
end
-
- -- ok
- return targets
+ return targets, ordertargets
end
-- load options
@@ -621,6 +626,20 @@ function project._load_packages()
return project._load_scope("package", true, false)
end
+-- sort targets for all deps
+function project._sort_targets(targets, ordertargets, targetrefs, target)
+ for _, depname in ipairs(table.wrap(target:get("deps"))) do
+ local targetinst = targets[depname]
+ if targetinst then
+ project._sort_targets(targets, ordertargets, targetrefs, targetinst)
+ end
+ end
+ if not targetrefs[target:name()] then
+ targetrefs[target:name()] = true
+ table.insert(ordertargets, target)
+ end
+end
+
-- get project apis
function project.apis()
@@ -872,22 +891,28 @@ function project.target(name)
return project.targets()[name]
end
--- get the current configure for targets
+-- get targets
function project.targets()
-
- -- load targets
if not project._TARGETS then
- local targets, errors = project._load_targets()
- if not targets then
+ local targets, ordertargets, errors = project._load_targets()
+ if not targets or not ordertargets then
os.raise(errors)
end
project._TARGETS = targets
+ project._ORDERTARGETS = ordertargets
end
-
- -- ok
return project._TARGETS
end
+-- get order targets
+function project.ordertargets()
+ if not project._ORDERTARGETS then
+ -- ensure _ORDERTARGETS to be initialized
+ project.targets()
+ end
+ return project._ORDERTARGETS
+end
+
-- get the given option
function project.option(name)
return project.options()[name]