scripts: zephyr_module: Skip writing output on no change

Skips updating files if the output already matches the file
contents, this prevents a random occurance whereby sysbuild
reconfigures itself after a reconfiguration for no known
discernable reason

Signed-off-by: Jamie McCrae <spam@helper3000.net>
This commit is contained in:
Jamie McCrae
2025-11-20 16:51:57 +00:00
committed by Anas Nashif
parent 7a9b4d3a5c
commit a4e2a38370

View File

@@ -830,6 +830,14 @@ def parse_modules(zephyr_base, manifest=None, west_projs=None, modules=None,
return sorted_modules
def write_if_different(file, data):
if Path(file).is_file():
with open(file, encoding="utf-8") as fp:
if fp.read() == data:
return
with open(file, 'w', encoding="utf-8") as fp:
fp.write(data)
def main():
parser = argparse.ArgumentParser(description='''
@@ -878,8 +886,17 @@ def main():
cmake = ""
sysbuild_kconfig = ""
sysbuild_cmake = ""
settings = ""
twister = ""
settings = '''\
# WARNING. THIS FILE IS AUTO-GENERATED. DO NOT MODIFY!
#
# This file contains build system settings derived from your modules.
#
# Modules may be set via ZEPHYR_MODULES, ZEPHYR_EXTRA_MODULES,
# and/or the west manifest file.
#
# See the Modules guide for more information.
'''
west_projs = west_projects()
modules = parse_modules(args.zephyr_base, None, west_projs,
@@ -907,54 +924,34 @@ def main():
kconfig_module_dirs_cmake_out = PurePath(args.sysbuild_kconfig_out).parent / \
'kconfig_module_dirs.cmake'
with open(kconfig_module_dirs_out, 'w', encoding="utf-8") as fp:
fp.write(kconfig_module_dirs)
with open(kconfig_module_dirs_cmake_out, 'w', encoding="utf-8") as fp:
fp.write(kconfig_module_dirs_cmake)
write_if_different(kconfig_module_dirs_out, kconfig_module_dirs)
write_if_different(kconfig_module_dirs_cmake_out, kconfig_module_dirs_cmake)
if args.kconfig_out:
with open(args.kconfig_out, 'w', encoding="utf-8") as fp:
fp.write(kconfig)
write_if_different(args.kconfig_out, kconfig)
if args.cmake_out:
with open(args.cmake_out, 'w', encoding="utf-8") as fp:
fp.write(cmake)
write_if_different(args.cmake_out, cmake)
if args.sysbuild_kconfig_out:
with open(args.sysbuild_kconfig_out, 'w', encoding="utf-8") as fp:
fp.write(sysbuild_kconfig)
write_if_different(args.sysbuild_kconfig_out, sysbuild_kconfig)
if args.sysbuild_cmake_out:
with open(args.sysbuild_cmake_out, 'w', encoding="utf-8") as fp:
fp.write(sysbuild_cmake)
write_if_different(args.sysbuild_cmake_out, sysbuild_cmake)
if args.settings_out:
with open(args.settings_out, 'w', encoding="utf-8") as fp:
fp.write('''\
# WARNING. THIS FILE IS AUTO-GENERATED. DO NOT MODIFY!
#
# This file contains build system settings derived from your modules.
#
# Modules may be set via ZEPHYR_MODULES, ZEPHYR_EXTRA_MODULES,
# and/or the west manifest file.
#
# See the Modules guide for more information.
''')
fp.write(settings)
write_if_different(args.settings_out, settings)
if args.twister_out:
with open(args.twister_out, 'w', encoding="utf-8") as fp:
fp.write(twister)
write_if_different(args.twister_out, twister)
if args.meta_out:
meta = process_meta(args.zephyr_base, west_projs, modules,
args.extra_modules, args.meta_state_propagate)
with open(args.meta_out, 'w', encoding="utf-8") as fp:
# Ignore references and insert data instead
yaml.Dumper.ignore_aliases = lambda self, data: True
fp.write(yaml.dump(meta))
# Ignore references and insert data instead
yaml.Dumper.ignore_aliases = lambda self, data: True
write_if_different(args.meta_out, yaml.dump(meta))
if __name__ == "__main__":