diff --git a/scripts/target_config.lua b/scripts/target_config.lua index 452d4f19..28ea4153 100755 --- a/scripts/target_config.lua +++ b/scripts/target_config.lua @@ -1,24 +1,5 @@ -local funcs = {} +local lib = dofile('scripts/target_config_lib.lua') -function funcs.config_message(config, _, ...) - config(...) -end - -function funcs.config_package(config, pkg, value) - config('CONFIG_PACKAGE_%s=%s', pkg, value) -end - -local lib = dofile('scripts/target_config_lib.lua')(funcs) - - -local output = {} - -for config in pairs(lib.configs) do - table.insert(output, config) -end - --- The sort will make =y entries override =m ones -table.sort(output) -for _, line in ipairs(output) do - io.stdout:write(line, '\n') +for _, config in pairs(lib.configs) do + io.stdout:write(config:format(), '\n') end diff --git a/scripts/target_config_check.lua b/scripts/target_config_check.lua index 373cf430..9be50585 100755 --- a/scripts/target_config_check.lua +++ b/scripts/target_config_check.lua @@ -1,16 +1,12 @@ -local errors = {} +local errors = false - -local function fail(...) - if not next(errors) then +local function fail(msg) + if not errors then + errors = true io.stderr:write('Configuration failed:', '\n') end - local msg = string.format(...) - if not errors[msg] then - errors[msg] = true - io.stderr:write(' * ', msg, '\n') - end + io.stderr:write(' * ', msg, '\n') end local function match_config(f) @@ -23,49 +19,21 @@ local function match_config(f) return false end -local function check_config(pattern) - return match_config(function(line) return line == pattern end) -end - -local function check_config_prefix(pattern) - return match_config(function(line) return string.sub(line, 1, -2) == pattern end) +local function check_config(config) + return match_config(function(line) return line == config end) end -local funcs = {} +local lib = dofile('scripts/target_config_lib.lua') -function funcs.config_message(_, message, ...) - local pattern = string.format(...) - - if not check_config(pattern) then - fail('%s', message) - end -end - -function funcs.config_package(_, pkg, value) - local pattern = string.format('CONFIG_PACKAGE_%s=%s', pkg, value) - local res - if value == 'y' then - res = check_config(pattern) - else - res = check_config_prefix(string.sub(pattern, 1, -2)) - end - - if not res then - fail("unable to enable package '%s'", pkg) - end -end - -local lib = dofile('scripts/target_config_lib.lua')(funcs) - -for config, v in pairs(lib.configs) do - if v == 2 then - if not check_config(config) then - fail("unable to set '%s'", config) +for _, config in pairs(lib.configs) do + if config.required then + if not check_config(config:format()) then + fail(config.required) end end end -if next(errors) then +if errors then os.exit(1) end diff --git a/scripts/target_config_lib.lua b/scripts/target_config_lib.lua index ee2bf006..fc897d68 100644 --- a/scripts/target_config_lib.lua +++ b/scripts/target_config_lib.lua @@ -1,3 +1,20 @@ +local lib = dofile('scripts/target_lib.lua') +local env = lib.env + +local target = env.GLUON_TARGET + +assert(target) +assert(env.BOARD) +assert(env.SUBTARGET) + +local openwrt_config_target +if env.SUBTARGET ~= '' then + openwrt_config_target = env.BOARD .. '_' .. env.SUBTARGET +else + openwrt_config_target = env.BOARD +end + + -- Split a string into words local function split(s) local ret = {} @@ -40,133 +57,138 @@ local function compact_list(list, keep_neg) return ret end -return function(funcs) - local lib = dofile('scripts/target_lib.lua') - local env = lib.env - local target = env.GLUON_TARGET - - assert(target) - assert(env.BOARD) - assert(env.SUBTARGET) - - local openwrt_config_target - if env.SUBTARGET ~= '' then - openwrt_config_target = env.BOARD .. '_' .. env.SUBTARGET - else - openwrt_config_target = env.BOARD - end - - - local function site_vars(var) - return lib.exec_capture_raw(string.format([[ - MAKEFLAGS= make print _GLUON_SITE_VARS_=%s --no-print-directory -s -f - <<'END_MAKE' +local function site_vars(var) + return lib.exec_capture_raw(string.format( +[[ +MAKEFLAGS= make print _GLUON_SITE_VARS_=%s --no-print-directory -s -f - <<'END_MAKE' include $(GLUON_SITEDIR)/site.mk print: echo -n '$(_GLUON_SITE_VARS_)' END_MAKE - ]], lib.escape(var))) +]], + 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 function site_packages(image) - return split(site_vars(string.format('$(GLUON_%s_SITE_PACKAGES)', image))) - end + local features = site_vars(string.format('$(GLUON_FEATURES) $(GLUON_FEATURES_%s)', class)) + features = table.concat(compact_list(split(features), false), ' ') - -- 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 + local pkgs = feature_packages(features) + pkgs = pkgs .. ' ' .. site_vars(string.format('$(GLUON_SITE_PACKAGES) $(GLUON_SITE_PACKAGES_%s)', class)) - -- 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] + pkgs = compact_list(split(pkgs)) + + class_cache[class] = pkgs + return pkgs +end + +local enabled_packages = {} +-- Arguments: package name and config value (true: y, nil: m, false: unset) +-- Ensures precedence of y > m > unset +local function config_package(pkg, v) + if v == false then + if not enabled_packages[pkg] then + lib.try_config('PACKAGE_' .. pkg, false) 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 + return end - local function handle_target_pkgs(pkgs) - for _, pkg in ipairs(pkgs) do - if string.sub(pkg, 1, 1) == '-' then - lib.try_config('# CONFIG_PACKAGE_%s is not set', string.sub(pkg, 2)) - else - funcs.config_package(lib.config, pkg, 'y') - end + if v == true or not enabled_packages[pkg] then + lib.config('PACKAGE_' .. pkg, v, string.format("unable to enable package '%s'", pkg)) + enabled_packages[pkg] = true + end +end + +local function handle_target_pkgs(pkgs) + for _, pkg in ipairs(pkgs) do + if string.sub(pkg, 1, 1) == '-' then + config_package(string.sub(pkg, 2), false) + else + config_package(pkg, true) end end +end - lib.include('generic') - lib.include(target) +lib.include('generic') +lib.include(target) - lib.check_devices() +lib.check_devices() - if not lib.opkg then - lib.config '# CONFIG_SIGNED_PACKAGES is not set' - lib.config 'CONFIG_CLEAN_IPKG=y' - lib.packages {'-opkg'} - end +if not lib.opkg then + lib.config('SIGNED_PACKAGES', false) + lib.config('CLEAN_IPKG', true) + lib.packages {'-opkg'} +end - if #lib.devices > 0 then - handle_target_pkgs(lib.target_packages) +if #lib.devices > 0 then + handle_target_pkgs(lib.target_packages) - for _, dev in ipairs(lib.devices) do - local profile = dev.options.profile or dev.name + for _, dev in ipairs(lib.devices) do + local profile = dev.options.profile or dev.name - local device_pkgs = {} - local function handle_pkgs(pkgs) - for _, pkg in ipairs(pkgs) do - if string.sub(pkg, 1, 1) ~= '-' then - funcs.config_package(lib.config, pkg, 'm') - end - device_pkgs = append_to_list(device_pkgs, pkg) - end - end - - handle_pkgs(lib.target_packages) - handle_pkgs(class_packages(dev.options.class)) - handle_pkgs(dev.options.packages or {}) - handle_pkgs(site_packages(dev.image)) - - funcs.config_message(lib.config, string.format("unable to enable device '%s'", profile), - '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, - table.concat(device_pkgs, ' ')) - end - else - -- x86 fallback: no devices - local target_pkgs = {} + local device_pkgs = {} local function handle_pkgs(pkgs) for _, pkg in ipairs(pkgs) do - target_pkgs = append_to_list(target_pkgs, pkg) + if string.sub(pkg, 1, 1) ~= '-' then + config_package(pkg, nil) + end + device_pkgs = append_to_list(device_pkgs, pkg) end end - -- Just hardcode the class for device-less targets to 'standard' - -- - this is x86 only at the moment, and it will have devices - -- in OpenWrt 19.07 + 1 as well handle_pkgs(lib.target_packages) - handle_pkgs(class_packages('standard')) + handle_pkgs(class_packages(dev.options.class)) + handle_pkgs(dev.options.packages or {}) + handle_pkgs(site_packages(dev.image)) - handle_target_pkgs(target_pkgs) + local profile_config = string.format('%s_DEVICE_%s', openwrt_config_target, profile) + lib.config( + 'TARGET_DEVICE_' .. profile_config, true, + string.format("unable to enable device '%s'", profile) + ) + lib.config( + 'TARGET_DEVICE_PACKAGES_' .. profile_config, + table.concat(device_pkgs, ' ') + ) + end +else + -- x86 fallback: no devices + local target_pkgs = {} + local function handle_pkgs(pkgs) + for _, pkg in ipairs(pkgs) do + target_pkgs = append_to_list(target_pkgs, pkg) + end end - return lib + -- Just hardcode the class for device-less targets to 'standard' + -- - this is x86 only at the moment, and it will have devices + -- in OpenWrt 19.07 + 1 as well + handle_pkgs(lib.target_packages) + handle_pkgs(class_packages('standard')) + + handle_target_pkgs(target_pkgs) end + +return lib diff --git a/scripts/target_lib.lua b/scripts/target_lib.lua index 0fc2d8b6..bb974659 100644 --- a/scripts/target_lib.lua +++ b/scripts/target_lib.lua @@ -150,14 +150,51 @@ local function add_image(image) table.insert(M.images[device], setmetatable(image, image_mt)) end -function F.try_config(...) - M.configs[string.format(...)] = 1 + +local function format_config(k, v) + local format + if type(v) == 'string' then + format = '%s=%q' + elseif v == true then + format = '%s=y' + elseif v == nil then + format = '%s=m' + elseif v == false then + format = '# %s is not set' + else + format = '%s=%d' + end + return string.format(format, 'CONFIG_' .. k, v) end -function F.config(...) - M.configs[string.format(...)] = 2 +local config_mt = { + __index = { + format = function(config) + return format_config(config.key, config.value) + end, + } +} + +local function do_config(k, v, required) + M.configs[k] = setmetatable({ + key = k, + value = v, + required = required, + }, config_mt) end +function F.try_config(k, v) + do_config(k, v) +end + +function F.config(k, v, message) + if not message then + message = string.format("unable to set '%s'", format_config(k, v)) + end + do_config(k, v, message) +end + + function F.packages(pkgs) for _, pkg in ipairs(pkgs) do table.insert(M.target_packages, pkg) @@ -165,6 +202,14 @@ function F.packages(pkgs) end M.packages = F.packages +local function as_table(v) + if type(v) == 'table' then + return v + else + return {v} + end +end + function F.device(image, name, options) options = merge(default_options, options) @@ -196,16 +241,17 @@ function F.device(image, name, options) end if options.factory then - add_image { - image = image, - name = name, - subdir = 'factory', - in_suffix = options.factory, - out_suffix = '', - extension = options.factory_ext, - aliases = options.aliases, - manifest_aliases = options.manifest_aliases, - } + for _, ext in ipairs(as_table(options.factory_ext)) do + add_image { + image = image, + name = name, + subdir = 'factory', + in_suffix = options.factory, + out_suffix = '', + extension = ext, + aliases = options.aliases, + } + end end for _, extra_image in ipairs(options.extra_images) do add_image { @@ -216,7 +262,6 @@ function F.device(image, name, options) out_suffix = extra_image[2], extension = extra_image[3], aliases = options.aliases, - manifest_aliases = options.manifest_aliases, } end end @@ -240,7 +285,6 @@ function F.factory_image(image, name, ext, options) out_suffix = '', extension = ext, aliases = options.aliases, - manifest_aliases = options.manifest_aliases, } end diff --git a/targets/ar71xx-generic b/targets/ar71xx-generic index 04d798ab..a31d78b2 100644 --- a/targets/ar71xx-generic +++ b/targets/ar71xx-generic @@ -1,5 +1,5 @@ -config 'CONFIG_GLUON_SPECIALIZE_KERNEL=y' -config 'CONFIG_TARGET_SQUASHFS_BLOCK_SIZE=64' +config('GLUON_SPECIALIZE_KERNEL', true) +config('TARGET_SQUASHFS_BLOCK_SIZE', 64) local ATH10K_PACKAGES = { 'kmod-ath10k', diff --git a/targets/ar71xx-mikrotik b/targets/ar71xx-mikrotik index 6a783b5e..81a053f2 100644 --- a/targets/ar71xx-mikrotik +++ b/targets/ar71xx-mikrotik @@ -1,4 +1,4 @@ -config 'CONFIG_GLUON_SPECIALIZE_KERNEL=y' +config('GLUON_SPECIALIZE_KERNEL', true) defaults { factory = false, diff --git a/targets/ar71xx-nand b/targets/ar71xx-nand index e52b82e0..89afd52c 100644 --- a/targets/ar71xx-nand +++ b/targets/ar71xx-nand @@ -1,4 +1,4 @@ -config 'CONFIG_GLUON_SPECIALIZE_KERNEL=y' +config('GLUON_SPECIALIZE_KERNEL', true) local ATH10K_PACKAGES = {'kmod-ath10k', '-kmod-ath10k-ct', 'ath10k-firmware-qca988x', '-ath10k-firmware-qca988x-ct'} diff --git a/targets/ar71xx-tiny b/targets/ar71xx-tiny index bc9f03c8..a0a8d510 100644 --- a/targets/ar71xx-tiny +++ b/targets/ar71xx-tiny @@ -1,4 +1,4 @@ -config 'CONFIG_GLUON_SPECIALIZE_KERNEL=y' +config('GLUON_SPECIALIZE_KERNEL', true) no_opkg() diff --git a/targets/generic b/targets/generic index 91ab783c..e0285821 100644 --- a/targets/generic +++ b/targets/generic @@ -1,21 +1,21 @@ assert(env.GLUON_LANGS) -config('CONFIG_GLUON_SITEDIR="%s"', env.GLUON_SITEDIR) -config('CONFIG_GLUON_RELEASE="%s"', env.GLUON_RELEASE) -try_config('CONFIG_GLUON_BRANCH="%s"', env.GLUON_BRANCH or '') +config('GLUON_SITEDIR', env.GLUON_SITEDIR) +config('GLUON_RELEASE', env.GLUON_RELEASE) +try_config('GLUON_BRANCH', env.GLUON_BRANCH or '') for lang in string.gmatch(env.GLUON_LANGS, '%S+') do - try_config('CONFIG_GLUON_WEB_LANG_%s=y', lang) + try_config('GLUON_WEB_LANG_' .. lang, true) end -config('CONFIG_TARGET_%s=y', env.BOARD) +config('TARGET_' .. env.BOARD, true) if env.SUBTARGET ~= '' then - config('CONFIG_TARGET_%s_%s=y', env.BOARD, env.SUBTARGET) + config(string.format('TARGET_%s_%s', env.BOARD, env.SUBTARGET), true) end -- Disable non-default feeds in distfeeds.conf -config('# CONFIG_FEED_gluon_base is not set') +config('FEED_gluon_base', false) local default_feeds = {} for feed in string.gmatch(exec_capture_raw('. scripts/default_feeds.sh && echo "$DEFAULT_FEEDS"'), '%S+') do @@ -24,52 +24,46 @@ end for feed in string.gmatch(exec_capture_raw('. scripts/modules.sh && echo -n "$FEEDS"'), '%S+') do if not default_feeds[feed] then - config('# CONFIG_FEED_%s is not set', feed) + config('FEED_' .. feed, false) end end -config '# CONFIG_TARGET_ROOTFS_INITRAMFS is not set' +config('TARGET_ROOTFS_INITRAMFS', false) -config 'CONFIG_DEVEL=y' -config 'CONFIG_ALL_NONSHARED=y' +config('DEVEL', true) +config('ALL_NONSHARED', true) -config '# CONFIG_PACKAGE_usbip is not set' -- fails to build -config '# CONFIG_PACKAGE_kmod-jool is not set' -- fails to build +config('PACKAGE_usbip', false) -- fails to build +config('PACKAGE_kmod-jool', false) -- fails to build -config 'CONFIG_BUSYBOX_CUSTOM=y' -config '# CONFIG_BUSYBOX_CONFIG_FEATURE_PREFER_IPV4_ADDRESS is not set' +config('BUSYBOX_CUSTOM', true) +config('BUSYBOX_CONFIG_FEATURE_PREFER_IPV4_ADDRESS', false) -config 'CONFIG_PACKAGE_ATH_DEBUG=y' +config('PACKAGE_ATH_DEBUG', true) -try_config 'CONFIG_TARGET_SQUASHFS_BLOCK_SIZE=256' +try_config('TARGET_SQUASHFS_BLOCK_SIZE', 256) -config '# CONFIG_KERNEL_IP_MROUTE is not set' -config '# CONFIG_KERNEL_IPV6_MROUTE is not set' +config('KERNEL_IP_MROUTE', false) +config('KERNEL_IPV6_MROUTE', false) -try_config 'CONFIG_TARGET_MULTI_PROFILE=y' -try_config 'CONFIG_TARGET_PER_DEVICE_ROOTFS=y' +try_config('TARGET_MULTI_PROFILE', true) +try_config('TARGET_PER_DEVICE_ROOTFS', true) -if istrue(env.GLUON_MULTIDOMAIN) then - config 'CONFIG_GLUON_MULTIDOMAIN=y' -end +config('GLUON_MULTIDOMAIN', istrue(env.GLUON_MULTIDOMAIN)) -if istrue(env.GLUON_AUTOREMOVE) then - config 'CONFIG_AUTOREMOVE=y' -end +config('AUTOREMOVE', istrue(env.GLUON_AUTOREMOVE)) if istrue(env.GLUON_DEBUG) then - config 'CONFIG_DEBUG=y' - config 'CONFIG_NO_STRIP=y' - config '# CONFIG_USE_STRIP is not set' - config '# CONFIG_USE_SSTRIP is not set' + config('DEBUG', true) + config('NO_STRIP', true) + config('USE_STRIP', false) + config('USE_SSTRIP', false) - try_config 'CONFIG_TARGET_ROOTFS_PARTSIZE=500' + try_config('TARGET_ROOTFS_PARTSIZE', 500) end -if not istrue(env.GLUON_MINIFY) then - config '# CONFIG_GLUON_MINIFY is not set' -end +config('GLUON_MINIFY', istrue(env.GLUON_MINIFY)) packages { '-kmod-ipt-offload', diff --git a/targets/ramips-rt305x b/targets/ramips-rt305x index a4026e24..8678f12e 100644 --- a/targets/ramips-rt305x +++ b/targets/ramips-rt305x @@ -1,5 +1,5 @@ -config '# CONFIG_KERNEL_KALLSYMS is not set' -config 'CONFIG_GLUON_SPECIALIZE_KERNEL=y' +config('KERNEL_KALLSYMS', false) +config('GLUON_SPECIALIZE_KERNEL', true) no_opkg() diff --git a/targets/x86.inc b/targets/x86.inc index 9536e805..c6037c68 100644 --- a/targets/x86.inc +++ b/targets/x86.inc @@ -1,5 +1,5 @@ -config 'CONFIG_VDI_IMAGES=y' -config 'CONFIG_VMDK_IMAGES=y' +config('VDI_IMAGES', true) +config('VMDK_IMAGES', true) packages { 'kmod-3c59x',