diff options
Diffstat (limited to 'pw_package/py/pw_package/packages/zephyr.py')
-rw-r--r-- | pw_package/py/pw_package/packages/zephyr.py | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/pw_package/py/pw_package/packages/zephyr.py b/pw_package/py/pw_package/packages/zephyr.py new file mode 100644 index 000000000..89646d711 --- /dev/null +++ b/pw_package/py/pw_package/packages/zephyr.py @@ -0,0 +1,142 @@ +# Copyright 2023 The Pigweed Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +"""Install and check status of Zephyr.""" +import importlib.resources +import json +import pathlib +import os +import subprocess +import sys +import tempfile + +from typing import Sequence + +import pw_env_setup.virtualenv_setup + +import pw_package.git_repo +import pw_package.package_manager + + +class Zephyr(pw_package.git_repo.GitRepo): + """Install and check status of Zephyr.""" + + def __init__(self, *args, **kwargs): + super().__init__( + *args, + name='zephyr', + url=( + 'https://pigweed.googlesource.com/third_party/' + 'github/zephyrproject-rtos/zephyr' + ), + commit='a6eef0ba3755f2530c5ce93524e5ac4f5be30194', # v3.5 release + **kwargs, + ) + + def info(self, path: pathlib.Path) -> Sequence[str]: + return ( + f'{self.name} installed in: {path}', + 'Enable by running "gn args out" and adding this line:', + f' dir_pw_third_party_zephyr = "{path}"', + ) + + @staticmethod + def __populate_download_cache_from_cipd(path: pathlib.Path) -> None: + """Check for Zephyr SDK in cipd""" + package_path = path.parent.resolve() + core_cache_path = package_path / 'zephyr_sdk' + core_cache_path.mkdir(parents=True, exist_ok=True) + + cipd_package_subpath = 'infra/3pp/tools/zephyr_sdk/${platform}' + + # Check if the zephyr_sdk cipd package is readable + with tempfile.NamedTemporaryFile( + prefix='cipd', delete=True + ) as temp_json: + temp_json_path = pathlib.Path(temp_json.name) + cipd_acl_check_command = [ + 'cipd', + 'acl-check', + cipd_package_subpath, + '-reader', + '-json-output', + str(temp_json_path), + ] + subprocess.run(cipd_acl_check_command, capture_output=True) + + # Return if no packages are readable. + if not temp_json_path.is_file(): + raise RuntimeError( + 'Failed to verify zephyr_sdk cipd package is readable.' + ) + result_text = temp_json_path.read_text() + result_dict = json.loads(result_text) + if 'result' not in result_dict: + raise RuntimeError( + 'Failed to verify zephyr_sdk cipd package is readable.' + ) + + # Initialize cipd + subprocess.check_call( + [ + 'cipd', + 'init', + '-force', + str(core_cache_path), + ] + ) + # Install the Zephyr SDK + subprocess.check_call( + [ + 'cipd', + 'install', + cipd_package_subpath, + '-root', + str(core_cache_path), + '-force', + ] + ) + # Setup Zephyr SDK + setup_file = 'setup.cmd' if os.name == 'nt' else 'setup.sh' + subprocess.check_call( + [ + str(core_cache_path / setup_file), + '-t', + 'all', + '-c', + '-h', + ] + ) + + def install(self, path: pathlib.Path) -> None: + super().install(path) + + self.__populate_download_cache_from_cipd(path) + with importlib.resources.path( + pw_env_setup.virtualenv_setup, 'constraint.list' + ) as constraint: + subprocess.check_call( + [ + sys.executable, + '-m', + 'pip', + 'install', + '-r', + f'{path}/scripts/requirements.txt', + '-c', + str(constraint), + ] + ) + + +pw_package.package_manager.register(Zephyr) |