From 08061a9fda02ea091dcd9866e9d40ea794ae65b4 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Thu, 6 Oct 2022 14:23:55 +1100 Subject: pkg/linux: Add user config support to RPM spec file --- pkg/configs.py | 43 ++++++++++++++++++++++++++++++------------- pkg/linux.py | 47 +++++++++++++++++++++++++++++++++++++++++++++-- pkg/rpm.spec.in | 36 +++++++++++++++++++++++++++++------- 3 files changed, 104 insertions(+), 22 deletions(-) diff --git a/pkg/configs.py b/pkg/configs.py index ffb90ed..5b499db 100644 --- a/pkg/configs.py +++ b/pkg/configs.py @@ -63,6 +63,26 @@ def configure(conf): conf.msg('Buildset filter', bf, color='GREEN') +def get_config_parser(): + try: + import configparser + config = configparser.ConfigParser(strict=False, interpolation=None) + except: + # python2 + import ConfigParser as configparser + config = configparser.ConfigParser(raw=True) + return config + + +def get_config_error(): + try: + import configparser + except: + # python2 + import ConfigParser as configparser + return configparser.Error + + def config_path(config): return os.path.join(path, config + '.bset') @@ -80,16 +100,6 @@ def add_wscript_fun(ctx, fun_name, fun_func): def configs_ini_load(bld, inis, configs): - def get_parser(): - try: - import configparser - config = configparser.ConfigParser(strict=False) - except: - # python2 - import ConfigParser as configparser - config = configparser.ConfigParser() - return config - def parse_types(bld, value): vs = value.lower().strip().split(' ') if len(vs) == 1: @@ -126,8 +136,11 @@ def configs_ini_load(bld, inis, configs): return None for ini in inis: - config = get_parser() - config.read(ini) + config = get_config_parser() + try: + config.read(ini) + except pkg.configs.get_config_error() as ce: + bld.fatal('configs ini parse error: ' + str(ce)) ini_dir = os.path.dirname(os.path.abspath(ini)) for d in config.defaults(): i = (d, config.defaults()[d]) @@ -141,7 +154,11 @@ def configs_ini_load(bld, inis, configs): for section in config.sections(): for c in configs: if section == os.path.basename(c['buildset']): - for i in config.items(section): + try: + items = config.items(section) + except pkg.configs.get_config_error() as ce: + bld.fatal('configs ini parse error: ' + str(ce)) + for i in items: val = parse_types(bld, i[1]) if val is None: bld.fatal('invalid configs item in ' + ini + ': ' + diff --git a/pkg/linux.py b/pkg/linux.py index 4246286..7be7cb7 100644 --- a/pkg/linux.py +++ b/pkg/linux.py @@ -52,15 +52,54 @@ def _esc_label(s): return s.replace('-', '_') +def rpm_get_config(ctx): + if ctx.env.RPM_CONFIG: + config = pkg.configs.get_config_parser() + try: + config.read(ctx.env.RPM_CONFIG) + except pkg.configs.get_config_error() as ce: + conf.fatal('rpm config parse error: ' + str(ce)) + else: + config = None + return config + + +def rpm_config_parser(bld, build): + config = rpm_get_config(bld) + no_config = '# No user configuration, see ./waf --help and --rpm-config' + if config is None: + return no_config + if not config.has_section(build['buildset']): + return no_config + try: + items = config.items(build['buildset']) + except pkg.configs.get_config_error() as ce: + bld.fatal('rpm config parse error: ' + str(ce)) + user_config = [] + for ci in items: + user_config += ['%%define %s %s' % (ci[0], ci[1])] + return os.linesep.join(user_config) + + def rpm_configure(conf): try: conf.find_program('rpmbuild', var='RPMBUILD', manditory=False) conf.env.PACKAGER = True except: pass + if conf.options.rpm_config is not None: + if not conf.env.PACKAGER: + conf.fatal('RPM config option is invalid without rpmbuild') + if not os.path.isfile(conf.options.rpm_config): + conf.fatal('RPM config does not exist or not a file: ' + + conf.options.rpm_config) + conf.msg('RPM config', conf.options.rpm_config) + conf.env.RPM_CONFIG = conf.options.rpm_config + rpm_get_config(conf) def rpm_build(bld, build): + user_rpm_config = rpm_config_parser(bld, build) bset = pkg.configs.buildset(bld, build, dry_run=False) rpm_name = 'rpmspec/' + bset['name'] spec_file = _esc_name(build['buildset']) @@ -84,7 +123,8 @@ def rpm_build(bld, build): TARFILE=bset['tar'], RSB_SET_BUILDER=bset['cmd'], RSB_SET_BUILDER_ARGS=' '.join(bset['pkg-opts']), - RSB_WORK_PATH=bld.path) + RSB_WORK_PATH=bld.path, + USER_RPM_CONFIG=user_rpm_config) def rpmspec(bld): @@ -97,7 +137,10 @@ def init(ctx): def options(opt): - pass + opt.add_option('--rpm-config', + default=None, + dest='rpm_config', + help='RPM configuration INI file') def configure(conf): diff --git a/pkg/rpm.spec.in b/pkg/rpm.spec.in index 46dbba4..78873d0 100644 --- a/pkg/rpm.spec.in +++ b/pkg/rpm.spec.in @@ -46,26 +46,48 @@ %define rsb_set_builder_args @RSB_SET_BUILDER_ARGS@ %define rsb_work_path @RSB_WORK_PATH@ - # Use a buildroot under this repo build path %define _topdir %{rsb_buildroot} +# User supplied RPM configuration +@USER_RPM_CONFIG@ + + # Package -%define name rtems-%{rsb_pkg_name} %define arch noarch +%if %{undefined rpm_name} + %define rpm_name rtems-%{rsb_pkg_name} +%endif + +%if %{undefined rpm_version} + %define rpm_version %{rsb_version} +%endif + +%if %{undefined rpm_revision} + %define rpm_revision %{rsb_revision}%{?dist} +%endif + +%if %{undefined rpm_summary} + %define rpm_summary RTEMS tools and board support package +%endif + +%if %{undefined rpm_description} + %define rpm_description This RPM is development tools and libraries for RTEMS +%endif + # Package details -Name: %{name} -Version: %{rsb_version} -Release: %{rsb_revision}%{?dist} -Summary: RTEMS tools and board support package +Name: %{rpm_name} +Version: %{rpm_version} +Release: %{rpm_revision} +Summary: %{rpm_summary} License: GPLv2, GPLv3, BSD-2 %description -This RPM is development tools and BSP for RTEMS +%{rpm_description} %prep -- cgit v1.2.3