From dcdd24be1b29551a2df6484a300da8df5c19682a Mon Sep 17 00:00:00 2001 From: Jamie McCrae Date: Wed, 13 Nov 2024 12:58:56 +0000 Subject: [PATCH] cmake: dts: Use temporary file for dts.cmake Uses a temporary file for dts output then uses CMake to copy to the correct file if it has changed. This prevents a ping-pong issue when sysbuild is used of configuring and building cycle when nothing has changed and there is sysbuild code which loads in the devicetree data from an image Signed-off-by: Jamie McCrae --- cmake/modules/dts.cmake | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/cmake/modules/dts.cmake b/cmake/modules/dts.cmake index a2c56577cfa54f..737e083aa57206 100644 --- a/cmake/modules/dts.cmake +++ b/cmake/modules/dts.cmake @@ -349,17 +349,26 @@ endif() # # Run GEN_DTS_CMAKE_SCRIPT. # +# A temporary file is copied to the original file if it differs. This prevents issue such as a +# cycle when sysbuild is used of configuring and building multiple times due to the dts.cmake file +# of images having a newer modification time than the sysbuild build.ninja file, despite the +# output having not changed +# +set(dts_cmake_tmp ${DTS_CMAKE}.new) execute_process( COMMAND ${PYTHON_EXECUTABLE} ${GEN_DTS_CMAKE_SCRIPT} --edt-pickle ${EDT_PICKLE} - --cmake-out ${DTS_CMAKE} + --cmake-out ${dts_cmake_tmp} WORKING_DIRECTORY ${PROJECT_BINARY_DIR} RESULT_VARIABLE ret ) if(NOT "${ret}" STREQUAL "0") message(FATAL_ERROR "gen_dts_cmake.py failed with return code: ${ret}") else() + zephyr_file_copy(${dts_cmake_tmp} ${DTS_CMAKE} ONLY_IF_DIFFERENT) + file(REMOVE ${dts_cmake_tmp}) + set(dts_cmake_tmp) message(STATUS "Including generated dts.cmake file: ${DTS_CMAKE}") include(${DTS_CMAKE}) endif()