blob: ac0742eb56f7800656b3f229681b14ae0baaa531 [file] [log] [blame]
# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import os
import subprocess
import sys
def CompileXCAssets(
output, platform, product_type, min_deployment_target, inputs):
"""Compile the .xcassets bundles to an asset catalog using actool.
Args:
output: absolute path to the containing bundle
platform: the targetted platform
product_type: the bundle type
min_deployment_target: minimum deployment target
inputs: list of absolute paths to .xcassets bundles
"""
command = [
'xcrun', 'actool', '--output-format=human-readable-text',
'--compress-pngs', '--notices', '--warnings', '--errors',
'--platform', platform, '--minimum-deployment-target',
min_deployment_target,
]
if product_type != '':
command.extend(['--product-type', product_type])
if platform == 'macosx':
command.extend(['--target-device', 'mac'])
else:
command.extend(['--target-device', 'iphone', '--target-device', 'ipad'])
# actool crashes if paths are relative, so convert input and output paths
# to absolute paths.
command.extend(['--compile', os.path.dirname(os.path.abspath(output))])
command.extend(map(os.path.abspath, inputs))
# Run actool and redirect stdout and stderr to the same pipe (as actool
# is confused about what should go to stderr/stdout).
process = subprocess.Popen(
command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
stdout, _ = process.communicate()
if process.returncode:
sys.stderr.write(stdout)
sys.exit(process.returncode)
# In case of success, the output looks like the following:
# /* com.apple.actool.compilation-results */
# /Full/Path/To/Bundle.app/Assets.car
#
# Ignore any lines in the output matching those (last line is an empty line)
# and consider that the build failed if the output contains any other lines.
for line in stdout.splitlines():
if not line:
continue
if line == '/* com.apple.actool.compilation-results */':
continue
if line == os.path.abspath(output):
continue
sys.stderr.write(stdout)
sys.exit(1)
def Main():
parser = argparse.ArgumentParser(
description='compile assets catalog for a bundle')
parser.add_argument(
'--platform', '-p', required=True,
choices=('macosx', 'iphoneos', 'iphonesimulator'),
help='target platform for the compiled assets catalog')
parser.add_argument(
'--minimum-deployment-target', '-t', required=True,
help='minimum deployment target for the compiled assets catalog')
parser.add_argument(
'--output', '-o', required=True,
help='path to the compiled assets catalog')
parser.add_argument(
'--product-type', '-T',
help='type of the containing bundle')
parser.add_argument(
'inputs', nargs='+',
help='path to input assets catalog sources')
args = parser.parse_args()
if os.path.basename(args.output) != 'Assets.car':
sys.stderr.write(
'output should be path to compiled asset catalog, not '
'to the containing bundle: %s\n' % (args.output,))
sys.exit(1)
CompileXCAssets(
args.output,
args.platform,
args.product_type,
args.minimum_deployment_target,
args.inputs)
if __name__ == '__main__':
sys.exit(Main())