You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.4 KiB
139 lines
3.4 KiB
# Copyright (c) 2022 Nordic Semiconductor ASA |
|
# |
|
# SPDX-License-Identifier: Apache-2.0 |
|
|
|
'''Domain handling for west extension commands. |
|
|
|
This provides parsing of domains yaml file and creation of objects of the |
|
Domain class. |
|
''' |
|
|
|
import yaml |
|
import pykwalify.core |
|
from west import log |
|
|
|
DOMAINS_SCHEMA = ''' |
|
## A pykwalify schema for basic validation of the structure of a |
|
## domains YAML file. |
|
## |
|
# The domains.yaml file is a simple list of domains from a multi image build |
|
# along with the default domain to use. |
|
type: map |
|
mapping: |
|
default: |
|
required: true |
|
type: str |
|
build_dir: |
|
required: true |
|
type: str |
|
domains: |
|
required: false |
|
type: seq |
|
sequence: |
|
- type: map |
|
mapping: |
|
name: |
|
required: true |
|
type: str |
|
build_dir: |
|
required: true |
|
type: str |
|
''' |
|
|
|
schema = yaml.safe_load(DOMAINS_SCHEMA) |
|
|
|
|
|
class Domains: |
|
|
|
def __init__(self, data): |
|
self._domains = [] |
|
self._domain_names = [] |
|
self._domain_default = [] |
|
|
|
self._build_dir = data.get('build_dir') |
|
domain_list = data.get('domains') |
|
if not domain_list: |
|
log.wrn("no domains defined; this probably won't work") |
|
|
|
for d in domain_list: |
|
domain = Domain(d['name'], d['build_dir']) |
|
self._domains.append(domain) |
|
self._domain_names.append(domain.name) |
|
if domain.name == data['default']: |
|
self._default_domain = domain |
|
|
|
@staticmethod |
|
def from_file(domains_file): |
|
'''Load domains from domains.yaml. |
|
|
|
Exception raised: |
|
- ``FileNotFoundError`` if the domains file is not found. |
|
''' |
|
try: |
|
with open(domains_file, 'r') as f: |
|
domains = yaml.safe_load(f.read()) |
|
except FileNotFoundError: |
|
log.die(f'domains.yaml file not found: {domains_file}') |
|
|
|
try: |
|
pykwalify.core.Core(source_data=domains, schema_data=schema)\ |
|
.validate() |
|
except pykwalify.errors.SchemaError: |
|
log.die(f'ERROR: Malformed yaml in file: {domains_file}') |
|
|
|
return Domains(domains) |
|
|
|
@staticmethod |
|
def from_data(domains_data): |
|
'''Load domains from domains dictionary. |
|
''' |
|
return Domains(domains_data) |
|
|
|
def get_domains(self, names=None): |
|
ret = [] |
|
|
|
if not names: |
|
return self._domains |
|
|
|
for n in names: |
|
found = False |
|
for d in self._domains: |
|
if n == d.name: |
|
ret.append(d) |
|
found = True |
|
break |
|
# Getting here means the domain was not found. |
|
# Todo: throw an error. |
|
if not found: |
|
log.die(f'domain {n} not found, ' |
|
f'valid domains are:', *self._domain_names) |
|
return ret |
|
|
|
def get_default_domain(self): |
|
return self._default_domain |
|
|
|
def get_top_build_dir(self): |
|
return self._build_dir |
|
|
|
|
|
class Domain: |
|
|
|
def __init__(self, name, build_dir): |
|
self.name = name |
|
self.build_dir = build_dir |
|
|
|
@property |
|
def name(self): |
|
return self._name |
|
|
|
@name.setter |
|
def name(self, value): |
|
self._name = value |
|
|
|
@property |
|
def build_dir(self): |
|
return self._build_dir |
|
|
|
@build_dir.setter |
|
def build_dir(self, value): |
|
self._build_dir = value
|
|
|