github.com/hwaf/hwaf@v0.0.0-20140814122253-5465f73b20f1/py-hwaftools/orch/wafutil.py (about) 1 #!/usr/bin/env python 2 ''' 3 Utility functions needing waf 4 ''' 5 import os 6 import os.path as osp 7 import waflib.Logs as msg 8 from waflib.Errors import WafError 9 import pprint 10 11 from . import util 12 13 def exec_command(task, cmd, **kw): 14 ''' 15 helper function to: 16 - run a command 17 - log stderr and stdout into worch_<taskname>.log.txt 18 - printout the content of that file when the command fails 19 ''' 20 bld = task.generator.bld 21 cwd = getattr(task, 'cwd', bld.out_dir) 22 msg.debug('orch: exec command: %s: "%s" in %s' % (task.name, cmd, cwd)) 23 if not osp.exists(cwd): 24 os.makedirs(cwd) 25 26 log_dir = bld.root.make_node(osp.join(bld.out_dir, 'logs')) 27 log_dir.mkdir() 28 fnode = log_dir.make_node('worch_%s.log.txt' % task.name) 29 flog = open(fnode.abspath(), 'w') 30 31 cmd_dict = dict(kw) 32 env = kw.get('env', task.env.env) 33 cmd_dict.update({ 34 'cwd': cwd, 35 'env': env, 36 'stdout': flog, 37 'stderr': flog, 38 }) 39 40 try: 41 pdict = bld.env['orch_package_dict'][task.name.split('_',1)[0]] 42 except KeyError: 43 pdict = dict() 44 45 flog.write('WORCH CMD: %s\n' % cmd) 46 flog.write('WORCH CWD: %s\n' % cwd) 47 flog.write('WORCH TSK: %s\n' % str(task)) 48 flog.write(pprint.pformat(task.__dict__, indent=2, depth=2)) 49 flog.write('\n') 50 if pdict: 51 flog.write('WORCH PKG:\n') 52 flog.write(pprint.pformat(pdict, indent=2, depth=2)) 53 flog.write('\nWORCH ENV:\n\t%s' % \ 54 '\n\t'.join(['%s = %s' % kv for kv in sorted(env.items())])) 55 flog.write('\nWORCH command output:\n') 56 flog.flush() 57 58 try: 59 ret = task.exec_command(cmd, **cmd_dict) 60 except KeyboardInterrupt: 61 raise 62 except WafError: 63 msg.error('Command failed with WafError: %s in %s' % (cmd, cwd)) 64 raise 65 finally: 66 flog.close() 67 if msg.verbose and ret == 0 and 'orchstep' in msg.zones: 68 with open(flog.abspath()) as f: 69 msg.pprint('NORMAL','orchstep: %s (%s)\n%s' % \ 70 (task.name, flog.name, ''.join(f.readlines()))) 71 pass 72 pass 73 if ret == 0: 74 return 0 75 msg.error('command failed with code %s, log in %s' % (ret, flog.name)) 76 repo = osp.join(cwd, "worch_%s.repo.sh" % task.name) 77 with open(repo, 'w') as fp: 78 fp.write('#!/bin/bash\n') 79 fp.write('cd %s\n' % cwd) 80 for var, val in sorted(env.items()): 81 if val.startswith('()'): 82 fp.write('%s %s\n' % (var, val)) 83 else: 84 fp.write('export %s="%s"\n' % (var,val)) 85 fp.write('\n\n%s\n' % cmd) 86 msg.error('reproduce with: %s' % repo) 87 return ret 88 89