From 84e809d44c0b28c553f4fcf7411d35953b5fa818 Mon Sep 17 00:00:00 2001 From: Gregory Shue Date: Fri, 21 Jan 2022 10:58:17 -0800 Subject: [PATCH 1/2] 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. Fixes #41830 Signed-off-by: Gregory Shue --- cmake/app/boilerplate.cmake | 3 ++- cmake/dts.cmake | 3 ++- cmake/kconfig.cmake | 6 +++-- doc/application/index.rst | 5 ++++- doc/guides/dts/howtos.rst | 5 ++++- .../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 + .../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 | 1 + .../cmake/overlays/var_expansions/src/main.c | 22 +++++++++++++++++++ .../overlays/var_expansions/testcase.yaml | 11 ++++++++++ 15 files changed, 84 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/app/boilerplate.cmake b/cmake/app/boilerplate.cmake index 6102d739c9f51..c7ca5a4ef72ca 100644 --- a/cmake/app/boilerplate.cmake +++ b/cmake/app/boilerplate.cmake @@ -444,7 +444,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/dts.cmake b/cmake/dts.cmake index 039853a69255f..7bf9249c6ec9d 100644 --- a/cmake/dts.cmake +++ b/cmake/dts.cmake @@ -69,7 +69,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/kconfig.cmake b/cmake/kconfig.cmake index cd7ba45b70659..8e6d9e514a440 100644 --- a/cmake/kconfig.cmake +++ b/cmake/kconfig.cmake @@ -52,11 +52,13 @@ 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() 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/application/index.rst b/doc/application/index.rst index 0cb6b17f0c494..b64fd12d133c9 100644 --- a/doc/application/index.rst +++ b/doc/application/index.rst @@ -478,7 +478,10 @@ Application Configuration Directory Zephyr will use configuration files from the application's configuration directory except for files with an absolute path provided by the arguments described earlier, for example ``CONF_FILE``, ``OVERLAY_CONFIG``, and -``DTC_OVERLAY_FILE``. +``DTC_OVERLAY_FILE``. 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. The application configuration directory is defined by the ``APPLICATION_CONFIG_DIR`` variable. diff --git a/doc/guides/dts/howtos.rst b/doc/guides/dts/howtos.rst index a6e36279dd022..4ff2549d551ee 100644 --- a/doc/guides/dts/howtos.rst +++ b/doc/guides/dts/howtos.rst @@ -202,7 +202,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/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..9467c2926896d --- /dev/null +++ b/tests/cmake/overlays/var_expansions/prj.conf @@ -0,0 +1 @@ +CONFIG_ZTEST=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..e1cf71fcb9abf --- /dev/null +++ b/tests/cmake/overlays/var_expansions/src/main.c @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2022 Legrand North America, LLC. + * + * SPDX-License-Identifier: Apache-2.0 + */ + + +#include +#include + + +static void test_stub_for_build_only_test(void) +{ + ztest_test_pass(); +} + +void test_main(void) +{ + ztest_test_suite(cmake_overlay_var_expansions_test_suite, + ztest_unit_test(test_stub_for_build_only_test)); + ztest_run_test_suite(cmake_overlay_var_expansions_test_suite); +} 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 From 99ff090cf68478703f7084072b7c50cc4ca5a269 Mon Sep 17 00:00:00 2001 From: Greg Shue <32416235+gregshue@users.noreply.github.com> Date: Tue, 15 Feb 2022 16:57:48 -0800 Subject: [PATCH 2/2] Apply suggestions from code review Adopted from review suggestions. Co-authored-by: Torsten Tejlmand Rasmussen --- doc/application/index.rst | 4 ++-- doc/guides/dts/howtos.rst | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/application/index.rst b/doc/application/index.rst index b64fd12d133c9..fb9c78dbf0a3a 100644 --- a/doc/application/index.rst +++ b/doc/application/index.rst @@ -478,9 +478,9 @@ Application Configuration Directory Zephyr will use configuration files from the application's configuration directory except for files with an absolute path provided by the arguments described earlier, for example ``CONF_FILE``, ``OVERLAY_CONFIG``, and -``DTC_OVERLAY_FILE``. A file in a Zephyr module can be referred by +``DTC_OVERLAY_FILE``. A file in a Zephyr module can be referred by escaping the Zephyr module dir variable like this -``\${ZEPHYR__MODULE_DIR}//`` +``\${ZEPHYR__MODULE_DIR}//`` when setting any of said variables. The application configuration directory is defined by the diff --git a/doc/guides/dts/howtos.rst b/doc/guides/dts/howtos.rst index 4ff2549d551ee..cb4141ce611cd 100644 --- a/doc/guides/dts/howtos.rst +++ b/doc/guides/dts/howtos.rst @@ -204,7 +204,7 @@ 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. A file in a Zephyr module can be referred to by escaping the Zephyr module dir variable -like `\${ZEPHYR__MODULE_DIR}//dts.overlay` +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