blob: afce2c9dd9729c3a17b5e4dc172516191bcdd78a [file] [log] [blame]
# Copyright 2018 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.
"""Functions to use fixed xcode installations.
The cost of installing xcode from cold caches is prohibitely high for the
Flutter Devicelab tasks. This module provide functions to use semi-hermetic
Xcode installations pre-installed on Devicelab bots.
XCode build version number. Internally maps to an XCode build id like '9c40b'.
See:
https://chrome-infra-packages.appspot.com/p/flutter_internal/ios/xcode/mac/+/
for an up to date list of the latest SDK builds.
"""
from contextlib import contextmanager
from recipe_engine import recipe_api
class DevicelabOSXSDKApi(recipe_api.RecipeApi):
"""API for using OS X SDK distributed via CIPD."""
def __init__(self, sdk_properties, *args, **kwargs):
super(DevicelabOSXSDKApi, self).__init__(*args, **kwargs)
self._sdk_properties = sdk_properties
self._sdk_version = None
self._tool_pkg = 'infra/tools/mac_toolchain/${platform}'
self._tool_ver = 'latest'
def initialize(self):
"""Initializes xcode, and ios versions.
Versions are passed as recipe properties.
"""
if not self.m.platform.is_mac:
return
if 'sdk_version' in self._sdk_properties:
self._sdk_version = self._sdk_properties['sdk_version'].lower()
@contextmanager
def __call__(self, kind):
"""Sets up the XCode SDK environment.
Is a no-op on non-mac platforms.
This will deploy the helper tool and the XCode.app bundle at
`/opt/flutter/xcode/<version>`.
Usage:
with api.devicelab_osx_sdk('mac'):
# sdk with mac build bits
with api.devicelab_osx_sdk('ios'):
# sdk with mac+iOS build bits
Args:
kind ('mac'|'ios'): How the SDK should be configured. iOS includes the
base XCode distribution, as well as the iOS simulators (which can be
quite large).
Raises:
StepFailure or InfraFailure.
"""
assert kind in ('mac', 'ios'), 'Invalid kind %r' % (kind,)
if not self.m.platform.is_mac:
yield
return
try:
with self.m.context(infra_steps=True):
app = '/opt/flutter/xcode/%s/XCode.app' % self._sdk_version
self._ensure_sdk(kind, app)
self.m.step('select XCode', ['sudo', 'xcode-select', '--switch', app])
self.m.step('list simulators', ['xcrun', 'simctl', 'list'])
yield
finally:
with self.m.context(infra_steps=True):
self.m.step('reset XCode', ['sudo', 'xcode-select', '--reset'])
def _ensure_sdk(self, kind, app):
"""Ensures the mac_toolchain tool and OS X SDK packages are installed."""
tool_dir = self.m.path.mkdtemp().join('osx_sdk')
ef = self.m.cipd.EnsureFile()
ef.add_package(self._tool_pkg, self._tool_ver)
self.m.cipd.ensure(tool_dir, ef)
self.m.step(
'install xcode', [
tool_dir.join('mac_toolchain'),
'install',
'-kind',
kind,
'-xcode-version',
self._sdk_version,
'-output-dir',
app,
'-cipd-package-prefix',
'flutter_internal/ios/xcode',
]
)