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

@@ -43,43 +43,13 @@ if(COMPARE_RESULT EQUAL 0 AND EXISTS ${CONFIG_H})
endif()
set(BASE_DEFCONFIG "${NUTTX_BOARD}/${NUTTX_CONFIG}")
# Mirror tools/Unix.mk:258-263: compare .config to .config.orig after stripping
# CONFIG_BASE_DEFCONFIG lines so our own write of that value does not spuriously
# trigger -dirty on subsequent runs.
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()
execute_process(
COMMAND ${CMAKE_COMMAND} -E compare_files ${CMAKE_BINARY_DIR}/.config
${CMAKE_BINARY_DIR}/.config.orig RESULT_VARIABLE COMPARE_RESULT)
if(COMPARE_RESULT)
string(APPEND BASE_DEFCONFIG "-dirty")
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
# NuttX
"CONFIG_DEBUG_OPTLEVEL" # Custom debug level