Changeset adf0946 in rtems-source-builder


Ignore:
Timestamp:
Apr 28, 2013, 11:01:14 PM (6 years ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10, 4.11, 4.9, master
Children:
699a51c5
Parents:
8837860
Message:

Report from the setbuilder's build config.

Refactor the reporter to allow the setbuilder to use its build config
rather than regenerating the configuration from the configuration file.
Using the config file and the build macros exposed an issue if a
macro was undefined that was defined in a build set above the
config file. Using the build set's configuration as used to build
is a better solution.

The reporter was refactored to allow a config class to be used
to report.

The setbuild can now take a configuration file as an input file.

Location:
source-builder/sb
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • source-builder/sb/reports.py

    r8837860 radf0946  
    155155            self.output('')
    156156
    157     def introduction(self, name, intro_text):
     157    def introduction(self, name, intro_text = None):
    158158        if self.is_asciidoc():
    159159            h = 'RTEMS Source Builder Report'
     
    246246                self.output('--------------------------------------------')
    247247
    248     def config(self, configname, opts, macros):
    249 
    250         _config = config.file(configname, opts, macros)
     248    def config(self, _config, opts, macros):
     249
    251250        packages = _config.packages()
    252251        package = packages['main']
     
    255254        if self.is_asciidoc():
    256255            self.output('*Package*: _%s_ +' % (name))
    257             self.output('*Config*: %s' % (configname))
     256            self.output('*Config*: %s' % (_config.file_name()))
    258257            self.output('')
    259258        else:
    260259            self.output('-' * self.line_len)
    261260            self.output('Package: %s' % (name))
    262             self.output(' Config: %s' % (configname))
     261            self.output(' Config: %s' % (_config.file_name()))
    263262        self.output_info('Summary', package.get_info('summary'), True)
    264263        self.output_info('URL', package.get_info('url'))
     
    303302        self.config_end(name)
    304303
    305     def buildset(self, name, opts = None, macros = None):
    306         self.bset_nesting += 1
    307         self.buildset_start(name)
    308         if opts is None:
    309             opts = self.opts
    310         if macros is None:
    311             macros = self.macros
    312         bset = setbuilder.buildset(name, self.configs, opts, macros)
    313         for c in bset.load():
    314             if c.endswith('.bset'):
    315                 self.buildset(c, bset.opts, bset.macros)
    316             elif c.endswith('.cfg'):
    317                 self.config(c, bset.opts, bset.macros)
    318             else:
    319                 raise error.general('invalid config type: %s' % (c))
    320         self.buildset_end(name)
    321         self.bset_nesting -= 1
    322 
    323     def generate(self, name):
     304    def write(self, name):
    324305        if self.format == 'html':
    325306            if self.asciidoc is None:
     
    341322                raise error.general('writing output file: %s: %s' % (name, err))
    342323
    343     def make(self, inname, outname = None, intro_text = None):
     324    def generate(self, name, opts = None, macros = None):
     325        self.bset_nesting += 1
     326        self.buildset_start(name)
     327        if opts is None:
     328            opts = self.opts
     329        if macros is None:
     330            macros = self.macros
     331        bset = setbuilder.buildset(name, self.configs, opts, macros)
     332        for c in bset.load():
     333            if c.endswith('.bset'):
     334                self.buildset(c, bset.opts, bset.macros)
     335            elif c.endswith('.cfg'):
     336                self.config(config.file(c, bset.opts, bset.macros),
     337                            bset.opts, bset.macros)
     338            else:
     339                raise error.general('invalid config type: %s' % (c))
     340        self.buildset_end(name)
     341        self.bset_nesting -= 1
     342
     343    def create(self, inname, outname = None, intro_text = None):
    344344        self.setup()
    345345        self.introduction(inname, intro_text)
    346         config = build.find_config(inname, self.configs)
    347         if config is None:
    348             raise error.general('config file not found: %s' % (inname))
    349         if config.endswith('.bset'):
    350             self.buildset(config)
    351         elif config.endswith('.cfg'):
    352             self.config(config, self.opts, self.macros)
    353         else:
    354             raise error.general('invalid config type: %s' % (config))
    355         self.generate(outname)
     346        self.generate(inname)
     347        self.write(outname)
    356348
    357349def run(args):
     
    395387                else:
    396388                    outname = output
    397                 r.make(_config, outname)
     389                config = build.find_config(_config, configs)
     390                if config is None:
     391                    raise error.general('config file not found: %s' % (inname))
     392                r.create(config, outname)
    398393            del r
     394        else:
     395            raise error.general('invalid config type: %s' % (config))
    399396    except error.general, gerr:
    400397        print gerr
  • source-builder/sb/setbuilder.py

    r8837860 radf0946  
    6060        self.bset = bset
    6161        self.bset_pkg = '%s-%s-set' % (self.macros.expand('%{_target}'), self.bset)
     62        self.email_report = ''
     63
     64    def write_email_report(self, text, prepend = False):
     65        if len(text) == 0 or text[-1] != '\n' or text[-1] != '\r':
     66            text += os.linesep
     67        if prepend:
     68            self.email_report = text + self.email_report
     69        else:
     70            self.email_report += text
    6271
    6372    def copy(self, src, dst):
     
    7685
    7786    def report(self, _config, _build):
    78         if not _build.opts.get_arg('--no-report'):
     87        if not _build.opts.get_arg('--no-report') and not _build.opts.get_arg('--no-email'):
    7988            format = _build.opts.get_arg('--report-format')
    8089            if format is None:
     
    98107            prefix = _build.macros.expand('%{_prefix}')
    99108            name = _build.main_package().name() + ext
    100             outpath = path.host(path.join(buildroot, prefix, 'share', 'rtems-source-builder'))
    101             outname = path.host(path.join(outpath, name))
    102109            log.notice('reporting: %s -> %s' % (_config, name))
    103             if not _build.opts.dry_run():
    104                 _build.mkdir(outpath)
     110            if not _build.opts.get_arg('--no-report'):
     111                outpath = path.host(path.join(buildroot, prefix, 'share', 'rtems-source-builder'))
     112                outname = path.host(path.join(outpath, name))
    105113                r = reports.report(format, self.configs, _build.opts, _build.macros)
    106                 r.make(_config, outname)
     114                r.setup()
     115                r.introduction(_build.config.file_name())
     116                r.config(_build.config, _build.opts, _build.macros)
     117                if not _build.opts.dry_run():
     118                    _build.mkdir(outpath)
     119                    r.write(outname)
     120                del r
     121            if not _build.opts.get_arg('--no-email'):
     122                r = reports.report('text', self.configs, _build.opts, _build.macros)
     123                r.setup()
     124                r.introduction(_build.config.file_name())
     125                r.config(_build.config, _build.opts, _build.macros)
     126                self.email_report += r.out
    107127                del r
    108128
     
    234254    def load(self):
    235255
    236         exbset = self.macros.expand(self.bset)
    237 
    238         self.macros['_bset'] = exbset
    239 
    240         root, ext = path.splitext(exbset)
    241 
    242         if exbset.endswith('.bset'):
    243             bset = exbset
     256        #
     257        # If the build set file ends with .cfg the user has passed to the
     258        # buildset builder a configuration so we just return it.
     259        #
     260        if self.bset.endswith('.cfg'):
     261            configs = [self.bset]
    244262        else:
    245             bset = '%s.bset' % (exbset)
    246 
    247         return self.parse(bset)
     263            exbset = self.macros.expand(self.bset)
     264            self.macros['_bset'] = exbset
     265            root, ext = path.splitext(exbset)
     266            if exbset.endswith('.bset'):
     267                bset = exbset
     268            else:
     269                bset = '%s.bset' % (exbset)
     270            configs = self.parse(bset)
     271        return configs
    248272
    249273    def build(self, deps = None):
     
    251275        log.trace('_bset: %s: make' % (self.bset))
    252276        log.notice('Build Set: %s' % (self.bset))
     277
     278        if not self.opts.get_arg('--no-email'):
     279            email_report_header = \
     280                'Build Set: %s (%s)' % (self.bset, datetime.datetime.now().ctime())
    253281
    254282        configs = self.load()
     
    272300                    macros = copy.copy(self.macros)
    273301                    if configs[s].endswith('.bset'):
     302                        log.trace('_bset: %s' % ('=' * 80))
    274303                        bs = buildset(configs[s], self.configs, opts, macros)
    275304                        bs.build(deps)
    276305                        del bs
    277306                    elif configs[s].endswith('.cfg'):
     307                        log.trace('_bset: %s' % ('-' * 80))
    278308                        b = build.build(configs[s], self.opts.get_arg('--pkg-tar-files'),
    279309                                        opts, macros)
     
    288318                        raise error.general('invalid config type: %s' % (configs[s]))
    289319                except error.general, gerr:
     320                    self.write_email_report(str(gerr))
    290321                    if self.opts.keep_going():
    291322                        print gerr
     
    316347        log.notice('Build Set: Time %s' % (str(end - start)))
    317348
     349        if not self.opts.get_arg('--no-email'):
     350            self.write_email_report('', True)
     351            self.write_email_report('  Build Time %s' % (str(end - start)), True)
     352            self.write_email_report(email_report_header, True)
     353
    318354def list_bset_cfg_files(opts, configs):
    319355    if opts.get_arg('--list-configs') or opts.get_arg('--list-bsets'):
     
    336372                    '--list-bsets':    'List available build sets',
    337373                    '--list-deps':     'List the dependent files.',
     374                    '--bset-tar-file': 'Create a build set tar file',
     375                    '--pkg-tar-files': 'Create package tar files',
    338376                    '--no-report':     'Do not create a package report.',
    339377                    '--report-format': 'The report format (text, html, asciidoc).',
    340                     '--bset-tar-file': 'Create a build set tar file',
    341                     '--pkg-tar-files': 'Create package tar files' }
     378                    '--no-email':      'Do not send an email report.',
     379                    '--smtp-host':     'SMTP host to send via.',
     380                    '--email-to':      'Email address to send the email too.',
     381                    '--email-from':    'Email address the report is from.' }
    342382        opts = options.load(sys.argv, optargs)
    343383        log.notice('RTEMS Source Builder - Set Builder, v%s' % (version.str()))
Note: See TracChangeset for help on using the changeset viewer.