scripts: enforce module name uniqueness

Although CMake scripts already support duplicated module
names, if two modules with the same name provide different
Kconfig files, then both files will be loaded leading to
potential conflicts.

Modify zephyr_module.py to enforce that all modules are
uniquely named so that it is possbile to override some of
the built-in modules using ZEPHYR_EXTRA_MODULES variable.

Signed-off-by: Damian Krolik <damian.krolik@nordicsemi.no>
This commit is contained in:
Damian Krolik 2022-03-01 18:36:16 +01:00 committed by Anas Nashif
commit a505148d2f
2 changed files with 11 additions and 10 deletions

View file

@ -146,7 +146,3 @@ else()
) )
endif() endif()
if(DEFINED ZEPHYR_MODULE_NAMES)
list(REMOVE_DUPLICATES ZEPHYR_MODULE_NAMES)
endif()

View file

@ -396,6 +396,8 @@ def parse_modules(zephyr_base, modules=None, extra_modules=None):
extra_modules = [] extra_modules = []
Module = namedtuple('Module', ['project', 'meta', 'depends']) Module = namedtuple('Module', ['project', 'meta', 'depends'])
all_modules_by_name = {}
# dep_modules is a list of all modules that has an unresolved dependency # dep_modules is a list of all modules that has an unresolved dependency
dep_modules = [] dep_modules = []
# start_modules is a list modules with no depends left (no incoming edge) # start_modules is a list modules with no depends left (no incoming edge)
@ -410,16 +412,19 @@ def parse_modules(zephyr_base, modules=None, extra_modules=None):
meta = process_module(project) meta = process_module(project)
if meta: if meta:
section = meta.get('build', dict()) depends = meta.get('build', {}).get('depends', [])
deps = section.get('depends', []) all_modules_by_name[meta['name']] = Module(project, meta, depends)
if not deps:
start_modules.append(Module(project, meta, []))
else:
dep_modules.append(Module(project, meta, deps))
elif project in extra_modules: elif project in extra_modules:
sys.exit(f'{project}, given in ZEPHYR_EXTRA_MODULES, ' sys.exit(f'{project}, given in ZEPHYR_EXTRA_MODULES, '
'is not a valid zephyr module') 'is not a valid zephyr module')
for module in all_modules_by_name.values():
if not module.depends:
start_modules.append(module)
else:
dep_modules.append(module)
# This will do a topological sort to ensure the modules are ordered # This will do a topological sort to ensure the modules are ordered
# according to dependency settings. # according to dependency settings.
while start_modules: while start_modules: