github.com/hwaf/hwaf@v0.0.0-20140814122253-5465f73b20f1/py-hwaftools/hwaf-spy-env.py (about)

     1  # -*- python -*-
     2  
     3  # stdlib imports
     4  import os
     5  import os.path as osp
     6  import sys
     7  
     8  # waf imports ---
     9  import waflib.Options
    10  import waflib.Utils
    11  import waflib.Logs as msg
    12  from waflib.Configure import conf
    13  
    14  _heptooldir = osp.dirname(osp.abspath(__file__))
    15  # add this directory to sys.path to ease the loading of other hepwaf tools
    16  if not _heptooldir in sys.path: sys.path.append(_heptooldir)
    17  
    18  ### ---------------------------------------------------------------------------
    19  # monkey patch waflib.ConfigSet.ConfigSet to log environment mods
    20  @conf
    21  def hwaf_setup_spy_env(ctx):
    22      import traceback
    23      import waflib.ConfigSet
    24      _orig_ConfigSet_setitem = waflib.ConfigSet.ConfigSet.__setitem__
    25      _orig_ConfigSet_setattr = waflib.ConfigSet.ConfigSet.__setattr__
    26      _orig_ConfigSet_append_value = waflib.ConfigSet.ConfigSet.append_value
    27      _orig_ConfigSet_prepend_value = waflib.ConfigSet.ConfigSet.prepend_value
    28      _orig_ConfigSet_append_unique = waflib.ConfigSet.ConfigSet.append_unique
    29  
    30      def _tb_stack_filter(stack):
    31          '''filter function to only keep interesting stacks
    32          (discarding noise from waf/hwaf internals)
    33          '''
    34          who = stack[-1]
    35          fname = who[0]
    36          if fname.endswith(('waflib/Configure.py',
    37                             'waflib/ConfigSet.py',
    38                             'share/hwaf/tools/hwaf-base.py',
    39                             'tools/hwaf-base.py',
    40                             'share/hwaf/tools/hwaf-spy-env.py',
    41                             'tools/hwaf-spy-env.py',
    42                             )):
    43              return True
    44          return False
    45      
    46      #mylog = open('spy.log.txt', 'w')
    47      def _new_ConfigSet_setitem(self, key, value):
    48          if key == 'HWAF_ENV_SPY':
    49              return _orig_ConfigSet_setitem(self, key, value)
    50          
    51          stack = traceback.extract_stack()[:-1]
    52          if _tb_stack_filter(stack):
    53              return _orig_ConfigSet_setitem(self, key, value)
    54              
    55          #print(">>> __setitem__(%s, %s)..." % (key, stack), file=mylog)
    56          #mylog.flush()
    57          old_value = self[key]
    58          ret = _orig_ConfigSet_setitem(self, key, value)
    59          new_value = self[key]
    60          if old_value != new_value or 1:
    61              _orig_ConfigSet_append_value(
    62                  self,
    63                  'HWAF_ENV_SPY',
    64                  [{'action': 'set',
    65                    'key': key,
    66                    'old': old_value,
    67                    'new': new_value,
    68                    'val': value,
    69                    'who': stack[-1],
    70                    }]
    71                  )
    72          return ret
    73      waflib.ConfigSet.ConfigSet.__setitem__ = _new_ConfigSet_setitem
    74  
    75      def _new_ConfigSet_setattr(self, key, value):
    76          if key == 'HWAF_ENV_SPY':
    77              return _orig_ConfigSet_setattr(self, key, value)
    78          stack = traceback.extract_stack()[:-1]
    79          if _tb_stack_filter(stack):
    80              return _orig_ConfigSet_setattr(self, key, value)
    81          #print(">>> __setattr__(%s, %s)..." % (key, stack), file=mylog)
    82          #mylog.flush()
    83          old_value = self[key]
    84          ret = _orig_ConfigSet_setattr(self, key, value)
    85          new_value = self[key]
    86          if old_value != new_value or 1:
    87              _orig_ConfigSet_append_value(
    88                  self,
    89                  'HWAF_ENV_SPY',
    90                  [{'action': 'set',
    91                    'key': key,
    92                    'old': old_value,
    93                    'new': new_value,
    94                    'val': value,
    95                    'who': stack[-1],
    96                    }]
    97                  )
    98          return ret
    99      waflib.ConfigSet.ConfigSet.__setattr__ = _new_ConfigSet_setattr
   100  
   101      def _new_ConfigSet_append_value(self, var, val):
   102          if var == 'HWAF_ENV_SPY':
   103              return _orig_ConfigSet_append_value(self, var, val)
   104          stack = traceback.extract_stack()[:-1]
   105          if _tb_stack_filter(stack):
   106              return _orig_ConfigSet_append_value(self, var, val)
   107          
   108          #print(">>> append_value(%s, %s)..." % (var, stack), file=mylog)
   109          #mylog.flush()
   110          old_value = self[var]
   111          ret = _orig_ConfigSet_append_value(self, var, val)
   112          new_value = self[var]
   113          if old_value != new_value or 1:
   114              _orig_ConfigSet_append_value(
   115                  self,
   116                  'HWAF_ENV_SPY',
   117                  [{'action': 'append_value',
   118                    'key': var,
   119                    'old': old_value,
   120                    'new': new_value,
   121                    'val': val,
   122                    'who': stack[-1],
   123                    }]
   124                  )
   125          return ret
   126      waflib.ConfigSet.ConfigSet.append_value = _new_ConfigSet_append_value
   127  
   128      def _new_ConfigSet_prepend_value(self, var, val):
   129          if var == 'HWAF_ENV_SPY':
   130              return _orig_ConfigSet_prepend_value(self, var, val)
   131          stack = traceback.extract_stack()[:-1]
   132          if _tb_stack_filter(stack):
   133              return _orig_ConfigSet_prepend_value(self, var, val)
   134          
   135          #print(">>> prepend_value(%s, %s)..." % (var, stack), file=mylog)
   136          #mylog.flush()
   137          old_value = self[var]
   138          ret = _orig_ConfigSet_prepend_value(self, var, val)
   139          new_value = self[var]
   140          if old_value != new_value or 1:
   141              _orig_ConfigSet_append_value(
   142                  self,
   143                  'HWAF_ENV_SPY',
   144                  [{'action': 'prepend_value',
   145                    'key': var,
   146                    'old': old_value,
   147                    'new': new_value,
   148                    'val': val,
   149                    'who': stack[-1],
   150                    }]
   151                  )
   152          return ret
   153      waflib.ConfigSet.ConfigSet.prepend_value = _new_ConfigSet_prepend_value
   154  
   155      def _new_ConfigSet_append_unique(self, var, val):
   156          if var == 'HWAF_ENV_SPY':
   157              return _orig_ConfigSet_append_unique(self, var, val)
   158          stack = traceback.extract_stack()[:-1]
   159          if _tb_stack_filter(stack):
   160              return _orig_ConfigSet_append_unique(self, var, val)
   161          
   162          #print(">>> append_unique(%s, %s)..." % (var, stack), file=mylog)
   163          #mylog.flush()
   164          old_value = self[var]
   165          ret = _orig_ConfigSet_append_unique(self, var, val)
   166          new_value = self[var]
   167          if old_value != new_value or 1:
   168              _orig_ConfigSet_append_value(
   169                  self,
   170                  'HWAF_ENV_SPY',
   171                  [{'action': 'append_unique',
   172                    'key': var,
   173                    'old': old_value,
   174                    'new': new_value,
   175                    'val': val,
   176                    'who': stack[-1],
   177                    }]
   178                  )
   179          return ret
   180      waflib.ConfigSet.ConfigSet.append_unique = _new_ConfigSet_append_unique
   181  
   182      pass
   183  
   184  ## EOF ##