diff --git a/source-builder/sb-reports b/source-builder/sb-reports new file mode 100755 index 0000000..ba9db1c --- /dev/null +++ b/source-builder/sb-reports @@ -0,0 +1,29 @@ +#! /usr/bin/env python +# +# RTEMS Tools Project (http://www.rtems.org/) +# Copyright 2010-2013 Chris Johns (chrisj@rtems.org) +# All rights reserved. +# +# This file is part of the RTEMS Tools package in 'rtems-tools'. +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import sys, os +base = os.path.dirname(sys.argv[0]) +sys.path.insert(0, base + '/sb') +try: + import reports + reports.run(sys.argv) +except ImportError: + print >> sys.stderr, "Incorrect Defaults installation" + sys.exit(1) diff --git a/source-builder/sb/reports.py b/source-builder/sb/reports.py new file mode 100644 index 0000000..2746b37 --- /dev/null +++ b/source-builder/sb/reports.py @@ -0,0 +1,240 @@ +# +# RTEMS Tools Project (http://www.rtems.org/) +# Copyright 2010-2013 Chris Johns (chrisj@rtems.org) +# All rights reserved. +# +# This file is part of the RTEMS Tools package in 'rtems-tools'. +# +# Permission to use, copy, modify, and/or distribute this software for any +# purpose with or without fee is hereby granted, provided that the above +# copyright notice and this permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +# +# This code builds a package given a config file. It only builds to be +# installed not to be package unless you run a packager around this. +# + +import os +import sys + +import build +import check +import config +import defaults +import error +import log +import setbuilder + +# +# Version of Sourcer Builder Build. +# +version = '0.1' + +def _notice(opts, text): + if not opts.quiet() and not log.default.has_stdout(): + print text + log.output(text) + log.flush() + +class report: + """Report the build details about a package given a config file.""" + + line_len = 78 + + def __init__(self, name, format, _configs, _defaults, opts): + self.format = format + self.name = name + self.configs = _configs + self.defaults = _defaults + self.opts = opts + self.bset_nesting = 0 + self.configs_active = False + + def _output(self, text): + if not self.opts.quiet(): + log.output(text) + + def is_text(self): + return self.format == 'text' + + def is_asciidoc(self): + return self.format == 'asciidoc' + + def setup(self): + if self.is_asciidoc(): + pass + + def header(self): + pass + + def footer(self): + pass + + def introduction(self, name): + if self.is_asciidoc(): + h = 'RTEMS Source Builder Report' + log.output(h) + log.output('=' * len(h)) + log.output(':doctype: book') + log.output(':toc2:') + log.output(':toclevels: 5') + log.output(':icons:') + log.output(':numbered:') + log.output(' ') + log.output('RTEMS Project ') + log.output('28th Feb 2013') + log.output(' ') + else: + log.output('report: %s' % (name)) + + def config_start(self, name): + first = not self.configs_active + self.configs_active = True + if self.is_asciidoc(): + log.output('.Config: %s' % name) + log.output('') + else: + log.output('-' * self.line_len) + log.output('config: %s' % (name)) + + def config_end(self, name): + if self.is_asciidoc(): + log.output(' ') + log.output("'''") + log.output(' ') + + def buildset_start(self, name): + if self.is_asciidoc(): + h = '%s' % (name) + log.output('=%s %s' % ('=' * self.bset_nesting, h)) + else: + log.output('=' * self.line_len) + log.output('build set: %s' % (name)) + + def buildset_end(self, name): + self.configs_active = False + + def source(self, package, source_tag): + return package.sources() + + def patch(self, package, args): + return package.patches() + + def config(self, name): + self.config_start(name) + _config = config.file(name, _defaults = self.defaults, opts = self.opts) + packages = _config.packages() + package = packages['main'] + name = package.name() + if self.is_asciidoc(): + log.output('*Package*: _%s_' % name) + log.output(' ') + else: + log.output(' package: %s' % (name)) + sources = package.sources() + if self.is_asciidoc(): + log.output('*Sources*;;') + if len(sources) == 0: + log.output('No sources') + else: + log.output(' sources: %d' % (len(sources))) + c = 0 + for s in sources: + c += 1 + if self.is_asciidoc(): + log.output('. %s' % (sources[s][0])) + else: + log.output(' %2d: %s' % (c, sources[s][0])) + patches = package.patches() + if self.is_asciidoc(): + log.output(' ') + log.output('*Patches*:;;') + if len(patches) == 0: + log.output('No patches') + else: + log.output(' patches: %s' % (len(patches))) + c = 0 + for p in patches: + c += 1 + if self.is_asciidoc(): + log.output('. %s' % (patches[p][0])) + else: + log.output(' %2d: %s' % (c, patches[p][0])) + self.config_end(name) + + def buildset(self, name): + try_config = False + try: + self.bset_nesting += 1 + self.buildset_start(name) + bset = setbuilder.buildset(name, + _configs = self.configs, + _defaults = self.defaults, + opts = self.opts) + for c in bset.load(): + if c.endswith('.bset'): + self.buildset(c) + elif c.endswith('.cfg'): + self.config(c) + else: + raise error.general('invalid config type: %s' % (c)) + self.buildset_end(name) + self.bset_nesting -= 1 + except error.general, gerr: + if gerr.msg.startswith('no build set file found'): + try_config = True + else: + raise + if try_config: + self.config(name) + + def generate(self): + self.introduction(self.name) + self.buildset(self.name) + +def run(args): + try: + optargs = { '--list-bsets': 'List available build sets', + '--list-configs': 'List available configurations', + '--asciidoc': 'Output report as asciidoc' } + opts, _defaults = defaults.load(args, optargs) + log.default = log.log(opts.logfiles()) + print 'RTEMS Source Builder, Reporter v%s' % (version) + if not check.host_setup(opts, _defaults): + _notice(opts, 'warning: forcing build with known host setup problems') + configs = build.get_configs(opts, _defaults) + if not setbuilder.list_bset_cfg_files(opts, configs): + format = 'text' + if opts.get_arg('--asciidoc'): + format = 'asciidoc' + for _file in opts.params(): + r = report(_file, + format = format, + _configs = configs, + _defaults = _defaults, + opts = opts) + r.generate() + del r + except error.general, gerr: + print gerr + sys.exit(1) + except error.internal, ierr: + print ierr + sys.exit(1) + except error.exit, eerr: + pass + except KeyboardInterrupt: + _notice(opts, 'user terminated') + sys.exit(1) + sys.exit(0) + +if __name__ == "__main__": + run(sys.argv)