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:
parent
53becb05bf
commit
3eaab029ec
2 changed files with 83 additions and 65 deletions
|
@ -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 application’s .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 \
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue