Changeset 51e19af in rtems-tools for tester


Ignore:
Timestamp:
Aug 18, 2016, 11:00:29 AM (3 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, master
Children:
3a92a54
Parents:
57e4172
Message:

bsp-builder: Support per BSP excludes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tester/rt/check.py

    r57e4172 r51e19af  
    3636import os
    3737import sys
     38
     39try:
     40    import configparser
     41except:
     42    import ConfigParser as configparser
    3843
    3944from rtemstoolkit import execute
     
    95100        log.output(text)
    96101
     102class results:
     103
     104    def __init__(self):
     105        self.passes = []
     106        self.fails = []
     107
     108    def add(self, good, arch, bsp, configure, warnings):
     109        if good:
     110            self.passes += [(arch, bsp, configure, warnings)]
     111        else:
     112            self.fails += [(arch, bsp, configure, 0)]
     113
     114    def report(self):
     115        log.notice('* Passes: %d   Failures: %d' %
     116                   (len(self.passes), len(self.fails)))
     117        log.output()
     118        log.output('Build Report')
     119        log.output('   Passes: %d   Failures: %d' %
     120                   (len(self.passes), len(self.fails)))
     121        log.output(' Failures:')
     122        for f in self.fails:
     123            arch_bsp = '%s/%s' % (f[0], f[1])
     124            config_cmd = f[2]
     125            config_at = config_cmd.find('configure')
     126            if config_at != -1:
     127                config_cmd = config_cmd[config_at:]
     128            log.output(' %20s:  %s' % (arch_bsp, config_cmd))
     129        log.output(' Passes:')
     130        for f in self.passes:
     131            arch_bsp = '%s/%s' % (f[0], f[1])
     132            config_cmd = f[2]
     133            config_at = config_cmd.find('configure')
     134            if config_at != -1:
     135                config_cmd = config_cmd[config_at:]
     136            log.output(' %20s:  %d  %s' % (arch_bsp, f[3], config_cmd))
     137
    97138class configuration:
    98139
    99140    def __init__(self):
    100         try:
    101             import configparser
    102         except:
    103             import ConfigParser as configparser
    104141        self.config = configparser.ConfigParser()
    105142        self.name = None
     
    128165        return None
    129166
     167    def _get_items(self, section, err = True):
     168        try:
     169            items = self.config.items(section)
     170            return items
     171        except:
     172            if err:
     173                raise error.general('config: section %s not found' % (section))
     174        return []
     175
    130176    def _comma_list(self, section, label, error = True):
    131177        items = self._get_item(section, label, error)
     
    138184            raise error.general('config: cannot read configuration: %s' % (name))
    139185        self.name = name
    140         self.config.read(name)
     186        try:
     187            self.config.read(name)
     188        except configparser.ParsingError as ce:
     189            raise error.general('config: %s' % (ce))
    141190        archs = []
    142191        self.profiles['profiles'] = self._comma_list('profiles', 'profiles', error = False)
     
    154203        for a in set(archs):
    155204            arch = {}
    156             arch['excludes'] = self._comma_list(a, 'excludes', error = False)
     205            arch['excludes'] = {}
     206            for exclude in self._comma_list(a, 'exclude', error = False):
     207                arch['excludes'][exclude] = ['all']
     208            for i in self._get_items(a, False):
     209                if i[0].startswith('exclude_'):
     210                    exclude = i[0][len('exclude_'):]
     211                    if exclude not in arch['excludes']:
     212                        arch['excludes'][exclude] = []
     213                    arch['excludes'][exclude] += sorted(set([b.strip() for b in i[1].split(',')]))
    157214            arch['bsps'] = self._comma_list(a, 'bsps', error = False)
    158215            for b in arch['bsps']:
    159216                arch[b] = {}
    160217                arch[b]['bspopts'] = self._comma_list(a, 'bspopts_%s' % (b), error = False)
    161                 arch[b]['config'] = self._comma_list(a, 'config_%s' % (b), error = False)
    162218            self.archs[a] = arch
    163219        builds = {}
     
    173229
    174230    def excludes(self, arch):
    175         return self.archs[arch]['excludes']
     231        excludes = self.archs[arch]['excludes'].keys()
     232        for exclude in self.archs[arch]['excludes']:
     233            if 'all' not in self.archs[arch]['excludes'][exclude]:
     234                excludes.remove(exclude)
     235        return sorted(excludes)
    176236
    177237    def archs(self):
     
    187247        return bsp in self.archs[arch]['bsps']
    188248
     249    def bsp_excludes(self, arch, bsp):
     250        excludes = self.archs[arch]['excludes'].keys()
     251        for exclude in self.archs[arch]['excludes']:
     252            if bsp not in self.archs[arch]['excludes'][exclude]:
     253                excludes.remove(exclude)
     254        return sorted(excludes)
     255
    189256    def bspopts(self, arch, bsp):
    190257        return self.archs[arch][bsp]['bspopts']
     
    195262    def variant_options(self, variant):
    196263        if variant in self.builds['var_options']:
    197             self.builds['var_options'][variant]
     264            return self.builds['var_options'][variant]
    198265        return []
    199266
     
    225292                        'libs'     : 0 }
    226293        self.warnings = warnings_counter(rtems)
     294        self.results = results()
    227295        if not path.exists(path.join(rtems, 'configure')) or \
    228296           not path.exists(path.join(rtems, 'Makefile.in')) or \
     
    244312
    245313    def _variations(self, arch, bsp):
     314        def _match(var, vars):
     315            matches = []
     316            for v in vars:
     317                if var in v.split('-'):
     318                    matches += [v]
     319            return matches
     320
    246321        vars = self.config.variations()
    247322        for v in self.config.excludes(arch):
    248             if v in vars:
    249                 vars.remove(v)
     323            for m in _match(v, vars):
     324                vars.remove(m)
     325        for v in self.config.bsp_excludes(arch, bsp):
     326            for m in _match(v, vars):
     327                vars.remove(m)
    250328        return vars
    251329
     
    320398            log.notice('. Configuring: %s' % (bs))
    321399            try:
     400                result = '+ Pass'
    322401                bpath = self._build_dir(arch, bsp, bs)
    323402                path.mkdir(bpath)
    324                 cmd = self._config_command(build_set[bs], arch, bsp)
     403                config_cmd = self._config_command(build_set[bs], arch, bsp)
     404                cmd = config_cmd
    325405                e = execute.capture_execution(log = warnings)
    326406                log.output('run: ' + cmd)
     
    330410                    exit_code, proc, output = e.shell(cmd, cwd = path.host(bpath))
    331411                if exit_code != 0:
     412                    result = '- FAIL'
    332413                    self.errors['configure'] += 1
    333414                    log.notice('- Configure failed: %s' % (bs))
     
    346427                        exit_code, proc, output = e.shell(cmd, cwd = path.host(bpath))
    347428                    if exit_code != 0:
     429                        result = '- FAIL'
    348430                        self.errors['build'] += 1
    349431                        log.notice('- FAIL: %s: %s' % (bs, self._error_str()))
     
    352434                            raise error.general('Building %s failed' % (bs))
    353435                    files = self._count_files(arch, bsp, bs)
    354                     log.notice('+ Pass: %s: warnings:%d  exes:%d  objs:%s  libs:%d' % \
    355                                (bs, warnings.get(),
    356                                 files['exes'], files['objs'], files['libs']))
    357                     log.notice('  %s' % (self._error_str()))
     436                log.notice('%s: %s: warnings:%d  exes:%d  objs:%s  libs:%d' % \
     437                           (result, bs, warnings.get(),
     438                            files['exes'], files['objs'], files['libs']))
     439                log.notice('  %s' % (self._error_str()))
     440                self.results.add(result[0] == '+', arch, bsp, config_cmd, warnings.get())
    358441            finally:
    359442                end = datetime.datetime.now()
     
    414497
    415498def run_args(args):
     499    b = None
     500    ec = 0
    416501    try:
    417502        #
     
    427512
    428513        top = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))
    429         profile = 'tier-1'
    430514        prefix = '/opt/rtems/%s' % (rtems_version())
    431515        tools = prefix
     
    433517        logf = 'bsp-build-%s.txt' % (datetime.datetime.now().strftime('%Y%m%d-%H%M%S'))
    434518        config_file = path.join(top, 'share', 'rtems', 'tester', 'rtems', 'rtems-bsps.ini')
     519        if not path.exists(config_file):
     520            config_file = path.join(top, 'tester', 'rtems', 'rtems-bsps.ini')
    435521
    436522        argsp = argparse.ArgumentParser()
     
    442528        argsp.add_argument('--stop-on-error', help = 'Stop on an error.', action = 'store_true')
    443529        argsp.add_argument('--no-clean', help = 'Do not clean the build output.', action = 'store_true')
     530        argsp.add_argument('--profiles', help = 'Build the listed profiles.', type = str, default = 'tier-1')
    444531        argsp.add_argument('--arch', help = 'Build the specific architecture.', type = str)
    445532        argsp.add_argument('--bsp', help = 'Build the specific BSP.', type = str)
     
    450537            logf = opts.log
    451538        log.default = log.log([logf])
    452         log.notice('RTEMS Tools Project - RTEMS Kernel Check, %s' % (version.str()))
     539        log.notice('RTEMS Tools Project - RTEMS Kernel BSP Builder, %s' % (version.str()))
    453540        if opts.rtems is None:
    454541            raise error.general('No RTEMS source provided on the command line')
     
    477564                b.build_arch(opts.arch)
    478565        else:
    479             b.build_profile(profile)
     566            for profile in opts.profiles.split(','):
     567                b.build_profile(profile.strip())
     568        b.results.report()
    480569
    481570    except error.general as gerr:
    482571        print(gerr)
    483572        print('BSP Build FAILED', file = sys.stderr)
    484         sys.exit(1)
     573        ec = 1
    485574    except error.internal as ierr:
    486575        print(ierr)
    487576        print('BSP Build FAILED', file = sys.stderr)
    488         sys.exit(1)
     577        ec = 1
    489578    except error.exit as eerr:
    490579        pass
    491580    except KeyboardInterrupt:
    492581        log.notice('abort: user terminated')
    493         sys.exit(1)
    494     sys.exit(0)
     582        ec = 1
     583    if b is not None:
     584        b.results.report()
     585    sys.exit(ec)
    495586
    496587def run():
Note: See TracChangeset for help on using the changeset viewer.