sysbuild: create sysbuild_cache function

Create dedicated function, sysbuild_cache(), for handling sysbuild's
image specific cache file.

This provides a cleaner handling of said cache file, and provides a
mechanism for updating the cache file at later sysbuild CMake stages.

Signed-off-by: Torsten Rasmussen <Torsten.Rasmussen@nordicsemi.no>
This commit is contained in:
Torsten Rasmussen 2023-11-13 13:36:44 +01:00 committed by Carles Cufí
parent cd9f307e71
commit 19d250e1dc

View file

@ -107,6 +107,87 @@ function(sysbuild_get variable)
endif()
endfunction()
# Usage:
# sysbuild_cache(CREATE APPLICATION <name> [CMAKE_RERUN])
#
# This function works on the sysbuild cache for sysbuild managed applications.
#
# Arguments:
# CREATE : Create or update existing sysbuild cache file for the application.
# The sysbuild cache is only updated if it contain changes.
# APPLICATION <name>: Name of the application.
# CMAKE_RERUN : Force a CMake rerun for the application during next build
# invocation if the sysbuild cache has changed. It is
# advised to always use this flag. Not using this flag can
# reduce build time, but only do so if application is
# guranteed to be up-to-date.
#
function(sysbuild_cache)
cmake_parse_arguments(SB_CACHE "CREATE;CMAKE_RERUN" "APPLICATION" "" ${ARGN})
zephyr_check_arguments_required(sysbuild_cache SB_CACHE APPLICATION)
zephyr_check_flags_required(sysbuild_cache SB_CACHE CREATE)
get_target_property(${SB_CACHE_APPLICATION}_MAIN_APP ${SB_CACHE_APPLICATION} MAIN_APP)
get_cmake_property(sysbuild_cache CACHE_VARIABLES)
foreach(var_name ${sysbuild_cache})
if(NOT "${var_name}" MATCHES "^(CMAKE_.*|BOARD)$")
# Perform a dummy read to prevent a false warning about unused variables
# being emitted due to a cmake bug: https://gitlab.kitware.com/cmake/cmake/-/issues/24555
set(unused_tmp_var ${${var_name}})
# We don't want to pass internal CMake variables.
# Required CMake variable to be passed, like CMAKE_BUILD_TYPE must be
# passed using `-D` on command invocation.
get_property(var_type CACHE ${var_name} PROPERTY TYPE)
set(cache_entry "${var_name}:${var_type}=$CACHE{${var_name}}")
string(REPLACE ";" "\;" cache_entry "${cache_entry}")
list(APPEND sysbuild_cache_strings "${cache_entry}\n")
endif()
endforeach()
if(DEFINED BOARD_REVISION)
list(APPEND sysbuild_cache_strings "BOARD:STRING=${BOARD}@${BOARD_REVISION}\n")
else()
list(APPEND sysbuild_cache_strings "BOARD:STRING=${BOARD}\n")
endif()
list(APPEND sysbuild_cache_strings "SYSBUILD_NAME:STRING=${SB_CACHE_APPLICATION}\n")
if(${SB_CACHE_APPLICATION}_MAIN_APP)
list(APPEND sysbuild_cache_strings "SYSBUILD_MAIN_APP:BOOL=True\n")
endif()
if(${SB_CACHE_APPLICATION}_BOARD AND NOT DEFINED CACHE{${SB_CACHE_APPLICATION}_BOARD})
# Only set image specific board if provided.
# The sysbuild BOARD is exported through sysbuild cache, and will be used
# unless <image>_BOARD is defined.
list(APPEND sysbuild_cache_strings
"${SB_CACHE_APPLICATION}_BOARD:STRING=${${SB_CACHE_APPLICATION}_BOARD}\n"
)
endif()
get_target_property(${SB_CACHE_APPLICATION}_CACHE_FILE ${SB_CACHE_APPLICATION} CACHE_FILE)
file(WRITE ${${SB_CACHE_APPLICATION}_CACHE_FILE}.tmp ${sysbuild_cache_strings})
if(SB_CACHE_CMAKE_RERUN)
execute_process(COMMAND ${CMAKE_COMMAND} -E compare_files
${${SB_CACHE_APPLICATION}_CACHE_FILE}.tmp
${${SB_CACHE_APPLICATION}_CACHE_FILE}
RESULT_VARIABLE compare_res
)
if(NOT compare_res EQUAL 0)
zephyr_file_copy(${${SB_CACHE_APPLICATION}_CACHE_FILE}.tmp
${${SB_CACHE_APPLICATION}_CACHE_FILE}
)
ExternalProject_Get_Property(${SB_CACHE_APPLICATION} BINARY_DIR)
file(TOUCH_NOCREATE ${BINARY_DIR}/CMakeCache.txt)
endif()
else()
zephyr_file_copy(${${SB_CACHE_APPLICATION}_CACHE_FILE}.tmp
${${SB_CACHE_APPLICATION}_CACHE_FILE} ONLY_IF_DIFFERENT
)
endif()
endfunction()
# Usage:
# ExternalZephyrProject_Add(APPLICATION <name>
# SOURCE_DIR <dir>
@ -372,9 +453,7 @@ function(ExternalZephyrProject_Cmake)
)
ExternalProject_Get_Property(${ZCMAKE_APPLICATION} SOURCE_DIR BINARY_DIR CMAKE_ARGS)
get_target_property(${ZCMAKE_APPLICATION}_CACHE_FILE ${ZCMAKE_APPLICATION} CACHE_FILE)
get_target_property(${ZCMAKE_APPLICATION}_BOARD ${ZCMAKE_APPLICATION} BOARD)
get_target_property(${ZCMAKE_APPLICATION}_MAIN_APP ${ZCMAKE_APPLICATION} MAIN_APP)
get_property(${ZCMAKE_APPLICATION}_CONF_SCRIPT TARGET ${ZCMAKE_APPLICATION}
PROPERTY IMAGE_CONF_SCRIPT
@ -390,46 +469,7 @@ function(ExternalZephyrProject_Cmake)
endif()
endforeach()
get_cmake_property(sysbuild_cache CACHE_VARIABLES)
foreach(var_name ${sysbuild_cache})
if(NOT "${var_name}" MATCHES "^(CMAKE_.*|BOARD)$")
# Perform a dummy read to prevent a false warning about unused variables
# being emitted due to a cmake bug: https://gitlab.kitware.com/cmake/cmake/-/issues/24555
set(unused_tmp_var ${${var_name}})
# We don't want to pass internal CMake variables.
# Required CMake variable to be passed, like CMAKE_BUILD_TYPE must be
# passed using `-D` on command invocation.
get_property(var_type CACHE ${var_name} PROPERTY TYPE)
set(cache_entry "${var_name}:${var_type}=$CACHE{${var_name}}")
string(REPLACE ";" "\;" cache_entry "${cache_entry}")
list(APPEND sysbuild_cache_strings "${cache_entry}\n")
endif()
endforeach()
if(DEFINED BOARD_REVISION)
list(APPEND sysbuild_cache_strings "BOARD:STRING=${BOARD}@${BOARD_REVISION}\n")
else()
list(APPEND sysbuild_cache_strings "BOARD:STRING=${BOARD}\n")
endif()
list(APPEND sysbuild_cache_strings "SYSBUILD_NAME:STRING=${ZCMAKE_APPLICATION}\n")
if(${ZCMAKE_APPLICATION}_MAIN_APP)
list(APPEND sysbuild_cache_strings "SYSBUILD_MAIN_APP:BOOL=True\n")
endif()
if(${ZCMAKE_APPLICATION}_BOARD AND NOT DEFINED CACHE{${ZCMAKE_APPLICATION}_BOARD})
# Only set image specific board if provided.
# The sysbuild BOARD is exported through sysbuild cache, and will be used
# unless <image>_BOARD is defined.
list(APPEND sysbuild_cache_strings
"${ZCMAKE_APPLICATION}_BOARD:STRING=${${ZCMAKE_APPLICATION}_BOARD}\n"
)
endif()
file(WRITE ${${ZCMAKE_APPLICATION}_CACHE_FILE}.tmp ${sysbuild_cache_strings})
zephyr_file_copy(${${ZCMAKE_APPLICATION}_CACHE_FILE}.tmp
${${ZCMAKE_APPLICATION}_CACHE_FILE} ONLY_IF_DIFFERENT
)
sysbuild_cache(CREATE APPLICATION ${ZCMAKE_APPLICATION})
foreach(script ${${ZCMAKE_APPLICATION}_CONF_SCRIPT})
include(${script})