trace_event_bytecode_rewriter.py (2351B)
1 #!/usr/bin/env python3 2 # Copyright 2021 The Chromium Authors 3 # Use of this source code is governed by a BSD-style license that can be 4 # found in the LICENSE file. 5 """Wrapper script around TraceEventAdder script.""" 6 7 import argparse 8 import logging 9 import sys 10 import tempfile 11 import os 12 13 from util import build_utils 14 import action_helpers # build_utils adds //build to sys.path. 15 16 17 # The real limit is generally >100kb, but 10k seems like a reasonable "it's big" 18 # threshold. 19 _MAX_CMDLINE = 10000 20 21 22 def main(argv): 23 build_utils.InitLogging('TRACE_EVENT_REWRITER_DEBUG') 24 argv = build_utils.ExpandFileArgs(argv[1:]) 25 parser = argparse.ArgumentParser() 26 action_helpers.add_depfile_arg(parser) 27 parser.add_argument('--script', 28 required=True, 29 help='Path to the java binary wrapper script.') 30 parser.add_argument('--stamp', help='Path to stamp to mark when finished.') 31 parser.add_argument('--classpath', action='append', nargs='+') 32 parser.add_argument('--input-jars', action='append', nargs='+') 33 parser.add_argument('--output-jars', action='append', nargs='+') 34 args = parser.parse_args(argv) 35 36 args.classpath = action_helpers.parse_gn_list(args.classpath) 37 args.input_jars = action_helpers.parse_gn_list(args.input_jars) 38 args.output_jars = action_helpers.parse_gn_list(args.output_jars) 39 40 for output_jar in args.output_jars: 41 jar_dir = os.path.dirname(output_jar) 42 if not os.path.exists(jar_dir): 43 os.makedirs(jar_dir) 44 45 cmd = [ 46 args.script, '--classpath', ':'.join(args.classpath), 47 ':'.join(args.input_jars), ':'.join(args.output_jars) 48 ] 49 if sum(len(x) for x in cmd) > _MAX_CMDLINE: 50 # Cannot put --classpath in the args file because that is consumed by the 51 # wrapper script. Keep the args file on disk when debugging. 52 is_debug = logging.getLogger().isEnabledFor(logging.DEBUG) 53 args_file = tempfile.NamedTemporaryFile(mode='w', delete=not is_debug) 54 args_file.write('\n'.join(cmd[3:])) 55 args_file.flush() 56 cmd[3:] = ['@' + args_file.name] 57 58 logging.debug(' '.join(cmd)) 59 60 build_utils.CheckOutput(cmd, print_stdout=True) 61 62 build_utils.Touch(args.stamp) 63 64 all_input_jars = args.input_jars + args.classpath 65 action_helpers.write_depfile(args.depfile, args.stamp, inputs=all_input_jars) 66 67 68 if __name__ == '__main__': 69 sys.exit(main(sys.argv))