# SPDX-License-Identifier: Apache-2.0
#
# Copyright (c) 2023, Nordic Semiconductor ASA

# This CMake module works together with the list_hardware.py script to obtain
# all archs and SoC implementations defined in the Zephyr build system.
#
# The result from list_hardware.py is then used to generate Kconfig files for
# the build system.
#
# The following files are generated in '<kconfig-binary-dir>/soc'
# - Kconfig.defconfig: Contains references to SoC defconfig files for Zephyr integration.
# - Kconfig: Contains references to regular SoC Kconfig files for Zephyr integration.
# - Kconfig.soc: Contains references to generic SoC Kconfig files.
#
# The following file is generated in '<kconfig-binary-dir>/arch'
# - Kconfig: Contains references to regular arch Kconfig files for Zephyr integration.

include_guard(GLOBAL)

if(NOT HWMv2)
  return()
endif()

# Internal helper function for creation of Kconfig files.
function(kconfig_gen bin_dir file dirs)
  file(MAKE_DIRECTORY "${bin_dir}")
  set(kconfig_file ${bin_dir}/${file})
  foreach(dir ${dirs})
    cmake_path(CONVERT "${dir}" TO_CMAKE_PATH_LIST dir)
    file(APPEND ${kconfig_file} "osource \"${dir}/${file}\"\n")
  endforeach()
endfunction()

# 'SOC_ROOT' and 'ARCH_ROOT' are prioritized lists of directories where their
# implementations may be found. It always includes ${ZEPHYR_BASE}/[arch|soc]
# at the lowest priority.
list(APPEND SOC_ROOT ${ZEPHYR_BASE})
list(APPEND ARCH_ROOT ${ZEPHYR_BASE})

list(TRANSFORM ARCH_ROOT PREPEND "--arch-root=" OUTPUT_VARIABLE arch_root_args)
list(TRANSFORM SOC_ROOT PREPEND "--soc-root=" OUTPUT_VARIABLE soc_root_args)

execute_process(COMMAND ${PYTHON_EXECUTABLE} ${ZEPHYR_BASE}/scripts/list_hardware.py
                ${arch_root_args} ${soc_root_args}
                --archs --socs
                --cmakeformat={TYPE}\;{NAME}\;{DIR}\;{HWM}
                OUTPUT_VARIABLE ret_hw
                ERROR_VARIABLE err_hw
                RESULT_VARIABLE ret_val
)
if(ret_val)
  message(FATAL_ERROR "Error listing hardware.\nError message: ${err_hw}")
endif()

set(kconfig_soc_source_dir)

while(TRUE)
  string(FIND "${ret_hw}" "\n" idx REVERSE)
  math(EXPR start "${idx} + 1")
  string(SUBSTRING "${ret_hw}" ${start} -1 line)
  string(SUBSTRING "${ret_hw}" 0 ${idx} ret_hw)

  cmake_parse_arguments(HWM "" "TYPE" "" ${line})
  if(HWM_TYPE STREQUAL "arch")
    cmake_parse_arguments(ARCH_V2 "" "NAME;DIR" "" ${line})

    list(APPEND kconfig_arch_source_dir "${ARCH_V2_DIR}")
    list(APPEND ARCH_V2_NAME_LIST ${ARCH_V2_NAME})
    string(TOUPPER "${ARCH_V2_NAME}" ARCH_V2_NAME_UPPER)
    set(ARCH_V2_${ARCH_V2_NAME_UPPER}_DIR ${ARCH_V2_DIR})
  elseif(HWM_TYPE MATCHES "^soc|^series|^family")
    cmake_parse_arguments(SOC_V2 "" "NAME;DIR;HWM" "" ${line})

    list(APPEND kconfig_soc_source_dir "${SOC_V2_DIR}")

    if(HWM_TYPE STREQUAL "soc")
      set(setting_name SOC_${SOC_V2_NAME}_DIR)
    else()
      set(setting_name SOC_${HWM_TYPE}_${SOC_V2_NAME}_DIR)
    endif()
    # We support both SOC_foo_DIR and SOC_FOO_DIR.
    set(${setting_name} ${SOC_V2_DIR})
    string(TOUPPER ${setting_name} setting_name)
    set(${setting_name} ${SOC_V2_DIR})
  endif()

  if(idx EQUAL -1)
    break()
  endif()
endwhile()
list(REMOVE_DUPLICATES kconfig_soc_source_dir)

# Support multiple ARCH_ROOT and SOC_ROOT
set(arch_kconfig_file  Kconfig)
set(soc_defconfig_file Kconfig.defconfig)
set(soc_zephyr_file    Kconfig)
set(soc_kconfig_file   Kconfig.soc)
set(arch_kconfig_header "# Load arch Kconfig descriptions.\n")
set(defconfig_header    "# Load Zephyr SoC Kconfig defconfig.\n")
set(soc_zephyr_header   "# Load Zephyr SoC Kconfig descriptions.\n")
set(soc_kconfig_header  "# Load SoC Kconfig descriptions.\n")
file(WRITE ${KCONFIG_BINARY_DIR}/arch/${arch_kconfig_file} "${arch_kconfig_header}")
file(WRITE ${KCONFIG_BINARY_DIR}/soc/${soc_defconfig_file} "${defconfig_header}")
file(WRITE ${KCONFIG_BINARY_DIR}/soc/${soc_zephyr_file}    "${soc_zephyr_header}")
file(WRITE ${KCONFIG_BINARY_DIR}/soc/${soc_kconfig_file}   "${soc_kconfig_header}")

kconfig_gen("${KCONFIG_BINARY_DIR}/arch" "${arch_kconfig_file}" "${kconfig_arch_source_dir}")
kconfig_gen("${KCONFIG_BINARY_DIR}/soc" "${soc_defconfig_file}" "${kconfig_soc_source_dir}")
kconfig_gen("${KCONFIG_BINARY_DIR}/soc" "${soc_zephyr_file}" "${kconfig_soc_source_dir}")
kconfig_gen("${KCONFIG_BINARY_DIR}/soc" "${soc_kconfig_file}" "${kconfig_soc_source_dir}")

# Clear variables created by cmake_parse_arguments
unset(SOC_V2_NAME)
unset(SOC_V2_DIR)
unset(SOC_V2_HWM)
unset(ARCH_V2_NAME)
unset(ARCH_V2_DIR)
