cmake: extend zephyr_file(CONF_FILES ...) to take NAMES as argument

Extend zephyr_file(CONF_FILES ...) to take a NAMES list of file names
to find instead of creating file names based on board and revision.

This allows to unify lookup prj.conf and <board>/app.overlay for
application, as well as pave the way for future enhancements to
configuration file handling.

Signed-off-by: Torsten Rasmussen <Torsten.Rasmussen@nordicsemi.no>
This commit is contained in:
Torsten Rasmussen 2024-02-02 13:35:36 +01:00 committed by Carles Cufí
commit 3eaab029ec
2 changed files with 83 additions and 65 deletions

View file

@ -40,70 +40,42 @@ else()
endif()
zephyr_get(CONF_FILE SYSBUILD LOCAL)
if(DEFINED CONF_FILE)
# This ensures that CACHE{CONF_FILE} will be set correctly to current scope
# variable CONF_FILE. An already current scope variable will stay the same.
set(CONF_FILE ${CONF_FILE})
# CONF_FILE has either been specified on the cmake CLI or is already
# in the CMakeCache.txt. This has precedence over the environment
# variable CONF_FILE and the default prj.conf
# In order to support a `prj_<name>.conf pattern for auto inclusion of board
# overlays, then we must first ensure only a single conf file is provided.
if(NOT DEFINED CONF_FILE)
zephyr_file(CONF_FILES ${APPLICATION_CONFIG_DIR} KCONF CONF_FILE NAMES "prj.conf" REQUIRED)
zephyr_file(CONF_FILES ${APPLICATION_CONFIG_DIR}/boards KCONF CONF_FILE)
else()
string(CONFIGURE "${CONF_FILE}" CONF_FILE_EXPANDED)
string(REPLACE " " ";" CONF_FILE_AS_LIST "${CONF_FILE_EXPANDED}")
list(LENGTH CONF_FILE_AS_LIST CONF_FILE_LENGTH)
if(${CONF_FILE_LENGTH} EQUAL 1)
# Need the file name to look for match.
# Need path in order to check if it is absolute.
get_filename_component(CONF_FILE_NAME ${CONF_FILE} NAME)
if(${CONF_FILE_NAME} MATCHES "prj_(.*).conf")
set(CONF_FILE_BUILD_TYPE ${CMAKE_MATCH_1})
set(CONF_FILE_INCLUDE_FRAGMENTS true)
zephyr_file(CONF_FILES ${APPLICATION_CONFIG_DIR}/boards KCONF CONF_FILE
BUILD ${CONF_FILE_BUILD_TYPE}
)
set(CONF_FILE_FORCE_CACHE FORCE)
endif()
endif()
elseif(CACHED_CONF_FILE)
# Cached conf file is present.
# That value has precedence over anything else than a new
# `cmake -DCONF_FILE=<file>` invocation.
set(CONF_FILE ${CACHED_CONF_FILE})
elseif(EXISTS ${APPLICATION_CONFIG_DIR}/prj.conf)
set(CONF_FILE ${APPLICATION_CONFIG_DIR}/prj.conf)
set(CONF_FILE_INCLUDE_FRAGMENTS true)
else()
message(FATAL_ERROR "No prj.conf file was found in the ${APPLICATION_CONFIG_DIR} folder, "
"please read the Zephyr documentation on application development.")
endif()
if(CONF_FILE_INCLUDE_FRAGMENTS)
zephyr_file(CONF_FILES ${APPLICATION_CONFIG_DIR}/boards KCONF CONF_FILE BUILD ${CONF_FILE_BUILD_TYPE})
endif()
set(APPLICATION_CONFIG_DIR ${APPLICATION_CONFIG_DIR} CACHE INTERNAL "The application configuration folder" FORCE)
set(CACHED_CONF_FILE ${CONF_FILE} CACHE STRING "If desired, you can build the application using\
set(CONF_FILE ${CONF_FILE} CACHE STRING "If desired, you can build the application using\
the configuration settings specified in an alternate .conf file using this parameter. \
These settings will override the settings in the applications .config file or its default .conf file.\
Multiple files may be listed, e.g. CONF_FILE=\"prj1.conf;prj2.conf\" \
The CACHED_CONF_FILE is internal Zephyr variable used between CMake runs. \
To change CONF_FILE, use the CONF_FILE variable.")
unset(CONF_FILE CACHE)
zephyr_file(CONF_FILES ${APPLICATION_CONFIG_DIR}/boards DTS APP_BOARD_DTS)
To change CONF_FILE, use the CONF_FILE variable." ${CONF_FILE_FORCE_CACHE})
# The CONF_FILE variable is now set to its final value.
zephyr_boilerplate_watch(CONF_FILE)
zephyr_file(CONF_FILES ${APPLICATION_CONFIG_DIR}/boards DTS APP_BOARD_DTS)
zephyr_get(DTC_OVERLAY_FILE SYSBUILD LOCAL)
if(DTC_OVERLAY_FILE)
# DTC_OVERLAY_FILE has either been specified on the cmake CLI or is already
# in the CMakeCache.txt.
elseif(APP_BOARD_DTS)
set(DTC_OVERLAY_FILE ${APP_BOARD_DTS})
elseif(EXISTS ${APPLICATION_CONFIG_DIR}/${BOARD}.overlay)
set(DTC_OVERLAY_FILE ${APPLICATION_CONFIG_DIR}/${BOARD}.overlay)
elseif(EXISTS ${APPLICATION_CONFIG_DIR}/app.overlay)
set(DTC_OVERLAY_FILE ${APPLICATION_CONFIG_DIR}/app.overlay)
if(NOT DEFINED DTC_OVERLAY_FILE)
zephyr_file(CONF_FILES ${APPLICATION_CONFIG_DIR} DTS DTC_OVERLAY_FILE
NAMES "${APP_BOARD_DTS};${BOARD}.overlay;app.overlay")
endif()
set(DTC_OVERLAY_FILE ${DTC_OVERLAY_FILE} CACHE STRING "If desired, you can \

View file

@ -2425,6 +2425,12 @@ endfunction()
#
# returns an updated list of absolute paths
#
# Usage:
# zephyr_file(CONF_FILES <paths> [DTS <list>] [KCONF <list>]
# [BOARD <board> [BOARD_REVISION <revision>] | NAMES <name> ...]
# [BUILD <type>] [REQUIRED]
# )
#
# CONF_FILES <paths>: Find all configuration files in the list of paths and
# return them in a list. If paths is empty then no configuration
# files are returned. Configuration files will be:
@ -2438,7 +2444,13 @@ endfunction()
# revision. Requires BOARD to be specified.
#
# If no board is given the current BOARD and
# BOARD_REVISION will be used.
# BOARD_REVISION will be used, unless NAMES are
# specified.
#
# NAMES <name1> [name2] ... List of file names to look for and instead of
# creating file names based on board settings.
# Only the first match found in <paths> will be
# returned in the <list>
#
# DTS <list>: List to append DTS overlay files in <path> to
# KCONF <list>: List to append Kconfig fragment files in <path> to
@ -2446,6 +2458,8 @@ endfunction()
# For example:
# BUILD debug, will look for <board>_debug.conf
# and <board>_debug.overlay, instead of <board>.conf
# REQUIRED: Option to indicate that the <list> specified by DTS or KCONF
# must contain at least one element, else an error will be raised.
#
function(zephyr_file)
set(file_options APPLICATION_ROOT CONF_FILES)
@ -2457,11 +2471,12 @@ Please provide one of following: APPLICATION_ROOT, CONF_FILES")
if(${ARGV0} STREQUAL APPLICATION_ROOT)
set(single_args APPLICATION_ROOT)
elseif(${ARGV0} STREQUAL CONF_FILES)
set(options REQUIRED)
set(single_args BOARD BOARD_REVISION DTS KCONF BUILD)
set(multi_args CONF_FILES)
set(multi_args CONF_FILES NAMES)
endif()
cmake_parse_arguments(FILE "" "${single_args}" "${multi_args}" ${ARGN})
cmake_parse_arguments(FILE "${options}" "${single_args}" "${multi_args}" ${ARGN})
if(FILE_UNPARSED_ARGUMENTS)
message(FATAL_ERROR "zephyr_file(${ARGV0} <val> ...) given unknown arguments: ${FILE_UNPARSED_ARGUMENTS}")
endif()
@ -2518,44 +2533,75 @@ Relative paths are only allowed with `-D${ARGV1}=<path>`")
endif()
endif()
zephyr_build_string(filename
BOARD ${FILE_BOARD}
BUILD ${FILE_BUILD}
)
set(filename_list ${filename})
if(FILE_NAMES)
set(dts_filename_list ${FILE_NAMES})
set(kconf_filename_list ${FILE_NAMES})
else()
zephyr_build_string(filename
BOARD ${FILE_BOARD}
BUILD ${FILE_BUILD}
)
set(filename_list ${filename})
zephyr_build_string(filename
BOARD ${FILE_BOARD}
BOARD_REVISION ${FILE_BOARD_REVISION}
BUILD ${FILE_BUILD}
)
list(APPEND filename_list ${filename})
list(REMOVE_DUPLICATES filename_list)
zephyr_build_string(filename
BOARD ${FILE_BOARD}
BOARD_REVISION ${FILE_BOARD_REVISION}
BUILD ${FILE_BUILD}
)
list(APPEND filename_list ${filename})
list(REMOVE_DUPLICATES filename_list)
set(dts_filename_list ${filename_list})
list(TRANSFORM dts_filename_list APPEND ".overlay")
set(kconf_filename_list ${filename_list})
list(TRANSFORM kconf_filename_list APPEND ".conf")
endif()
if(FILE_DTS)
foreach(path ${FILE_CONF_FILES})
foreach(filename ${filename_list})
if(EXISTS ${path}/${filename}.overlay)
list(APPEND ${FILE_DTS} ${path}/${filename}.overlay)
foreach(filename ${dts_filename_list})
if(EXISTS ${path}/${filename})
list(APPEND ${FILE_DTS} ${path}/${filename})
if(FILE_NAMES)
break()
endif()
endif()
endforeach()
endforeach()
# This updates the provided list in parent scope (callers scope)
set(${FILE_DTS} ${${FILE_DTS}} PARENT_SCOPE)
if(NOT ${FILE_DTS})
set(not_found ${dts_filename_list})
endif()
endif()
if(FILE_KCONF)
foreach(path ${FILE_CONF_FILES})
foreach(filename ${filename_list})
if(EXISTS ${path}/${filename}.conf)
list(APPEND ${FILE_KCONF} ${path}/${filename}.conf)
foreach(filename ${kconf_filename_list})
if(EXISTS ${path}/${filename})
list(APPEND ${FILE_KCONF} ${path}/${filename})
if(FILE_NAMES)
break()
endif()
endif()
endforeach()
endforeach()
# This updates the provided list in parent scope (callers scope)
set(${FILE_KCONF} ${${FILE_KCONF}} PARENT_SCOPE)
if(NOT ${FILE_KCONF})
set(not_found ${kconf_filename_list})
endif()
endif()
if(FILE_REQUIRED AND DEFINED not_found)
message(FATAL_ERROR
"No ${not_found} file(s) was found in the ${FILE_CONF_FILES} folder(s), "
"please read the Zephyr documentation on application development."
)
endif()
endif()
endfunction()
@ -4164,7 +4210,7 @@ function(zephyr_linker_dts_section)
if(DTS_SECTION_UNPARSED_ARGUMENTS)
message(FATAL_ERROR "zephyr_linker_dts_section(${ARGV0} ...) given unknown "
"arguments: ${DTS_SECTION_UNPARSED_ARGUMENTS}"
"arguments: ${DTS_SECTION_UNPARSED_ARGUMENTS}"
)
endif()