| # This cmake file provides functionality to import additional out-of-tree, OoT |
| # CMakeLists.txt and Kconfig files into Zephyr build system. |
| # It uses -DZEPHYR_MODULES=<oot-path-to-module>[;<additional-oot-module(s)>] |
| # given to CMake for a list of folders to search. |
| # It looks for: <oot-module>/zephyr/module.yml or |
| # <oot-module>/zephyr/CMakeLists.txt |
| # to load the oot-module into Zephyr build system. |
| # If west is available, it uses `west list` to obtain a list of projects to |
| # search for zephyr/module.yml |
| |
| if(ZEPHYR_MODULES) |
| set(west_project_list ${ZEPHYR_MODULES}) |
| elseif(WEST) |
| ## Use `west list` to fetch all west handled projects. |
| execute_process( |
| COMMAND |
| ${WEST} list --format={posixpath} |
| OUTPUT_VARIABLE |
| west_project_output |
| ERROR_VARIABLE |
| west_project_error |
| RESULT_VARIABLE |
| west_list_result |
| ) |
| if(NOT ${west_list_result}) |
| string(REGEX REPLACE "[\r\n]+" ";" west_project_list "${west_project_output}") |
| elseif(NOT ("${west_project_error}" MATCHES |
| "^Error: .* is not in a west installation\..*")) |
| message(FATAL_ERROR "${west_project_error}") |
| endif() |
| endif() |
| |
| if(ZEPHYR_EXTRA_MODULES) |
| list(APPEND west_project_list ${ZEPHYR_EXTRA_MODULES}) |
| endif() |
| |
| # Clear the Kconfig.modules generated file in case modules has been removed. |
| # The Kconfig.modules contains a list of additional Kconfig files to be sourced |
| # based upon <module>/zephyr/module.yml files. |
| set(KCONFIG_MODULES_FILE ${CMAKE_BINARY_DIR}/Kconfig.modules) |
| file(WRITE ${KCONFIG_MODULES_FILE} |
| "# NOTE: THIS FILE IS AUTOGENERATED BY CMAKE\n" |
| ) |
| # For each west managed project, determine if the project is a zephyr module. |
| foreach(module ${west_project_list}) |
| set(cmake_subdir "zephyr") |
| if(${ZEPHYR_BASE} STREQUAL ${module}) |
| # Ignore Zephyr project to avoid potential invalid looping |
| elseif(EXISTS "${module}/zephyr/module.yml") |
| set(kconfig_osource "osource \"${module}/zephyr/Kconfig\"\n") |
| get_filename_component(module_name ${module} NAME) |
| execute_process( |
| COMMAND |
| ${PYTHON_EXECUTABLE} |
| ${ZEPHYR_BASE}/scripts/yaml_to_cmake.py |
| -i "${module}/zephyr/module.yml" |
| -o "${CMAKE_CURRENT_BINARY_DIR}/zephyr_module_${module_name}.txt" |
| -s "build" |
| ) |
| file( |
| STRINGS |
| "${CMAKE_CURRENT_BINARY_DIR}/zephyr_module_${module_name}.txt" |
| zephyr_module |
| ) |
| |
| foreach(key_value ${zephyr_module}) |
| if(${key_value} MATCHES "^cmake=") |
| string(REGEX REPLACE "^cmake=" "" cmake_subdir ${key_value}) |
| elseif(${key_value} MATCHES "^kconfig=") |
| string( |
| REGEX REPLACE |
| "^kconfig=" |
| "osource \"${module}/" |
| kconfig_osource |
| ${key_value} "\"\n" |
| ) |
| endif() |
| endforeach() |
| |
| list(APPEND ZEPHYR_MODULES_NAME ${module_name}) |
| list(APPEND ZEPHYR_MODULES_DIR ${module}/${cmake_subdir}) |
| file(APPEND ${KCONFIG_MODULES_FILE} ${kconfig_osource}) |
| elseif(EXISTS "${module}/${cmake_subdir}/CMakeLists.txt") |
| set(kconfig_osource "osource \"${module}/zephyr/Kconfig\"\n") |
| get_filename_component(module_name ${module} NAME) |
| list(APPEND ZEPHYR_MODULES_NAME ${module_name}) |
| list(APPEND ZEPHYR_MODULES_DIR ${module}/${cmake_subdir}) |
| file(APPEND ${KCONFIG_MODULES_FILE} ${kconfig_osource}) |
| else() |
| # Not a Zephyr module, ignore. |
| endif() |
| |
| endforeach() |
| |