diff --git a/scripts/pylib/build_helpers/domains.py b/scripts/pylib/build_helpers/domains.py index c748a94a14f..8cacac7b4e8 100644 --- a/scripts/pylib/build_helpers/domains.py +++ b/scripts/pylib/build_helpers/domains.py @@ -38,6 +38,11 @@ mapping: build_dir: required: true type: str + flash_order: + required: false + type: seq + sequence: + - type: str ''' schema = yaml.safe_load(DOMAINS_SCHEMA) @@ -52,21 +57,19 @@ logger.addHandler(handler) 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') + domain_list = data.get('domains') or [] if not domain_list: logger.warning("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 + self._domains = { + d['name']: Domain(d['name'], d['build_dir']) + for d in domain_list + } + self._default_domain = self._domains.get(data['default']) + + domains_flash_order = data.get('flash_order') or [] + self._flash_order = list(map(self._domains.get, domains_flash_order)) @staticmethod def from_file(domains_file): @@ -97,25 +100,21 @@ class Domains: ''' return Domains(domains_data) - def get_domains(self, names=None): + def get_domains(self, names=None, default_flash_order=False): ret = [] if not names: - return self._domains + if default_flash_order: + return self._flash_order + return list(self._domains.values()) 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. + found = self._domains.get(n) if not found: logger.critical(f'domain {n} not found, ' - f'valid domains are:', *self._domain_names) + f'valid domains are: {", ".join(self._domains)}') exit(1) + ret.append(found) return ret def get_default_domain(self): diff --git a/scripts/west_commands/build_helpers.py b/scripts/west_commands/build_helpers.py index e4352ff1f28..88845e50f4b 100644 --- a/scripts/west_commands/build_helpers.py +++ b/scripts/west_commands/build_helpers.py @@ -153,6 +153,7 @@ def load_domains(path): if not domains_file.is_file(): return Domains.from_data({'default': 'app', 'build_dir': path, - 'domains': [{'name': 'app', 'build_dir': path}]}) + 'domains': [{'name': 'app', 'build_dir': path}], + 'flash_order': ['app']}) return Domains.from_file(domains_file) diff --git a/scripts/west_commands/flash.py b/scripts/west_commands/flash.py index 073a1ab2a28..4f173535be8 100644 --- a/scripts/west_commands/flash.py +++ b/scripts/west_commands/flash.py @@ -28,5 +28,6 @@ class Flash(WestCommand): def do_run(self, my_args, runner_args): build_dir = get_build_dir(my_args) - domains = load_domains(build_dir).get_domains(my_args.domain) + domains = load_domains(build_dir).get_domains(my_args.domain, + default_flash_order=True) do_run_common(self, my_args, runner_args, domains=domains) diff --git a/share/sysbuild/cmake/domains.cmake b/share/sysbuild/cmake/domains.cmake index c46d261aff2..1d197059bf1 100644 --- a/share/sysbuild/cmake/domains.cmake +++ b/share/sysbuild/cmake/domains.cmake @@ -7,12 +7,13 @@ sysbuild_images_order(IMAGES_FLASHING_ORDER FLASH IMAGES ${IMAGES}) set(domains_yaml "default: ${DEFAULT_IMAGE}") set(domains_yaml "${domains_yaml}\nbuild_dir: ${CMAKE_BINARY_DIR}") set(domains_yaml "${domains_yaml}\ndomains:") -foreach(image ${IMAGES_FLASHING_ORDER}) - get_target_property(image_is_build_only ${image} BUILD_ONLY) - if(image_is_build_only) - continue() - endif() +foreach(image ${IMAGES}) set(domains_yaml "${domains_yaml}\n - name: ${image}") set(domains_yaml "${domains_yaml}\n build_dir: $") endforeach() +set(domains_yaml "${domains_yaml}\nflash_order:") +foreach(image ${IMAGES_FLASHING_ORDER}) + set(flash_cond "$>>") + set(domains_yaml "${domains_yaml}$<${flash_cond}:\n - ${image}>") +endforeach() file(GENERATE OUTPUT ${CMAKE_BINARY_DIR}/domains.yaml CONTENT "${domains_yaml}")