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