# 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()

