Skip to content
Snippets Groups Projects
Commit f629b71a authored by David Bauer's avatar David Bauer
Browse files

build: implement flexible site-selection system


Implement a flexible system for handling site-defined features as well
as packages.

This system is inspired by the existing feature-system and allows for a
more flexible approach for selecting specific packages for devices.

Features are now defined in a `features` file in the site-root. The same
goes for packages.

These files are sequentially evaluated and the device-package list is
evaluated for each device independently.

Signed-off-by: default avatarDavid Bauer <mail@david-bauer.net>
parent c2dc338a
No related branches found
No related tags found
No related merge requests found
packages({'iwinfo'})
features({
'autoupdater',
'ebtables-filter-multicast',
'ebtables-filter-ra-dhcp',
'ebtables-limit-arp',
'mesh-batman-adv-15',
'mesh-vpn-fastd',
'respondd',
'status-page',
'web-advanced',
'web-wizard'
})
if not device_class('tiny') then
features({
'wireless-encryption-wpa3'
})
end
## gluon site.mk makefile example ## gluon site.mk makefile example
## GLUON_FEATURES
# Specify Gluon features/packages to enable;
# Gluon will automatically enable a set of packages
# depending on the combination of features listed
GLUON_FEATURES := \
autoupdater \
ebtables-filter-multicast \
ebtables-filter-ra-dhcp \
ebtables-limit-arp \
mesh-batman-adv-15 \
mesh-vpn-fastd \
respondd \
status-page \
web-advanced \
web-wizard
GLUON_FEATURES_standard := \
wireless-encryption-wpa3
## GLUON_SITE_PACKAGES
# Specify additional Gluon/OpenWrt packages to include here;
# A minus sign may be prepended to remove a packages from the
# selection that would be enabled by default or due to the
# chosen feature flags
GLUON_SITE_PACKAGES := iwinfo
## DEFAULT_GLUON_RELEASE ## DEFAULT_GLUON_RELEASE
# version string to use for images # version string to use for images
# gluon relies on # gluon relies on
......
local M = {}
local function collect_keys(t)
local ret = {}
for v in pairs(t) do
table.insert(ret, v)
end
return ret
end
local function evaluate_device(files, env, dev)
local selections = {}
local funcs = {}
local device_disabled = false
local function add_elements(element_type, element_list)
for _, element in ipairs(element_list) do
if not selections[element_type] then
selections[element_type] = {}
end
selections[element_type][element] = true
end
end
function funcs.features(features)
add_elements('feature', features)
end
function funcs.packages(packages)
add_elements('package', packages)
end
function funcs.device(device_names)
assert(
type(device_names) == 'table',
'Incorrect use of device(): pass a list of device names as argument')
for _, device_name in ipairs(device_names) do
if device_name == dev.image then
return true
end
end
return false
end
function funcs.target(target, subtarget)
assert(
type(target) == 'string',
'Incorrect use of target(): pass a target name as first argument')
if target ~= env.BOARD then
return false
end
if subtarget and subtarget ~= env.SUBTARGET then
return false
end
return true
end
function funcs.device_class(class)
return dev.options.class == class
end
-- Evaluate the feature definition files
for _, file in ipairs(files) do
local f, err = loadfile(file)
if not f then
error('Failed to parse feature definition: ' .. err)
end
setfenv(f, funcs)
f()
end
return {
selections = selections,
device_disabled = device_disabled,
}
end
function M.get_selection(selection_type, files, env, dev)
local eval_result = evaluate_device(files, env, dev)
return collect_keys(eval_result.selections[selection_type] or {})
end
return M
local lib = dofile('scripts/target_lib.lua') local lib = dofile('scripts/target_lib.lua')
local feature_lib = dofile('scripts/feature_lib.lua') local feature_lib = dofile('scripts/feature_lib.lua')
local image_customization_lib = dofile('scripts/image_customization_lib.lua')
local env = lib.env local env = lib.env
local target = env.GLUON_TARGET local target = env.GLUON_TARGET
...@@ -86,10 +87,6 @@ END_MAKE ...@@ -86,10 +87,6 @@ END_MAKE
lib.escape(var))) lib.escape(var)))
end end
local function site_packages(image)
return split(site_vars(string.format('$(GLUON_%s_SITE_PACKAGES)', image)))
end
local function feature_packages(features) local function feature_packages(features)
local files = {'package/features'} local files = {'package/features'}
for _, feed in ipairs(feeds) do for _, feed in ipairs(feeds) do
...@@ -102,20 +99,30 @@ local function feature_packages(features) ...@@ -102,20 +99,30 @@ local function feature_packages(features)
return feature_lib.get_packages(files, features) return feature_lib.get_packages(files, features)
end end
-- This involves running a few processes to evaluate site.mk, so we add a simple cache local function site_specific_packages(dev_info)
local class_cache = {} local image_custoization = env.GLUON_SITEDIR .. '/image-customization'
local function class_packages(class)
if class_cache[class] then local site_packages = {}
return class_cache[class] local feature_inherited_pkgs = {}
end
local features = site_vars(string.format('$(GLUON_FEATURES) $(GLUON_FEATURES_%s)', class)) if file_exists(image_custoization) then
features = compact_list(split(features), false) local site_features
-- First read enabled features from site
site_features = image_customization_lib.get_selection('feature', {image_custoization}, env, dev_info)
site_features = compact_list(site_features, false)
-- Create List from packages inherited from features
feature_inherited_pkgs = feature_packages(site_features)
-- Read list of packages from site
site_packages = image_customization_lib.get_selection('package', {image_custoization}, env, dev_info)
end
local pkgs = feature_packages(features) -- Concat feature-packages with site-packages
pkgs = concat_list(pkgs, split(site_vars(string.format('$(GLUON_SITE_PACKAGES) $(GLUON_SITE_PACKAGES_%s)', class)))) local pkgs = concat_list(feature_inherited_pkgs, site_packages)
class_cache[class] = pkgs -- Negations for the resulting package-list are dealt with in the calling function
return pkgs return pkgs
end end
...@@ -192,9 +199,8 @@ for _, dev in ipairs(lib.devices) do ...@@ -192,9 +199,8 @@ for _, dev in ipairs(lib.devices) do
end end
handle_pkgs(lib.target_packages) handle_pkgs(lib.target_packages)
handle_pkgs(class_packages(dev.options.class))
handle_pkgs(dev.options.packages or {}) handle_pkgs(dev.options.packages or {})
handle_pkgs(site_packages(dev.image)) handle_pkgs(site_specific_packages(dev))
local profile_config = string.format('%s_DEVICE_%s', openwrt_config_target, dev.name) local profile_config = string.format('%s_DEVICE_%s', openwrt_config_target, dev.name)
lib.config( lib.config(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment