| # 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, []))) |