Skip to content
Snippets Groups Projects
Unverified Commit c6024626 authored by Matthias Schiffer's avatar Matthias Schiffer Committed by GitHub
Browse files

Merge pull request #2007 from freifunk-gluon/class-package-order

Fix package selection precedence
parents 0d341a76 53690d83
No related branches found
No related tags found
No related merge requests found
...@@ -55,7 +55,8 @@ endef ...@@ -55,7 +55,8 @@ endef
GLUON_VARS = \ GLUON_VARS = \
GLUON_RELEASE GLUON_REGION GLUON_MULTIDOMAIN GLUON_DEBUG GLUON_DEPRECATED GLUON_DEVICES \ GLUON_RELEASE GLUON_REGION GLUON_MULTIDOMAIN GLUON_DEBUG GLUON_DEPRECATED GLUON_DEVICES \
GLUON_TARGETSDIR GLUON_PATCHESDIR GLUON_TMPDIR GLUON_IMAGEDIR GLUON_PACKAGEDIR \ GLUON_TARGETSDIR GLUON_PATCHESDIR GLUON_TMPDIR GLUON_IMAGEDIR GLUON_PACKAGEDIR \
GLUON_SITEDIR GLUON_RELEASE GLUON_BRANCH GLUON_LANGS GLUON_BASE_FEEDS BOARD SUBTARGET GLUON_SITEDIR GLUON_RELEASE GLUON_BRANCH GLUON_LANGS GLUON_BASE_FEEDS \
GLUON_TARGET BOARD SUBTARGET
unexport $(GLUON_VARS) unexport $(GLUON_VARS)
GLUON_ENV = $(foreach var,$(GLUON_VARS),$(var)=$(call escape,$($(var)))) GLUON_ENV = $(foreach var,$(GLUON_VARS),$(var)=$(call escape,$($(var))))
...@@ -135,31 +136,6 @@ lint-lua: FORCE ...@@ -135,31 +136,6 @@ lint-lua: FORCE
lint-sh: FORCE lint-sh: FORCE
scripts/lint-sh.sh scripts/lint-sh.sh
define merge_lists
$(1) :=
$(foreach pkg,$(2),
$(1) := $$(strip $$(filter-out -$$(patsubst -%,%,$(pkg)) $$(patsubst -%,%,$(pkg)),$$(value $(1))) $(pkg))
)
endef
define feature_packages
$(1) := $(shell scripts/features.sh '$(2)' || echo '__ERROR__')
endef
$(eval $(call merge_lists,GLUON_FEATURE_LIST_standard,$(GLUON_FEATURES) $(GLUON_FEATURES_standard)))
$(eval $(call merge_lists,GLUON_FEATURE_LIST_tiny,$(GLUON_FEATURES) $(GLUON_FEATURES_tiny)))
$(eval $(call feature_packages,GLUON_FEATURE_PACKAGES_standard,$(GLUON_FEATURE_LIST_standard)))
$(eval $(call feature_packages,GLUON_FEATURE_PACKAGES_tiny,$(GLUON_FEATURE_LIST_tiny)))
ifneq ($(filter __ERROR__,$(GLUON_FEATURES_standard) $(GLUON_FEATURES_tiny)),)
$(error Error while evaluating features)
endif
$(eval $(call merge_lists,GLUON_DEFAULT_PACKAGES,$(GLUON_DEFAULT_PACKAGES) $(GLUON_SITE_PACKAGES)))
$(eval $(call merge_lists,GLUON_CLASS_PACKAGES_standard,$(GLUON_FEATURE_PACKAGES_standard) $(GLUON_SITE_PACKAGES_standard)))
$(eval $(call merge_lists,GLUON_CLASS_PACKAGES_tiny,$(GLUON_FEATURE_PACKAGES_tiny) $(GLUON_SITE_PACKAGES_tiny)))
LUA := openwrt/staging_dir/hostpkg/bin/lua LUA := openwrt/staging_dir/hostpkg/bin/lua
...@@ -182,22 +158,16 @@ config: $(LUA) FORCE ...@@ -182,22 +158,16 @@ config: $(LUA) FORCE
$(call CheckSite,$(conf)); \ $(call CheckSite,$(conf)); \
) )
$(GLUON_ENV) \ $(GLUON_ENV) $(LUA) scripts/target_config.lua > openwrt/.config
$(LUA) scripts/target_config.lua '$(GLUON_TARGET)' '$(GLUON_DEFAULT_PACKAGES)' '$(GLUON_CLASS_PACKAGES_standard)' '$(GLUON_CLASS_PACKAGES_tiny)' \
> openwrt/.config
$(OPENWRTMAKE) defconfig $(OPENWRTMAKE) defconfig
$(GLUON_ENV) $(LUA) scripts/target_config_check.lua
$(GLUON_ENV) \
$(LUA) scripts/target_config_check.lua '$(GLUON_TARGET)' '$(GLUON_DEFAULT_PACKAGES)' '$(GLUON_CLASS_PACKAGES_standard)' '$(GLUON_CLASS_PACKAGES_tiny)'
all: config all: config
+ +
$(GLUON_ENV) \ $(GLUON_ENV) $(LUA) scripts/clean_output.lua
$(LUA) scripts/clean_output.lua
$(OPENWRTMAKE) $(OPENWRTMAKE)
$(GLUON_ENV) \ $(GLUON_ENV) $(LUA) scripts/copy_output.lua
$(LUA) scripts/copy_output.lua '$(GLUON_TARGET)'
clean download: config clean download: config
+$(OPENWRTMAKE) $@ +$(OPENWRTMAKE) $@
......
local lib = dofile('scripts/target_lib.lua') local lib = dofile('scripts/target_lib.lua')
local env = lib.env local env = lib.env
local target = env.GLUON_TARGET
assert(target)
assert(env.GLUON_IMAGEDIR) assert(env.GLUON_IMAGEDIR)
assert(env.GLUON_PACKAGEDIR) assert(env.GLUON_PACKAGEDIR)
local target = arg[1]
local openwrt_target local openwrt_target
local subtarget = env.SUBTARGET local subtarget = env.SUBTARGET
if subtarget ~= '' then if subtarget ~= '' then
......
-- Split a string into words
local function split(s)
local ret = {}
for w in string.gmatch(s, '%S+') do
table.insert(ret, w)
end
return ret
end
-- Strip leading '-' character
local function strip_neg(s)
if string.sub(s, 1, 1) == '-' then
return string.sub(s, 2)
else
return s
end
end
-- Add an element to a list, removing duplicate entries and handling negative
-- elements prefixed with a '-'
local function append_to_list(list, item, keep_neg)
local match = strip_neg(item)
local ret = {}
for _, el in ipairs(list) do
if strip_neg(el) ~= match then
table.insert(ret, el)
end
end
if keep_neg ~= false or string.sub(item, 1, 1) ~= '-' then
table.insert(ret, item)
end
return ret
end
local function compact_list(list, keep_neg)
local ret = {}
for _, el in ipairs(list) do
ret = append_to_list(ret, el, keep_neg)
end
return ret
end
return function(funcs) return function(funcs)
local lib = dofile('scripts/target_lib.lua') local lib = dofile('scripts/target_lib.lua')
local env = lib.env local env = lib.env
local target = env.GLUON_TARGET
assert(target)
assert(env.BOARD) assert(env.BOARD)
assert(env.SUBTARGET) assert(env.SUBTARGET)
local target = arg[1]
local extra_packages = arg[2]
local class_packages = {
standard = arg[3],
tiny = arg[4],
}
local openwrt_config_target local openwrt_config_target
if env.SUBTARGET ~= '' then if env.SUBTARGET ~= '' then
openwrt_config_target = env.BOARD .. '_' .. env.SUBTARGET openwrt_config_target = env.BOARD .. '_' .. env.SUBTARGET
...@@ -20,81 +58,114 @@ return function(funcs) ...@@ -20,81 +58,114 @@ return function(funcs)
end end
local function site_packages(image) local function site_vars(var)
return lib.exec_capture_raw(string.format([[ return lib.exec_capture_raw(string.format([[
MAKEFLAGS= make print _GLUON_IMAGE_=%s --no-print-directory -s -f - <<'END_MAKE' MAKEFLAGS= make print _GLUON_SITE_VARS_=%s --no-print-directory -s -f - <<'END_MAKE'
include $(GLUON_SITEDIR)/site.mk include $(GLUON_SITEDIR)/site.mk
print: print:
echo -n '$(GLUON_$(_GLUON_IMAGE_)_SITE_PACKAGES)' echo -n '$(_GLUON_SITE_VARS_)'
END_MAKE END_MAKE
]], lib.escape(image))) ]], lib.escape(var)))
end
local function site_packages(image)
return split(site_vars(string.format('$(GLUON_%s_SITE_PACKAGES)', image)))
end
-- TODO: Rewrite features.sh in Lua
local function feature_packages(features)
-- Ugly hack: Lua doesn't give us the return code of a popened
-- command, so we match on a special __ERROR__ marker
local pkgs = lib.exec_capture({'scripts/features.sh', features}, '|| echo __ERROR__')
assert(string.find(pkgs, '__ERROR__') == nil, 'Error while evaluating features')
return pkgs
end
-- This involves running lots of processes to evaluate site.mk, so we
-- add a simple cache
local class_cache = {}
local function class_packages(class)
if class_cache[class] then
return class_cache[class]
end
local features = site_vars(string.format('$(GLUON_FEATURES) $(GLUON_FEATURES_%s)', class))
features = table.concat(compact_list(split(features), false), ' ')
local pkgs = feature_packages(features)
pkgs = pkgs .. ' ' .. site_vars(string.format('$(GLUON_SITE_PACKAGES) $(GLUON_SITE_PACKAGES_%s)', class))
pkgs = compact_list(split(pkgs))
class_cache[class] = pkgs
return pkgs
end end
local function handle_target_pkgs(pkgs) local function handle_target_pkgs(pkgs)
local packages = string.gmatch(pkgs, '%S+') for _, pkg in ipairs(pkgs) do
for pkg in packages do if string.sub(pkg, 1, 1) == '-' then
lib.packages {pkg} lib.try_config('# CONFIG_PACKAGE_%s is not set', string.sub(pkg, 2))
else
funcs.config_package(lib.config, pkg, 'y')
end
end end
end end
lib.include('generic') lib.include('generic')
handle_target_pkgs(extra_packages)
lib.include(target) lib.include(target)
if lib.target_class ~= nil then
handle_target_pkgs(class_packages[lib.target_class])
end
lib.check_devices() lib.check_devices()
if not lib.opkg then if not lib.opkg then
lib.config '# CONFIG_SIGNED_PACKAGES is not set' lib.config '# CONFIG_SIGNED_PACKAGES is not set'
lib.config 'CONFIG_CLEAN_IPKG=y' lib.config 'CONFIG_CLEAN_IPKG=y'
lib.packages {'-opkg'} lib.packages {'-opkg'}
end end
if #lib.devices > 0 then
handle_target_pkgs(lib.target_packages)
local default_pkgs = '' for _, dev in ipairs(lib.devices) do
for _, pkg in ipairs(lib.target_packages) do local profile = dev.options.profile or dev.name
default_pkgs = default_pkgs .. ' ' .. pkg
if string.sub(pkg, 1, 1) == '-' then local device_pkgs = {}
lib.try_config('# CONFIG_PACKAGE_%s is not set', string.sub(pkg, 2)) local function handle_pkgs(pkgs)
else for _, pkg in ipairs(pkgs) do
funcs.config_package(lib.config, pkg, 'y') if string.sub(pkg, 1, 1) ~= '-' then
end funcs.config_package(lib.config, pkg, 'm')
end end
device_pkgs = append_to_list(device_pkgs, pkg)
end
end
for _, dev in ipairs(lib.devices) do handle_pkgs(lib.target_packages)
local profile = dev.options.profile or dev.name handle_pkgs(class_packages(dev.options.class))
local device_pkgs = default_pkgs handle_pkgs(dev.options.packages or {})
handle_pkgs(site_packages(dev.image))
local function handle_pkg(pkg) funcs.config_message(lib.config, string.format("unable to enable device '%s'", profile),
if string.sub(pkg, 1, 1) ~= '-' then 'CONFIG_TARGET_DEVICE_%s_DEVICE_%s=y', openwrt_config_target, profile)
funcs.config_package(lib.config, pkg, 'm') lib.config('CONFIG_TARGET_DEVICE_PACKAGES_%s_DEVICE_%s="%s"',
end openwrt_config_target, profile,
device_pkgs = device_pkgs .. ' ' .. pkg table.concat(device_pkgs, ' '))
end end
else
-- x86 fallback: no devices
local target_pkgs = {}
local function handle_pkgs(pkgs) local function handle_pkgs(pkgs)
local packages = string.gmatch(pkgs or '', '%S+') for _, pkg in ipairs(pkgs) do
for pkg in packages do target_pkgs = append_to_list(target_pkgs, pkg)
handle_pkg(pkg)
end end
end end
for _, pkg in ipairs(dev.options.packages or {}) do -- Just hardcode the class for device-less targets to 'standard'
handle_pkg(pkg) -- - this is x86 only at the moment, and it will have devices
end -- in OpenWrt 19.07 + 1 as well
handle_pkgs(site_packages(dev.image)) handle_pkgs(lib.target_packages)
handle_pkgs(class_packages('standard'))
handle_pkgs(class_packages[dev.options.class])
funcs.config_message(lib.config, string.format("unable to enable device '%s'", profile), handle_target_pkgs(target_pkgs)
'CONFIG_TARGET_DEVICE_%s_DEVICE_%s=y', openwrt_config_target, profile)
lib.config('CONFIG_TARGET_DEVICE_PACKAGES_%s_DEVICE_%s="%s"',
openwrt_config_target, profile, device_pkgs)
end end
return lib return lib
......
...@@ -23,7 +23,6 @@ assert(env.GLUON_DEPRECATED) ...@@ -23,7 +23,6 @@ assert(env.GLUON_DEPRECATED)
M.site_code = assert(assert(dofile('scripts/site_config.lua')('site.conf')).site_code) M.site_code = assert(assert(dofile('scripts/site_config.lua')('site.conf')).site_code)
M.target_packages = {} M.target_packages = {}
M.target_class = nil
M.configs = {} M.configs = {}
M.devices = {} M.devices = {}
M.images = {} M.images = {}
...@@ -40,7 +39,7 @@ local default_options = { ...@@ -40,7 +39,7 @@ local default_options = {
aliases = {}, aliases = {},
manifest_aliases = {}, manifest_aliases = {},
packages = {}, packages = {},
class = "standard", class = 'standard',
deprecated = false, deprecated = false,
broken = false, broken = false,
} }
...@@ -99,7 +98,10 @@ function F.escape(s) ...@@ -99,7 +98,10 @@ function F.escape(s)
end end
local function escape_command(command, raw) local function escape_command(command, raw)
local ret = 'exec' local ret = ''
if not raw then
ret = 'exec'
end
for _, arg in ipairs(command) do for _, arg in ipairs(command) do
ret = ret .. ' ' .. F.escape(arg) ret = ret .. ' ' .. F.escape(arg)
end end
...@@ -156,10 +158,6 @@ function F.config(...) ...@@ -156,10 +158,6 @@ function F.config(...)
M.configs[string.format(...)] = 2 M.configs[string.format(...)] = 2
end end
function F.class(target_class)
M.target_class = target_class
end
function F.packages(pkgs) function F.packages(pkgs)
for _, pkg in ipairs(pkgs) do for _, pkg in ipairs(pkgs) do
table.insert(M.target_packages, pkg) table.insert(M.target_packages, pkg)
......
class 'standard'
packages { packages {
'kmod-3c59x', 'kmod-3c59x',
'kmod-8139cp', 'kmod-8139cp',
......
config 'CONFIG_VDI_IMAGES=y' config 'CONFIG_VDI_IMAGES=y'
config 'CONFIG_VMDK_IMAGES=y' config 'CONFIG_VMDK_IMAGES=y'
class 'standard'
packages { packages {
'kmod-3c59x', 'kmod-3c59x',
'kmod-8139cp', 'kmod-8139cp',
......
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