summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Johns <chrisj@rtems.org>2013-04-21 18:37:02 +1000
committerChris Johns <chrisj@rtems.org>2013-04-21 18:37:02 +1000
commit5142becd8ec950ea0f2d36cdc9488660abc2ca29 (patch)
treecbe93e6ede010f4e716fcd21fd123a4247b0c917
parentAdd source and patches section. (diff)
downloadrtems-source-builder-5142becd8ec950ea0f2d36cdc9488660abc2ca29.tar.bz2
Refactor the logging support.
-rw-r--r--source-builder/sb/build.py66
-rw-r--r--source-builder/sb/check.py34
-rw-r--r--source-builder/sb/config.py71
-rw-r--r--source-builder/sb/cvs.py5
-rw-r--r--source-builder/sb/download.py46
-rwxr-xr-xsource-builder/sb/execute.py1
-rw-r--r--source-builder/sb/git.py6
-rwxr-xr-xsource-builder/sb/log.py59
-rw-r--r--source-builder/sb/options.py44
-rw-r--r--source-builder/sb/reports.py11
-rw-r--r--source-builder/sb/setbuilder.py48
11 files changed, 193 insertions, 198 deletions
diff --git a/source-builder/sb/build.py b/source-builder/sb/build.py
index f82dd99..8401500 100644
--- a/source-builder/sb/build.py
+++ b/source-builder/sb/build.py
@@ -48,18 +48,10 @@ except:
print 'error: unknown application load error'
sys.exit(1)
-def _notice(opts, text):
- if not opts.quiet() and not log.default.has_stdout():
- print text
- log.output(text)
- log.flush()
-
class script:
"""Create and manage a shell script."""
- def __init__(self, quiet = True, trace = False):
- self.quiet = quiet
- self.trace = trace
+ def __init__(self):
self.reset()
def reset(self):
@@ -69,13 +61,11 @@ class script:
def append(self, text):
if type(text) is str:
text = text.splitlines()
- if not self.quiet:
+ if not log.quiet:
i = 0
for l in text:
i += 1
log.output('script:%3d: %s' % (self.lc + i, l))
- if self.trace:
- print '%3d: S %s' % (self.lc + i, l)
self.lc += len(text)
self.body.extend(text)
@@ -107,22 +97,18 @@ class build:
else:
self.macros = macros
self.create_tar_files = create_tar_files
- _notice(opts, 'config: ' + name)
+ log.notice('config: ' + name)
self.config = config.file(name, opts, self.macros)
- self.script = script(quiet = opts.quiet(), trace = opts.trace())
-
- def _output(self, text):
- if not self.opts.quiet():
- log.output(text)
+ self.script = script()
def rmdir(self, rmpath):
- self._output('removing: %s' % (path.host(rmpath)))
+ log.output('removing: %s' % (path.host(rmpath)))
if not self.opts.dry_run():
if path.exists(rmpath):
path.removeall(rmpath)
def mkdir(self, mkpath):
- self._output('making dir: %s' % (path.host(mkpath)))
+ log.output('making dir: %s' % (path.host(mkpath)))
if not self.opts.dry_run():
path.mkdir(mkpath)
@@ -191,7 +177,7 @@ class build:
_host != _build and _host != _target
def setup(self, package, args):
- self._output('prep: %s: %s' % (package.name(), ' '.join(args)))
+ log.output('prep: %s: %s' % (package.name(), ' '.join(args)))
opts, args = getopt.getopt(args[1:], 'qDcTn:b:a:')
source_tag = 0
quiet = False
@@ -254,7 +240,7 @@ class build:
def run(self, command, shell_opts = '', cwd = None):
e = execute.capture_execution(log = log.default, dump = self.opts.quiet())
cmd = self.config.expand('%{___build_shell} -ex ' + shell_opts + ' ' + command)
- self._output('run: ' + cmd)
+ log.output('run: ' + cmd)
exit_code, proc, output = e.shell(cmd, cwd = path.host(cwd))
if exit_code != 0:
raise error.general('shell cmd failed: %s' % (cmd))
@@ -336,18 +322,14 @@ class build:
builddir = self.config.abspath('_builddir')
buildcxcdir = self.config.abspath('_buildcxcdir')
tmproot = self.config.abspath('_tmproot')
- if self.opts.trace():
- _notice(self.opts, 'cleanup: %s' % (buildroot))
+ log.trace('cleanup: %s' % (buildroot))
self.rmdir(buildroot)
- if self.opts.trace():
- _notice(self.opts, 'cleanup: %s' % (builddir))
+ log.trace('cleanup: %s' % (builddir))
self.rmdir(builddir)
if self.canadian_cross():
- if self.opts.trace():
- _notice(self.opts, 'cleanup: %s' % (buildcxcdir))
+ log.trace('cleanup: %s' % (buildcxcdir))
self.rmdir(buildcxcdir)
- if self.opts.trace():
- _notice(self.opts, 'cleanup: %s' % (tmproot))
+ log.trace('cleanup: %s' % (tmproot))
self.rmdir(tmproot)
def main_package(self):
@@ -358,13 +340,12 @@ class build:
package = self.main_package()
name = package.name()
if self.canadian_cross():
- _notice(self.opts, 'package: (Cxc) %s' % (name))
+ log.notice('package: (Cxc) %s' % (name))
else:
- _notice(self.opts, 'package: %s' % (name))
- if self.opts.trace():
- print '---- macro maps', '-' * 55
- print self.config.macros
- print '-' * 70
+ log.notice('package: %s' % (name))
+ log.trace('---- macro maps %s' % ('-' * 55))
+ log.trace('%s' % (str(self.config.macros)))
+ log.trace('-' * 70)
self.script.reset()
self.script.append(self.config.expand('%{___build_template}'))
self.script.append('echo "=> ' + name + ':"')
@@ -373,12 +354,12 @@ class build:
if not self.opts.dry_run():
self.builddir()
sn = path.join(self.config.expand('%{_builddir}'), 'doit')
- self._output('write script: ' + sn)
+ log.output('write script: ' + sn)
self.script.write(sn)
if self.canadian_cross():
- _notice(self.opts, 'building: (Cxc) %s' % (name))
+ log.notice('building: (Cxc) %s' % (name))
else:
- _notice(self.opts, 'building: %s' % (name))
+ log.notice('building: %s' % (name))
self.run(sn)
def name(self):
@@ -422,13 +403,12 @@ def run(args):
try:
optargs = { '--list-configs': 'List available configurations' }
opts = options.load(args, optargs)
- log.default = log.log(opts.logfiles())
- _notice(opts, 'RTEMS Source Builder, Package Builder v%s' % (version.str()))
+ log.notice('RTEMS Source Builder, Package Builder v%s' % (version.str()))
if not check.host_setup(opts):
if not opts.force():
raise error.general('host build environment is not set up' +
' correctly (use --force to proceed)')
- _notice(opts, 'warning: forcing build with known host setup problems')
+ log.notice('warning: forcing build with known host setup problems')
if opts.get_arg('--list-configs'):
configs = get_configs(opts)
for p in configs['paths']:
@@ -452,7 +432,7 @@ def run(args):
except error.exit, eerr:
pass
except KeyboardInterrupt:
- _notice(opts, 'abort: user terminated')
+ log.notice('abort: user terminated')
sys.exit(1)
sys.exit(0)
diff --git a/source-builder/sb/check.py b/source-builder/sb/check.py
index 2f83203..56d5b6d 100644
--- a/source-builder/sb/check.py
+++ b/source-builder/sb/check.py
@@ -30,13 +30,6 @@ import options
import path
import version
-def _notice(opts, text):
- if not opts.quiet() and log.default and not log.default.has_stdout():
- print text
- log.output(text)
- log.flush()
-
-
def _check_none(_opts, macro, value, constraint):
return True
@@ -48,10 +41,10 @@ def _check_triplet(_opts, macro, value, constraint):
def _check_dir(_opts, macro, value, constraint):
if constraint != 'none' and not path.isdir(value):
if constraint == 'required':
- _notice(_opts, 'error: dir: not found: (%s) %s' % (macro, value))
+ log.notice('error: dir: not found: (%s) %s' % (macro, value))
return False
if _opts.warn_all():
- _notice(_opts, 'warning: dir: not found: (%s) %s' % (macro, value))
+ log.notice('warning: dir: not found: (%s) %s' % (macro, value))
return True
@@ -77,16 +70,14 @@ def _check_exe(_opts, macro, value, constraint):
if _check_paths(value, paths):
if absexe:
- _notice(_opts,
- 'warning: exe: absolute exe found in path: (%s) %s' % (macro, orig_value))
+ log.notice('warning: exe: absolute exe found in path: (%s) %s' % (macro, orig_value))
return True
if constraint == 'optional':
- if _opts.trace():
- _notice(_opts, 'warning: exe: optional exe not found: (%s) %s' % (macro, orig_value))
+ log.trace('warning: exe: optional exe not found: (%s) %s' % (macro, orig_value))
return True
- _notice(_opts, 'error: exe: not found: (%s) %s' % (macro, orig_value))
+ log.notice('error: exe: not found: (%s) %s' % (macro, orig_value))
return False
@@ -123,12 +114,11 @@ def host_setup(opts):
if test not in checks:
raise error.general('invalid check test: %s [%r]' % (test, opts.defaults.get(d)))
ok = checks[test](opts, d, value, constraint)
- if opts.trace():
- if ok:
- tag = ' '
- else:
- tag = '*'
- _notice(opts, '%c %15s: %r -> "%s"' % (tag, d, opts.defaults.get(d), value))
+ if ok:
+ tag = ' '
+ else:
+ tag = '*'
+ log.trace('%c %15s: %r -> "%s"' % (tag, d, opts.defaults.get(d), value))
if sane and not ok:
sane = False
@@ -139,7 +129,7 @@ def run():
import sys
try:
_opts = options.load(args = sys.argv)
- _notice(_opts, 'RTEMS Source Builder - Check, v%s' % (version.str()))
+ log.notice('RTEMS Source Builder - Check, v%s' % (version.str()))
if host_setup(_opts):
print 'Environment is ok'
else:
@@ -153,7 +143,7 @@ def run():
except error.exit, eerr:
pass
except KeyboardInterrupt:
- _notice(opts, 'abort: user terminated')
+ log.notice('abort: user terminated')
sys.exit(1)
sys.exit(0)
diff --git a/source-builder/sb/config.py b/source-builder/sb/config.py
index 457044a..7cd1daf 100644
--- a/source-builder/sb/config.py
+++ b/source-builder/sb/config.py
@@ -227,8 +227,8 @@ class file:
self.macros = opts.defaults
else:
self.macros = macros
- if self.opts.trace():
- print 'config: %s' % (name)
+ self.init_name = name
+ log.trace('config: %s' % (name))
self.disable_macro_reassign = False
self.configpath = []
self.wss = re.compile(r'\s+')
@@ -262,22 +262,19 @@ class file:
return s
def _name_line_msg(self, msg):
- return '%s:%d: %s' % (path.basename(self.name), self.lc, msg)
+ return '%s:%d: %s' % (path.basename(self.init_name), self.lc, msg)
def _output(self, text):
if not self.opts.quiet():
log.output(text)
- def _warning(self, msg):
- self._output('warning: %s' % (self._name_line_msg(msg)))
-
def _error(self, msg):
err = 'error: %s' % (self._name_line_msg(msg))
- print >> sys.stderr, err
- self._output(err)
+ log.stderr(err)
+ log.output(err)
self.in_error = True
if not self.opts.dry_run():
- print >> sys.stderr, 'warning: switched to dry run due to errors'
+ log.stderr('warning: switched to dry run due to errors')
self.opts.set_dry_run()
def _label(self, name):
@@ -389,7 +386,7 @@ class file:
elif m.startswith('%{expand'):
colon = m.find(':')
if colon < 8:
- self._warning('malformed expand macro, no colon found')
+ log.warning('malformed expand macro, no colon found')
else:
e = self._expand(m[colon + 1:-1].strip())
s = s.replace(m, e)
@@ -408,11 +405,11 @@ class file:
mn = None
elif m.startswith('%{echo'):
if not m.endswith('}'):
- self._warning("malformed conditional macro '%s'" % (m))
+ log.warning("malformed conditional macro '%s'" % (m))
mn = None
else:
e = self._expand(m[6:-1].strip())
- self._output('%s' % (self._name_line_msg(e)))
+ log.output('%s' % (self._name_line_msg(e)))
s = ''
expanded = True
mn = None
@@ -432,7 +429,7 @@ class file:
colon = m[start:].find(':')
if colon < 0:
if not m.endswith('}'):
- self._warning("malformed conditional macro '%s'" % (m))
+ log.warning("malformed conditional macro '%s'" % (m))
mn = None
else:
mn = self._label(m[start:-1])
@@ -474,15 +471,15 @@ class file:
def _select(self, config, ls):
if len(ls) != 2:
- self._warning('invalid select statement')
+ log.warning('invalid select statement')
else:
r = self.macros.set_read_map(ls[1])
- if self.opts.trace():
- print '_select: ', r, ls[1], self.macros.maps()
+ log.trace('config: %s: _select: %s %s %r' % \
+ (self.init_name, r, ls[1], self.macros.maps()))
def _define(self, config, ls):
if len(ls) <= 1:
- self._warning('invalid macro definition')
+ log.warning('invalid macro definition')
else:
d = self._label(ls[1])
if self.disable_macro_reassign:
@@ -493,7 +490,7 @@ class file:
else:
self.macros[d] = ' '.join([f.strip() for f in ls[2:]])
else:
- self._warning("macro '%s' already defined" % (d))
+ log.warning("macro '%s' already defined" % (d))
else:
if len(ls) == 2:
self.macros[d] = '1'
@@ -502,13 +499,13 @@ class file:
def _undefine(self, config, ls):
if len(ls) <= 1:
- self._warning('invalid macro definition')
+ log.warning('invalid macro definition')
else:
mn = self._label(ls[1])
if mn in self.macros:
del self.macros[mn]
else:
- self._warning("macro '%s' not defined" % (mn))
+ log.warning("macro '%s' not defined" % (mn))
def _ifs(self, config, ls, label, iftrue, isvalid):
text = []
@@ -616,8 +613,7 @@ class file:
self._error('malformed if: ' + reduce(add, ls, ''))
if invert:
istrue = not istrue
- if self.opts.trace():
- print '_if: ', ifls, istrue
+ log.trace('config: %s: _if: %s %s' % (self.init_name, ifls, str(istrue)))
return self._ifs(config, ls, '%if', istrue, isvalid)
def _ifos(self, config, ls, isvalid):
@@ -663,8 +659,8 @@ class file:
l = _clean(l)
if len(l) == 0:
continue
- if self.opts.trace():
- print '%03d: %d %s' % (self.lc, isvalid, l)
+ log.trace('config: %s: %03d: %s %s' % \
+ (self.init_name, self.lc, str(isvalid), l))
lo = l
if isvalid:
l = self._expand(l)
@@ -718,11 +714,11 @@ class file:
elif ls[0] == '%endif':
if roc:
return ('control', '%endif', '%endif')
- self._warning("unexpected '" + ls[0] + "'")
+ log.warning("unexpected '" + ls[0] + "'")
elif ls[0] == '%else':
if roc:
return ('control', '%else', '%else')
- self._warning("unexpected '" + ls[0] + "'")
+ log.warning("unexpected '" + ls[0] + "'")
elif ls[0].startswith('%defattr'):
return ('data', [l])
elif ls[0] == '%bcond_with':
@@ -745,7 +741,7 @@ class file:
for d in self._directive:
if ls[0].strip() == d:
return ('directive', ls[0].strip(), ls[1:])
- self._warning("unknown directive: '" + ls[0] + "'")
+ log.warning("unknown directive: '" + ls[0] + "'")
return ('data', [lo])
else:
return ('data', [lo])
@@ -837,8 +833,7 @@ class file:
raise error.general('no config file found: %s' % (cfgname))
try:
- if self.opts.trace():
- print '_open: %s' % (path.host(configname))
+ log.trace('config: %s: _open: %s' % (self.init_name, path.host(configname)))
config = open(path.host(configname), 'r')
except IOError, err:
raise error.general('error opening config file: %s' % (path.host(configname)))
@@ -858,7 +853,7 @@ class file:
elif r[0] == 'control':
if r[1] == '%end':
break
- self._warning("unexpected '%s'" % (r[1]))
+ log.warning("unexpected '%s'" % (r[1]))
elif r[0] == 'directive':
new_data = []
if r[1] == '%description':
@@ -873,7 +868,7 @@ class file:
_package = r[2][0]
else:
if r[2][0].strip() != '-n':
- self._warning("unknown directive option: '%s'" % (' '.join(r[2])))
+ log.warning("unknown directive option: '%s'" % (' '.join(r[2])))
_package = r[2][1].strip()
self._set_package(_package)
if dir and dir != r[1]:
@@ -887,13 +882,12 @@ class file:
raise error.general('config error: %s' % (l[7:]))
elif l.startswith('%warning'):
l = self._expand(l)
- print >> sys.stderr, 'warning: %s' % (l[9:])
- self._warning(l[9:])
+ log.stderr('warning: %s' % (l[9:]))
+ log.warning(l[9:])
if not dir:
l = self._expand(l)
ls = self.tags.split(l, 1)
- if self.opts.trace():
- print '_tag: ', l, ls
+ log.trace('config: %s: _tag: %s %s' % (self.init_name, l, ls))
if len(ls) > 1:
info = ls[0].lower()
if info[-1] == ':':
@@ -904,7 +898,7 @@ class file:
if info is not None:
self._info_append(info, info_data)
else:
- self._warning("invalid format: '%s'" % (info_data[:-1]))
+ log.warning("invalid format: '%s'" % (info_data[:-1]))
else:
data.append(l)
else:
@@ -976,8 +970,7 @@ def run():
# Run where defaults.mc is located
#
opts = options.load(sys.argv, defaults = 'defaults.mc')
- if opts.trace():
- print 'config: count %d' % (len(opts.config_files()))
+ log.trace('config: count %d' % (len(opts.config_files())))
for config_file in opts.config_files():
s = file(config_file, opts)
print s
@@ -989,7 +982,7 @@ def run():
print ierr
sys.exit(1)
except KeyboardInterrupt:
- print 'user terminated'
+ log.notice('abort: user terminated')
sys.exit(1)
sys.exit(0)
diff --git a/source-builder/sb/cvs.py b/source-builder/sb/cvs.py
index e2c9bc8..3e2acb4 100644
--- a/source-builder/sb/cvs.py
+++ b/source-builder/sb/cvs.py
@@ -25,6 +25,7 @@ import os
import error
import execute
+import log
import options
import path
@@ -33,7 +34,7 @@ class repo:
def _cvs_exit_code(self, cmd, ec, output):
if ec:
- print output
+ log.output(output)
raise error.general('cvs command failed (%s): %d' % (cmd, ec))
def _parse_args(self, url):
@@ -54,7 +55,9 @@ class repo:
if path.exists(self.path):
cwd = self.path
cmd = [self.cvs, '-q'] + args
+ log.output('cmd: (%s) %s' % (str(cwd), ' '.join(cmd)))
exit_code, proc, output = e.spawn(cmd, cwd = cwd)
+ log.trace(output)
if check:
self._cvs_exit_code(cmd, exit_code, output)
return exit_code, output
diff --git a/source-builder/sb/download.py b/source-builder/sb/download.py
index 52a62f4..faf681b 100644
--- a/source-builder/sb/download.py
+++ b/source-builder/sb/download.py
@@ -34,16 +34,6 @@ import git
import log
import path
-def _notice(opts, text):
- if not opts.quiet() and not log.default.has_stdout():
- print text
- log.output(text)
- log.flush()
-
-def _output(opts, text):
- if not opts.quiet():
- log.output(text)
-
def _http_parser(source, config, opts):
#
# Is the file compressed ?
@@ -142,7 +132,7 @@ def _http_downloader(url, local, config, opts):
#
if url.startswith('https://api.github.com'):
url = urlparse.urljoin(url, config.expand('tarball/%{version}'))
- _notice(opts, 'download: %s -> %s' % (url, os.path.relpath(path.host(local))))
+ log.notice('download: %s -> %s' % (url, os.path.relpath(path.host(local))))
failed = False
if not opts.dry_run():
_in = None
@@ -152,20 +142,19 @@ def _http_downloader(url, local, config, opts):
_out = open(path.host(local), 'wb')
_out.write(_in.read())
except IOError, err:
- msg = 'download: %s: error: %s' % (url, str(err))
- _notice(opts, msg)
+ log.notice('download: %s: error: %s' % (url, str(err)))
if path.exists(local):
os.remove(path.host(local))
failed = True
except ValueError, err:
- msg = 'download: %s: error: %s' % (url, str(err))
- _notice(opts, msg)
+ log.notice('download: %s: error: %s' % (url, str(err)))
if path.exists(local):
os.remove(path.host(local))
failed = True
except:
msg = 'download: %s: error' % (url)
- print >> sys.stderr, msg
+ log.stderr(msd)
+ log.notice(msg)
if _out is not None:
_out.close()
raise
@@ -183,28 +172,28 @@ def _git_downloader(url, local, config, opts):
us = url.split('?')
repo = git.repo(local, opts, config.macros)
if not repo.valid():
- _notice(opts, 'git: clone: %s -> %s' % (us[0], rlp))
+ log.notice('git: clone: %s -> %s' % (us[0], rlp))
if not opts.dry_run():
repo.clone(us[0], local)
for a in us[1:]:
_as = a.split('=')
if _as[0] == 'branch':
- _notice(opts, 'git: checkout: %s => %s' % (us[0], _as[1]))
+ log.notice('git: checkout: %s => %s' % (us[0], _as[1]))
if not opts.dry_run():
repo.checkout(_as[1])
elif _as[0] == 'pull':
- _notice(opts, 'git: pull: %s' % (us[0]))
+ log.notice('git: pull: %s' % (us[0]))
if not opts.dry_run():
repo.pull()
elif _as[0] == 'fetch':
- _notice(opts, 'git: fetch: %s -> %s' % (us[0], rlp))
+ log.notice('git: fetch: %s -> %s' % (us[0], rlp))
if not opts.dry_run():
repo.fetch()
elif _as[0] == 'reset':
arg = []
if len(_as) > 1:
arg = ['--%s' % (_as[1])]
- _notice(opts, 'git: reset: %s' % (us[0]))
+ log.notice('git: reset: %s' % (us[0]))
if not opts.dry_run():
repo.reset(arg)
return True
@@ -236,17 +225,17 @@ def _cvs_downloader(url, local, config, opts):
date = _as[1]
repo = cvs.repo(local, opts, config.macros, src_prefix)
if not repo.valid():
- _notice(opts, 'cvs: checkout: %s -> %s' % (us[0], rlp))
+ log.notice('cvs: checkout: %s -> %s' % (us[0], rlp))
if not opts.dry_run():
repo.checkout(':%s' % (us[0][6:]), module, tag, date)
for a in us[1:]:
_as = a.split('=')
if _as[0] == 'update':
- _notice(opts, 'cvs: update: %s' % (us[0]))
+ log.notice('cvs: update: %s' % (us[0]))
if not opts.dry_run():
repo.update()
elif _as[0] == 'reset':
- _notice(opts, 'cvs: reset: %s' % (us[0]))
+ log.notice('cvs: reset: %s' % (us[0]))
if not opts.dry_run():
repo.reset()
return True
@@ -266,9 +255,9 @@ def get_file(url, local, opts, config):
if local is None:
raise error.general('source/patch path invalid')
if not path.isdir(path.dirname(local)) and not opts.download_disabled():
- _notice(opts,
- 'Creating source directory: %s' % (os.path.relpath(path.host(path.dirname(local)))))
- _output(opts, 'making dir: %s' % (path.host(path.dirname(local))))
+ log.notice('Creating source directory: %s' % \
+ (os.path.relpath(path.host(path.dirname(local)))))
+ log.output('making dir: %s' % (path.host(path.dirname(local))))
if not opts.dry_run():
path.mkdir(path.dirname(local))
if not path.exists(local) and opts.download_disabled():
@@ -290,8 +279,7 @@ def get_file(url, local, opts, config):
url_file = url_path[slash + 1:]
urls.append(urlparse.urljoin(base, url_file))
urls.append(url)
- if opts.trace():
- print '_url:', ','.join(urls), '->', local
+ log.trace('_url: %s -> %s' % (','.join(urls), local))
for url in urls:
for dl in downloaders:
if url.startswith(dl):
diff --git a/source-builder/sb/execute.py b/source-builder/sb/execute.py
index fda4974..92a5e83 100755
--- a/source-builder/sb/execute.py
+++ b/source-builder/sb/execute.py
@@ -181,6 +181,7 @@ class execute:
r, e = os.path.splitext(command[0])
if e not in ['.exe', '.com', '.bat']:
command[0] = command[0] + '.exe'
+ log.trace('exe: %s' % (command))
proc = subprocess.Popen(command, shell = shell,
cwd = cwd, env = env,
stdin = stdin, stdout = stdout,
diff --git a/source-builder/sb/git.py b/source-builder/sb/git.py
index f9d48f8..e503beb 100644
--- a/source-builder/sb/git.py
+++ b/source-builder/sb/git.py
@@ -25,6 +25,7 @@ import os
import error
import execute
+import log
import options
import path
@@ -41,7 +42,10 @@ class repo:
cwd = self.path
else:
cwd = None
- exit_code, proc, output = e.spawn([self.git] + args, cwd = cwd)
+ cmd = [self.git] + args
+ log.trace('cmd: (%s) %s' % (str(cwd), ' '.join(cmd)))
+ exit_code, proc, output = e.spawn(cmd, cwd = cwd)
+ log.trace(output)
if check:
self._git_exit_code(exit_code)
return exit_code, output
diff --git a/source-builder/sb/log.py b/source-builder/sb/log.py
index 71c77f0..9a8dc5b 100755
--- a/source-builder/sb/log.py
+++ b/source-builder/sb/log.py
@@ -31,11 +31,17 @@ import error
#
default = None
+#
+# Global parameters.
+#
+tracing = False
+quiet = False
+
def set_default_once(log):
if default is None:
default = log
-def output(text = os.linesep, log = None):
+def _output(text = os.linesep, log = None):
"""Output the text to a log if provided else send it to stdout."""
if text is None:
text = os.linesep
@@ -52,6 +58,28 @@ def output(text = os.linesep, log = None):
for l in text.replace(chr(13), '').splitlines():
print l
+def stderr(text = os.linesep, log = None):
+ for l in text.replace(chr(13), '').splitlines():
+ print >> sys.stderr, l
+
+def output(text = os.linesep, log = None):
+ if not quiet:
+ _output(text, log)
+
+def notice(text = os.linesep, log = None):
+ if not quiet and default is not None and not default.has_stdout():
+ for l in text.replace(chr(13), '').splitlines():
+ print l
+ _output(text, log)
+
+def trace(text = os.linesep, log = None):
+ if tracing:
+ _output(text, log)
+
+def warning(text = os.linesep, log = None):
+ for l in text.replace(chr(13), '').splitlines():
+ _output('warning: %s' % (l), log)
+
def flush(log = None):
if log:
log.flush()
@@ -94,6 +122,7 @@ class log:
for f in range(0, len(self.fhs)):
if self.fhs[f] is not None:
self.fhs[f].write(out)
+ self.flush()
def flush(self):
"""Flush the output."""
@@ -104,8 +133,30 @@ class log:
if __name__ == "__main__":
l = log(['stdout', 'log.txt'])
for i in range(0, 10):
- l.output('hello world: %d\n' % (i))
- l.output('hello world CRLF\r\n')
- l.output('hello world NONE')
+ l.output('log: hello world: %d\n' % (i))
+ l.output('log: hello world CRLF\r\n')
+ l.output('log: hello world NONE')
l.flush()
+ for i in [0, 1]:
+ quiet = False
+ tracing = False
+ print '- quiet:%s - trace:%s %s' % (str(quiet), str(tracing), '-' * 30)
+ trace('trace with quiet and trace off')
+ notice('notice with quiet and trace off')
+ quiet = True
+ tracing = False
+ print '- quiet:%s - trace:%s %s' % (str(quiet), str(tracing), '-' * 30)
+ trace('trace with quiet on and trace off')
+ notice('notice with quiet on and trace off')
+ quiet = False
+ tracing = True
+ print '- quiet:%s - trace:%s %s' % (str(quiet), str(tracing), '-' * 30)
+ trace('trace with quiet off and trace on')
+ notice('notice with quiet off and trace on')
+ quiet = True
+ tracing = True
+ print '- quiet:%s - trace:%s %s' % (str(quiet), str(tracing), '-' * 30)
+ trace('trace with quiet on and trace on')
+ notice('notice with quiet on and trace on')
+ default = l
del l
diff --git a/source-builder/sb/options.py b/source-builder/sb/options.py
index 6671a57..de8afd7 100644
--- a/source-builder/sb/options.py
+++ b/source-builder/sb/options.py
@@ -30,6 +30,7 @@ import string
import error
import execute
import git
+import log
import macros
import path
import sys
@@ -243,6 +244,12 @@ class command_line:
arg += 1
def post_process(self):
+ # Handle the log first.
+ log.default = log.log(self.logfiles())
+ if self.trace():
+ log.tracing = True
+ if self.quiet():
+ log.quiet = True
# Must have a host
if self.defaults['_host'] == self.defaults['nil']:
raise error.general('host not set')
@@ -271,6 +278,25 @@ class command_line:
for m in um:
self.defaults.load(m)
+ def sb_git(self):
+ repo = git.repo(self.defaults.expand('%{_sbdir}'), self)
+ if repo.valid():
+ repo_valid = '1'
+ repo_head = repo.head()
+ repo_clean = repo.clean()
+ repo_id = repo_head
+ if not repo_clean:
+ repo_id += '-modified'
+ else:
+ repo_valid = '0'
+ repo_head = '%{nil}'
+ repo_clean = '%{nil}'
+ repo_id = 'no-repo'
+ self.defaults['_sbgit_valid'] = repo_valid
+ self.defaults['_sbgit_head'] = repo_head
+ self.defaults['_sbgit_clean'] = str(repo_clean)
+ self.defaults['_sbgit_id'] = repo_id
+
def command(self):
return path.join(self.command_path, self.command_name)
@@ -466,26 +492,10 @@ def load(args, optargs = None, defaults = '%{_sbdir}/defaults.mc'):
for k in overrides:
o.defaults[k] = overrides[k]
+ o.sb_git()
o.process()
o.post_process()
- repo = git.repo(o.defaults.expand('%{_sbdir}'), o)
- if repo.valid():
- repo_valid = '1'
- repo_head = repo.head()
- repo_clean = repo.clean()
- repo_id = repo_head
- if not repo_clean:
- repo_id += '-modified'
- else:
- repo_valid = '0'
- repo_head = '%{nil}'
- repo_clean = '%{nil}'
- repo_id = 'no-repo'
- o.defaults['_sbgit_valid'] = repo_valid
- o.defaults['_sbgit_head'] = repo_head
- o.defaults['_sbgit_clean'] = str(repo_clean)
- o.defaults['_sbgit_id'] = repo_id
return o
def run(args):
diff --git a/source-builder/sb/reports.py b/source-builder/sb/reports.py
index f6603bc..4e37923 100644
--- a/source-builder/sb/reports.py
+++ b/source-builder/sb/reports.py
@@ -45,12 +45,6 @@ except:
print 'error: unknown application load error'
sys.exit(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."""
@@ -364,12 +358,11 @@ def run(args):
'--format': 'Output format (text, html, asciidoc)',
'--output': 'File name to output the report' }
opts = options.load(args, optargs)
- log.default = log.log(opts.logfiles())
if opts.get_arg('--output') and len(opts.params()) > 1:
raise error.general('--output can only be used with a single config')
print 'RTEMS Source Builder, Reporter v%s' % (version.str())
if not check.host_setup(opts):
- _notice(opts, 'warning: forcing build with known host setup problems')
+ log.warning('forcing build with known host setup problems')
configs = build.get_configs(opts)
if not setbuilder.list_bset_cfg_files(opts, configs):
output = opts.get_arg('--output')
@@ -409,7 +402,7 @@ def run(args):
except error.exit, eerr:
pass
except KeyboardInterrupt:
- _notice(opts, 'abort: user terminated')
+ log.notice('abort: user terminated')
sys.exit(1)
sys.exit(0)
diff --git a/source-builder/sb/setbuilder.py b/source-builder/sb/setbuilder.py
index 701e201..171f59f 100644
--- a/source-builder/sb/setbuilder.py
+++ b/source-builder/sb/setbuilder.py
@@ -46,21 +46,11 @@ except:
print 'error: unknown application load error'
sys.exit(1)
-def _trace(opts, text):
- if opts.trace():
- print text
-
-def _notice(opts, text):
- if not opts.quiet() and not log.default.has_stdout():
- print text
- log.output(text)
- log.flush()
-
class buildset:
"""Build a set builds a set of packages."""
def __init__(self, bset, _configs, opts, macros = None):
- _trace(opts, '_bset:%s: init' % (bset))
+ log.trace('_bset: %s: init' % (bset))
self.configs = _configs
self.opts = opts
if macros is None:
@@ -70,10 +60,6 @@ class buildset:
self.bset = bset
self.bset_pkg = '%s-%s-set' % (self.macros.expand('%{_target}'), self.bset)
- def _output(self, text):
- if not self.opts.quiet():
- log.output(text)
-
def copy(self, src, dst):
if not os.path.isdir(path.host(src)):
raise error.general('copying tree: no source directory: %s' % (path.host(src)))
@@ -82,7 +68,7 @@ class buildset:
files = distutils.dir_util.copy_tree(path.host(src),
path.host(dst))
for f in files:
- self._output(f)
+ log.output(f)
except IOError, err:
raise error.general('copying tree: %s -> %s: %s' % (src, dst, str(err)))
except distutils.errors.DistutilsFileError, err:
@@ -113,7 +99,7 @@ class buildset:
name = _build.main_package().name() + ext
outpath = path.host(path.join(buildroot, prefix, 'share', 'rtems-source-builder'))
outname = path.host(path.join(outpath, name))
- _notice(self.opts, 'reporting: %s -> %s' % (_config, name))
+ log.notice('reporting: %s -> %s' % (_config, name))
if not _build.opts.dry_run():
_build.mkdir(outpath)
r = reports.report(format, self.configs, _build.opts, _build.macros)
@@ -123,15 +109,14 @@ class buildset:
def root_copy(self, src, dst):
what = '%s -> %s' % \
(os.path.relpath(path.host(src)), os.path.relpath(path.host(dst)))
- if self.opts.trace():
- _notice(self.opts, 'collecting: %s' % (what))
+ log.trace('_bset: %s: collecting: %s' % (self.bset, what))
if not self.opts.dry_run():
self.copy(src, dst)
def install(self, name, buildroot, prefix):
dst = prefix
src = path.join(buildroot, prefix)
- _notice(self.opts, 'installing: %s -> %s' % (name, path.host(dst)))
+ log.notice('installing: %s -> %s' % (name, path.host(dst)))
if not self.opts.dry_run():
self.copy(src, dst)
@@ -170,7 +155,7 @@ class buildset:
if self.opts.get_arg('--bset-tar-file'):
path.mkdir(tardir)
tar = path.join(tardir, _build.config.expand('%s.tar.bz2' % (self.bset_pkg)))
- _notice(self.opts, 'tarball: %s' % (os.path.relpath(path.host(tar))))
+ log.notice('tarball: %s' % (os.path.relpath(path.host(tar))))
if not self.opts.dry_run():
tmproot = _build.config.expand('%{_tmproot}')
cmd = _build.config.expand("'cd " + tmproot + \
@@ -198,8 +183,7 @@ class buildset:
if bsetname is None:
raise error.general('no build set file found: %s' % (bset))
try:
- if self.opts.trace():
- print '_bset:%s: open: %s' % (self.bset, bsetname)
+ log.trace('_bset: %s: open: %s' % (self.bset, bsetname))
bset = open(path.host(bsetname), 'r')
except IOError, err:
raise error.general('error opening bset file: %s' % (bsetname))
@@ -213,8 +197,7 @@ class buildset:
l = _clean(l)
if len(l) == 0:
continue
- if self.opts.trace():
- print '%03d: %s' % (lc, l)
+ log.trace('_bset: %s: %03d: %s' % (self.bset, lc, l))
ls = l.split()
if ls[0][-1] == ':' and ls[0][:-1] == 'package':
self.bset_pkg = self.macros.expand(ls[1].strip())
@@ -265,12 +248,12 @@ class buildset:
def build(self, deps = None):
- _trace(self.opts, '_bset:%s: make' % (self.bset))
- _notice(self.opts, 'Build Set: %s' % (self.bset))
+ log.trace('_bset: %s: make' % (self.bset))
+ log.notice('Build Set: %s' % (self.bset))
configs = self.load()
- _trace(self.opts, '_bset:%s: configs: %s' % (self.bset, ','.join(configs)))
+ log.trace('_bset: %s: configs: %s' % (self.bset, ','.join(configs)))
current_path = os.environ['PATH']
@@ -318,7 +301,7 @@ class buildset:
if deps is None and \
(not self.opts.no_clean() or self.opts.always_clean()):
for b in builds:
- _notice(self.opts, 'cleaning: %s' % (b.name()))
+ log.notice('cleaning: %s' % (b.name()))
b.cleanup()
for b in builds:
del b
@@ -330,7 +313,7 @@ class buildset:
os.environ['PATH'] = current_path
- _notice(self.opts, 'Build Set: Time %s' % (str(end - start)))
+ log.notice('Build Set: Time %s' % (str(end - start)))
def list_bset_cfg_files(opts, configs):
if opts.get_arg('--list-configs') or opts.get_arg('--list-bsets'):
@@ -357,8 +340,7 @@ def run():
'--bset-tar-file': 'Create a build set tar file',
'--pkg-tar-files': 'Create package tar files' }
opts = options.load(sys.argv, optargs)
- log.default = log.log(opts.logfiles())
- _notice(opts, 'RTEMS Source Builder - Set Builder, v%s' % (version.str()))
+ log.notice('RTEMS Source Builder - Set Builder, v%s' % (version.str()))
if not check.host_setup(opts):
raise error.general('host build environment is not set up correctly')
configs = build.get_configs(opts)
@@ -390,7 +372,7 @@ def run():
except error.exit, eerr:
pass
except KeyboardInterrupt:
- _notice(opts, 'abort: user terminated')
+ log.notice('abort: user terminated')
sys.exit(1)
sys.exit(0)