sb: Support --dry-run --with-download for 3rd party RTEMS BSP packages.

The building of 3rd party packages for an RTEMS BSP requires a valid
BSP so the standard method to download the source for releasing does
not work. This change adds support to allow this. The RTEMS BSP support
will not generate an error is no BSP or tools are provided or found.

The change addis logic operators to the %if statement so you can '||'
to 'or' and '&&' to 'and' logic expressions.

A new %log directive has been added to clean up the messages.

A new %{!define ...} has been added to aid checking within logic
expressions.

All command line --with/--without now appear as macros.

Add version.version to get just the RTEMS major and minor version.

Some pkg-config issues have been resolved.

Closes #2655.
This commit is contained in:
Chris Johns 2016-03-17 16:39:57 +11:00
parent 1bbb7666a0
commit 38ed59a301
8 changed files with 104 additions and 18 deletions

View File

@ -12,7 +12,18 @@
# (--with-tools) is not provided use the prefix. # (--with-tools) is not provided use the prefix.
# #
%if %{_target} == %{nil} #
# If a dry-run and with download ignore errors and correct setting for tools
# and BSPs. Only after the source to download.
#
%if %{_dry_run} && %{defined with_download}
%log BSP configuration errors ignored
%define rtems_bsp_error 0
%else
%define rtems_bsp_error 1
%endif
%if %{_target} == %{nil} && %{rtems_bsp_error}
%error No RTEMS target specified: --rtems-bsp=arch/bsp (or --target=target) %error No RTEMS target specified: --rtems-bsp=arch/bsp (or --target=target)
%endif %endif
@ -21,8 +32,11 @@
%endif %endif
%ifn %{defined with_rtems_bsp} %ifn %{defined with_rtems_bsp}
%if %{rtems_bsp_error}
%error No RTEMS BSP specified: --rtems-bsp=arch/bsp (or --with-rtems-bsp=bsp) %error No RTEMS BSP specified: --rtems-bsp=arch/bsp (or --with-rtems-bsp=bsp)
%endif %endif
%define with_rtems_bsp sparc/erc32
%endif
%ifn %{defined with_tools} %ifn %{defined with_tools}
%define with_tools %{_prefix} %define with_tools %{_prefix}
@ -56,7 +70,7 @@
%define rtems_bsp_ldflags %{pkgconfig ldflags %{_host}-%{rtems_bsp}} %define rtems_bsp_ldflags %{pkgconfig ldflags %{_host}-%{rtems_bsp}}
%define rtems_bsp_libs %{pkgconfig libs %{_host}-%{rtems_bsp}} %define rtems_bsp_libs %{pkgconfig libs %{_host}-%{rtems_bsp}}
%if %{rtems_bsp_cflags} == %{nil} %if %{rtems_bsp_cflags} == %{nil} && %{rtems_bsp_error}
%error No RTEMS target CFLAGS found; Please check the --rtems-bsp option. %error No RTEMS target CFLAGS found; Please check the --rtems-bsp option.
%endif %endif

View File

@ -220,7 +220,7 @@ try:
except ImportError: except ImportError:
print("incorrect package config installation", file = sys.stderr) print("incorrect package config installation", file = sys.stderr)
sys.exit(1) sys.exit(1)
except pkgconfig.error, e: except pkgconfig.error as e:
print('error: %s' % (e), file = sys.stderr) print('error: %s' % (e), file = sys.stderr)
sys.exit(1) sys.exit(1)
sys.exit(ec) sys.exit(ec)

View File

@ -132,6 +132,7 @@ def host_setup(opts):
sane = True sane = True
log.trace('--- check host set up : start"')
for d in list(opts.defaults.keys()): for d in list(opts.defaults.keys()):
try: try:
(test, constraint, value) = opts.defaults.get(d) (test, constraint, value) = opts.defaults.get(d)
@ -152,6 +153,7 @@ def host_setup(opts):
log.trace('%c %15s: %r -> "%s"' % (tag, d, opts.defaults.get(d), value)) log.trace('%c %15s: %r -> "%s"' % (tag, d, opts.defaults.get(d), value))
if sane and not ok: if sane and not ok:
sane = False sane = False
log.trace('--- check host set up : end"')
return sane return sane

View File

@ -574,6 +574,14 @@ class file:
s = s.replace(m, '0') s = s.replace(m, '0')
expanded = True expanded = True
mn = None mn = None
elif m.startswith('%{!defined'):
n = self._label(m[10:-1].strip())
if n in self.macros:
s = s.replace(m, '0')
else:
s = s.replace(m, '1')
expanded = True
mn = None
elif m.startswith('%{path '): elif m.startswith('%{path '):
pl = m[7:-1].strip().split() pl = m[7:-1].strip().split()
ok = False ok = False
@ -752,13 +760,45 @@ class file:
def add(x, y): def add(x, y):
return x + ' ' + str(y) return x + ' ' + str(y)
istrue = False if len(ls) == 1:
if isvalid: self._error('invalid if expression: ' + reduce(add, ls, ''))
if len(ls) == 2:
s = ls[1] cistrue = True # compound istrue
sls = reduce(add, ls[1:], '').split()
cls = sls
while len(cls) > 0 and isvalid:
join_op = 'none'
if cls[0] == '||' or cls[0] == '&&':
if cls[0] == '||':
join_op = 'or'
elif cls[0] == '&&':
join_op = 'and'
cls = cls[1:]
ori = 0
andi = 0
i = len(cls)
if '||' in cls:
ori = cls.index('||')
if '&&' in cls:
andi = cls.index('&&')
if ori > 0 or andi > 0:
if ori < andi:
i = ori
else: else:
s = (ls[1] + ' ' + ls[2]) i = andi
ifls = s.split() if ori == 0:
i = andi
ls = cls[:i]
if len(ls) == 0:
self._error('invalid if expression: ' + reduce(add, sls, ''))
cls = cls[i:]
istrue = False
ifls = ls
if len(ifls) == 1: if len(ifls) == 1:
# #
# Check if '%if %{x} == %{nil}' has both parts as nothing # Check if '%if %{x} == %{nil}' has both parts as nothing
@ -835,10 +875,22 @@ class file:
istrue = False istrue = False
else: else:
self._error('invalid %if operator: ' + reduce(add, ls, '')) self._error('invalid %if operator: ' + reduce(add, ls, ''))
if join_op == 'or':
if istrue:
cistrue = True
elif join_op == 'and':
if not istrue:
cistrue = False
else:
cistrue = istrue
log.trace('config: %s: _if: %s %s %s %s' % (self.name, ifls, str(cistrue),
join_op, str(istrue)))
if invert: if invert:
istrue = not istrue cistrue = not cistrue
log.trace('config: %s: _if: %s %s' % (self.name, ifls, str(istrue))) return self._ifs(config, ls, '%if', cistrue, isvalid, dir, info)
return self._ifs(config, ls, '%if', istrue, isvalid, dir, info)
def _ifos(self, config, ls, isvalid, dir, info): def _ifos(self, config, ls, isvalid, dir, info):
isos = False isos = False
@ -922,6 +974,9 @@ class file:
elif ls[0] == '%error': elif ls[0] == '%error':
if isvalid: if isvalid:
return ('data', ['%%error %s' % (self._name_line_msg(l[7:]))]) return ('data', ['%%error %s' % (self._name_line_msg(l[7:]))])
elif ls[0] == '%log':
if isvalid:
return ('data', ['%%log %s' % (self._name_line_msg(l[4:]))])
elif ls[0] == '%warning': elif ls[0] == '%warning':
if isvalid: if isvalid:
return ('data', ['%%warning %s' % (self._name_line_msg(l[9:]))]) return ('data', ['%%warning %s' % (self._name_line_msg(l[9:]))])
@ -1019,9 +1074,11 @@ class file:
if l.startswith('%error'): if l.startswith('%error'):
l = self._expand(l) l = self._expand(l)
raise error.general('config error: %s' % (l[7:])) raise error.general('config error: %s' % (l[7:]))
elif l.startswith('%log'):
l = self._expand(l)
log.output(l[4:])
elif l.startswith('%warning'): elif l.startswith('%warning'):
l = self._expand(l) l = self._expand(l)
log.stderr('warning: %s' % (l[9:]))
log.warning(l[9:]) log.warning(l[9:])
if not directive: if not directive:
l = self._expand(l) l = self._expand(l)

View File

@ -254,6 +254,13 @@ class command_line:
else: else:
value = '='.join(los[1:]) value = '='.join(los[1:])
long_opt[1](lo, long_opt[0], value) long_opt[1](lo, long_opt[0], value)
else:
if a.startswith('--with'):
if len(los) != 1:
value = los[1]
else:
value = '1'
self.defaults[los[0][2:].replace('-', '_').lower()] = ('none', 'none', value)
else: else:
self.opts['params'].append(a) self.opts['params'].append(a)
arg += 1 arg += 1
@ -548,7 +555,7 @@ class command_line:
raise error.general('invalid --rtems-bsp option') raise error.general('invalid --rtems-bsp option')
rtems_version = self.parse_args('--rtems-version') rtems_version = self.parse_args('--rtems-version')
if rtems_version is None: if rtems_version is None:
rtems_version = '%d.%d' % (version.major, version.minor) rtems_version = version.version()
else: else:
rtems_version = rtems_version[1] rtems_version = rtems_version[1]
self.args.append('--target=%s-rtems%s' % (ab[0], rtems_version)) self.args.append('--target=%s-rtems%s' % (ab[0], rtems_version))

View File

@ -214,6 +214,7 @@ class package(object):
if prefix: if prefix:
self._log('prefix: %s' % (prefix)) self._log('prefix: %s' % (prefix))
if type(prefix) is str: if type(prefix) is str:
self.prefix = []
for p in prefix.split(os.pathsep): for p in prefix.split(os.pathsep):
self.prefix += [path.shell(p)] self.prefix += [path.shell(p)]
elif type(prefix) is list: elif type(prefix) is list:

View File

@ -60,6 +60,8 @@ class buildset:
self.macros = copy.copy(opts.defaults) self.macros = copy.copy(opts.defaults)
else: else:
self.macros = copy.copy(macros) self.macros = copy.copy(macros)
log.trace('_bset: %s: macro defaults' % (bset))
log.trace(str(self.macros))
self.bset = bset self.bset = bset
_target = self.macros.expand('%{_target}') _target = self.macros.expand('%{_target}')
if len(_target): if len(_target):

View File

@ -111,5 +111,8 @@ def load_release_hashes(macros):
raise error.general('invalid release hash in VERSION') raise error.general('invalid release hash in VERSION')
sources.hash((hs[0], hash[0], hs[1]), macros, hash_error) sources.hash((hs[0], hash[0], hs[1]), macros, hash_error)
def version():
return _version
if __name__ == '__main__': if __name__ == '__main__':
print('Version: %s' % (str())) print('Version: %s' % (str()))