blob: d0e8b85f7fc19f8ad8bcd7842851e68fc001ced9 [file] [log] [blame]
Anas Nashif3ae52622019-04-06 09:08:09 -04001# SPDX-License-Identifier: Apache-2.0
2
Torsten Rasmussen3673e282020-12-17 11:27:42 +01003# 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 Rasmussen7e9d1bd2019-02-05 10:36:22 +010017# If west is available, it uses `west list` to obtain a list of projects to
18# search for zephyr/module.yml
Torsten Rasmussen3673e282020-12-17 11:27:42 +010019#
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 Rasmussen7e9d1bd2019-02-05 10:36:22 +010025
26if(ZEPHYR_MODULES)
Torsten Rasmussenbd7569f2019-03-19 10:38:18 +010027 set(ZEPHYR_MODULES_ARG "--modules" ${ZEPHYR_MODULES})
Torsten Rasmussen7e9d1bd2019-02-05 10:36:22 +010028endif()
29
30if(ZEPHYR_EXTRA_MODULES)
Torsten Rasmussenbd7569f2019-03-19 10:38:18 +010031 set(ZEPHYR_EXTRA_MODULES_ARG "--extra-modules" ${ZEPHYR_EXTRA_MODULES})
Torsten Rasmussen7e9d1bd2019-02-05 10:36:22 +010032endif()
33
Torsten Rasmussen01f55a42020-07-06 21:39:31 +020034set(KCONFIG_MODULES_FILE ${KCONFIG_BINARY_DIR}/Kconfig.modules)
Torsten Rasmussen25d57ba2020-07-07 17:29:56 +020035set(ZEPHYR_SETTINGS_FILE ${CMAKE_BINARY_DIR}/zephyr_settings.txt)
Marc Herbertc240b692019-03-29 23:35:12 -070036
Sigvart M. Hovland06365a52019-04-25 12:27:17 +020037if(WEST)
Torsten Rasmussenef3c5e52020-06-08 21:09:15 +020038 set(WEST_ARG "--zephyr-base" ${ZEPHYR_BASE})
Sigvart M. Hovland06365a52019-04-25 12:27:17 +020039endif()
40
Torsten Rasmussenbd7569f2019-03-19 10:38:18 +010041if(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. Hovland06365a52019-04-25 12:27:17 +020047 ${WEST_ARG}
Torsten Rasmussenbd7569f2019-03-19 10:38:18 +010048 ${ZEPHYR_MODULES_ARG}
49 ${ZEPHYR_EXTRA_MODULES_ARG}
Marc Herbertc240b692019-03-29 23:35:12 -070050 --kconfig-out ${KCONFIG_MODULES_FILE}
Torsten Rasmussenbd7569f2019-03-19 10:38:18 +010051 --cmake-out ${CMAKE_BINARY_DIR}/zephyr_modules.txt
Torsten Rasmussen25d57ba2020-07-07 17:29:56 +020052 --settings-out ${ZEPHYR_SETTINGS_FILE}
Torsten Rasmussen6c294bc2020-08-26 12:09:43 +020053 WORKING_DIRECTORY ${ZEPHYR_BASE}
Torsten Rasmussenbd7569f2019-03-19 10:38:18 +010054 ERROR_VARIABLE
55 zephyr_module_error_text
56 RESULT_VARIABLE
57 zephyr_module_return
Torsten Rasmussen7e9d1bd2019-02-05 10:36:22 +010058 )
Torsten Rasmussen7e9d1bd2019-02-05 10:36:22 +010059
Torsten Rasmussen25d57ba2020-07-07 17:29:56 +020060 if(${zephyr_module_return})
Torsten Rasmussenbd7569f2019-03-19 10:38:18 +010061 message(FATAL_ERROR "${zephyr_module_error_text}")
Torsten Rasmussen7e9d1bd2019-02-05 10:36:22 +010062 endif()
Marc Herbertc240b692019-03-29 23:35:12 -070063
Torsten Rasmussen25d57ba2020-07-07 17:29:56 +020064 if(EXISTS ${ZEPHYR_SETTINGS_FILE})
Martí Bolívar361956b2021-08-09 10:46:17 -070065 file(STRINGS ${ZEPHYR_SETTINGS_FILE} ZEPHYR_SETTINGS_TXT ENCODING UTF-8 REGEX "^[^#]")
Torsten Rasmussen25d57ba2020-07-07 17:29:56 +020066 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 Rasmussen3673e282020-12-17 11:27:42 +010072 # 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 Rasmussen25d57ba2020-07-07 17:29:56 +020080 endforeach()
81 endif()
82
Torsten Rasmussen3673e282020-12-17 11:27:42 +010083 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 Rasmussen2fc062b2020-08-24 11:01:04 +020091 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 Rasmussen3673e282020-12-17 11:27:42 +0100100 string(CONFIGURE ${module} module)
Torsten Rasmussenab7ec172020-08-25 13:32:33 +0200101 string(REGEX REPLACE "\"(.*)\":\".*\":\".*\"" "\\1" module_name ${module})
102 string(REGEX REPLACE "\".*\":\"(.*)\":\".*\"" "\\1" module_path ${module})
103 string(REGEX REPLACE "\".*\":\".*\":\"(.*)\"" "\\1" cmake_path ${module})
Torsten Rasmussen2fc062b2020-08-24 11:01:04 +0200104
105 list(APPEND ZEPHYR_MODULE_NAMES ${module_name})
106
Torsten Rasmussen3d880832021-01-19 12:01:38 +0100107 zephyr_string(SANITIZE TOUPPER MODULE_NAME_UPPER ${module_name})
Torsten Rasmussen4e8a9912020-08-26 09:45:08 +0200108 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 Rasmussen2fc062b2020-08-24 11:01:04 +0200116 endforeach()
117 endif()
Marc Herbertc240b692019-03-29 23:35:12 -0700118else()
119
120 file(WRITE ${KCONFIG_MODULES_FILE}
121 "# No west and no modules\n"
122 )
123
Torsten Rasmussenbd7569f2019-03-19 10:38:18 +0100124endif()
Torsten Rasmussen2bf26ec2021-01-26 09:41:42 +0100125
Wolfgang Puffitsch4a014462021-02-19 13:03:35 +0100126if(DEFINED ZEPHYR_MODULE_NAMES)
127 list(REMOVE_DUPLICATES ZEPHYR_MODULE_NAMES)
128endif()