1*8975f5c5SAndroid Build Coastguard Worker#!/usr/bin/python3 2*8975f5c5SAndroid Build Coastguard Worker# 3*8975f5c5SAndroid Build Coastguard Worker# Copyright 2023 The ANGLE Project Authors. All rights reserved. 4*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 5*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file. 6*8975f5c5SAndroid Build Coastguard Worker# 7*8975f5c5SAndroid Build Coastguard Worker# angle_trace_bundle.py: 8*8975f5c5SAndroid Build Coastguard Worker# Makes a zip bundle allowing to run angle traces, similarly to mb.py but 9*8975f5c5SAndroid Build Coastguard Worker# - trims most of the dependencies 10*8975f5c5SAndroid Build Coastguard Worker# - includes list_traces.sh and run_trace.sh (see --trace-name) 11*8975f5c5SAndroid Build Coastguard Worker# - lib.unstripped only included if --include-unstripped-libs 12*8975f5c5SAndroid Build Coastguard Worker# - does not depend on vpython 13*8975f5c5SAndroid Build Coastguard Worker# - just adds files to the zip instead of "isolate remap" with a temp dir 14*8975f5c5SAndroid Build Coastguard Worker# 15*8975f5c5SAndroid Build Coastguard Worker# Example usage: 16*8975f5c5SAndroid Build Coastguard Worker# % gn args out/Android # angle_restricted_traces=["among_us"] 17*8975f5c5SAndroid Build Coastguard Worker# (note: explicit build isn't necessary as it is invoked by mb isolate this script runs) 18*8975f5c5SAndroid Build Coastguard Worker# % scripts/angle_trace_bundle.py out/Android angle_trace.zip --trace-name=among_us 19*8975f5c5SAndroid Build Coastguard Worker# 20*8975f5c5SAndroid Build Coastguard Worker# (transfer the zip elsewhere) 21*8975f5c5SAndroid Build Coastguard Worker# % unzip angle_trace.zip -d angle_trace 22*8975f5c5SAndroid Build Coastguard Worker# % angle_trace/list_traces.sh 23*8975f5c5SAndroid Build Coastguard Worker# % angle_trace/run_trace.sh # only included if --trace-name, runs that trace 24*8975f5c5SAndroid Build Coastguard Worker 25*8975f5c5SAndroid Build Coastguard Workerimport argparse 26*8975f5c5SAndroid Build Coastguard Workerimport json 27*8975f5c5SAndroid Build Coastguard Workerimport os 28*8975f5c5SAndroid Build Coastguard Workerimport subprocess 29*8975f5c5SAndroid Build Coastguard Workerimport sys 30*8975f5c5SAndroid Build Coastguard Workerimport zipfile 31*8975f5c5SAndroid Build Coastguard Worker 32*8975f5c5SAndroid Build Coastguard Worker# {gn_dir}/angle_trace_tests has vpython in wrapper shebangs, call our runner directly 33*8975f5c5SAndroid Build Coastguard WorkerRUN_TESTS_TEMPLATE = r'''#!/bin/bash 34*8975f5c5SAndroid Build Coastguard Workercd "$(dirname "$0")" 35*8975f5c5SAndroid Build Coastguard Workerpython3 src/tests/angle_android_test_runner.py gtest --suite=angle_trace_tests --output-directory={gn_dir} "$@" 36*8975f5c5SAndroid Build Coastguard Worker''' 37*8975f5c5SAndroid Build Coastguard Worker 38*8975f5c5SAndroid Build Coastguard WorkerLIST_TRACES_TEMPLATE = r'''#!/bin/bash 39*8975f5c5SAndroid Build Coastguard Workercd "$(dirname "$0")" 40*8975f5c5SAndroid Build Coastguard Worker./_run_tests.sh --list-tests 41*8975f5c5SAndroid Build Coastguard Worker''' 42*8975f5c5SAndroid Build Coastguard Worker 43*8975f5c5SAndroid Build Coastguard WorkerRUN_TRACE_TEMPLATE = r'''#!/bin/bash 44*8975f5c5SAndroid Build Coastguard Workercd "$(dirname "$0")" 45*8975f5c5SAndroid Build Coastguard Worker./_run_tests.sh --filter='TraceTest.{trace_name}' --verbose --fixed-test-time-with-warmup 10 46*8975f5c5SAndroid Build Coastguard Worker''' 47*8975f5c5SAndroid Build Coastguard Worker 48*8975f5c5SAndroid Build Coastguard Worker 49*8975f5c5SAndroid Build Coastguard Workerdef main(): 50*8975f5c5SAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 51*8975f5c5SAndroid Build Coastguard Worker parser.add_argument('gn_dir', help='path to GN. (e.g. out/Android)') 52*8975f5c5SAndroid Build Coastguard Worker parser.add_argument('output_zip_file', help='output zip file') 53*8975f5c5SAndroid Build Coastguard Worker parser.add_argument( 54*8975f5c5SAndroid Build Coastguard Worker '--include-unstripped-libs', action='store_true', help='include lib.unstripped') 55*8975f5c5SAndroid Build Coastguard Worker parser.add_argument('--trace-name', help='trace to run from run_script.sh') 56*8975f5c5SAndroid Build Coastguard Worker args, _ = parser.parse_known_args() 57*8975f5c5SAndroid Build Coastguard Worker 58*8975f5c5SAndroid Build Coastguard Worker gn_dir = os.path.join(os.path.normpath(args.gn_dir), '') 59*8975f5c5SAndroid Build Coastguard Worker assert os.path.sep == '/' and gn_dir.endswith('/') 60*8975f5c5SAndroid Build Coastguard Worker assert gn_dir[0] not in ('.', '/') # expecting relative to angle root 61*8975f5c5SAndroid Build Coastguard Worker 62*8975f5c5SAndroid Build Coastguard Worker subprocess.check_call([ 63*8975f5c5SAndroid Build Coastguard Worker 'python3', 'tools/mb/mb.py', 'isolate', gn_dir, 'angle_trace_perf_tests', '-i', 64*8975f5c5SAndroid Build Coastguard Worker 'infra/specs/gn_isolate_map.pyl' 65*8975f5c5SAndroid Build Coastguard Worker ]) 66*8975f5c5SAndroid Build Coastguard Worker 67*8975f5c5SAndroid Build Coastguard Worker with open(os.path.join(args.gn_dir, 'angle_trace_perf_tests.isolate')) as f: 68*8975f5c5SAndroid Build Coastguard Worker isolate_file_paths = json.load(f)['variables']['files'] 69*8975f5c5SAndroid Build Coastguard Worker 70*8975f5c5SAndroid Build Coastguard Worker skipped_prefixes = [ 71*8975f5c5SAndroid Build Coastguard Worker 'build/', 72*8975f5c5SAndroid Build Coastguard Worker 'src/tests/run_perf_tests.py', # won't work as it depends on catapult 73*8975f5c5SAndroid Build Coastguard Worker 'third_party/catapult/', 74*8975f5c5SAndroid Build Coastguard Worker 'third_party/colorama/', 75*8975f5c5SAndroid Build Coastguard Worker 'third_party/jdk/', 76*8975f5c5SAndroid Build Coastguard Worker 'third_party/jinja2/', 77*8975f5c5SAndroid Build Coastguard Worker 'third_party/logdog/', 78*8975f5c5SAndroid Build Coastguard Worker 'third_party/r8/', 79*8975f5c5SAndroid Build Coastguard Worker 'third_party/requests/', 80*8975f5c5SAndroid Build Coastguard Worker os.path.join(gn_dir, 'lib.java/'), 81*8975f5c5SAndroid Build Coastguard Worker os.path.join(gn_dir, 'obj/'), 82*8975f5c5SAndroid Build Coastguard Worker ] 83*8975f5c5SAndroid Build Coastguard Worker 84*8975f5c5SAndroid Build Coastguard Worker if not args.include_unstripped_libs: 85*8975f5c5SAndroid Build Coastguard Worker skipped_prefixes.append(os.path.join(gn_dir, 'lib.unstripped/')) 86*8975f5c5SAndroid Build Coastguard Worker 87*8975f5c5SAndroid Build Coastguard Worker with zipfile.ZipFile(args.output_zip_file, 'w', zipfile.ZIP_DEFLATED, allowZip64=True) as fzip: 88*8975f5c5SAndroid Build Coastguard Worker for fn in isolate_file_paths: 89*8975f5c5SAndroid Build Coastguard Worker path = os.path.normpath(os.path.join(gn_dir, fn)) 90*8975f5c5SAndroid Build Coastguard Worker if any(path.startswith(p) for p in skipped_prefixes): 91*8975f5c5SAndroid Build Coastguard Worker continue 92*8975f5c5SAndroid Build Coastguard Worker 93*8975f5c5SAndroid Build Coastguard Worker fzip.write(path) 94*8975f5c5SAndroid Build Coastguard Worker 95*8975f5c5SAndroid Build Coastguard Worker def addScript(path_in_zip, contents): 96*8975f5c5SAndroid Build Coastguard Worker # Creates a script directly inside the zip file 97*8975f5c5SAndroid Build Coastguard Worker info = zipfile.ZipInfo(path_in_zip) 98*8975f5c5SAndroid Build Coastguard Worker info.external_attr = 0o755 << 16 # unnecessarily obscure way to chmod 755... 99*8975f5c5SAndroid Build Coastguard Worker fzip.writestr(info, contents) 100*8975f5c5SAndroid Build Coastguard Worker 101*8975f5c5SAndroid Build Coastguard Worker addScript('_run_tests.sh', RUN_TESTS_TEMPLATE.format(gn_dir=gn_dir)) 102*8975f5c5SAndroid Build Coastguard Worker addScript('list_traces.sh', LIST_TRACES_TEMPLATE.format(gn_dir=gn_dir)) 103*8975f5c5SAndroid Build Coastguard Worker 104*8975f5c5SAndroid Build Coastguard Worker if args.trace_name: 105*8975f5c5SAndroid Build Coastguard Worker addScript('run_trace.sh', 106*8975f5c5SAndroid Build Coastguard Worker RUN_TRACE_TEMPLATE.format(gn_dir=gn_dir, trace_name=args.trace_name)) 107*8975f5c5SAndroid Build Coastguard Worker 108*8975f5c5SAndroid Build Coastguard Worker return 0 109*8975f5c5SAndroid Build Coastguard Worker 110*8975f5c5SAndroid Build Coastguard Worker 111*8975f5c5SAndroid Build Coastguard Workerif __name__ == '__main__': 112*8975f5c5SAndroid Build Coastguard Worker sys.exit(main()) 113