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 10import sys 11from waflib import Logs 12 13class 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 57def options(opt): 58 Logs.log.handlers[0].setFormatter(ColorMSVCFormatter(Logs.colors)) 59 60