cmake: add reverse option to zephyr_get(... MERGE)

Adding the possibility to have the list returned in reversed order when
using `zephyr_get(... MERGE).

`zephyr_get(... MERGE)` creates a list which populates the content based
on variable settings in the following scopes, in this order:
sysbuild, cache, environment, local.

This works well for lists where content first in list has highest
precedence, such as ROOTs settings.
However, for settings where the value last in the list will overwrite
values earlier in the list, we want the list to be reversed, examples
of such can be CONF_FILE, OVERLAY_CONFIG, DTC_OVERLAY_FILE, where the
content of the file last in the list will overrule the content from an
earlier file.
So to ensure that a DTC_OVERLAY_FILE defined as cache takes precedence
over an env or local scope variable the possibility of reversing the
list must be available.

Signed-off-by: Torsten Rasmussen <Torsten.Rasmussen@nordicsemi.no>
This commit is contained in:
Torsten Rasmussen 2023-05-08 13:50:03 +02:00 committed by Fabio Baltieri
parent 39b50ee37c
commit fd526cc4b2

View file

@ -2493,10 +2493,13 @@ function(zephyr_var_name variable scope out)
endfunction()
# Usage:
# zephyr_get(<variable> [MERGE] [SYSBUILD [LOCAL|GLOBAL]] [VAR <var1> ...])
# zephyr_get(<variable> [MERGE [REVERSE]] [SYSBUILD [LOCAL|GLOBAL]] [VAR <var1> ...])
#
# Return the value of <variable> as local scoped variable of same name. If MERGE
# is supplied, will return a list of found items.
# is supplied, will return a list of found items. If REVERSE is supplied
# together with MERGE, the order of the list will be reversed before being
# returned. Reverse will happen before the list is returned and hence it will
# not change the order of precedence in which the list itself is constructed.
#
# VAR can be used either to store the result in a variable with a different
# name, or to look for values from multiple variables.
@ -2526,7 +2529,7 @@ endfunction()
# using `-DZEPHYR_TOOLCHAIN_VARIANT=<val>`, then the value from the cache is
# returned.
function(zephyr_get variable)
cmake_parse_arguments(GET_VAR "MERGE" "SYSBUILD" "VAR" ${ARGN})
cmake_parse_arguments(GET_VAR "MERGE;REVERSE" "SYSBUILD" "VAR" ${ARGN})
if(DEFINED GET_VAR_SYSBUILD)
if(NOT ("${GET_VAR_SYSBUILD}" STREQUAL "GLOBAL" OR
@ -2538,6 +2541,10 @@ function(zephyr_get variable)
set(GET_VAR_SYSBUILD "GLOBAL")
endif()
if(GET_VAR_REVERSE AND NOT GET_VAR_MERGE)
message(FATAL_ERROR "zephyr_get(... REVERSE) missing a required argument: MERGE")
endif()
if(NOT DEFINED GET_VAR_VAR)
set(GET_VAR_VAR ${variable})
endif()
@ -2564,6 +2571,9 @@ function(zephyr_get variable)
endforeach()
set(scopes "sysbuild;CACHE;ENV;current")
if(GET_VAR_REVERSE)
list(REVERSE scopes)
endif()
foreach(scope IN LISTS scopes)
foreach(var ${GET_VAR_VAR})
zephyr_var_name("${var}" "${scope}" expansion_var)
@ -2601,7 +2611,13 @@ function(zephyr_get variable)
endforeach()
if(GET_VAR_MERGE)
list(REMOVE_DUPLICATES ${variable})
if(GET_VAR_REVERSE)
list(REVERSE ${variable})
list(REMOVE_DUPLICATES ${variable})
list(REVERSE ${variable})
else()
list(REMOVE_DUPLICATES ${variable})
endif()
set(${variable} ${${variable}} PARENT_SCOPE)
endif()
endfunction(zephyr_get variable)