xref: /aosp_15_r20/external/angle/build/apple/xcrun.py (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*8975f5c5SAndroid Build Coastguard Worker# Copyright 2020 The Chromium Authors
3*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker"""
6*8975f5c5SAndroid Build Coastguard WorkerWrapper around xcrun adding support for --developer-dir parameter to set
7*8975f5c5SAndroid Build Coastguard Workerthe DEVELOPER_DIR environment variable, and for converting paths relative
8*8975f5c5SAndroid Build Coastguard Workerto absolute (since this is required by most of the tool run via xcrun).
9*8975f5c5SAndroid Build Coastguard Worker"""
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Workerimport argparse
12*8975f5c5SAndroid Build Coastguard Workerimport os
13*8975f5c5SAndroid Build Coastguard Workerimport subprocess
14*8975f5c5SAndroid Build Coastguard Workerimport sys
15*8975f5c5SAndroid Build Coastguard Worker
16*8975f5c5SAndroid Build Coastguard Worker
17*8975f5c5SAndroid Build Coastguard Workerdef xcrun(command, developer_dir):
18*8975f5c5SAndroid Build Coastguard Worker  environ = dict(os.environ)
19*8975f5c5SAndroid Build Coastguard Worker  if developer_dir:
20*8975f5c5SAndroid Build Coastguard Worker    environ['DEVELOPER_DIR'] = os.path.abspath(developer_dir)
21*8975f5c5SAndroid Build Coastguard Worker
22*8975f5c5SAndroid Build Coastguard Worker  processed_args = ['/usr/bin/xcrun']
23*8975f5c5SAndroid Build Coastguard Worker  for arg in command:
24*8975f5c5SAndroid Build Coastguard Worker    if os.path.exists(arg):
25*8975f5c5SAndroid Build Coastguard Worker      arg = os.path.abspath(arg)
26*8975f5c5SAndroid Build Coastguard Worker    processed_args.append(arg)
27*8975f5c5SAndroid Build Coastguard Worker
28*8975f5c5SAndroid Build Coastguard Worker  process = subprocess.Popen(processed_args,
29*8975f5c5SAndroid Build Coastguard Worker                             stdout=subprocess.PIPE,
30*8975f5c5SAndroid Build Coastguard Worker                             stderr=subprocess.PIPE,
31*8975f5c5SAndroid Build Coastguard Worker                             universal_newlines=True,
32*8975f5c5SAndroid Build Coastguard Worker                             env=environ)
33*8975f5c5SAndroid Build Coastguard Worker
34*8975f5c5SAndroid Build Coastguard Worker  stdout, stderr = process.communicate()
35*8975f5c5SAndroid Build Coastguard Worker  sys.stdout.write(stdout)
36*8975f5c5SAndroid Build Coastguard Worker  if process.returncode:
37*8975f5c5SAndroid Build Coastguard Worker    sys.stderr.write(stderr)
38*8975f5c5SAndroid Build Coastguard Worker    sys.exit(process.returncode)
39*8975f5c5SAndroid Build Coastguard Worker
40*8975f5c5SAndroid Build Coastguard Worker
41*8975f5c5SAndroid Build Coastguard Workerdef main(args):
42*8975f5c5SAndroid Build Coastguard Worker  parser = argparse.ArgumentParser(add_help=False)
43*8975f5c5SAndroid Build Coastguard Worker  parser.add_argument(
44*8975f5c5SAndroid Build Coastguard Worker      '--developer-dir',
45*8975f5c5SAndroid Build Coastguard Worker      help='path to developer dir to use for the invocation of xcrun')
46*8975f5c5SAndroid Build Coastguard Worker
47*8975f5c5SAndroid Build Coastguard Worker  parsed, remaining_args = parser.parse_known_args(args)
48*8975f5c5SAndroid Build Coastguard Worker  xcrun(remaining_args, parsed.developer_dir)
49*8975f5c5SAndroid Build Coastguard Worker
50*8975f5c5SAndroid Build Coastguard Worker
51*8975f5c5SAndroid Build Coastguard Workerif __name__ == '__main__':
52*8975f5c5SAndroid Build Coastguard Worker  main(sys.argv[1:])
53