xref: /aosp_15_r20/external/cronet/build/toolchain/ios/compile_xcassets.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker# Copyright 2016 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker"""Wrapper around actool to compile assets catalog.
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard WorkerThe script compile_xcassets.py is a wrapper around actool to compile
8*6777b538SAndroid Build Coastguard Workerassets catalog to Assets.car that turns warning into errors. It also
9*6777b538SAndroid Build Coastguard Workerfixes some quirks of actool to make it work from ninja (mostly that
10*6777b538SAndroid Build Coastguard Workeractool seems to require absolute path but gn generates command-line
11*6777b538SAndroid Build Coastguard Workerwith relative paths).
12*6777b538SAndroid Build Coastguard Worker
13*6777b538SAndroid Build Coastguard WorkerThe wrapper filter out any message that is not a section header and
14*6777b538SAndroid Build Coastguard Workernot a warning or error message, and fails if filtered output is not
15*6777b538SAndroid Build Coastguard Workerempty. This should to treat all warnings as error until actool has
16*6777b538SAndroid Build Coastguard Workeran option to fail with non-zero error code when there are warnings.
17*6777b538SAndroid Build Coastguard Worker"""
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Workerimport argparse
20*6777b538SAndroid Build Coastguard Workerimport os
21*6777b538SAndroid Build Coastguard Workerimport re
22*6777b538SAndroid Build Coastguard Workerimport shutil
23*6777b538SAndroid Build Coastguard Workerimport subprocess
24*6777b538SAndroid Build Coastguard Workerimport sys
25*6777b538SAndroid Build Coastguard Workerimport tempfile
26*6777b538SAndroid Build Coastguard Workerimport zipfile
27*6777b538SAndroid Build Coastguard Worker
28*6777b538SAndroid Build Coastguard Worker# Pattern matching a section header in the output of actool.
29*6777b538SAndroid Build Coastguard WorkerSECTION_HEADER = re.compile('^/\\* ([^ ]*) \\*/$')
30*6777b538SAndroid Build Coastguard Worker
31*6777b538SAndroid Build Coastguard Worker# Name of the section containing informational messages that can be ignored.
32*6777b538SAndroid Build Coastguard WorkerNOTICE_SECTION = 'com.apple.actool.compilation-results'
33*6777b538SAndroid Build Coastguard Worker
34*6777b538SAndroid Build Coastguard Worker# Map special type of asset catalog to the corresponding command-line
35*6777b538SAndroid Build Coastguard Worker# parameter that need to be passed to actool.
36*6777b538SAndroid Build Coastguard WorkerACTOOL_FLAG_FOR_ASSET_TYPE = {
37*6777b538SAndroid Build Coastguard Worker    '.appiconset': '--app-icon',
38*6777b538SAndroid Build Coastguard Worker    '.launchimage': '--launch-image',
39*6777b538SAndroid Build Coastguard Worker}
40*6777b538SAndroid Build Coastguard Worker
41*6777b538SAndroid Build Coastguard Workerdef FixAbsolutePathInLine(line, relative_paths):
42*6777b538SAndroid Build Coastguard Worker  """Fix absolute paths present in |line| to relative paths."""
43*6777b538SAndroid Build Coastguard Worker  absolute_path = line.split(':')[0]
44*6777b538SAndroid Build Coastguard Worker  relative_path = relative_paths.get(absolute_path, absolute_path)
45*6777b538SAndroid Build Coastguard Worker  if absolute_path == relative_path:
46*6777b538SAndroid Build Coastguard Worker    return line
47*6777b538SAndroid Build Coastguard Worker  return relative_path + line[len(absolute_path):]
48*6777b538SAndroid Build Coastguard Worker
49*6777b538SAndroid Build Coastguard Worker
50*6777b538SAndroid Build Coastguard Workerdef FilterCompilerOutput(compiler_output, relative_paths):
51*6777b538SAndroid Build Coastguard Worker  """Filers actool compilation output.
52*6777b538SAndroid Build Coastguard Worker
53*6777b538SAndroid Build Coastguard Worker  The compiler output is composed of multiple sections for each different
54*6777b538SAndroid Build Coastguard Worker  level of output (error, warning, notices, ...). Each section starts with
55*6777b538SAndroid Build Coastguard Worker  the section name on a single line, followed by all the messages from the
56*6777b538SAndroid Build Coastguard Worker  section.
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker  The function filter any lines that are not in com.apple.actool.errors or
59*6777b538SAndroid Build Coastguard Worker  com.apple.actool.document.warnings sections (as spurious messages comes
60*6777b538SAndroid Build Coastguard Worker  before any section of the output).
61*6777b538SAndroid Build Coastguard Worker
62*6777b538SAndroid Build Coastguard Worker  See crbug.com/730054, crbug.com/739163 and crbug.com/770634 for some example
63*6777b538SAndroid Build Coastguard Worker  messages that pollute the output of actool and cause flaky builds.
64*6777b538SAndroid Build Coastguard Worker
65*6777b538SAndroid Build Coastguard Worker  Args:
66*6777b538SAndroid Build Coastguard Worker    compiler_output: string containing the output generated by the
67*6777b538SAndroid Build Coastguard Worker      compiler (contains both stdout and stderr)
68*6777b538SAndroid Build Coastguard Worker    relative_paths: mapping from absolute to relative paths used to
69*6777b538SAndroid Build Coastguard Worker      convert paths in the warning and error messages (unknown paths
70*6777b538SAndroid Build Coastguard Worker      will be left unaltered)
71*6777b538SAndroid Build Coastguard Worker
72*6777b538SAndroid Build Coastguard Worker  Returns:
73*6777b538SAndroid Build Coastguard Worker    The filtered output of the compiler. If the compilation was a
74*6777b538SAndroid Build Coastguard Worker    success, then the output will be empty, otherwise it will use
75*6777b538SAndroid Build Coastguard Worker    relative path and omit any irrelevant output.
76*6777b538SAndroid Build Coastguard Worker  """
77*6777b538SAndroid Build Coastguard Worker
78*6777b538SAndroid Build Coastguard Worker  filtered_output = []
79*6777b538SAndroid Build Coastguard Worker  current_section = None
80*6777b538SAndroid Build Coastguard Worker  data_in_section = False
81*6777b538SAndroid Build Coastguard Worker  for line in compiler_output.splitlines():
82*6777b538SAndroid Build Coastguard Worker    match = SECTION_HEADER.search(line)
83*6777b538SAndroid Build Coastguard Worker    if match is not None:
84*6777b538SAndroid Build Coastguard Worker      data_in_section = False
85*6777b538SAndroid Build Coastguard Worker      current_section = match.group(1)
86*6777b538SAndroid Build Coastguard Worker      continue
87*6777b538SAndroid Build Coastguard Worker    if current_section and current_section != NOTICE_SECTION:
88*6777b538SAndroid Build Coastguard Worker      if not data_in_section:
89*6777b538SAndroid Build Coastguard Worker        data_in_section = True
90*6777b538SAndroid Build Coastguard Worker        filtered_output.append('/* %s */\n' % current_section)
91*6777b538SAndroid Build Coastguard Worker
92*6777b538SAndroid Build Coastguard Worker      fixed_line = FixAbsolutePathInLine(line, relative_paths)
93*6777b538SAndroid Build Coastguard Worker      filtered_output.append(fixed_line + '\n')
94*6777b538SAndroid Build Coastguard Worker
95*6777b538SAndroid Build Coastguard Worker  return ''.join(filtered_output)
96*6777b538SAndroid Build Coastguard Worker
97*6777b538SAndroid Build Coastguard Worker
98*6777b538SAndroid Build Coastguard Workerdef CompileAssetCatalog(output, platform, target_environment, product_type,
99*6777b538SAndroid Build Coastguard Worker                        min_deployment_target, possibly_zipped_inputs,
100*6777b538SAndroid Build Coastguard Worker                        compress_pngs, partial_info_plist, temporary_dir):
101*6777b538SAndroid Build Coastguard Worker  """Compile the .xcassets bundles to an asset catalog using actool.
102*6777b538SAndroid Build Coastguard Worker
103*6777b538SAndroid Build Coastguard Worker  Args:
104*6777b538SAndroid Build Coastguard Worker    output: absolute path to the containing bundle
105*6777b538SAndroid Build Coastguard Worker    platform: the targeted platform
106*6777b538SAndroid Build Coastguard Worker    product_type: the bundle type
107*6777b538SAndroid Build Coastguard Worker    min_deployment_target: minimum deployment target
108*6777b538SAndroid Build Coastguard Worker    possibly_zipped_inputs: list of absolute paths to .xcassets bundles or zips
109*6777b538SAndroid Build Coastguard Worker    compress_pngs: whether to enable compression of pngs
110*6777b538SAndroid Build Coastguard Worker    partial_info_plist: path to partial Info.plist to generate
111*6777b538SAndroid Build Coastguard Worker    temporary_dir: path to directory for storing temp data
112*6777b538SAndroid Build Coastguard Worker  """
113*6777b538SAndroid Build Coastguard Worker  command = [
114*6777b538SAndroid Build Coastguard Worker      'xcrun',
115*6777b538SAndroid Build Coastguard Worker      'actool',
116*6777b538SAndroid Build Coastguard Worker      '--output-format=human-readable-text',
117*6777b538SAndroid Build Coastguard Worker      '--notices',
118*6777b538SAndroid Build Coastguard Worker      '--warnings',
119*6777b538SAndroid Build Coastguard Worker      '--errors',
120*6777b538SAndroid Build Coastguard Worker      '--minimum-deployment-target',
121*6777b538SAndroid Build Coastguard Worker      min_deployment_target,
122*6777b538SAndroid Build Coastguard Worker  ]
123*6777b538SAndroid Build Coastguard Worker
124*6777b538SAndroid Build Coastguard Worker  if compress_pngs:
125*6777b538SAndroid Build Coastguard Worker    command.extend(['--compress-pngs'])
126*6777b538SAndroid Build Coastguard Worker
127*6777b538SAndroid Build Coastguard Worker  if product_type != '':
128*6777b538SAndroid Build Coastguard Worker    command.extend(['--product-type', product_type])
129*6777b538SAndroid Build Coastguard Worker
130*6777b538SAndroid Build Coastguard Worker  if platform == 'mac':
131*6777b538SAndroid Build Coastguard Worker    command.extend([
132*6777b538SAndroid Build Coastguard Worker        '--platform',
133*6777b538SAndroid Build Coastguard Worker        'macosx',
134*6777b538SAndroid Build Coastguard Worker        '--target-device',
135*6777b538SAndroid Build Coastguard Worker        'mac',
136*6777b538SAndroid Build Coastguard Worker    ])
137*6777b538SAndroid Build Coastguard Worker  elif platform == 'ios':
138*6777b538SAndroid Build Coastguard Worker    if target_environment == 'simulator':
139*6777b538SAndroid Build Coastguard Worker      command.extend([
140*6777b538SAndroid Build Coastguard Worker          '--platform',
141*6777b538SAndroid Build Coastguard Worker          'iphonesimulator',
142*6777b538SAndroid Build Coastguard Worker          '--target-device',
143*6777b538SAndroid Build Coastguard Worker          'iphone',
144*6777b538SAndroid Build Coastguard Worker          '--target-device',
145*6777b538SAndroid Build Coastguard Worker          'ipad',
146*6777b538SAndroid Build Coastguard Worker      ])
147*6777b538SAndroid Build Coastguard Worker    elif target_environment == 'device':
148*6777b538SAndroid Build Coastguard Worker      command.extend([
149*6777b538SAndroid Build Coastguard Worker          '--platform',
150*6777b538SAndroid Build Coastguard Worker          'iphoneos',
151*6777b538SAndroid Build Coastguard Worker          '--target-device',
152*6777b538SAndroid Build Coastguard Worker          'iphone',
153*6777b538SAndroid Build Coastguard Worker          '--target-device',
154*6777b538SAndroid Build Coastguard Worker          'ipad',
155*6777b538SAndroid Build Coastguard Worker      ])
156*6777b538SAndroid Build Coastguard Worker    elif target_environment == 'catalyst':
157*6777b538SAndroid Build Coastguard Worker      command.extend([
158*6777b538SAndroid Build Coastguard Worker          '--platform',
159*6777b538SAndroid Build Coastguard Worker          'macosx',
160*6777b538SAndroid Build Coastguard Worker          '--target-device',
161*6777b538SAndroid Build Coastguard Worker          'ipad',
162*6777b538SAndroid Build Coastguard Worker          '--ui-framework-family',
163*6777b538SAndroid Build Coastguard Worker          'uikit',
164*6777b538SAndroid Build Coastguard Worker      ])
165*6777b538SAndroid Build Coastguard Worker
166*6777b538SAndroid Build Coastguard Worker  # Unzip any input zipfiles to a temporary directory.
167*6777b538SAndroid Build Coastguard Worker  inputs = []
168*6777b538SAndroid Build Coastguard Worker  for relative_path in possibly_zipped_inputs:
169*6777b538SAndroid Build Coastguard Worker    if os.path.isfile(relative_path) and zipfile.is_zipfile(relative_path):
170*6777b538SAndroid Build Coastguard Worker      catalog_name = os.path.basename(relative_path)
171*6777b538SAndroid Build Coastguard Worker      unzip_path = os.path.join(temporary_dir, os.path.dirname(relative_path))
172*6777b538SAndroid Build Coastguard Worker      with zipfile.ZipFile(relative_path) as z:
173*6777b538SAndroid Build Coastguard Worker        invalid_files = [
174*6777b538SAndroid Build Coastguard Worker            x for x in z.namelist()
175*6777b538SAndroid Build Coastguard Worker            if '..' in x or not x.startswith(catalog_name)
176*6777b538SAndroid Build Coastguard Worker        ]
177*6777b538SAndroid Build Coastguard Worker        if invalid_files:
178*6777b538SAndroid Build Coastguard Worker          sys.stderr.write('Invalid files in zip: %s' % invalid_files)
179*6777b538SAndroid Build Coastguard Worker          sys.exit(1)
180*6777b538SAndroid Build Coastguard Worker        z.extractall(unzip_path)
181*6777b538SAndroid Build Coastguard Worker      inputs.append(os.path.join(unzip_path, catalog_name))
182*6777b538SAndroid Build Coastguard Worker    else:
183*6777b538SAndroid Build Coastguard Worker      inputs.append(relative_path)
184*6777b538SAndroid Build Coastguard Worker
185*6777b538SAndroid Build Coastguard Worker  # Scan the input directories for the presence of asset catalog types that
186*6777b538SAndroid Build Coastguard Worker  # require special treatment, and if so, add them to the actool command-line.
187*6777b538SAndroid Build Coastguard Worker  for relative_path in inputs:
188*6777b538SAndroid Build Coastguard Worker
189*6777b538SAndroid Build Coastguard Worker    if not os.path.isdir(relative_path):
190*6777b538SAndroid Build Coastguard Worker      continue
191*6777b538SAndroid Build Coastguard Worker
192*6777b538SAndroid Build Coastguard Worker    for file_or_dir_name in os.listdir(relative_path):
193*6777b538SAndroid Build Coastguard Worker      if not os.path.isdir(os.path.join(relative_path, file_or_dir_name)):
194*6777b538SAndroid Build Coastguard Worker        continue
195*6777b538SAndroid Build Coastguard Worker
196*6777b538SAndroid Build Coastguard Worker      asset_name, asset_type = os.path.splitext(file_or_dir_name)
197*6777b538SAndroid Build Coastguard Worker      if asset_type not in ACTOOL_FLAG_FOR_ASSET_TYPE:
198*6777b538SAndroid Build Coastguard Worker        continue
199*6777b538SAndroid Build Coastguard Worker
200*6777b538SAndroid Build Coastguard Worker      command.extend([ACTOOL_FLAG_FOR_ASSET_TYPE[asset_type], asset_name])
201*6777b538SAndroid Build Coastguard Worker
202*6777b538SAndroid Build Coastguard Worker  # Always ask actool to generate a partial Info.plist file. If no path
203*6777b538SAndroid Build Coastguard Worker  # has been given by the caller, use a temporary file name.
204*6777b538SAndroid Build Coastguard Worker  temporary_file = None
205*6777b538SAndroid Build Coastguard Worker  if not partial_info_plist:
206*6777b538SAndroid Build Coastguard Worker    temporary_file = tempfile.NamedTemporaryFile(suffix='.plist')
207*6777b538SAndroid Build Coastguard Worker    partial_info_plist = temporary_file.name
208*6777b538SAndroid Build Coastguard Worker
209*6777b538SAndroid Build Coastguard Worker  command.extend(['--output-partial-info-plist', partial_info_plist])
210*6777b538SAndroid Build Coastguard Worker
211*6777b538SAndroid Build Coastguard Worker  # Dictionary used to convert absolute paths back to their relative form
212*6777b538SAndroid Build Coastguard Worker  # in the output of actool.
213*6777b538SAndroid Build Coastguard Worker  relative_paths = {}
214*6777b538SAndroid Build Coastguard Worker
215*6777b538SAndroid Build Coastguard Worker  # actool crashes if paths are relative, so convert input and output paths
216*6777b538SAndroid Build Coastguard Worker  # to absolute paths, and record the relative paths to fix them back when
217*6777b538SAndroid Build Coastguard Worker  # filtering the output.
218*6777b538SAndroid Build Coastguard Worker  absolute_output = os.path.abspath(output)
219*6777b538SAndroid Build Coastguard Worker  relative_paths[output] = absolute_output
220*6777b538SAndroid Build Coastguard Worker  relative_paths[os.path.dirname(output)] = os.path.dirname(absolute_output)
221*6777b538SAndroid Build Coastguard Worker  command.extend(['--compile', os.path.dirname(os.path.abspath(output))])
222*6777b538SAndroid Build Coastguard Worker
223*6777b538SAndroid Build Coastguard Worker  for relative_path in inputs:
224*6777b538SAndroid Build Coastguard Worker    absolute_path = os.path.abspath(relative_path)
225*6777b538SAndroid Build Coastguard Worker    relative_paths[absolute_path] = relative_path
226*6777b538SAndroid Build Coastguard Worker    command.append(absolute_path)
227*6777b538SAndroid Build Coastguard Worker
228*6777b538SAndroid Build Coastguard Worker  try:
229*6777b538SAndroid Build Coastguard Worker    # Run actool and redirect stdout and stderr to the same pipe (as actool
230*6777b538SAndroid Build Coastguard Worker    # is confused about what should go to stderr/stdout).
231*6777b538SAndroid Build Coastguard Worker    process = subprocess.Popen(command,
232*6777b538SAndroid Build Coastguard Worker                               stdout=subprocess.PIPE,
233*6777b538SAndroid Build Coastguard Worker                               stderr=subprocess.STDOUT)
234*6777b538SAndroid Build Coastguard Worker    stdout = process.communicate()[0].decode('utf-8')
235*6777b538SAndroid Build Coastguard Worker
236*6777b538SAndroid Build Coastguard Worker    # If the invocation of `actool` failed, copy all the compiler output to
237*6777b538SAndroid Build Coastguard Worker    # the standard error stream and exit. See https://crbug.com/1205775 for
238*6777b538SAndroid Build Coastguard Worker    # example of compilation that failed with no error message due to filter.
239*6777b538SAndroid Build Coastguard Worker    if process.returncode:
240*6777b538SAndroid Build Coastguard Worker      for line in stdout.splitlines():
241*6777b538SAndroid Build Coastguard Worker        fixed_line = FixAbsolutePathInLine(line, relative_paths)
242*6777b538SAndroid Build Coastguard Worker        sys.stderr.write(fixed_line + '\n')
243*6777b538SAndroid Build Coastguard Worker      sys.exit(1)
244*6777b538SAndroid Build Coastguard Worker
245*6777b538SAndroid Build Coastguard Worker    # Filter the output to remove all garbage and to fix the paths. If the
246*6777b538SAndroid Build Coastguard Worker    # output is not empty after filtering, then report the compilation as a
247*6777b538SAndroid Build Coastguard Worker    # failure (as some version of `actool` report error to stdout, yet exit
248*6777b538SAndroid Build Coastguard Worker    # with an return code of zero).
249*6777b538SAndroid Build Coastguard Worker    stdout = FilterCompilerOutput(stdout, relative_paths)
250*6777b538SAndroid Build Coastguard Worker    if stdout:
251*6777b538SAndroid Build Coastguard Worker      sys.stderr.write(stdout)
252*6777b538SAndroid Build Coastguard Worker      sys.exit(1)
253*6777b538SAndroid Build Coastguard Worker
254*6777b538SAndroid Build Coastguard Worker  finally:
255*6777b538SAndroid Build Coastguard Worker    if temporary_file:
256*6777b538SAndroid Build Coastguard Worker      temporary_file.close()
257*6777b538SAndroid Build Coastguard Worker
258*6777b538SAndroid Build Coastguard Worker
259*6777b538SAndroid Build Coastguard Workerdef Main():
260*6777b538SAndroid Build Coastguard Worker  parser = argparse.ArgumentParser(
261*6777b538SAndroid Build Coastguard Worker      description='compile assets catalog for a bundle')
262*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--platform',
263*6777b538SAndroid Build Coastguard Worker                      '-p',
264*6777b538SAndroid Build Coastguard Worker                      required=True,
265*6777b538SAndroid Build Coastguard Worker                      choices=('mac', 'ios'),
266*6777b538SAndroid Build Coastguard Worker                      help='target platform for the compiled assets catalog')
267*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--target-environment',
268*6777b538SAndroid Build Coastguard Worker                      '-e',
269*6777b538SAndroid Build Coastguard Worker                      default='',
270*6777b538SAndroid Build Coastguard Worker                      choices=('simulator', 'device', 'catalyst'),
271*6777b538SAndroid Build Coastguard Worker                      help='target environment for the compiled assets catalog')
272*6777b538SAndroid Build Coastguard Worker  parser.add_argument(
273*6777b538SAndroid Build Coastguard Worker      '--minimum-deployment-target',
274*6777b538SAndroid Build Coastguard Worker      '-t',
275*6777b538SAndroid Build Coastguard Worker      required=True,
276*6777b538SAndroid Build Coastguard Worker      help='minimum deployment target for the compiled assets catalog')
277*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--output',
278*6777b538SAndroid Build Coastguard Worker                      '-o',
279*6777b538SAndroid Build Coastguard Worker                      required=True,
280*6777b538SAndroid Build Coastguard Worker                      help='path to the compiled assets catalog')
281*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--compress-pngs',
282*6777b538SAndroid Build Coastguard Worker                      '-c',
283*6777b538SAndroid Build Coastguard Worker                      action='store_true',
284*6777b538SAndroid Build Coastguard Worker                      default=False,
285*6777b538SAndroid Build Coastguard Worker                      help='recompress PNGs while compiling assets catalog')
286*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--product-type',
287*6777b538SAndroid Build Coastguard Worker                      '-T',
288*6777b538SAndroid Build Coastguard Worker                      help='type of the containing bundle')
289*6777b538SAndroid Build Coastguard Worker  parser.add_argument('--partial-info-plist',
290*6777b538SAndroid Build Coastguard Worker                      '-P',
291*6777b538SAndroid Build Coastguard Worker                      help='path to partial info plist to create')
292*6777b538SAndroid Build Coastguard Worker  parser.add_argument('inputs',
293*6777b538SAndroid Build Coastguard Worker                      nargs='+',
294*6777b538SAndroid Build Coastguard Worker                      help='path to input assets catalog sources')
295*6777b538SAndroid Build Coastguard Worker  args = parser.parse_args()
296*6777b538SAndroid Build Coastguard Worker
297*6777b538SAndroid Build Coastguard Worker  if os.path.basename(args.output) != 'Assets.car':
298*6777b538SAndroid Build Coastguard Worker    sys.stderr.write('output should be path to compiled asset catalog, not '
299*6777b538SAndroid Build Coastguard Worker                     'to the containing bundle: %s\n' % (args.output, ))
300*6777b538SAndroid Build Coastguard Worker    sys.exit(1)
301*6777b538SAndroid Build Coastguard Worker
302*6777b538SAndroid Build Coastguard Worker  if os.path.exists(args.output):
303*6777b538SAndroid Build Coastguard Worker    if os.path.isfile(args.output):
304*6777b538SAndroid Build Coastguard Worker      os.unlink(args.output)
305*6777b538SAndroid Build Coastguard Worker    else:
306*6777b538SAndroid Build Coastguard Worker      shutil.rmtree(args.output)
307*6777b538SAndroid Build Coastguard Worker
308*6777b538SAndroid Build Coastguard Worker  with tempfile.TemporaryDirectory() as temporary_dir:
309*6777b538SAndroid Build Coastguard Worker    CompileAssetCatalog(args.output, args.platform, args.target_environment,
310*6777b538SAndroid Build Coastguard Worker                        args.product_type, args.minimum_deployment_target,
311*6777b538SAndroid Build Coastguard Worker                        args.inputs, args.compress_pngs,
312*6777b538SAndroid Build Coastguard Worker                        args.partial_info_plist, temporary_dir)
313*6777b538SAndroid Build Coastguard Worker
314*6777b538SAndroid Build Coastguard Worker
315*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__':
316*6777b538SAndroid Build Coastguard Worker  sys.exit(Main())
317