waf

FORK: waf with some random patches
git clone https://git.neptards.moe/neptards/waf.git
Log | Files | Refs | README

color_msvc.py (1821B)


      1 #!/usr/bin/env python
      2 # encoding: utf-8
      3 
      4 # Replaces the default formatter by one which understands MSVC output and colorizes it.
      5 # Modified from color_gcc.py
      6 
      7 __author__ = __maintainer__ = "Alibek Omarov <a1ba.omarov@gmail.com>"
      8 __copyright__ = "Alibek Omarov, 2019"
      9 
     10 import sys
     11 from waflib import Logs
     12 
     13 class ColorMSVCFormatter(Logs.formatter):
     14 	def __init__(self, colors):
     15 		self.colors = colors
     16 		Logs.formatter.__init__(self)
     17 	
     18 	def parseMessage(self, line, color):
     19 		# Split messaage from 'disk:filepath: type: message'
     20 		arr = line.split(':', 3)
     21 		if len(arr) < 4:
     22 			return line
     23 		
     24 		colored = self.colors.BOLD + arr[0] + ':' + arr[1] + ':' + self.colors.NORMAL
     25 		colored += color + arr[2] + ':' + self.colors.NORMAL
     26 		colored += arr[3]
     27 		return colored
     28 	
     29 	def format(self, rec):
     30 		frame = sys._getframe()
     31 		while frame:
     32 			func = frame.f_code.co_name
     33 			if func == 'exec_command':
     34 				cmd = frame.f_locals.get('cmd')
     35 				if isinstance(cmd, list):
     36 					# Fix file case, it may be CL.EXE or cl.exe
     37 					argv0 = cmd[0].lower()
     38 					if 'cl.exe' in argv0:
     39 						lines = []
     40 						# This will not work with "localized" versions
     41 						# of MSVC
     42 						for line in rec.msg.splitlines():
     43 							if ': warning ' in line:
     44 								lines.append(self.parseMessage(line, self.colors.YELLOW))
     45 							elif ': error ' in line:
     46 								lines.append(self.parseMessage(line, self.colors.RED))
     47 							elif ': fatal error ' in line:
     48 								lines.append(self.parseMessage(line, self.colors.RED + self.colors.BOLD))
     49 							elif ': note: ' in line:
     50 								lines.append(self.parseMessage(line, self.colors.CYAN))
     51 							else:
     52 								lines.append(line)
     53 						rec.msg = "\n".join(lines)
     54 			frame = frame.f_back
     55 		return Logs.formatter.format(self, rec)
     56 
     57 def options(opt):
     58 	Logs.log.handlers[0].setFormatter(ColorMSVCFormatter(Logs.colors))
     59