blob: e27308c40cdcac21f010c01c2f0fc97f134ec821 [file] [log] [blame]
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Recipe for building and publishing fastboot to CIPD."""
import os
DEPS = [
'fuchsia/buildbucket_util',
'fuchsia/git',
'fuchsia/macos_sdk',
'fuchsia/upload',
'recipe_engine/buildbucket',
'recipe_engine/cipd',
'recipe_engine/context',
'recipe_engine/file',
'recipe_engine/isolated',
'recipe_engine/path',
'recipe_engine/platform',
'recipe_engine/raw_io',
'recipe_engine/step',
]
ANDROID_SOURCE_REPO = 'https://android.googlesource.com/platform/manifest'
ANDROID_SOURCE_BRANCH = 'platform-tools-29.0.4'
FASTBOOT_CIPD_NAME = 'fuchsia/third_party/fastboot/${platform}'
REPO_CIPD_PKG = ('fuchsia/third_party/repo', 'version:1.13.2', 'repo')
# The source file that checks whether the host filesystem is case-sensitive,
# a fails if not, along with the pattern that matches the invocation of that
# check within.
FILE_WITH_CASE_SENSITIVITY_CHECK = ('build', 'soong', 'ui', 'build', 'build.go')
CASE_SENSITIVITY_CHECK_PATTERN = 'checkCaseSensitivity(ctx, config)'
def RunSteps(api):
cipd_dir = api.path['start_dir'].join('cipd')
pkgs = api.cipd.EnsureFile()
pkgs.add_package(*REPO_CIPD_PKG)
api.cipd.ensure(cipd_dir, pkgs)
repo_dir = cipd_dir.join('repo')
src_dir = api.path['start_dir'].join('android', 'src')
api.file.ensure_directory('ensure source directory', src_dir)
with api.context(cwd=src_dir):
api.step('repo init', [
repo_dir.join('repo'),
'init',
'-u', ANDROID_SOURCE_REPO,
'-b', ANDROID_SOURCE_BRANCH,
]) # yapf: disable
api.step('repo sync', [
repo_dir.join('repo'),
'sync',
'-j%d' % api.platform.cpu_count,
]) # yapf: disable
if api.platform.is_mac:
with api.step.nest('disable case-sensitivity check'):
# Necessary hack! Disable the check so that we can build on macs.
case_checking_file = src_dir.join(*FILE_WITH_CASE_SENSITIVITY_CHECK)
relpath = os.sep.join(FILE_WITH_CASE_SENSITIVITY_CHECK)
contents = api.file.read_text(
'read in %s' % relpath,
case_checking_file,
test_data='blah\n%s\nblah' % CASE_SENSITIVITY_CHECK_PATTERN)
contents = contents.replace(CASE_SENSITIVITY_CHECK_PATTERN, '')
api.file.write_text('write back to %s' % relpath, case_checking_file,
contents)
fastboot_dir = src_dir.join('system', 'core', 'fastboot')
with api.context(cwd=fastboot_dir):
repository = api.git.get_remote_url('aosp')
revision = api.git.get_hash()
out_dir = api.path.mkdtemp('fastboot').join('out')
with api.macos_sdk(), api.context(cwd=src_dir, env={'OUT_DIR': out_dir}):
# Soong is a work-in-progress build system that works well enough to build
# fastboot alone.
# (See https://source.android.com/setup/build#what_is_soong.)
# We can bootstrap everything needed to invoke soong through the 'soong_ui'
# bash script.
soong_ui_script = src_dir.join('build', 'soong', 'soong_ui.bash')
android_host_os = {
'linux': 'linux',
'mac': 'darwin',
}[api.platform.name]
android_host_arch = {
'intel': {
64: 'x86',
}
}[api.platform.arch][api.platform.bits]
android_host_platform = '%s-%s' % (android_host_os, android_host_arch)
out_bin_dir = out_dir.join('host', android_host_platform, 'bin')
fastboot = out_bin_dir.join('fastboot')
api.step('build fastboot', [soong_ui_script, '--make-mode', fastboot])
upload_paths = [api.upload.FilePath(fastboot)]
if api.buildbucket_util.is_tryjob:
api.upload.upload_isolated(out_bin_dir, upload_paths=upload_paths)
else:
api.upload.cipd_package(
FASTBOOT_CIPD_NAME,
out_bin_dir,
upload_paths,
search_tag={'git_revision': revision},
extra_tags={'git_branch': ANDROID_SOURCE_BRANCH},
repository=repository,
)
def GenTests(api):
revision = 'a' * 40
ci_build = api.buildbucket.ci_build(
project='android',
bucket='ci',
git_repo='https://android.googlesource.com/platform/system/core',
revision=revision,
)
try_build = api.buildbucket.try_build(
project='android',
bucket='try',
git_repo='https://android.googlesource.com/platform/system/core',
revision=revision,
)
for os in ('linux', 'mac'):
yield api.test('try-%s' % os) + try_build + api.platform.name(os)
yield (api.test('ci-%s-cipd_pkg_exists' % os) + ci_build +
api.platform.name(os))
yield (api.test('ci-%s-cipd_pkg_new' % os) + ci_build +
api.step_data('git rev-parse', api.raw_io.stream_output(revision)) +
api.platform.name(os) + api.step_data(
'cipd.cipd search %s git_revision:%s' %
(FASTBOOT_CIPD_NAME, revision),
api.cipd.example_search(FASTBOOT_CIPD_NAME, [])))