summaryrefslogtreecommitdiff
path: root/zephyr/firmware_builder.py
diff options
context:
space:
mode:
Diffstat (limited to 'zephyr/firmware_builder.py')
-rwxr-xr-xzephyr/firmware_builder.py226
1 files changed, 0 insertions, 226 deletions
diff --git a/zephyr/firmware_builder.py b/zephyr/firmware_builder.py
deleted file mode 100755
index 446ad20bee..0000000000
--- a/zephyr/firmware_builder.py
+++ /dev/null
@@ -1,226 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-# Copyright 2021 The Chromium OS Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-"""Build and test all of the Zephyr boards.
-
-This is the entry point for the custom firmware builder workflow recipe.
-"""
-
-import argparse
-import multiprocessing
-import pathlib
-import subprocess
-import sys
-import zmake.project
-
-# TODO(crbug/1181505): Code outside of chromite should not be importing from
-# chromite.api.gen. Import json_format after that so we get the matching one.
-from chromite.api.gen.chromite.api import firmware_pb2
-from google.protobuf import json_format
-
-DEFAULT_BUNDLE_DIRECTORY = '/tmp/artifact_bundles'
-DEFAULT_BUNDLE_METADATA_FILE = '/tmp/artifact_bundle_metadata'
-
-
-def build(opts):
- """Builds all Zephyr firmware targets"""
- # TODO(b/169178847): Add appropriate metric information
- metrics = firmware_pb2.FwBuildMetricList()
- with open(opts.metrics, 'w') as f:
- f.write(json_format.MessageToJson(metrics))
-
- targets = [
- 'projects/kohaku',
- 'projects/posix-ec',
- 'projects/volteer/volteer',
- ]
- for target in targets:
- print('Building {}'.format(target))
- cmd = ['zmake', '-D', 'configure', '-b', target]
- rv = subprocess.run(cmd, cwd=pathlib.Path(__file__).parent).returncode
- if rv != 0:
- return rv
- return 0
-
-
-def bundle(opts):
- if opts.code_coverage:
- bundle_coverage(opts)
- else:
- bundle_firmware(opts)
-
-
-def get_bundle_dir(opts):
- """Get the directory for the bundle from opts or use the default.
-
- Also create the directory if it doesn't exist."""
- bundle_dir = (opts.output_dir
- if opts.output_dir else DEFAULT_BUNDLE_DIRECTORY)
- bundle_dir = pathlib.Path(bundle_dir)
- if not bundle_dir.is_dir():
- bundle_dir.mkdir()
- return bundle_dir
-
-
-def write_metadata(opts, info):
- """Write the metadata about the bundle."""
- bundle_metadata_file = (opts.metadata
- if opts.metadata else DEFAULT_BUNDLE_METADATA_FILE)
- with open(bundle_metadata_file, 'w') as f:
- f.write(json_format.MessageToJson(info))
-
-
-def bundle_coverage(opts):
- """Bundles the artifacts from code coverage into its own tarball."""
- info = firmware_pb2.FirmwareArtifactInfo()
- info.bcs_version_info.version_string = opts.bcs_version
- bundle_dir = get_bundle_dir(opts)
- zephyr_dir = pathlib.Path(__file__).parent
- platform_ec = zephyr_dir.resolve().parent
- build_dir = platform_ec / 'build/zephyr-coverage'
- tarball_name = 'coverage.tbz2'
- tarball_path = bundle_dir / tarball_name
- cmd = ['tar', 'cvfj', tarball_path, 'lcov.info']
- subprocess.run(cmd, cwd=build_dir, check=True)
- meta = info.objects.add()
- meta.file_name = tarball_name
- meta.lcov_info.type = firmware_pb2.FirmwareArtifactInfo.LcovTarballInfo.LcovType.LCOV
-
- write_metadata(opts, info)
-
-
-
-def bundle_firmware(opts):
- """Bundles the artifacts from each target into its own tarball."""
- info = firmware_pb2.FirmwareArtifactInfo()
- info.bcs_version_info.version_string = opts.bcs_version
- bundle_dir = get_bundle_dir(opts)
- zephyr_dir = pathlib.Path(__file__).parent
- platform_ec = zephyr_dir.resolve().parent
- for project in zmake.project.find_projects(zephyr_dir):
- build_dir = zmake.util.resolve_build_dir(platform_ec,
- project.project_dir, None)
- artifacts_dir = build_dir / 'output'
- # TODO(kmshelton): Remove once the build command does not rely
- # on a pre-defined list of targets.
- if not artifacts_dir.is_dir():
- continue
- project_identifier = '_'.join(
- project.project_dir.
- parts[project.project_dir.parts.index('projects') + 1:])
- tarball_name = '{}.firmware.tbz2'.format(project_identifier)
- tarball_path = bundle_dir.joinpath(tarball_name)
- cmd = ['tar', 'cvfj', tarball_path, '.']
- subprocess.run(cmd, cwd=artifacts_dir, check=True)
- meta = info.objects.add()
- meta.file_name = tarball_name
- meta.tarball_info.type = (
- firmware_pb2.FirmwareArtifactInfo.TarballInfo.FirmwareType.EC)
- # TODO(kmshelton): Populate the rest of metadata contents as it
- # gets defined in infra/proto/src/chromite/api/firmware.proto.
-
- write_metadata(opts, info)
-
-
-def test(opts):
- """Runs all of the unit tests for Zephyr firmware"""
- # TODO(b/169178847): Add appropriate metric information
- metrics = firmware_pb2.FwTestMetricList()
- with open(opts.metrics, 'w') as f:
- f.write(json_format.MessageToJson(metrics))
-
- zephyr_dir = pathlib.Path(__file__).parent.resolve()
-
- # Run zmake tests to ensure we have a fully working zmake before
- # proceeding.
- subprocess.run([zephyr_dir / 'zmake' / 'run_tests.sh'], check=True)
-
- subprocess.run(['zmake', '-D', 'testall'], check=True)
-
- # Run the test with coverage also, as sometimes they behave differently.
- platform_ec = zephyr_dir.parent
- build_dir = platform_ec / 'build/zephyr-coverage'
- return subprocess.run(
- ['zmake', '-D', 'coverage', build_dir], cwd=platform_ec).returncode
-
-
-def main(args):
- """Builds and tests all of the Zephyr targets and reports build metrics"""
- opts = parse_args(args)
-
- if not hasattr(opts, 'func'):
- print("Must select a valid sub command!")
- return -1
-
- # Run selected sub command function
- return opts.func(opts)
-
-
-def parse_args(args):
- parser = argparse.ArgumentParser(description=__doc__)
-
- parser.add_argument(
- '--cpus',
- default=multiprocessing.cpu_count(),
- help='The number of cores to use.',
- )
-
- parser.add_argument(
- '--metrics',
- dest='metrics',
- required=True,
- help='File to write the json-encoded MetricsList proto message.',
- )
-
- parser.add_argument(
- '--metadata',
- required=False,
- help=('Full pathname for the file in which to write build artifact '
- 'metadata.'),
- )
-
- parser.add_argument(
- '--output-dir',
- required=False,
- help=
- 'Full pathanme for the directory in which to bundle build artifacts.',
- )
-
- parser.add_argument(
- '--code-coverage',
- required=False,
- action='store_true',
- help='Build host-based unit tests for code coverage.',
- )
-
- parser.add_argument(
- '--bcs-version',
- dest='bcs_version',
- default='',
- required=False,
- # TODO(b/180008931): make this required=True.
- help='BCS version to include in metadata.',
- )
-
- # Would make this required=True, but not available until 3.7
- sub_cmds = parser.add_subparsers()
-
- build_cmd = sub_cmds.add_parser('build',
- help='Builds all firmware targets')
- build_cmd.set_defaults(func=build)
-
- build_cmd = sub_cmds.add_parser('bundle',
- help='Creates a tarball containing build '
- 'artifacts from all firmware targets')
- build_cmd.set_defaults(func=bundle)
-
- test_cmd = sub_cmds.add_parser('test', help='Runs all firmware unit tests')
- test_cmd.set_defaults(func=test)
-
- return parser.parse_args(args)
-
-
-if __name__ == '__main__':
- sys.exit(main(sys.argv[1:]))