mirror of
https://git.rtems.org/rtems-source-builder
synced 2024-10-09 07:15:10 +08:00
241 lines
7.4 KiB
Python
241 lines
7.4 KiB
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.
|
|
|
|
#
|
|
# 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 <rtems-user@rtems.org>')
|
|
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)
|