From 2d3c4a60396231358b329d04bee348c280f48a6d Mon Sep 17 00:00:00 2001 From: Gregory Shue Date: Fri, 21 Jan 2022 10:58:17 -0800 Subject: [PATCH] build: Overlay build vars expand ${ZEPHYR__MODULE_DIR} Support referencing module directories by name in CONF_FILE, OVERLAY_CONFIG, and DTC_OVERLAY_FILE so that projects can reference overlay files in arbitrary modules. Verified by passing all the following tests: ./scripts/twister -T tests/cmake/overlays/ Fixes #41830 Signed-off-by: Gregory Shue --- cmake/modules/configuration_files.cmake | 3 ++- cmake/modules/dts.cmake | 3 ++- cmake/modules/kconfig.cmake | 6 ++++-- doc/build/dts/howtos.rst | 5 ++++- doc/build/kconfig/setting.rst | 5 ++++- .../cmake/overlays/var_expansions/CMakeLists.txt | 12 ++++++++++++ .../my_extra_module/zephyr/module.yml | 1 + .../zephyr/my_extra_module-board.overlay | 9 +++++++++ .../zephyr/my_extra_module-overlay.conf | 1 + .../var_expansions/my_module/zephyr/module.yml | 1 + .../my_module/zephyr/my_module-board.overlay | 9 +++++++++ .../my_module/zephyr/my_module-overlay.conf | 1 + tests/cmake/overlays/var_expansions/prj.conf | 2 ++ tests/cmake/overlays/var_expansions/src/main.c | 16 ++++++++++++++++ .../cmake/overlays/var_expansions/testcase.yaml | 11 +++++++++++ 15 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 tests/cmake/overlays/var_expansions/CMakeLists.txt create mode 100644 tests/cmake/overlays/var_expansions/my_extra_module/zephyr/module.yml create mode 100644 tests/cmake/overlays/var_expansions/my_extra_module/zephyr/my_extra_module-board.overlay create mode 100644 tests/cmake/overlays/var_expansions/my_extra_module/zephyr/my_extra_module-overlay.conf create mode 100644 tests/cmake/overlays/var_expansions/my_module/zephyr/module.yml create mode 100644 tests/cmake/overlays/var_expansions/my_module/zephyr/my_module-board.overlay create mode 100644 tests/cmake/overlays/var_expansions/my_module/zephyr/my_module-overlay.conf create mode 100644 tests/cmake/overlays/var_expansions/prj.conf create mode 100644 tests/cmake/overlays/var_expansions/src/main.c create mode 100644 tests/cmake/overlays/var_expansions/testcase.yaml diff --git a/cmake/modules/configuration_files.cmake b/cmake/modules/configuration_files.cmake index 73f12ec90ae7d..9ca36e7f12c05 100644 --- a/cmake/modules/configuration_files.cmake +++ b/cmake/modules/configuration_files.cmake @@ -47,7 +47,8 @@ if(DEFINED CONF_FILE) # In order to support a `prj_.conf pattern for auto inclusion of board # overlays, then we must first ensure only a single conf file is provided. - string(REPLACE " " ";" CONF_FILE_AS_LIST "${CONF_FILE}") + 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. diff --git a/cmake/modules/dts.cmake b/cmake/modules/dts.cmake index 7d5ccc1209eb4..80afc125d7575 100644 --- a/cmake/modules/dts.cmake +++ b/cmake/modules/dts.cmake @@ -92,7 +92,8 @@ set(dts_files if(SUPPORTS_DTS) if(DTC_OVERLAY_FILE) # Convert from space-separated files into file list - string(REPLACE " " ";" DTC_OVERLAY_FILE_RAW_LIST "${DTC_OVERLAY_FILE}") + string(CONFIGURE "${DTC_OVERLAY_FILE}" DTC_OVERLAY_FILE_EXPANDED) + string(REPLACE " " ";" DTC_OVERLAY_FILE_RAW_LIST "${DTC_OVERLAY_FILE_EXPANDED}") foreach(file ${DTC_OVERLAY_FILE_RAW_LIST}) file(TO_CMAKE_PATH "${file}" cmake_path_file) list(APPEND DTC_OVERLAY_FILE_AS_LIST ${cmake_path_file}) diff --git a/cmake/modules/kconfig.cmake b/cmake/modules/kconfig.cmake index 4316f2e42d285..00db561d954f8 100644 --- a/cmake/modules/kconfig.cmake +++ b/cmake/modules/kconfig.cmake @@ -69,12 +69,14 @@ set(DOTCONFIG ${PROJECT_BINARY_DIR}/.config) set(PARSED_KCONFIG_SOURCES_TXT ${PROJECT_BINARY_DIR}/kconfig/sources.txt) if(CONF_FILE) -string(REPLACE " " ";" CONF_FILE_AS_LIST "${CONF_FILE}") + string(CONFIGURE "${CONF_FILE}" CONF_FILE_EXPANDED) + string(REPLACE " " ";" CONF_FILE_AS_LIST "${CONF_FILE_EXPANDED}") endif() zephyr_get(OVERLAY_CONFIG SYSBUILD LOCAL) if(OVERLAY_CONFIG) - string(REPLACE " " ";" OVERLAY_CONFIG_AS_LIST "${OVERLAY_CONFIG}") + string(CONFIGURE "${OVERLAY_CONFIG}" OVERLAY_CONFIG_EXPANDED) + string(REPLACE " " ";" OVERLAY_CONFIG_AS_LIST "${OVERLAY_CONFIG_EXPANDED}") endif() if((DEFINED BOARD_REVISION) AND EXISTS ${BOARD_DIR}/${BOARD}_${BOARD_REVISION_STRING}.conf) diff --git a/doc/build/dts/howtos.rst b/doc/build/dts/howtos.rst index b7768a98a0017..0609ed8a63f44 100644 --- a/doc/build/dts/howtos.rst +++ b/doc/build/dts/howtos.rst @@ -222,7 +222,10 @@ Set devicetree overlays Devicetree overlays are explained in :ref:`devicetree-intro`. The CMake variable :makevar:`DTC_OVERLAY_FILE` contains a space- or semicolon-separated list of overlay files to use. If :makevar:`DTC_OVERLAY_FILE` specifies multiple -files, they are included in that order by the C preprocessor. +files, they are included in that order by the C preprocessor. A file in a +Zephyr module can be referred to by escaping the Zephyr module dir variable +like ``\${ZEPHYR__MODULE_DIR}//dts.overlay`` +when setting the DTC_OVERLAY_FILE variable. You can set :makevar:`DTC_OVERLAY_FILE` to contain exactly the files you want to use. Here is an :ref:`example ` using diff --git a/doc/build/kconfig/setting.rst b/doc/build/kconfig/setting.rst index 2df44a8f50107..e3180edf755d8 100644 --- a/doc/build/kconfig/setting.rst +++ b/doc/build/kconfig/setting.rst @@ -170,7 +170,10 @@ The application configuration can come from the sources below. By default, All configuration files will be taken from the application's configuration directory except for files with an absolute path that are given with the -``CONF_FILE`` argument. +``CONF_FILE``, ``OVERLAY_CONFIG``, and ``DTC_OVERLAY_FILE`` arguments. For these, +a file in a Zephyr module can be referred by escaping the Zephyr module dir +variable like this ``\${ZEPHYR__MODULE_DIR}//`` +when setting any of said variables in the application's :file:`CMakeLists.txt`. See :ref:`Application Configuration Directory ` on how the application configuration directory is defined. diff --git a/tests/cmake/overlays/var_expansions/CMakeLists.txt b/tests/cmake/overlays/var_expansions/CMakeLists.txt new file mode 100644 index 0000000000000..db382a53e966e --- /dev/null +++ b/tests/cmake/overlays/var_expansions/CMakeLists.txt @@ -0,0 +1,12 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) + +set(ZEPHYR_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/my_module") +set(ZEPHYR_EXTRA_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/my_extra_module") + +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(overlay_var_expansions) + +FILE(GLOB app_sources src/*.c) +target_sources(app PRIVATE ${app_sources}) diff --git a/tests/cmake/overlays/var_expansions/my_extra_module/zephyr/module.yml b/tests/cmake/overlays/var_expansions/my_extra_module/zephyr/module.yml new file mode 100644 index 0000000000000..90a7f1b2bdefb --- /dev/null +++ b/tests/cmake/overlays/var_expansions/my_extra_module/zephyr/module.yml @@ -0,0 +1 @@ +name: my_extra_module_name diff --git a/tests/cmake/overlays/var_expansions/my_extra_module/zephyr/my_extra_module-board.overlay b/tests/cmake/overlays/var_expansions/my_extra_module/zephyr/my_extra_module-board.overlay new file mode 100644 index 0000000000000..26c2da4122abc --- /dev/null +++ b/tests/cmake/overlays/var_expansions/my_extra_module/zephyr/my_extra_module-board.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2022 Legrand, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + /* This file is intentionally empty */ +}; diff --git a/tests/cmake/overlays/var_expansions/my_extra_module/zephyr/my_extra_module-overlay.conf b/tests/cmake/overlays/var_expansions/my_extra_module/zephyr/my_extra_module-overlay.conf new file mode 100644 index 0000000000000..b8f1e0ad46ccf --- /dev/null +++ b/tests/cmake/overlays/var_expansions/my_extra_module/zephyr/my_extra_module-overlay.conf @@ -0,0 +1 @@ +# extra-overlay-empty.conf diff --git a/tests/cmake/overlays/var_expansions/my_module/zephyr/module.yml b/tests/cmake/overlays/var_expansions/my_module/zephyr/module.yml new file mode 100644 index 0000000000000..a1fa25b16805f --- /dev/null +++ b/tests/cmake/overlays/var_expansions/my_module/zephyr/module.yml @@ -0,0 +1 @@ +name: my_module_name diff --git a/tests/cmake/overlays/var_expansions/my_module/zephyr/my_module-board.overlay b/tests/cmake/overlays/var_expansions/my_module/zephyr/my_module-board.overlay new file mode 100644 index 0000000000000..26c2da4122abc --- /dev/null +++ b/tests/cmake/overlays/var_expansions/my_module/zephyr/my_module-board.overlay @@ -0,0 +1,9 @@ +/* + * Copyright (c) 2022 Legrand, Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + /* This file is intentionally empty */ +}; diff --git a/tests/cmake/overlays/var_expansions/my_module/zephyr/my_module-overlay.conf b/tests/cmake/overlays/var_expansions/my_module/zephyr/my_module-overlay.conf new file mode 100644 index 0000000000000..67ace195392ad --- /dev/null +++ b/tests/cmake/overlays/var_expansions/my_module/zephyr/my_module-overlay.conf @@ -0,0 +1 @@ +# overlay-empty.conf diff --git a/tests/cmake/overlays/var_expansions/prj.conf b/tests/cmake/overlays/var_expansions/prj.conf new file mode 100644 index 0000000000000..9228251051ec0 --- /dev/null +++ b/tests/cmake/overlays/var_expansions/prj.conf @@ -0,0 +1,2 @@ +CONFIG_ZTEST=y +CONFIG_ZTEST_NEW_API=y diff --git a/tests/cmake/overlays/var_expansions/src/main.c b/tests/cmake/overlays/var_expansions/src/main.c new file mode 100644 index 0000000000000..59460a2db7e44 --- /dev/null +++ b/tests/cmake/overlays/var_expansions/src/main.c @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2022 Legrand North America, LLC. + * + * SPDX-License-Identifier: Apache-2.0 + */ + + +#include + + +ZTEST_SUITE(cmake_overlay_tests, NULL, NULL, NULL, NULL, NULL); + +ZTEST(cmake_overlay_tests, test_stub_for_build_only_test) +{ + ztest_test_pass(); +} diff --git a/tests/cmake/overlays/var_expansions/testcase.yaml b/tests/cmake/overlays/var_expansions/testcase.yaml new file mode 100644 index 0000000000000..4d33884b4f465 --- /dev/null +++ b/tests/cmake/overlays/var_expansions/testcase.yaml @@ -0,0 +1,11 @@ +common: + tags: cmake + build_only: true + platform_allow: native_posix +tests: + cmake.overlays.var_expansions.CONF_FILE: + extra_args: CONF_FILE=${ZEPHYR_MY_MODULE_NAME_MODULE_DIR}/zephyr/my_module-overlay.conf;${ZEPHYR_MY_EXTRA_MODULE_NAME_MODULE_DIR}/zephyr/my_extra_module-overlay.conf;prj.conf + cmake.overlays.var_expansions.OVERLAY_CONFIG: + extra_args: OVERLAY_CONFIG=${ZEPHYR_MY_MODULE_NAME_MODULE_DIR}/zephyr/my_module-overlay.conf;${ZEPHYR_MY_EXTRA_MODULE_NAME_MODULE_DIR}/zephyr/my_extra_module-overlay.conf + cmake.overlays.var_expansions.DTC_OVERLAY_FILE: + extra_args: DTC_OVERLAY_FILE=${ZEPHYR_MY_MODULE_NAME_MODULE_DIR}/zephyr/my_module-board.overlay;${ZEPHYR_MY_EXTRA_MODULE_NAME_MODULE_DIR}/zephyr/my_extra_module-board.overlay