1*61046927SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*61046927SAndroid Build Coastguard Worker 3*61046927SAndroid Build Coastguard Workerimport argparse 4*61046927SAndroid Build Coastguard Workerimport difflib 5*61046927SAndroid Build Coastguard Workerimport errno 6*61046927SAndroid Build Coastguard Workerimport os 7*61046927SAndroid Build Coastguard Workerimport pathlib 8*61046927SAndroid Build Coastguard Workerimport subprocess 9*61046927SAndroid Build Coastguard Workerimport sys 10*61046927SAndroid Build Coastguard Worker 11*61046927SAndroid Build Coastguard Worker# The meson version handles windows paths better, but if it's not available 12*61046927SAndroid Build Coastguard Worker# fall back to shlex 13*61046927SAndroid Build Coastguard Workertry: 14*61046927SAndroid Build Coastguard Worker from meson.mesonlib import split_args 15*61046927SAndroid Build Coastguard Workerexcept ImportError: 16*61046927SAndroid Build Coastguard Worker from shlex import split as split_args 17*61046927SAndroid Build Coastguard Worker 18*61046927SAndroid Build Coastguard Workerparser = argparse.ArgumentParser() 19*61046927SAndroid Build Coastguard Workerparser.add_argument('--brw_asm', 20*61046927SAndroid Build Coastguard Worker help='path to brw_asm binary') 21*61046927SAndroid Build Coastguard Workerparser.add_argument('--gen_name', 22*61046927SAndroid Build Coastguard Worker help='name of the hardware generation (as understood by brw_asm)') 23*61046927SAndroid Build Coastguard Workerparser.add_argument('--gen_folder', 24*61046927SAndroid Build Coastguard Worker type=pathlib.Path, 25*61046927SAndroid Build Coastguard Worker help='name of the folder for the generation') 26*61046927SAndroid Build Coastguard Workerargs = parser.parse_args() 27*61046927SAndroid Build Coastguard Worker 28*61046927SAndroid Build Coastguard Workerwrapper = os.environ.get('MESON_EXE_WRAPPER') 29*61046927SAndroid Build Coastguard Workerif wrapper is not None: 30*61046927SAndroid Build Coastguard Worker brw_asm = split_args(wrapper) + [args.brw_asm] 31*61046927SAndroid Build Coastguard Workerelse: 32*61046927SAndroid Build Coastguard Worker brw_asm = [args.brw_asm] 33*61046927SAndroid Build Coastguard Worker 34*61046927SAndroid Build Coastguard Workerif not args.gen_folder.is_dir(): 35*61046927SAndroid Build Coastguard Worker print('Test files path does not exist or is not a directory.', 36*61046927SAndroid Build Coastguard Worker file=sys.stderr) 37*61046927SAndroid Build Coastguard Worker exit(99) 38*61046927SAndroid Build Coastguard Worker 39*61046927SAndroid Build Coastguard Workersuccess = True 40*61046927SAndroid Build Coastguard Worker 41*61046927SAndroid Build Coastguard Workerfor asm_file in args.gen_folder.glob('*.asm'): 42*61046927SAndroid Build Coastguard Worker expected_file = asm_file.stem + '.expected' 43*61046927SAndroid Build Coastguard Worker expected_path = args.gen_folder / expected_file 44*61046927SAndroid Build Coastguard Worker 45*61046927SAndroid Build Coastguard Worker try: 46*61046927SAndroid Build Coastguard Worker command = brw_asm + [ 47*61046927SAndroid Build Coastguard Worker '--type', 'hex', 48*61046927SAndroid Build Coastguard Worker '--gen', args.gen_name, 49*61046927SAndroid Build Coastguard Worker asm_file 50*61046927SAndroid Build Coastguard Worker ] 51*61046927SAndroid Build Coastguard Worker with subprocess.Popen(command, 52*61046927SAndroid Build Coastguard Worker stdout=subprocess.PIPE, 53*61046927SAndroid Build Coastguard Worker stderr=subprocess.DEVNULL) as cmd: 54*61046927SAndroid Build Coastguard Worker lines_after = [line.decode('ascii') for line in cmd.stdout.readlines()] 55*61046927SAndroid Build Coastguard Worker except OSError as e: 56*61046927SAndroid Build Coastguard Worker if e.errno == errno.ENOEXEC: 57*61046927SAndroid Build Coastguard Worker print('Skipping due to inability to run host binaries.', 58*61046927SAndroid Build Coastguard Worker file=sys.stderr) 59*61046927SAndroid Build Coastguard Worker exit(77) 60*61046927SAndroid Build Coastguard Worker raise 61*61046927SAndroid Build Coastguard Worker 62*61046927SAndroid Build Coastguard Worker with expected_path.open() as f: 63*61046927SAndroid Build Coastguard Worker lines_before = f.readlines() 64*61046927SAndroid Build Coastguard Worker 65*61046927SAndroid Build Coastguard Worker diff = ''.join(difflib.unified_diff(lines_before, lines_after, 66*61046927SAndroid Build Coastguard Worker expected_file, asm_file.stem + '.out')) 67*61046927SAndroid Build Coastguard Worker 68*61046927SAndroid Build Coastguard Worker if diff: 69*61046927SAndroid Build Coastguard Worker print('Output comparison for {}:'.format(asm_file.name)) 70*61046927SAndroid Build Coastguard Worker print(diff) 71*61046927SAndroid Build Coastguard Worker success = False 72*61046927SAndroid Build Coastguard Worker else: 73*61046927SAndroid Build Coastguard Worker print('{} : PASS'.format(asm_file.name)) 74*61046927SAndroid Build Coastguard Worker 75*61046927SAndroid Build Coastguard Workerif not success: 76*61046927SAndroid Build Coastguard Worker exit(1) 77