106 строки
3.3 KiB
Python
106 строки
3.3 KiB
Python
# 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())
|