blob: 191c71c193b2c5ce38127b20b3a43b2bbfcff020 [file] [log] [blame]
Anas Nashif3ae52622019-04-06 09:08:09 -04001# SPDX-License-Identifier: Apache-2.0
2
Torsten Rasmussen61453e42021-12-16 17:13:54 +01003include_guard(GLOBAL)
4
5include(extensions)
6include(python)
7
Torsten Rasmussen3673e282020-12-17 11:27:42 +01008# This cmake file provides functionality to import CMakeLists.txt and Kconfig
9# files for Zephyr modules into Zephyr build system.
10#
Torsten Rasmussen96b3e4d2021-12-16 15:52:28 +010011# CMakeLists.txt and Kconfig files can reside directly in the Zephyr module or
12# in a MODULE_EXT_ROOT.
Torsten Rasmussen3673e282020-12-17 11:27:42 +010013# The `<module>/zephyr/module.yml` file specifies whether the build files are
Torsten Rasmussen96b3e4d2021-12-16 15:52:28 +010014# located in the Zephyr module or in a MODULE_EXT_ROOT.
Torsten Rasmussen3673e282020-12-17 11:27:42 +010015#
16# A list of Zephyr modules can be provided to the build system using:
17# -DZEPHYR_MODULES=<module-path>[;<additional-module(s)-path>]
18#
19# It looks for: <module>/zephyr/module.yml or
20# <module>/zephyr/CMakeLists.txt
Torsten Rasmussen96b3e4d2021-12-16 15:52:28 +010021# to load the Zephyr module into Zephyr build system.
Marti Bolivar95166472023-01-07 14:47:42 -080022# If west is installed, it uses west's APIs to obtain a list of projects to
23# search for zephyr/module.yml from the current workspace's manifest.
Torsten Rasmussen3673e282020-12-17 11:27:42 +010024#
25# If the module.yml file specifies that build files are located in a
26# MODULE_EXT_ROOT then the variables:
27# - `ZEPHYR_<MODULE_NAME>_CMAKE_DIR` is used for inclusion of the CMakeLists.txt
28# - `ZEPHYR_<MODULE_NAME>_KCONFIG` is used for inclusion of the Kconfig
29# files into the build system.
Torsten Rasmussen7e9d1bd2019-02-05 10:36:22 +010030
Torsten Rasmussen0a9a3c02021-12-15 15:22:39 +010031# Settings used by Zephyr module but where systems may define an alternative value.
32set_ifndef(KCONFIG_BINARY_DIR ${CMAKE_BINARY_DIR}/Kconfig)
33
Torsten Rasmussen44a05e42022-08-19 16:27:39 +020034zephyr_get(ZEPHYR_MODULES)
Torsten Rasmussen7e9d1bd2019-02-05 10:36:22 +010035if(ZEPHYR_MODULES)
Torsten Rasmussenbd7569f2019-03-19 10:38:18 +010036 set(ZEPHYR_MODULES_ARG "--modules" ${ZEPHYR_MODULES})
Torsten Rasmussen7e9d1bd2019-02-05 10:36:22 +010037endif()
38
Torsten Rasmussena8850272023-05-17 13:59:28 +020039zephyr_get(EXTRA_ZEPHYR_MODULES VAR EXTRA_ZEPHYR_MODULES ZEPHYR_EXTRA_MODULES)
40if(EXTRA_ZEPHYR_MODULES)
41 set(EXTRA_ZEPHYR_MODULES_ARG "--extra-modules" ${EXTRA_ZEPHYR_MODULES})
Torsten Rasmussen7e9d1bd2019-02-05 10:36:22 +010042endif()
43
Torsten Rasmussen0a9a3c02021-12-15 15:22:39 +010044file(MAKE_DIRECTORY ${KCONFIG_BINARY_DIR})
Jamie McCrae8cc71672023-02-20 09:36:50 +000045set(kconfig_modules_file ${KCONFIG_BINARY_DIR}/Kconfig.modules)
Jamie McCraedf9027a2023-02-20 10:00:38 +000046set(kconfig_sysbuild_file ${KCONFIG_BINARY_DIR}/Kconfig.sysbuild.modules)
47set(cmake_modules_file ${CMAKE_BINARY_DIR}/zephyr_modules.txt)
48set(cmake_sysbuild_file ${CMAKE_BINARY_DIR}/sysbuild_modules.txt)
Jamie McCrae8cc71672023-02-20 09:36:50 +000049set(zephyr_settings_file ${CMAKE_BINARY_DIR}/zephyr_settings.txt)
Marc Herbertc240b692019-03-29 23:35:12 -070050
Torsten Rasmussenbd7569f2019-03-19 10:38:18 +010051if(WEST OR ZEPHYR_MODULES)
52 # Zephyr module uses west, so only call it if west is installed or
53 # ZEPHYR_MODULES was provided as argument to CMake.
54 execute_process(
55 COMMAND
56 ${PYTHON_EXECUTABLE} ${ZEPHYR_BASE}/scripts/zephyr_module.py
Thomas Gagneretc62dbb12024-01-17 15:56:59 +010057 --zephyr-base=${ZEPHYR_BASE}
Torsten Rasmussenbd7569f2019-03-19 10:38:18 +010058 ${ZEPHYR_MODULES_ARG}
Torsten Rasmussena8850272023-05-17 13:59:28 +020059 ${EXTRA_ZEPHYR_MODULES_ARG}
Jamie McCrae8cc71672023-02-20 09:36:50 +000060 --kconfig-out ${kconfig_modules_file}
Jamie McCraedf9027a2023-02-20 10:00:38 +000061 --cmake-out ${cmake_modules_file}
62 --sysbuild-kconfig-out ${kconfig_sysbuild_file}
63 --sysbuild-cmake-out ${cmake_sysbuild_file}
Jamie McCrae8cc71672023-02-20 09:36:50 +000064 --settings-out ${zephyr_settings_file}
Torsten Rasmussen6c294bc2020-08-26 12:09:43 +020065 WORKING_DIRECTORY ${ZEPHYR_BASE}
Torsten Rasmussenbd7569f2019-03-19 10:38:18 +010066 ERROR_VARIABLE
67 zephyr_module_error_text
68 RESULT_VARIABLE
69 zephyr_module_return
Torsten Rasmussen7e9d1bd2019-02-05 10:36:22 +010070 )
Torsten Rasmussen7e9d1bd2019-02-05 10:36:22 +010071
Torsten Rasmussen25d57ba2020-07-07 17:29:56 +020072 if(${zephyr_module_return})
Torsten Rasmussenbd7569f2019-03-19 10:38:18 +010073 message(FATAL_ERROR "${zephyr_module_error_text}")
Torsten Rasmussen7e9d1bd2019-02-05 10:36:22 +010074 endif()
Marc Herbertc240b692019-03-29 23:35:12 -070075
Jamie McCrae8cc71672023-02-20 09:36:50 +000076 if(EXISTS ${zephyr_settings_file})
77 file(STRINGS ${zephyr_settings_file} zephyr_settings_txt ENCODING UTF-8 REGEX "^[^#]")
78 foreach(setting ${zephyr_settings_txt})
Torsten Rasmussen25d57ba2020-07-07 17:29:56 +020079 # Match <key>:<value> for each line of file, each corresponding to
80 # a setting. The use of quotes is required due to CMake not supporting
81 # lazy regexes (it supports greedy only).
82 string(REGEX REPLACE "\"(.*)\":\".*\"" "\\1" key ${setting})
83 string(REGEX REPLACE "\".*\":\"(.*)\"" "\\1" value ${setting})
Torsten Rasmussen96b3e4d2021-12-16 15:52:28 +010084 list(APPEND ${key} ${value})
Torsten Rasmussen25d57ba2020-07-07 17:29:56 +020085 endforeach()
86 endif()
87
Torsten Rasmussen96b3e4d2021-12-16 15:52:28 +010088 # Append ZEPHYR_BASE as a default ext root at lowest priority
89 list(APPEND MODULE_EXT_ROOT ${ZEPHYR_BASE})
90
Jamie McCraedf9027a2023-02-20 10:00:38 +000091 if(EXISTS ${cmake_modules_file})
92 file(STRINGS ${cmake_modules_file} zephyr_modules_txt ENCODING UTF-8)
Torsten Rasmussena1c49be2021-11-26 10:11:00 +010093 endif()
94
Jamie McCraedf9027a2023-02-20 10:00:38 +000095 set(ZEPHYR_MODULE_NAMES)
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).
100 string(REGEX REPLACE "\"(.*)\":\".*\":\".*\"" "\\1" module_name ${module})
101 list(APPEND ZEPHYR_MODULE_NAMES ${module_name})
102 endforeach()
103
104 if(EXISTS ${cmake_sysbuild_file})
105 file(STRINGS ${cmake_sysbuild_file} sysbuild_modules_txt ENCODING UTF-8)
106 endif()
107
108 set(SYSBUILD_MODULE_NAMES)
109 foreach(module ${sysbuild_modules_txt})
110 # Match "<name>":"<path>" for each line of file, each corresponding to
111 # one module. The use of quotes is required due to CMake not supporting
112 # lazy regexes (it supports greedy only).
113 string(REGEX REPLACE "\"(.*)\":\".*\":\".*\"" "\\1" module_name ${module})
114 list(APPEND SYSBUILD_MODULE_NAMES ${module_name})
115 endforeach()
116
Torsten Rasmussen96b3e4d2021-12-16 15:52:28 +0100117 # MODULE_EXT_ROOT is process order which means Zephyr module roots processed
118 # later wins. therefore we reverse the list before processing.
119 list(REVERSE MODULE_EXT_ROOT)
Torsten Rasmussen3673e282020-12-17 11:27:42 +0100120 foreach(root ${MODULE_EXT_ROOT})
Pete Dietlfd94ca72023-03-27 13:15:30 +0200121 set(module_cmake_file_path modules/modules.cmake)
122 if(NOT EXISTS ${root}/${module_cmake_file_path})
123 message(FATAL_ERROR "No `${module_cmake_file_path}` found in module root `${root}`.")
Torsten Rasmussen3673e282020-12-17 11:27:42 +0100124 endif()
125
Pete Dietlfd94ca72023-03-27 13:15:30 +0200126 include(${root}/${module_cmake_file_path})
Torsten Rasmussen3673e282020-12-17 11:27:42 +0100127 endforeach()
128
Jamie McCraedf9027a2023-02-20 10:00:38 +0000129 foreach(module ${zephyr_modules_txt})
130 # Match "<name>":"<path>" for each line of file, each corresponding to
131 # one Zephyr module. The use of quotes is required due to CMake not
132 # supporting lazy regexes (it supports greedy only).
133 string(CONFIGURE ${module} module)
134 string(REGEX REPLACE "\"(.*)\":\".*\":\".*\"" "\\1" module_name ${module})
135 string(REGEX REPLACE "\".*\":\"(.*)\":\".*\"" "\\1" module_path ${module})
136 string(REGEX REPLACE "\".*\":\".*\":\"(.*)\"" "\\1" cmake_path ${module})
Torsten Rasmussen2fc062b2020-08-24 11:01:04 +0200137
Jamie McCraedf9027a2023-02-20 10:00:38 +0000138 zephyr_string(SANITIZE TOUPPER MODULE_NAME_UPPER ${module_name})
139 if(NOT ${MODULE_NAME_UPPER} STREQUAL CURRENT)
Pieter De Gendtfcaed382024-01-16 19:16:23 +0100140 set(ZEPHYR_${MODULE_NAME_UPPER}_MODULE_NAME ${module_name})
Jamie McCraedf9027a2023-02-20 10:00:38 +0000141 set(ZEPHYR_${MODULE_NAME_UPPER}_MODULE_DIR ${module_path})
142 set(ZEPHYR_${MODULE_NAME_UPPER}_CMAKE_DIR ${cmake_path})
143 else()
144 message(FATAL_ERROR "Found Zephyr module named: ${module_name}\n\
Torsten Rasmussen4e8a9912020-08-26 09:45:08 +0200145${MODULE_NAME_UPPER} is a restricted name for Zephyr modules as it is used for \
146\${ZEPHYR_${MODULE_NAME_UPPER}_MODULE_DIR} CMake variable.")
Jamie McCraedf9027a2023-02-20 10:00:38 +0000147 endif()
148 endforeach()
149
150 foreach(module ${sysbuild_modules_txt})
151 # Match "<name>":"<path>" for each line of file, each corresponding to
152 # one Zephyr module. The use of quotes is required due to CMake not
153 # supporting lazy regexes (it supports greedy only).
154 string(CONFIGURE ${module} module)
155 string(REGEX REPLACE "\"(.*)\":\".*\":\".*\"" "\\1" module_name ${module})
156 string(REGEX REPLACE "\".*\":\"(.*)\":\".*\"" "\\1" module_path ${module})
157 string(REGEX REPLACE "\".*\":\".*\":\"(.*)\"" "\\1" cmake_path ${module})
158
159 zephyr_string(SANITIZE TOUPPER MODULE_NAME_UPPER ${module_name})
160 if(NOT ${MODULE_NAME_UPPER} STREQUAL CURRENT)
161 set(SYSBUILD_${MODULE_NAME_UPPER}_MODULE_DIR ${module_path})
162 set(SYSBUILD_${MODULE_NAME_UPPER}_CMAKE_DIR ${cmake_path})
163 else()
164 message(FATAL_ERROR "Found Zephyr module named: ${module_name}\n\
165${MODULE_NAME_UPPER} is a restricted name for Zephyr modules as it is used for \
166\${SYSBUILD_${MODULE_NAME_UPPER}_MODULE_DIR} CMake variable.")
167 endif()
168 endforeach()
Marc Herbertc240b692019-03-29 23:35:12 -0700169else()
170
Jamie McCrae8cc71672023-02-20 09:36:50 +0000171 file(WRITE ${kconfig_modules_file}
Torsten Rasmussen96b3e4d2021-12-16 15:52:28 +0100172 "# No west and no Zephyr modules\n"
Marc Herbertc240b692019-03-29 23:35:12 -0700173 )
174
Jamie McCraedf9027a2023-02-20 10:00:38 +0000175 file(WRITE ${kconfig_sysbuild_file}
176 "# No west and no Zephyr modules\n"
177 )
178
Torsten Rasmussenbd7569f2019-03-19 10:38:18 +0100179endif()