cmake: Enhance .config handling and comparison logic

Refactor the logic for managing the .config file to ensure it aligns with Make behavior. Introduce a mechanism to set CONFIG_BASE_DEFCONFIG correctly and streamline the comparison process between .config and .config.orig, improving accuracy in detecting changes.

Signed-off-by: Arjav Patel <arjav1528@gmail.com>
This commit is contained in:
Arjav Patel
2026-02-18 23:50:00 +05:30
committed by Alan C. Assis
parent c172074f21
commit dfb2c24d62
2 changed files with 16 additions and 33 deletions

View File

@@ -349,6 +349,19 @@ if(NOT EXISTS ${CMAKE_BINARY_DIR}/.config OR NOT "${NUTTX_DEFCONFIG}" STREQUAL
${CMAKE_BINARY_DIR}/.config) ${CMAKE_BINARY_DIR}/.config)
set(ENV{KCONFIG_CONFIG} ${CMAKE_BINARY_DIR}/.config) set(ENV{KCONFIG_CONFIG} ${CMAKE_BINARY_DIR}/.config)
# Set CONFIG_BASE_DEFCONFIG so .config matches Make behavior (configure.sh)
file(READ ${CMAKE_BINARY_DIR}/.config _config_init_content)
string(
REGEX
REPLACE "CONFIG_BASE_DEFCONFIG=\"[^\"]*\""
"CONFIG_BASE_DEFCONFIG=\"${NUTTX_BOARD}/${NUTTX_CONFIG}\""
_config_init_content "${_config_init_content}")
if(NOT _config_init_content MATCHES "CONFIG_BASE_DEFCONFIG=")
string(APPEND _config_init_content
"\nCONFIG_BASE_DEFCONFIG=\"${NUTTX_BOARD}/${NUTTX_CONFIG}\"\n")
endif()
file(WRITE ${CMAKE_BINARY_DIR}/.config "${_config_init_content}")
# store original expanded .config # store original expanded .config
configure_file(${CMAKE_BINARY_DIR}/.config ${CMAKE_BINARY_DIR}/.config.orig configure_file(${CMAKE_BINARY_DIR}/.config ${CMAKE_BINARY_DIR}/.config.orig
COPYONLY) COPYONLY)

View File

@@ -43,43 +43,13 @@ if(COMPARE_RESULT EQUAL 0 AND EXISTS ${CONFIG_H})
endif() endif()
set(BASE_DEFCONFIG "${NUTTX_BOARD}/${NUTTX_CONFIG}") set(BASE_DEFCONFIG "${NUTTX_BOARD}/${NUTTX_CONFIG}")
# Mirror tools/Unix.mk:258-263: compare .config to .config.orig after stripping execute_process(
# CONFIG_BASE_DEFCONFIG lines so our own write of that value does not spuriously COMMAND ${CMAKE_COMMAND} -E compare_files ${CMAKE_BINARY_DIR}/.config
# trigger -dirty on subsequent runs. ${CMAKE_BINARY_DIR}/.config.orig RESULT_VARIABLE COMPARE_RESULT)
file(READ ${CMAKE_BINARY_DIR}/.config CONFIG_FOR_DIRTY)
file(READ ${CMAKE_BINARY_DIR}/.config.orig CONFIG_ORIG_FOR_DIRTY)
# Strip CONFIG_BASE_DEFCONFIG line (with optional trailing newline for last line)
string(REGEX REPLACE "\nCONFIG_BASE_DEFCONFIG=\"[^\"]*\"\n?" "\n"
CONFIG_FOR_DIRTY "${CONFIG_FOR_DIRTY}")
string(REGEX REPLACE "^CONFIG_BASE_DEFCONFIG=\"[^\"]*\"\n?" ""
CONFIG_FOR_DIRTY "${CONFIG_FOR_DIRTY}")
string(REGEX REPLACE "\nCONFIG_BASE_DEFCONFIG=\"[^\"]*\"\n?" "\n"
CONFIG_ORIG_FOR_DIRTY "${CONFIG_ORIG_FOR_DIRTY}")
string(REGEX REPLACE "^CONFIG_BASE_DEFCONFIG=\"[^\"]*\"\n?" ""
CONFIG_ORIG_FOR_DIRTY "${CONFIG_ORIG_FOR_DIRTY}")
if(CONFIG_FOR_DIRTY STREQUAL CONFIG_ORIG_FOR_DIRTY)
set(COMPARE_RESULT 0)
else()
set(COMPARE_RESULT 1)
endif()
if(COMPARE_RESULT) if(COMPARE_RESULT)
string(APPEND BASE_DEFCONFIG "-dirty") string(APPEND BASE_DEFCONFIG "-dirty")
endif() endif()
# Write CONFIG_BASE_DEFCONFIG to .config so it matches Make behavior
file(READ ${CMAKE_BINARY_DIR}/.config CONFIG_CONTENT)
string(REGEX REPLACE "CONFIG_BASE_DEFCONFIG=\".*\""
"CONFIG_BASE_DEFCONFIG=\"${BASE_DEFCONFIG}\"" CONFIG_CONTENT
"${CONFIG_CONTENT}")
if(NOT CONFIG_CONTENT MATCHES "CONFIG_BASE_DEFCONFIG=")
string(APPEND CONFIG_CONTENT "\nCONFIG_BASE_DEFCONFIG=\"${BASE_DEFCONFIG}\"\n")
endif()
file(WRITE ${CMAKE_BINARY_DIR}/.config "${CONFIG_CONTENT}")
execute_process(
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/.config
${CMAKE_BINARY_DIR}/.config.prev
WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
set(DEQUOTELIST set(DEQUOTELIST
# NuttX # NuttX
"CONFIG_DEBUG_OPTLEVEL" # Custom debug level "CONFIG_DEBUG_OPTLEVEL" # Custom debug level