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