| # SPDX-License-Identifier: Apache-2.0 |
| # |
| # Copyright (c) 2021, Nordic Semiconductor ASA |
| |
| # Configure SoC settings based on Kconfig settings and SoC root. |
| # |
| # This CMake module will set the following variables in the build system based |
| # on Kconfig settings and selected SoC. |
| # |
| # If no implementation is available for the selected SoC an error will be raised. |
| # |
| # Outcome: |
| # The following variables will be defined when this CMake module completes: |
| # |
| # - SOC_NAME: Name of the SoC in use, identical to CONFIG_SOC |
| # - SOC_SERIES: Name of the SoC series in use, identical to CONFIG_SOC_SERIES |
| # - SOC_FAMILY: Name of the SoC family, identical to CONFIG_SOC_FAMILY |
| # - SOC_PATH: Path fragment defined by either SOC_NAME or SOC_FAMILY/SOC_SERIES. |
| # - SOC_DIR: Directory containing the SoC implementation |
| # - SOC_ROOT: SOC_ROOT with ZEPHYR_BASE appended |
| # |
| # Variable dependencies: |
| # - SOC_ROOT: CMake list of SoC roots containing SoC implementations |
| # |
| # Variables set by this module and not mentioned above are considered internal |
| # use only and may be removed, renamed, or re-purposed without prior notice. |
| |
| include_guard(GLOBAL) |
| |
| include(kconfig) |
| |
| if(HWMv1) |
| # 'SOC_ROOT' is a prioritized list of directories where socs may be |
| # found. It always includes ${ZEPHYR_BASE}/soc at the lowest priority. |
| list(APPEND SOC_ROOT ${ZEPHYR_BASE}) |
| |
| set(SOC_NAME ${CONFIG_SOC}) |
| set(SOC_SERIES ${CONFIG_SOC_SERIES}) |
| set(SOC_TOOLCHAIN_NAME ${CONFIG_SOC_TOOLCHAIN_NAME}) |
| set(SOC_FAMILY ${CONFIG_SOC_FAMILY}) |
| |
| if("${SOC_SERIES}" STREQUAL "") |
| set(SOC_PATH ${SOC_NAME}) |
| else() |
| set(SOC_PATH ${SOC_FAMILY}/${SOC_SERIES}) |
| endif() |
| |
| # Use SOC to search for a 'CMakeLists.txt' file. |
| # e.g. zephyr/soc/xtensa/intel_adsp/CMakeLists.txt. |
| foreach(root ${SOC_ROOT}) |
| # Check that the root looks reasonable. |
| if(NOT IS_DIRECTORY "${root}/soc") |
| message(WARNING "\nSOC_ROOT element(s) without a 'soc' subdirectory: |
| ${root} |
| Hints: |
| - if your SoC family directory is '/foo/bar/soc/<ARCH>/my_soc_family', then add '/foo/bar' to SOC_ROOT, not the entire SoC family path |
| - if in doubt, use absolute paths\n") |
| endif() |
| |
| if(EXISTS ${root}/soc/${ARCH}/${SOC_PATH}) |
| set(SOC_DIR ${root}/soc) |
| break() |
| elseif(EXISTS ${root}/soc/soc_legacy/${ARCH}/${SOC_PATH}) |
| set(SOC_DIR ${root}/soc/soc_legacy) |
| break() |
| endif() |
| endforeach() |
| |
| if(NOT SOC_DIR) |
| message(FATAL_ERROR "Could not find SOC=${SOC_NAME} for BOARD=${BOARD},\n" |
| "please check your installation.\n" |
| "SOC roots searched:\n" |
| "${SOC_ROOT}\n" |
| ) |
| endif() |
| |
| set(SOC_FULL_DIR ${SOC_DIR}/${ARCH}/${SOC_PATH}) |
| endif() |