[osx_sdk] Add mac_toolchain based osx_sdk module.
R=hinoka@chromium.org, nodir@chromium.org, sergeyberezin@chromium.org Change-Id: I92a6675a7fa81987667edb8c7189c2e827f62732 Reviewed-on: https://chromium-review.googlesource.com/1168652 Reviewed-by: Sergey Berezin <sergeyberezin@chromium.org> Reviewed-by: Ryan Tseng <hinoka@chromium.org> Commit-Queue: Robbie Iannucci <iannucci@chromium.org>changes/52/1168652/4
parent
15a5a77db4
commit
61110ec711
@ -0,0 +1,40 @@
|
|||||||
|
# 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.
|
||||||
|
|
||||||
|
DEPS = [
|
||||||
|
'recipe_engine/cipd',
|
||||||
|
'recipe_engine/context',
|
||||||
|
'recipe_engine/json',
|
||||||
|
'recipe_engine/path',
|
||||||
|
'recipe_engine/platform',
|
||||||
|
'recipe_engine/step',
|
||||||
|
]
|
||||||
|
|
||||||
|
from recipe_engine.recipe_api import Property
|
||||||
|
from recipe_engine.config import ConfigGroup, Single
|
||||||
|
|
||||||
|
PROPERTIES = {
|
||||||
|
'$depot_tools/osx_sdk': Property(
|
||||||
|
help='Properties specifically for the infra osx_sdk module.',
|
||||||
|
param_name='sdk_properties',
|
||||||
|
kind=ConfigGroup( # pylint: disable=line-too-long
|
||||||
|
# XCode build version number. Internally maps to an XCode build id like
|
||||||
|
# '9c40b'. See
|
||||||
|
#
|
||||||
|
# https://chrome-infra-packages.appspot.com/p/infra_internal/ios/xcode/mac/+/
|
||||||
|
#
|
||||||
|
# For an up to date list of the latest SDK builds.
|
||||||
|
sdk_version=Single(str),
|
||||||
|
|
||||||
|
# The CIPD toolchain tool package and version
|
||||||
|
toolchain_pkg=Single(str),
|
||||||
|
toolchain_ver=Single(str),
|
||||||
|
), default={
|
||||||
|
'sdk_version': '9c40b',
|
||||||
|
|
||||||
|
'toolchain_pkg': 'infra/tools/mac_toolchain/${platform}',
|
||||||
|
'toolchain_ver': 'git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a',
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
@ -0,0 +1,104 @@
|
|||||||
|
# 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.
|
||||||
|
|
||||||
|
"""The `osx_sdk` module provides safe functions to access a semi-hermetic
|
||||||
|
XCode installation.
|
||||||
|
|
||||||
|
Available only to Google-run bots."""
|
||||||
|
|
||||||
|
from contextlib import contextmanager
|
||||||
|
|
||||||
|
from recipe_engine import recipe_api
|
||||||
|
|
||||||
|
|
||||||
|
class OSXSDKApi(recipe_api.RecipeApi):
|
||||||
|
"""API for using OS X SDK distributed via CIPD."""
|
||||||
|
|
||||||
|
def __init__(self, sdk_properties, *args, **kwargs):
|
||||||
|
super(OSXSDKApi, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
self._sdk_version = sdk_properties['sdk_version'].lower()
|
||||||
|
self._tool_pkg = sdk_properties['toolchain_pkg']
|
||||||
|
self._tool_ver = sdk_properties['toolchain_ver']
|
||||||
|
|
||||||
|
@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
|
||||||
|
`[START_DIR]/cache/osx_sdk`.
|
||||||
|
|
||||||
|
To avoid machines rebuilding these on every run, set up a named cache in
|
||||||
|
your cr-buildbucket.cfg file like:
|
||||||
|
|
||||||
|
caches: {
|
||||||
|
# Cache for mac_toolchain tool and XCode.app
|
||||||
|
name: "osx_sdk"
|
||||||
|
path: "osx_sdk"
|
||||||
|
}
|
||||||
|
|
||||||
|
If you have builders which e.g. use a non-current SDK, you can give them
|
||||||
|
a uniqely named cache:
|
||||||
|
|
||||||
|
caches: {
|
||||||
|
# Cache for N-1 version mac_toolchain tool and XCode.app
|
||||||
|
name: "osx_sdk_old"
|
||||||
|
path: "osx_sdk"
|
||||||
|
}
|
||||||
|
|
||||||
|
Similarly, if you have mac and iOS builders you may want to distinguish the
|
||||||
|
cache name by adding '_ios' to it. However, if you're sharing the same bots
|
||||||
|
for both mac and iOS, consider having a single cache and just always
|
||||||
|
fetching the iOS version. This will lead to lower overall disk utilization
|
||||||
|
and should help to reduce cache thrashing.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
with api.osx_sdk('mac'):
|
||||||
|
# sdk with mac build bits
|
||||||
|
|
||||||
|
with api.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 = self._ensure_sdk(kind)
|
||||||
|
self.m.step('select XCode', ['sudo', 'xcode-select', '--switch', app])
|
||||||
|
yield
|
||||||
|
finally:
|
||||||
|
with self.m.context(infra_steps=True):
|
||||||
|
self.m.step('reset XCode', ['sudo', 'xcode-select', '--reset'])
|
||||||
|
|
||||||
|
def _ensure_sdk(self, kind):
|
||||||
|
"""Ensures the mac_toolchain tool and OS X SDK packages are installed.
|
||||||
|
|
||||||
|
Returns Path to the installed sdk app bundle."""
|
||||||
|
cache_dir = self.m.path['cache'].join('osx_sdk')
|
||||||
|
|
||||||
|
ef = self.m.cipd.EnsureFile()
|
||||||
|
ef.add_package(self._tool_pkg, self._tool_ver)
|
||||||
|
self.m.cipd.ensure(cache_dir, ef)
|
||||||
|
|
||||||
|
sdk_app = cache_dir.join('XCode.app')
|
||||||
|
self.m.step('install xcode', [
|
||||||
|
cache_dir.join('mac_toolchain'), 'install',
|
||||||
|
'-kind', kind,
|
||||||
|
'-xcode-version', self._sdk_version,
|
||||||
|
'-output-dir', sdk_app,
|
||||||
|
])
|
||||||
|
return sdk_app
|
@ -0,0 +1,23 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"cmd": [
|
||||||
|
"gn",
|
||||||
|
"gen",
|
||||||
|
"out/Release"
|
||||||
|
],
|
||||||
|
"name": "gn"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmd": [
|
||||||
|
"ninja",
|
||||||
|
"-C",
|
||||||
|
"out/Release"
|
||||||
|
],
|
||||||
|
"name": "ninja"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "$result",
|
||||||
|
"recipe_result": null,
|
||||||
|
"status_code": 0
|
||||||
|
}
|
||||||
|
]
|
@ -0,0 +1,83 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"cmd": [
|
||||||
|
"cipd",
|
||||||
|
"ensure",
|
||||||
|
"-root",
|
||||||
|
"[CACHE]/osx_sdk",
|
||||||
|
"-ensure-file",
|
||||||
|
"infra/tools/mac_toolchain/${platform} git_revision:796d2b92cff93fc2059623ce0a66284373ceea0a",
|
||||||
|
"-json-output",
|
||||||
|
"/path/to/tmp/json"
|
||||||
|
],
|
||||||
|
"infra_step": true,
|
||||||
|
"name": "ensure_installed",
|
||||||
|
"~followup_annotations": [
|
||||||
|
"@@@STEP_LOG_LINE@json.output@{@@@",
|
||||||
|
"@@@STEP_LOG_LINE@json.output@ \"result\": {@@@",
|
||||||
|
"@@@STEP_LOG_LINE@json.output@ \"\": [@@@",
|
||||||
|
"@@@STEP_LOG_LINE@json.output@ {@@@",
|
||||||
|
"@@@STEP_LOG_LINE@json.output@ \"instance_id\": \"resolved-instance_id-of-git_revision:796\", @@@",
|
||||||
|
"@@@STEP_LOG_LINE@json.output@ \"package\": \"infra/tools/mac_toolchain/${platform}\"@@@",
|
||||||
|
"@@@STEP_LOG_LINE@json.output@ }@@@",
|
||||||
|
"@@@STEP_LOG_LINE@json.output@ ]@@@",
|
||||||
|
"@@@STEP_LOG_LINE@json.output@ }@@@",
|
||||||
|
"@@@STEP_LOG_LINE@json.output@}@@@",
|
||||||
|
"@@@STEP_LOG_END@json.output@@@"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmd": [
|
||||||
|
"[CACHE]/osx_sdk/mac_toolchain",
|
||||||
|
"install",
|
||||||
|
"-kind",
|
||||||
|
"mac",
|
||||||
|
"-xcode-version",
|
||||||
|
"9c40b",
|
||||||
|
"-output-dir",
|
||||||
|
"[CACHE]/osx_sdk/XCode.app"
|
||||||
|
],
|
||||||
|
"infra_step": true,
|
||||||
|
"name": "install xcode"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmd": [
|
||||||
|
"sudo",
|
||||||
|
"xcode-select",
|
||||||
|
"--switch",
|
||||||
|
"[CACHE]/osx_sdk/XCode.app"
|
||||||
|
],
|
||||||
|
"infra_step": true,
|
||||||
|
"name": "select XCode"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmd": [
|
||||||
|
"gn",
|
||||||
|
"gen",
|
||||||
|
"out/Release"
|
||||||
|
],
|
||||||
|
"name": "gn"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmd": [
|
||||||
|
"ninja",
|
||||||
|
"-C",
|
||||||
|
"out/Release"
|
||||||
|
],
|
||||||
|
"name": "ninja"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmd": [
|
||||||
|
"sudo",
|
||||||
|
"xcode-select",
|
||||||
|
"--reset"
|
||||||
|
],
|
||||||
|
"infra_step": true,
|
||||||
|
"name": "reset XCode"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "$result",
|
||||||
|
"recipe_result": null,
|
||||||
|
"status_code": 0
|
||||||
|
}
|
||||||
|
]
|
@ -0,0 +1,23 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"cmd": [
|
||||||
|
"gn",
|
||||||
|
"gen",
|
||||||
|
"out/Release"
|
||||||
|
],
|
||||||
|
"name": "gn"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmd": [
|
||||||
|
"ninja",
|
||||||
|
"-C",
|
||||||
|
"out/Release"
|
||||||
|
],
|
||||||
|
"name": "ninja"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "$result",
|
||||||
|
"recipe_result": null,
|
||||||
|
"status_code": 0
|
||||||
|
}
|
||||||
|
]
|
@ -0,0 +1,23 @@
|
|||||||
|
# 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.
|
||||||
|
|
||||||
|
DEPS = [
|
||||||
|
'osx_sdk',
|
||||||
|
'recipe_engine/platform',
|
||||||
|
'recipe_engine/properties',
|
||||||
|
'recipe_engine/step',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def RunSteps(api):
|
||||||
|
with api.osx_sdk('mac'):
|
||||||
|
api.step('gn', ['gn', 'gen', 'out/Release'])
|
||||||
|
api.step('ninja', ['ninja', '-C', 'out/Release'])
|
||||||
|
|
||||||
|
|
||||||
|
def GenTests(api):
|
||||||
|
for platform in ('linux', 'mac', 'win'):
|
||||||
|
yield (api.test(platform) +
|
||||||
|
api.platform.name(platform) +
|
||||||
|
api.properties.generic(buildername='test_builder'))
|
Loading…
Reference in New Issue