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