diff options
author | Chris Johns <chrisj@rtems.org> | 2013-04-21 18:37:02 +1000 |
---|---|---|
committer | Chris Johns <chrisj@rtems.org> | 2013-04-21 18:37:02 +1000 |
commit | 5142becd8ec950ea0f2d36cdc9488660abc2ca29 (patch) | |
tree | cbe93e6ede010f4e716fcd21fd123a4247b0c917 | |
parent | Add source and patches section. (diff) | |
download | rtems-source-builder-5142becd8ec950ea0f2d36cdc9488660abc2ca29.tar.bz2 |
Refactor the logging support.
-rw-r--r-- | source-builder/sb/build.py | 66 | ||||
-rw-r--r-- | source-builder/sb/check.py | 34 | ||||
-rw-r--r-- | source-builder/sb/config.py | 71 | ||||
-rw-r--r-- | source-builder/sb/cvs.py | 5 | ||||
-rw-r--r-- | source-builder/sb/download.py | 46 | ||||
-rwxr-xr-x | source-builder/sb/execute.py | 1 | ||||
-rw-r--r-- | source-builder/sb/git.py | 6 | ||||
-rwxr-xr-x | source-builder/sb/log.py | 59 | ||||
-rw-r--r-- | source-builder/sb/options.py | 44 | ||||
-rw-r--r-- | source-builder/sb/reports.py | 11 | ||||
-rw-r--r-- | source-builder/sb/setbuilder.py | 48 |
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) |