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

build: allow modification of device build-properties

parent 3d07353c
No related branches found
No related tags found
No related merge requests found
......@@ -8,10 +8,23 @@ local function collect_keys(t)
return ret
end
local function evaluate_device(files, env, dev)
local function file_exists(file)
local f = io.open(file)
if not f then
return false
end
f:close()
return true
end
local function get_customization_file_name(env)
return env.GLUON_SITEDIR .. '/image-customization'
end
local function evaluate_device(env, dev)
local selections = {}
local funcs = {}
local device_disabled = false
local device_overrides = {}
local function add_elements(element_type, element_list)
for _, element in ipairs(element_list) do
......@@ -23,6 +36,10 @@ local function evaluate_device(files, env, dev)
end
end
local function add_override(ovr_key, ovr_value)
device_overrides[ovr_key] = ovr_value
end
function funcs.features(features)
add_elements('feature', features)
end
......@@ -31,6 +48,21 @@ local function evaluate_device(files, env, dev)
add_elements('package', packages)
end
function funcs.broken(broken)
assert(
type(broken) == 'boolean',
'Incorrect use of broken(): has to be a boolean value')
add_override('broken', broken)
end
function funcs.disable()
add_override('disabled', true)
end
function funcs.disable_factory()
add_override('disable_factory', true)
end
function funcs.device(device_names)
assert(
type(device_names) == 'table',
......@@ -66,24 +98,35 @@ local function evaluate_device(files, env, dev)
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()
local f, err = loadfile(get_customization_file_name(env))
if not f then
error('Failed to parse feature definition: ' .. err)
end
setfenv(f, funcs)
f()
return {
selections = selections,
device_disabled = device_disabled,
device_overrides = device_overrides,
}
end
function M.get_selection(selection_type, files, env, dev)
local eval_result = evaluate_device(files, env, dev)
function M.get_selection(selection_type, env, dev)
if not file_exists(get_customization_file_name(env)) then
return {}
end
local eval_result = evaluate_device(env, dev)
return collect_keys(eval_result.selections[selection_type] or {})
end
function M.device_overrides(env, dev)
if not file_exists(get_customization_file_name(env)) then
return {}
end
local eval_result = evaluate_device(env, dev)
return eval_result.device_overrides
end
return M
......@@ -87,24 +87,19 @@ local function feature_packages(features)
end
local function site_specific_packages(dev_info)
local image_custoization = env.GLUON_SITEDIR .. '/image-customization'
local site_packages
local feature_inherited_pkgs
local site_features
local site_packages = {}
local feature_inherited_pkgs = {}
-- First read enabled features from site
site_features = image_customization_lib.get_selection('feature', env, dev_info)
site_features = compact_list(site_features, false)
if file_exists(image_custoization) then
local site_features
-- Create List from packages inherited from features
feature_inherited_pkgs = feature_packages(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
-- Read list of packages from site
site_packages = image_customization_lib.get_selection('package', env, dev_info)
-- Concat feature-packages with site-packages
local pkgs = concat_list(feature_inherited_pkgs, site_packages)
......
local image_customization_lib = dofile('scripts/image_customization_lib.lua')
-- Functions for use in targets/*
local F = {}
......@@ -55,11 +57,37 @@ function F.istrue(v)
return (tonumber(v) or 0) > 0
end
local function want_device(dev, options)
if options.broken and not F.istrue(env.BROKEN) then
local function get_device_overrides(device_info)
return image_customization_lib.device_overrides(env, device_info)
end
local function device_broken(device_info, overrides)
if F.istrue(env.BROKEN) then
return false
end
if options.deprecated and env.GLUON_DEPRECATED == '0' then
if overrides['broken'] ~= nil then
return overrides['broken'] == true
elseif device_info.options.broken then
return true
end
return false
end
local function want_device(device_info)
local overrides = get_device_overrides(device_info)
-- Check if device is disabled via image-customization in site
if overrides['disabled'] then
return false
end
if device_broken(device_info, overrides) then
return false
end
if device_info.options.deprecated and env.GLUON_DEPRECATED == '0' then
return false
end
......@@ -67,13 +95,10 @@ local function want_device(dev, options)
return true
end
unknown_devices[dev] = nil
return gluon_devices[dev]
unknown_devices[device_info.image] = nil
return gluon_devices[device_info.image]
end
local full_deprecated = env.GLUON_DEPRECATED == 'full'
local function merge(a, b)
local ret = {}
for k, v in pairs(a) do
......@@ -210,18 +235,33 @@ local function as_table(v)
end
end
function F.device(image, name, options)
options = merge(default_options, options)
local function disable_factory_image(device_info)
if device_info.options.deprecated and env.GLUON_DEPRECATED ~= 'full' then
return true
end
if not want_device(image, options) then
return
local overrides = get_device_overrides(device_info)
if overrides["disable_factory"] then
return true
end
table.insert(M.devices, {
return false
end
function F.device(image, name, options)
options = merge(default_options, options)
local device_info = {
image = image,
name = name,
options = options,
})
}
if not want_device(device_info) then
return
end
table.insert(M.devices, device_info)
if options.sysupgrade then
add_image {
......@@ -236,7 +276,7 @@ function F.device(image, name, options)
}
end
if options.deprecated and not full_deprecated then
if disable_factory_image(device_info) then
return
end
......
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