Changeset 7051ba5 in rtems-tools


Ignore:
Timestamp:
Oct 22, 2017, 7:09:39 AM (19 months ago)
Author:
Chris Johns <chrisj@…>
Branches:
master
Children:
5251361
Parents:
b1d2db9
git-author:
Chris Johns <chrisj@…> (10/22/17 07:09:39)
git-committer:
Chris Johns <chrisj@…> (10/22/17 07:56:26)
Message:

bsb-builder: Add email support, and config report types.

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • rtemstoolkit/mailer.py

    rb1d2db9 r7051ba5  
    5252    import path
    5353
     54_options = {
     55    '--mail'     : 'Send email report or results.',
     56    '--smtp-host': 'SMTP host to send via.',
     57    '--mail-to'  : 'Email address to send the email too.',
     58    '--mail-from': 'Email address the report is from.'
     59}
     60
    5461def append_options(opts):
    55     opts['--mail'] = 'Send email report or results.'
    56     opts['--smtp-host'] = 'SMTP host to send via.'
    57     opts['--mail-to'] = 'Email address to send the email too.'
    58     opts['--mail-from'] = 'Email address the report is from.'
     62    for o in _options:
     63        opts[o] = _options[o]
     64
     65def add_arguments(argsp):
     66    argsp.add_argument('--mail', help = _options['--mail'], action = 'store_true')
     67    for o in ['--smtp-host', '--mail-to', '--mail-from']:
     68        argsp.add_argument(o, help = _options[o], type = str)
    5969
    6070class mail:
    6171    def __init__(self, opts):
    6272        self.opts = opts
     73
     74    def _args_are_macros(self):
     75        return type(self.opts) is 'command_line'
     76
     77    def _get_arg(self, arg):
     78        if self._args_are_macros():
     79            value = self.opts.find_arg(arg)[1]
     80        else:
     81            if arg.startswith('--'):
     82                arg = arg[2:]
     83            arg = arg.replace('-', '_')
     84            if arg in vars(self.opts):
     85                value = vars(self.opts)[arg]
     86            else:
     87                value = None
     88        return value
    6389
    6490    def from_address(self):
     
    7399            return l.strip()
    74100
    75         addr = self.opts.find_arg('--mail-from')
     101        addr = self._get_arg('--mail-from')
    76102        if addr is not None:
    77             return addr[1]
     103            return addr
    78104        mailrc = None
    79105        if 'MAILRC' in os.environ:
     
    96122            if addr is not None:
    97123                return addr
    98         addr = self.opts.defaults.get_value('%{_sbgit_mail}')
     124        if self._args_are_macros():
     125            addr = self.opts.defaults.get_value('%{_sbgit_mail}')
     126        else:
     127            raise error.general('no valid from address for mail')
    99128        return addr
    100129
    101130    def smtp_host(self):
    102         host = self.opts.find_arg('--smtp-host')
     131        host = self._get_arg('--smtp-host')
    103132        if host is not None:
    104133            return host[1]
    105         host = self.opts.defaults.get_value('%{_mail_smtp_host}')
     134        if self._args_are_macros():
     135            host = self.opts.defaults.get_value('%{_mail_smtp_host}')
    106136        if host is not None:
    107137            return host
  • tester/rt/check.py

    rb1d2db9 r7051ba5  
    5050from rtemstoolkit import host
    5151from rtemstoolkit import log
     52from rtemstoolkit import mailer
    5253from rtemstoolkit import path
    5354from rtemstoolkit import textbox
     
    268269        return data
    269270
    270     def _report_category(self, label, warnings, group_counts):
     271    def _report_category(self, label, warnings, group_counts, summary):
    271272        width = 70
    272273        cols_1 = [width]
     
    312313                        s += textbox.row(cols_4, d, indent = 1)
    313314                s += textbox.line(cols_2_4, marker = '+', indent = 1)
    314                 vw = sorted([(w, warnings[build][w]) for w in build_warnings],
    315                             key = operator.itemgetter(1),
    316                             reverse = True)
    317                 for w in vw:
    318                     c1 = '%6d' % w[1]
    319                     for l in textwrap.wrap(' ' + w[0], width = cols_2[1] - 3):
    320                         s += textbox.row(cols_2, [c1, l], indent = 1)
    321                         c1 = ' ' * 6
    322                 s += textbox.line(cols_2, marker = '+', indent = 1)
     315                if not summary:
     316                    vw = sorted([(w, warnings[build][w]) for w in build_warnings],
     317                                key = operator.itemgetter(1),
     318                                reverse = True)
     319                    for w in vw:
     320                        c1 = '%6d' % w[1]
     321                        for l in textwrap.wrap(' ' + w[0], width = cols_2[1] - 3):
     322                            s += textbox.row(cols_2, [c1, l], indent = 1)
     323                            c1 = ' ' * 6
     324                    s += textbox.line(cols_2, marker = '+', indent = 1)
    323325        return s
    324326
     
    342344        return s
    343345
    344     def warnings_report(self):
     346    def warnings_report(self, summary):
    345347        self.lock.acquire()
    346         s = ' No warnings'
     348        s = ' No warnings' + os.linesep
    347349        try:
    348350            total = 0
     
    352354                data = self._analyze(self.warnings, self.groups['exclude'])
    353355                s = self._report_category('By Architecture (total : %d)' % (total),
    354                                           data['arch'], data['groups']['arch'])
     356                                          data['arch'], data['groups']['arch'],
     357                                          summary)
    355358                s += os.linesep
    356359                s += self._report_category('By BSP (total : %d)' % (total),
    357                                            data['arch_bsp'], data['groups']['arch_bsp'])
     360                                           data['arch_bsp'], data['groups']['arch_bsp'],
     361                                           summary)
    358362                s += os.linesep
    359363                s += self._report_category('By Build (total : %d)' % (total),
    360                                            data['build'], data['groups']['build'])
     364                                           data['build'], data['groups']['build'],
     365                                           summary)
    361366                s += os.linesep
    362                 s += self._report_warning_map()
    363                 s += os.linesep
     367                if not summary:
     368                    s += self._report_warning_map()
     369                    s += os.linesep
    364370        finally:
    365371            self.lock.release()
     
    632638                    s += bs + os.linesep
    633639        if count == 0:
    634             s = ' No failures'
     640            s = ' No failures' + os.linesep
    635641        return s
    636642
    637     def warnings_report(self):
    638         return self.warnings_errors.warnings_report()
     643    def warnings_report(self, summary = False):
     644        return self.warnings_errors.warnings_report(summary)
    639645
    640646    def report(self):
     
    924930            profile = {}
    925931            profile['name'] = p
    926             profile['archs'] = self.config.comma_list(profile['name'], 'archs')
     932            profile['archs'] = self.config.comma_list(profile['name'], 'archs', err = False)
    927933            archs += profile['archs']
    928934            for arch in profile['archs']:
     
    12821288                f.write(self.results.warnings_errors.report())
    12831289
     1290    def _failures_report(self):
     1291        if self.options['failures-report'] is not None:
     1292            with open(self.options['failures-report'], 'w') as f:
     1293                f.write(title() + os.linesep)
     1294                f.write(os.linesep)
     1295                f.write('Date: %s%s' % (datetime.datetime.now().strftime('%c'),
     1296                                        os.linesep))
     1297                f.write(os.linesep)
     1298                f.write(command_line() + os.linesep)
     1299                f.write(self.results.failures_report())
     1300
    12841301    def _finished(self):
    12851302        log.notice('Total: Warnings:%d  exes:%d  objs:%d  libs:%d' % \
     
    12931310        log.notice(self.results.failures_report())
    12941311        self._warnings_report()
     1312        self._failures_report()
    12951313
    12961314    def run_jobs(self, jobs):
     
    12981316            log.notice('Cleaning: %s' % (self.build_dir))
    12991317            path.removeall(self.build_dir)
    1300         start = datetime.datetime.now()
     1318        self.start = datetime.datetime.now()
     1319        self.end = datetime.datetime.now()
     1320        self.duration = self.end - self.start
     1321        self.average = self.duration
    13011322        env_path = os.environ['PATH']
    13021323        os.environ['PATH'] = path.host(path.join(self.tools, 'bin')) + \
     
    13051326        builds = self._create_build_jobs(jobs, build_job_count)
    13061327        active_jobs = []
    1307         jobs_completed = 0
     1328        self.jobs_completed = 0
    13081329        try:
    13091330            while len(builds) > 0 or len(active_jobs) > 0:
     
    13241345                    job.clean()
    13251346                    active_jobs.remove(job)
    1326                     jobs_completed += 1
     1347                    self.jobs_completed += 1
    13271348                time.sleep(0.250)
    13281349        except:
     
    13331354                    pass
    13341355            raise
    1335         end = datetime.datetime.now()
     1356        self.end = datetime.datetime.now()
    13361357        os.environ['PATH'] = env_path
    1337         duration = end - start
    1338         if jobs_completed == 0:
    1339             jobs_completed = 1
     1358        self.duration = self.end - self.start
     1359        if self.jobs_completed == 0:
     1360            self.jobs_completed = 1
    13401361        self._finished()
    1341         log.notice('Average BSP Build Time: %s' % \
    1342                    (str(duration / jobs_completed)))
    1343         log.notice('Total Time %s' % (str(duration)))
     1362        self.average = self.duration / self.jobs_completed
     1363        log.notice('Average BSP Build Time: %s' % (str(self.average)))
     1364        log.notice('Total Time %s' % (str(self.duration)))
    13441365
    13451366    def arch_bsp_jobs(self, arch, bsps):
     
    14021423                os.environ['PATH'] = os.pathsep.join(cspath[1:])
    14031424
     1425        start = datetime.datetime.now()
    14041426        top = os.path.dirname(os.path.dirname(os.path.abspath(sys.argv[0])))
    14051427        prefix = '/opt/rtems/%s' % (rtems_version())
     
    14241446        argsp.add_argument('--log', help = 'Log file.', type = str)
    14251447        argsp.add_argument('--config-report', help = 'Report the configuration.',
    1426                            action = 'store_true')
     1448                           type = str, default = None,
     1449                           choices = ['all', 'profiles', 'builds', 'archs'])
    14271450        argsp.add_argument('--warnings-report', help = 'Report the warnings to a file.',
     1451                           type = str, default = None)
     1452        argsp.add_argument('--failures-report', help = 'Report the failures to a file.',
    14281453                           type = str, default = None)
    14291454        argsp.add_argument('--stop-on-error', help = 'Stop on an error.',
     
    14431468        argsp.add_argument('--dry-run', help = 'Do not run the actual builds.',
    14441469                           action = 'store_true')
     1470        mailer.add_arguments(argsp)
    14451471
    14461472        opts = argsp.parse_args(args[1:])
     1473        mail = None
     1474        if opts.mail:
     1475            mail = mailer.mail(opts)
     1476            # Request these now to generate any errors.
     1477            from_addr = mail.from_address()
     1478            smtp_host = mail.smtp_host()
     1479            if 'mail_to' in opts and opts.mail_to is not None:
     1480                to_addr = opts.mail_to
     1481            else:
     1482                to_addr = 'build@rtems.org'
    14471483        if opts.log is not None:
    14481484            logf = opts.log
     
    14501486        log.notice(title())
    14511487        log.output(command_line())
     1488        if mail:
     1489            log.notice('Mail: from:%s to:%s smtp:%s' % (from_addr,
     1490                                                        to_addr,
     1491                                                        smtp_host))
    14521492
    14531493        config = configuration_()
     
    14551495
    14561496        if opts.config_report:
    1457             log.notice('Configuration Report:')
    1458             log.notice(config.report())
     1497            log.notice('Configuration Report: %s' % (opts.config_report))
     1498            c_profiles = False
     1499            c_builds = False
     1500            c_archs = False
     1501            if opts.config_report == 'all':
     1502                c_profiles = True
     1503                c_builds = True
     1504                c_archs = True
     1505            elif opts.config_report == 'profiles':
     1506                c_profiles = True
     1507            elif opts.config_report == 'builds':
     1508                c_builds = True
     1509            elif opts.config_report == 'archs':
     1510                c_archs = True
     1511            log.notice(config.report(c_profiles, c_builds, c_archs))
    14591512            sys.exit(0)
    14601513
     
    14721525                    'dry-run'         : opts.dry_run,
    14731526                    'jobs'            : opts.jobs,
    1474                     'warnings-report' : opts.warnings_report }
     1527                    'warnings-report' : opts.warnings_report,
     1528                    'failures-report' : opts.failures_report }
    14751529
    14761530        b = builder(config, rtems_version(), prefix, tools,
     
    14861540        if bsps is not None:
    14871541            if archs is not None:
    1488                 raise error.general('--arch supplied with --bsp; use --bsp=arch/bsp,arch/bsp,..')
     1542                raise error.general('--arch supplied with --bsp;' \
     1543                                    ' use --bsp=arch/bsp,arch/bsp,..')
     1544            what = 'BSPs: %s' % (' '.join(bsps))
    14891545            b.build_bsps(bsps)
    14901546        elif archs is not None:
     1547            what = 'Archs: %s' % (' '.join(archs))
    14911548            b.build_archs(archs)
    14921549        else:
     1550            what = 'Profile(s): %s' % (' '.join(profiles))
    14931551            b.build_profiles(profiles)
     1552        end = datetime.datetime.now()
     1553
     1554        #
     1555        # Email the results of the build.
     1556        #
     1557        if mail is not None:
     1558            subject = '[rtems-bsp-builder] %s: %s' % (str(start).split('.')[0],
     1559                                                      what)
     1560            t = title()
     1561            body = t + os.linesep
     1562            body += '=' * len(t) + os.linesep
     1563            body += os.linesep
     1564            body += 'Host: %s' % (os.uname()[3]) + os.linesep
     1565            body += os.linesep
     1566            body += command_line()
     1567            body += os.linesep
     1568            body += 'Total Time            : %s for %d completed job(s)' % \
     1569                    (str(b.duration), b.jobs_completed)
     1570            body += os.linesep
     1571            body += 'Average BSP Build Time: %s' % (str(b.average))
     1572            body += os.linesep + os.linesep
     1573            body += 'Builds' + os.linesep
     1574            body += '======' + os.linesep
     1575            body += os.linesep.join([' ' + cb for cb in config.builds()])
     1576            body += os.linesep + os.linesep
     1577            body += 'Failures Report' + os.linesep
     1578            body += '===============' + os.linesep
     1579            body += b.results.failures_report()
     1580            body += os.linesep
     1581            body += 'Warnings Report' + os.linesep
     1582            body += '===============' + os.linesep
     1583            body += b.results.warnings_report(summary = True)
     1584            mail.send(to_addr, subject, body)
    14941585
    14951586    except error.general as gerr:
  • tester/rtems/rtems-bsps-tiers.ini

    rb1d2db9 r7051ba5  
    2222#
    2323[tier-1]
    24 archs = arm, i386, sparc
    25 bsps_arm = altcycv_devkit,
    26     altcycv_devkit_smp,
    27     xilinx_zynq_zc702, xilinx_zynq_zc706, xilinx_zynq_zedboard
     24archs = arm, i386
     25bsps_arm = beagleboneblack, xilinx_zynq_zedboard
    2826bsps_i386 = pc686
    29 bsps_sparc = leon2, leon3
    3027
    3128#
     
    3431#
    3532[tier-2]
    36 archs = arm, sparc
    37 bsps_arm = lm3s6965_qemu,
    38     realview_pbx_a9_qemu, realview_pbx_a9_qemu_smp,
    39     xilinx_zynq_a9_qemu
    40 bsps_sparc = erc32
     33
    4134#
    4235# Tier 3: no build errors, no tests run.
    4336#
    4437[tier-3]
    45 archs = arm, moxie
    46 bsps_arm = arm1136jfs,
    47     arm1136js, arm7tdmi, arm920, armcortexa9, atsamv,
    48     beagleboardorig, beagleboardxm, beagleboneblack, beaglebonewhite,
     38archs = arm, bfin, i386, lm32, m32c, m68k, mips, moxie,
     39        nios2, or1k, powerpc, sh, sparc, sparc64, v850
     40bsps_arm = altcycv_devkit, altcycv_devkit_smp,
     41    arm1136jfs, arm1136js, arm7tdmi, arm920, armcortexa9, atsamv,
     42    beagleboardorig, beagleboardxm, beaglebonewhite,
    4943    csb336, csb337, csb637,
    5044    edb7312,
    5145    kit637_v6,
    5246    gumstix,
    53     lm3s3749, lm3s6965, lm4f120,
     47    imx7,
     48    lm3s3749, lm3s6965, lm3s6965_qemu, lm4f120,
    5449    lpc1768_mbed, lpc1768_mbed_ahb_ram, lpc1768_mbed_ahb_ram_eth,
    5550    lpc17xx_ea_ram, lpc17xx_ea_rom_int, lpc17xx_plx800_ram,
     
    6055    lpc32xx_mzx_stage_2, lpc32xx_phycore,
    6156    raspberrypi, raspberrypi2,
     57    realview_pbx_a9_qemu, realview_pbx_a9_qemu_smp,
    6258    rtl22xx, rtl22xx_t,
    6359    smdk2410,
     
    6561    tms570ls3137_hdk, tms570ls3137_hdk_intram,
    6662    tms570ls3137_hdk_sdram,
    67     tms570ls3137_hdk_with_loader
     63    tms570ls3137_hdk_with_loader,
     64    xilinx_zynq_a9_qemu, xilinx_zynq_zc702, xilinx_zynq_zc706
     65bsps_bfin = TLL6527M, bf537Stamp, eZKit533
     66bsps_i386 = pc386, pc486, pc586-sse, pc586, pcp4
     67bsps_lm32 = lm32_evr, lm32_evr_gdbsim, milkymist
     68bsps_m32c = m32csim
     69bsps_m68k = av5282,
     70    csb360,
     71    gen68340, gen68360, gen68360_040,
     72    pgh360,
     73    COBRA5475,
     74    m5484FireEngine,
     75    mcf5206elite,
     76    mcf52235, mcf5225x,
     77    mcf5235,
     78    mcf5329,
     79    mrm332,
     80    mvme147, mvme147s, mvme162, mvme162lx, mvme167,
     81    uC5282
     82bsps_mips =  csb350, hurricane, jmr3904, malta, rbtx4925, rbtx4938
    6883bsps_moxie = moxiesim
     84bsps_nios2 = nios2_iss
     85bsps_or1k = generic_or1k
     86bsps_powerpc = beatnik,
     87    br_uid, brs5l, brs6l,
     88    dp2,
     89    gwlcfm,
     90    haleakala,
     91    hsc_cm01,
     92    icecube,
     93    mcp750,
     94    mpc5566evb, mpc5566evb_spe, phycore_mpc5554,
     95    mpc5643l_dpu, mpc5643l_evb, mpc5668g,
     96    mpc5674f_ecu508_app, mpc5674f_ecu508_boot, mpc5674f_rsm6, mpc5674fevb, mpc5674fevb_spe,
     97    mpc8260ads,
     98    mpc8309som,
     99    mpc8313erdb,
     100    mpc8349eamds,
     101    mtx603e,
     102    mvme2100, mvme2307, mvme3100, mvme5500,
     103    pghplus,
     104    pm520_cr825, pm520_ze30,
     105    psim,
     106    qemuppc, qemuprep, qemuprep-altivec,
     107    qoriq_core_0, qoriq_core_1, qoriq_e500, qoriq_e6500_32, qoriq_e6500_64
     108    ss555,
     109    t32mppc,
     110    tqm8xx_stk8xx,
     111    virtex, virtex4, virtex5
     112bsps_sh = gensh1, gensh2, gensh4, simsh1, simsh2, simsh2e, simsh4
     113bsps_sparc = erc32, leon2, leon3, ngmp
     114bsps_sparc64 = niagara, usiii
     115bsps_v850 =  v850e1sim, v850e2sim, v850e2v3sim, v850esim, v850essim, v850sim
    69116
    70117#
Note: See TracChangeset for help on using the changeset viewer.