140 lines
3.4 KiB
Python
140 lines
3.4 KiB
Python
# 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
|