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 ##