Anas Nashif | 3ae5262 | 2019-04-06 09:08:09 -0400 | [diff] [blame] | 1 | # SPDX-License-Identifier: Apache-2.0 |
| 2 | |
Torsten Rasmussen | 3673e28 | 2020-12-17 11:27:42 +0100 | [diff] [blame] | 3 | # This cmake file provides functionality to import CMakeLists.txt and Kconfig |
| 4 | # files for Zephyr modules into Zephyr build system. |
| 5 | # |
| 6 | # CMakeLists.txt and Kconfig files can reside directly in the module or in a |
| 7 | # MODULE_EXT_ROOT. |
| 8 | # The `<module>/zephyr/module.yml` file specifies whether the build files are |
| 9 | # located in the module or in a MODULE_EXT_ROOT. |
| 10 | # |
| 11 | # A list of Zephyr modules can be provided to the build system using: |
| 12 | # -DZEPHYR_MODULES=<module-path>[;<additional-module(s)-path>] |
| 13 | # |
| 14 | # It looks for: <module>/zephyr/module.yml or |
| 15 | # <module>/zephyr/CMakeLists.txt |
| 16 | # to load the module into Zephyr build system. |
Torsten Rasmussen | 7e9d1bd | 2019-02-05 10:36:22 +0100 | [diff] [blame] | 17 | # If west is available, it uses `west list` to obtain a list of projects to |
| 18 | # search for zephyr/module.yml |
Torsten Rasmussen | 3673e28 | 2020-12-17 11:27:42 +0100 | [diff] [blame] | 19 | # |
| 20 | # If the module.yml file specifies that build files are located in a |
| 21 | # MODULE_EXT_ROOT then the variables: |
| 22 | # - `ZEPHYR_<MODULE_NAME>_CMAKE_DIR` is used for inclusion of the CMakeLists.txt |
| 23 | # - `ZEPHYR_<MODULE_NAME>_KCONFIG` is used for inclusion of the Kconfig |
| 24 | # files into the build system. |
Torsten Rasmussen | 7e9d1bd | 2019-02-05 10:36:22 +0100 | [diff] [blame] | 25 | |
| 26 | if(ZEPHYR_MODULES) |
Torsten Rasmussen | bd7569f | 2019-03-19 10:38:18 +0100 | [diff] [blame] | 27 | set(ZEPHYR_MODULES_ARG "--modules" ${ZEPHYR_MODULES}) |
Torsten Rasmussen | 7e9d1bd | 2019-02-05 10:36:22 +0100 | [diff] [blame] | 28 | endif() |
| 29 | |
| 30 | if(ZEPHYR_EXTRA_MODULES) |
Torsten Rasmussen | bd7569f | 2019-03-19 10:38:18 +0100 | [diff] [blame] | 31 | set(ZEPHYR_EXTRA_MODULES_ARG "--extra-modules" ${ZEPHYR_EXTRA_MODULES}) |
Torsten Rasmussen | 7e9d1bd | 2019-02-05 10:36:22 +0100 | [diff] [blame] | 32 | endif() |
| 33 | |
Torsten Rasmussen | 01f55a4 | 2020-07-06 21:39:31 +0200 | [diff] [blame] | 34 | set(KCONFIG_MODULES_FILE ${KCONFIG_BINARY_DIR}/Kconfig.modules) |
Torsten Rasmussen | 25d57ba | 2020-07-07 17:29:56 +0200 | [diff] [blame] | 35 | set(ZEPHYR_SETTINGS_FILE ${CMAKE_BINARY_DIR}/zephyr_settings.txt) |
Marc Herbert | c240b69 | 2019-03-29 23:35:12 -0700 | [diff] [blame] | 36 | |
Sigvart M. Hovland | 06365a5 | 2019-04-25 12:27:17 +0200 | [diff] [blame] | 37 | if(WEST) |
Torsten Rasmussen | ef3c5e5 | 2020-06-08 21:09:15 +0200 | [diff] [blame] | 38 | set(WEST_ARG "--zephyr-base" ${ZEPHYR_BASE}) |
Sigvart M. Hovland | 06365a5 | 2019-04-25 12:27:17 +0200 | [diff] [blame] | 39 | endif() |
| 40 | |
Torsten Rasmussen | bd7569f | 2019-03-19 10:38:18 +0100 | [diff] [blame] | 41 | if(WEST OR ZEPHYR_MODULES) |
| 42 | # Zephyr module uses west, so only call it if west is installed or |
| 43 | # ZEPHYR_MODULES was provided as argument to CMake. |
| 44 | execute_process( |
| 45 | COMMAND |
| 46 | ${PYTHON_EXECUTABLE} ${ZEPHYR_BASE}/scripts/zephyr_module.py |
Sigvart M. Hovland | 06365a5 | 2019-04-25 12:27:17 +0200 | [diff] [blame] | 47 | ${WEST_ARG} |
Torsten Rasmussen | bd7569f | 2019-03-19 10:38:18 +0100 | [diff] [blame] | 48 | ${ZEPHYR_MODULES_ARG} |
| 49 | ${ZEPHYR_EXTRA_MODULES_ARG} |
Marc Herbert | c240b69 | 2019-03-29 23:35:12 -0700 | [diff] [blame] | 50 | --kconfig-out ${KCONFIG_MODULES_FILE} |
Torsten Rasmussen | bd7569f | 2019-03-19 10:38:18 +0100 | [diff] [blame] | 51 | --cmake-out ${CMAKE_BINARY_DIR}/zephyr_modules.txt |
Torsten Rasmussen | 25d57ba | 2020-07-07 17:29:56 +0200 | [diff] [blame] | 52 | --settings-out ${ZEPHYR_SETTINGS_FILE} |
Torsten Rasmussen | 6c294bc | 2020-08-26 12:09:43 +0200 | [diff] [blame] | 53 | WORKING_DIRECTORY ${ZEPHYR_BASE} |
Torsten Rasmussen | bd7569f | 2019-03-19 10:38:18 +0100 | [diff] [blame] | 54 | ERROR_VARIABLE |
| 55 | zephyr_module_error_text |
| 56 | RESULT_VARIABLE |
| 57 | zephyr_module_return |
Torsten Rasmussen | 7e9d1bd | 2019-02-05 10:36:22 +0100 | [diff] [blame] | 58 | ) |
Torsten Rasmussen | 7e9d1bd | 2019-02-05 10:36:22 +0100 | [diff] [blame] | 59 | |
Torsten Rasmussen | 25d57ba | 2020-07-07 17:29:56 +0200 | [diff] [blame] | 60 | if(${zephyr_module_return}) |
Torsten Rasmussen | bd7569f | 2019-03-19 10:38:18 +0100 | [diff] [blame] | 61 | message(FATAL_ERROR "${zephyr_module_error_text}") |
Torsten Rasmussen | 7e9d1bd | 2019-02-05 10:36:22 +0100 | [diff] [blame] | 62 | endif() |
Marc Herbert | c240b69 | 2019-03-29 23:35:12 -0700 | [diff] [blame] | 63 | |
Torsten Rasmussen | 25d57ba | 2020-07-07 17:29:56 +0200 | [diff] [blame] | 64 | if(EXISTS ${ZEPHYR_SETTINGS_FILE}) |
Martí Bolívar | 361956b | 2021-08-09 10:46:17 -0700 | [diff] [blame] | 65 | file(STRINGS ${ZEPHYR_SETTINGS_FILE} ZEPHYR_SETTINGS_TXT ENCODING UTF-8 REGEX "^[^#]") |
Torsten Rasmussen | 25d57ba | 2020-07-07 17:29:56 +0200 | [diff] [blame] | 66 | foreach(setting ${ZEPHYR_SETTINGS_TXT}) |
| 67 | # Match <key>:<value> for each line of file, each corresponding to |
| 68 | # a setting. The use of quotes is required due to CMake not supporting |
| 69 | # lazy regexes (it supports greedy only). |
| 70 | string(REGEX REPLACE "\"(.*)\":\".*\"" "\\1" key ${setting}) |
| 71 | string(REGEX REPLACE "\".*\":\"(.*)\"" "\\1" value ${setting}) |
Torsten Rasmussen | 3673e28 | 2020-12-17 11:27:42 +0100 | [diff] [blame] | 72 | # MODULE_EXT_ROOT is process order which means module roots processed |
| 73 | # later wins. To ensure ZEPHYR_BASE stays first, and command line settings |
| 74 | # are processed last, we insert at position 1. |
| 75 | if ("${key}" STREQUAL "MODULE_EXT_ROOT") |
| 76 | list(INSERT ${key} 1 ${value}) |
| 77 | else() |
| 78 | list(APPEND ${key} ${value}) |
| 79 | endif() |
Torsten Rasmussen | 25d57ba | 2020-07-07 17:29:56 +0200 | [diff] [blame] | 80 | endforeach() |
| 81 | endif() |
| 82 | |
Torsten Rasmussen | 3673e28 | 2020-12-17 11:27:42 +0100 | [diff] [blame] | 83 | foreach(root ${MODULE_EXT_ROOT}) |
| 84 | if(NOT EXISTS ${root}) |
| 85 | message(FATAL_ERROR "No `modules.cmake` found in module root `${root}`.") |
| 86 | endif() |
| 87 | |
| 88 | include(${root}/modules/modules.cmake) |
| 89 | endforeach() |
| 90 | |
Torsten Rasmussen | 2fc062b | 2020-08-24 11:01:04 +0200 | [diff] [blame] | 91 | if(EXISTS ${CMAKE_BINARY_DIR}/zephyr_modules.txt) |
| 92 | file(STRINGS ${CMAKE_BINARY_DIR}/zephyr_modules.txt ZEPHYR_MODULES_TXT |
| 93 | ENCODING UTF-8) |
| 94 | set(ZEPHYR_MODULE_NAMES) |
| 95 | |
| 96 | foreach(module ${ZEPHYR_MODULES_TXT}) |
| 97 | # Match "<name>":"<path>" for each line of file, each corresponding to |
| 98 | # one module. The use of quotes is required due to CMake not supporting |
| 99 | # lazy regexes (it supports greedy only). |
Torsten Rasmussen | 3673e28 | 2020-12-17 11:27:42 +0100 | [diff] [blame] | 100 | string(CONFIGURE ${module} module) |
Torsten Rasmussen | ab7ec17 | 2020-08-25 13:32:33 +0200 | [diff] [blame] | 101 | string(REGEX REPLACE "\"(.*)\":\".*\":\".*\"" "\\1" module_name ${module}) |
| 102 | string(REGEX REPLACE "\".*\":\"(.*)\":\".*\"" "\\1" module_path ${module}) |
| 103 | string(REGEX REPLACE "\".*\":\".*\":\"(.*)\"" "\\1" cmake_path ${module}) |
Torsten Rasmussen | 2fc062b | 2020-08-24 11:01:04 +0200 | [diff] [blame] | 104 | |
| 105 | list(APPEND ZEPHYR_MODULE_NAMES ${module_name}) |
| 106 | |
Torsten Rasmussen | 3d88083 | 2021-01-19 12:01:38 +0100 | [diff] [blame] | 107 | zephyr_string(SANITIZE TOUPPER MODULE_NAME_UPPER ${module_name}) |
Torsten Rasmussen | 4e8a991 | 2020-08-26 09:45:08 +0200 | [diff] [blame] | 108 | if(NOT ${MODULE_NAME_UPPER} STREQUAL CURRENT) |
| 109 | set(ZEPHYR_${MODULE_NAME_UPPER}_MODULE_DIR ${module_path}) |
| 110 | set(ZEPHYR_${MODULE_NAME_UPPER}_CMAKE_DIR ${cmake_path}) |
| 111 | else() |
| 112 | message(FATAL_ERROR "Found Zephyr module named: ${module_name}\n\ |
| 113 | ${MODULE_NAME_UPPER} is a restricted name for Zephyr modules as it is used for \ |
| 114 | \${ZEPHYR_${MODULE_NAME_UPPER}_MODULE_DIR} CMake variable.") |
| 115 | endif() |
Torsten Rasmussen | 2fc062b | 2020-08-24 11:01:04 +0200 | [diff] [blame] | 116 | endforeach() |
| 117 | endif() |
Marc Herbert | c240b69 | 2019-03-29 23:35:12 -0700 | [diff] [blame] | 118 | else() |
| 119 | |
| 120 | file(WRITE ${KCONFIG_MODULES_FILE} |
| 121 | "# No west and no modules\n" |
| 122 | ) |
| 123 | |
Torsten Rasmussen | bd7569f | 2019-03-19 10:38:18 +0100 | [diff] [blame] | 124 | endif() |
Torsten Rasmussen | 2bf26ec | 2021-01-26 09:41:42 +0100 | [diff] [blame] | 125 | |
Wolfgang Puffitsch | 4a01446 | 2021-02-19 13:03:35 +0100 | [diff] [blame] | 126 | if(DEFINED ZEPHYR_MODULE_NAMES) |
| 127 | list(REMOVE_DUPLICATES ZEPHYR_MODULE_NAMES) |
| 128 | endif() |