From 3c97bf1014d7585d480e88f52462f141cbbebbce Mon Sep 17 00:00:00 2001 From: Richard Hughes Date: Fri, 13 Jun 2025 10:40:46 +0100 Subject: [PATCH] cmake: kconfig: regenerate .config when Kconfig sources are updated The existing logic caused a regeneration when any of the .conf files changed, but modifying the Kconfig files can also cause the .config file to become out of date e.g. by adding a new config option or by changing the default value of a config option (when that default is not overridden by a .conf). Without this change, an incremental build wouldn't pick up the new value and would require the user to notice that and manually do a clean build. Signed-off-by: Richard Hughes --- cmake/modules/kconfig.cmake | 38 ++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/cmake/modules/kconfig.cmake b/cmake/modules/kconfig.cmake index b87e08e6f12..f7f17f07246 100644 --- a/cmake/modules/kconfig.cmake +++ b/cmake/modules/kconfig.cmake @@ -313,6 +313,18 @@ foreach(f ${merge_config_files}) set(merge_config_files_checksum "${merge_config_files_checksum}${checksum}") endforeach() +# Add to the checksum all the Kconfig files which were used last time +set(merge_kconfig_checksum "") +if(EXISTS ${PARSED_KCONFIG_SOURCES_TXT}) + file(STRINGS ${PARSED_KCONFIG_SOURCES_TXT} parsed_kconfig_sources_list ENCODING UTF-8) + foreach(f ${parsed_kconfig_sources_list}) + if(EXISTS ${f}) + file(MD5 ${f} checksum) + set(merge_kconfig_checksum "${merge_kconfig_checksum}${checksum}") + endif() + endforeach() +endif() + # Create a new .config if it does not exists, or if the checksum of # the dependencies has changed set(merge_config_files_checksum_file ${PROJECT_BINARY_DIR}/.cmake.dotconfig.checksum) @@ -326,7 +338,7 @@ if(EXISTS ${DOTCONFIG} AND EXISTS ${merge_config_files_checksum_file}) merge_config_files_checksum_prev ) if( - ${merge_config_files_checksum} STREQUAL + ${merge_config_files_checksum}${merge_kconfig_checksum} STREQUAL ${merge_config_files_checksum_prev} ) # Checksum is the same as before @@ -373,17 +385,17 @@ if(NOT "${ret}" STREQUAL "0") message(FATAL_ERROR "command failed with return code: ${ret}") endif() -if(CREATE_NEW_DOTCONFIG) - # Write the new configuration fragment checksum. Only do this if kconfig.py - # succeeds, to avoid marking zephyr/.config as up-to-date when it hasn't been - # regenerated. - file(WRITE ${merge_config_files_checksum_file} - ${merge_config_files_checksum}) -endif() - # Read out the list of 'Kconfig' sources that were used by the engine. file(STRINGS ${PARSED_KCONFIG_SOURCES_TXT} parsed_kconfig_sources_list ENCODING UTF-8) +# Recalculate the Kconfig files' checksum, since the list of files may have +# changed. +set(merge_kconfig_checksum "") +foreach(f ${parsed_kconfig_sources_list}) + file(MD5 ${f} checksum) + set(merge_kconfig_checksum "${merge_kconfig_checksum}${checksum}") +endforeach() + # Force CMAKE configure when the Kconfig sources or configuration files changes. foreach(kconfig_input ${merge_config_files} @@ -393,6 +405,14 @@ foreach(kconfig_input set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${kconfig_input}) endforeach() +if(CREATE_NEW_DOTCONFIG) + # Write the new configuration fragment checksum. Only do this if kconfig.py + # succeeds, to avoid marking zephyr/.config as up-to-date when it hasn't been + # regenerated. + file(WRITE ${merge_config_files_checksum_file} + ${merge_config_files_checksum}${merge_kconfig_checksum}) +endif() + add_custom_target(config-twister DEPENDS ${DOTCONFIG}) # Remove the CLI Kconfig symbols from the namespace and