gluon/scripts/feature_lib.lua
Matthias Schiffer ee5ec5afe5 build: rewrite features.sh in Lua
The `features` file is converted to a Lua-based DSL.

A helper function `_` is used in the DSL; this will return the original
string for enabled features, and nil for disabled features. This allows
to use boolean operations on features without making the code too
verbose.

Besides having more readable and robust code, this also fixes the bug
that all files `packages/*/features` were evaluated instead of only
using the feature definitions of currently active feeds.
2020-07-01 20:35:22 +02:00

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