summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xmake/core/base/hashset.lua49
-rw-r--r--xmake/core/project/target.lua2
2 files changed, 47 insertions, 4 deletions
diff --git a/xmake/core/base/hashset.lua b/xmake/core/base/hashset.lua
index c2d5e131e..2a0449ad4 100644
--- a/xmake/core/base/hashset.lua
+++ b/xmake/core/base/hashset.lua
@@ -109,10 +109,53 @@ function hashset_impl:to_array()
end
-- iterate keys of hashtable
--- for _, key in instance:keys() do ... end
+--
+-- @code
+-- for _, key in instance:keys() do
+-- ...
+-- end
+-- @endcode
+--
function hashset_impl:keys()
- return function (table, key)
- local k, _ = next(table._DATA, key)
+ return function (t, key)
+ local k, _ = next(t._DATA, key)
+ if k == hashset._NIL then
+ return k, nil
+ else
+ return k, k
+ end
+ end, self, nil
+end
+
+-- order keys iterator
+--
+-- @code
+-- for _, key in instance:orderkeys() do
+-- ...
+-- end
+-- @endcode
+--
+function hashset_impl:orderkeys()
+ local orderkeys = table.keys(self._DATA)
+ table.sort(orderkeys, function (a, b)
+ if a == hashset._NIL then
+ a = math.inf
+ end
+ if b == hashset._NIL then
+ b = math.inf
+ end
+ if type(a) == "table" then
+ a = tostring(a)
+ end
+ if type(b) == "table" then
+ b = tostring(b)
+ end
+ return a < b
+ end)
+ local i = 1
+ return function (t, k)
+ k = orderkeys[i]
+ i = i + 1
if k == hashset._NIL then
return k, nil
else
diff --git a/xmake/core/project/target.lua b/xmake/core/project/target.lua
index 9fc02ff19..47d013cbb 100644
--- a/xmake/core/project/target.lua
+++ b/xmake/core/project/target.lua
@@ -979,7 +979,7 @@ function _instance:pkgenvs()
end
end
end
- for _, pkg in pkgs:keys() do
+ for _, pkg in pkgs:orderkeys() do
local envs = pkg:get("envs")
if envs then
for name, values in pairs(envs) do