From 80ad34130e8b92bb96825a14ed772006627fc565 Mon Sep 17 00:00:00 2001 From: Jamie McCrae Date: Wed, 13 Nov 2024 12:58:56 +0000 Subject: [PATCH] [nrf fromlist] 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 Upstream PR #: 81340 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 705de97d874..c02214bb858 100644 --- a/cmake/modules/dts.cmake +++ b/cmake/modules/dts.cmake @@ -321,17 +321,26 @@ endif() # # Run GEN_DTS_CMAKE_SCRIPT. # +# A temporary file is used 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()