xref: /aosp_15_r20/external/perfetto/gn/standalone/build_tool_wrapper.py (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2017 The Android Open Source Project
2*6dbdd20aSAndroid Build Coastguard Worker#
3*6dbdd20aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*6dbdd20aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*6dbdd20aSAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*6dbdd20aSAndroid Build Coastguard Worker#
7*6dbdd20aSAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
8*6dbdd20aSAndroid Build Coastguard Worker#
9*6dbdd20aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*6dbdd20aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*6dbdd20aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*6dbdd20aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*6dbdd20aSAndroid Build Coastguard Worker# limitations under the License.
14*6dbdd20aSAndroid Build Coastguard Worker""" Wrapper to invoke compiled build tools from the build system.
15*6dbdd20aSAndroid Build Coastguard Worker
16*6dbdd20aSAndroid Build Coastguard WorkerThis is just a workaround for GN assuming that all external scripts are
17*6dbdd20aSAndroid Build Coastguard Workerpython sources. It is used to invoke tools like the protoc compiler.
18*6dbdd20aSAndroid Build Coastguard Worker"""
19*6dbdd20aSAndroid Build Coastguard Worker
20*6dbdd20aSAndroid Build Coastguard Workerfrom __future__ import print_function
21*6dbdd20aSAndroid Build Coastguard Worker
22*6dbdd20aSAndroid Build Coastguard Workerimport argparse
23*6dbdd20aSAndroid Build Coastguard Workerimport os
24*6dbdd20aSAndroid Build Coastguard Workerimport subprocess
25*6dbdd20aSAndroid Build Coastguard Workerimport sys
26*6dbdd20aSAndroid Build Coastguard Worker
27*6dbdd20aSAndroid Build Coastguard Worker
28*6dbdd20aSAndroid Build Coastguard Workerdef main():
29*6dbdd20aSAndroid Build Coastguard Worker  parser = argparse.ArgumentParser()
30*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--chdir', default=None)
31*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--stamp', default=None)
32*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--path', default=None)
33*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--noop', default=False, action='store_true')
34*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--suppress_stdout', default=False, action='store_true')
35*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('--suppress_stderr', default=False, action='store_true')
36*6dbdd20aSAndroid Build Coastguard Worker  parser.add_argument('cmd', nargs=argparse.REMAINDER)
37*6dbdd20aSAndroid Build Coastguard Worker  args = parser.parse_args()
38*6dbdd20aSAndroid Build Coastguard Worker
39*6dbdd20aSAndroid Build Coastguard Worker  if args.noop:
40*6dbdd20aSAndroid Build Coastguard Worker    return 0
41*6dbdd20aSAndroid Build Coastguard Worker
42*6dbdd20aSAndroid Build Coastguard Worker  if args.chdir and not os.path.exists(args.chdir):
43*6dbdd20aSAndroid Build Coastguard Worker    print(
44*6dbdd20aSAndroid Build Coastguard Worker        'Cannot chdir to %s from %s' % (workdir, os.getcwd()), file=sys.stderr)
45*6dbdd20aSAndroid Build Coastguard Worker    return 1
46*6dbdd20aSAndroid Build Coastguard Worker
47*6dbdd20aSAndroid Build Coastguard Worker  exe = os.path.abspath(args.cmd[0]) if os.sep in args.cmd[0] else args.cmd[0]
48*6dbdd20aSAndroid Build Coastguard Worker  env = os.environ.copy()
49*6dbdd20aSAndroid Build Coastguard Worker  if args.path:
50*6dbdd20aSAndroid Build Coastguard Worker    env['PATH'] = os.path.abspath(args.path) + os.pathsep + env['PATH']
51*6dbdd20aSAndroid Build Coastguard Worker
52*6dbdd20aSAndroid Build Coastguard Worker  devnull = open(os.devnull, 'wb')
53*6dbdd20aSAndroid Build Coastguard Worker  stdout = devnull if args.suppress_stdout else None
54*6dbdd20aSAndroid Build Coastguard Worker  stderr = devnull if args.suppress_stderr else None
55*6dbdd20aSAndroid Build Coastguard Worker
56*6dbdd20aSAndroid Build Coastguard Worker  try:
57*6dbdd20aSAndroid Build Coastguard Worker    proc = subprocess.Popen(
58*6dbdd20aSAndroid Build Coastguard Worker        [exe] + args.cmd[1:],
59*6dbdd20aSAndroid Build Coastguard Worker        cwd=args.chdir,
60*6dbdd20aSAndroid Build Coastguard Worker        env=env,
61*6dbdd20aSAndroid Build Coastguard Worker        stderr=stderr,
62*6dbdd20aSAndroid Build Coastguard Worker        stdout=stdout)
63*6dbdd20aSAndroid Build Coastguard Worker    ret = proc.wait()
64*6dbdd20aSAndroid Build Coastguard Worker    if ret == 0 and args.stamp:
65*6dbdd20aSAndroid Build Coastguard Worker      with open(args.stamp, 'w'):
66*6dbdd20aSAndroid Build Coastguard Worker        os.utime(args.stamp, None)
67*6dbdd20aSAndroid Build Coastguard Worker    return ret
68*6dbdd20aSAndroid Build Coastguard Worker  except OSError as e:
69*6dbdd20aSAndroid Build Coastguard Worker    print('Error running: "%s" (%s)' % (args.cmd[0], e.strerror))
70*6dbdd20aSAndroid Build Coastguard Worker    print('PATH=%s' % env.get('PATH'))
71*6dbdd20aSAndroid Build Coastguard Worker    return 127
72*6dbdd20aSAndroid Build Coastguard Worker
73*6dbdd20aSAndroid Build Coastguard Worker
74*6dbdd20aSAndroid Build Coastguard Workerif __name__ == '__main__':
75*6dbdd20aSAndroid Build Coastguard Worker  sys.exit(main())
76