61 lines
989 B
Lua
61 lines
989 B
Lua
|
local M = {}
|
||
|
|
||
|
local function to_keys(t)
|
||
|
local ret = {}
|
||
|
for _, v in ipairs(t) do
|
||
|
ret[v] = true
|
||
|
end
|
||
|
return ret
|
||
|
end
|
||
|
|
||
|
local function collect_keys(t)
|
||
|
local ret = {}
|
||
|
for v in pairs(t) do
|
||
|
table.insert(ret, v)
|
||
|
end
|
||
|
return ret
|
||
|
end
|
||
|
|
||
|
function M.get_packages(file, features)
|
||
|
local feature_table = to_keys(features)
|
||
|
|
||
|
local funcs = {}
|
||
|
|
||
|
function funcs._(feature)
|
||
|
if feature_table[feature] then
|
||
|
return feature
|
||
|
end
|
||
|
end
|
||
|
|
||
|
local nodefault = {}
|
||
|
local packages = {}
|
||
|
function funcs.feature(match, options)
|
||
|
if not match then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if options.nodefault then
|
||
|
nodefault[match] = true
|
||
|
end
|
||
|
for _, package in ipairs(options.packages or {}) do
|
||
|
packages[package] = true
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- Evaluate the feature definition file
|
||
|
local f = loadfile(file)
|
||
|
setfenv(f, funcs)
|
||
|
f()
|
||
|
|
||
|
-- Handle default packages
|
||
|
for _, feature in ipairs(features) do
|
||
|
if not nodefault[feature] then
|
||
|
packages['gluon-' .. feature] = true
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return collect_keys(packages)
|
||
|
end
|
||
|
|
||
|
return M
|