|  | # The purpose of this file is to verify that required variables has been | 
|  | # defined for proper toolchain use. | 
|  | # | 
|  | # It also offers the possibility to verify that the selected toolchain matches | 
|  | # a specific version. | 
|  | # Currently only when using the Zephyr SDK the version is verified, but other | 
|  | # other version verification for other toolchains can be added as needed. | 
|  | # | 
|  | # This file can also be executed in script mode so that it can be used in other | 
|  | # places, such as python scripts. | 
|  | # | 
|  | # When invoked as a script with -P: | 
|  | # cmake [options] -P verify-toolchain.cmake | 
|  | # | 
|  | # it takes the following arguments: | 
|  | # FORMAT=json: Print the output as a json formatted string, useful for Python | 
|  |  | 
|  | # This is the minimum required Zephyr-SDK version which supports CMake package | 
|  | set(TOOLCHAIN_ZEPHYR_MINIMUM_REQUIRED_VERSION 0.11.3) | 
|  |  | 
|  | # Set internal variables if set in environment. | 
|  | if(NOT DEFINED ZEPHYR_TOOLCHAIN_VARIANT) | 
|  | set(ZEPHYR_TOOLCHAIN_VARIANT $ENV{ZEPHYR_TOOLCHAIN_VARIANT}) | 
|  | endif() | 
|  |  | 
|  | if(NOT DEFINED ZEPHYR_SDK_INSTALL_DIR) | 
|  | set(ZEPHYR_SDK_INSTALL_DIR $ENV{ZEPHYR_SDK_INSTALL_DIR}) | 
|  | endif() | 
|  |  | 
|  | # Pick host system's toolchain if we are targeting posix | 
|  | if("${ARCH}" STREQUAL "posix") | 
|  | if(NOT "${ZEPHYR_TOOLCHAIN_VARIANT}" STREQUAL "llvm") | 
|  | set(ZEPHYR_TOOLCHAIN_VARIANT "host") | 
|  | endif() | 
|  | return() | 
|  | endif() | 
|  |  | 
|  | if(NOT ZEPHYR_TOOLCHAIN_VARIANT AND | 
|  | (CROSS_COMPILE OR (DEFINED ENV{CROSS_COMPILE}))) | 
|  | set(ZEPHYR_TOOLCHAIN_VARIANT cross-compile) | 
|  | endif() | 
|  |  | 
|  | # Verify Zephyr SDK Toolchain. | 
|  | # There are three scenarios where Zephyr SDK should be looked up: | 
|  | # 1) Zephyr specified as toolchain (ZEPHYR_SDK_INSTALL_DIR still used if defined) | 
|  | # 2) No toolchain specified == Default to Zephyr toolchain (Linux only) | 
|  | # Until we completely deprecate it | 
|  | if(("zephyr" STREQUAL ${ZEPHYR_TOOLCHAIN_VARIANT}) OR | 
|  | ((NOT DEFINED ZEPHYR_TOOLCHAIN_VARIANT) AND (${CMAKE_HOST_SYSTEM_NAME} STREQUAL Linux)) OR | 
|  | (DEFINED ZEPHYR_SDK_INSTALL_DIR)) | 
|  |  | 
|  | # No toolchain was specified, so inform user that we will be searching. | 
|  | if (NOT DEFINED ZEPHYR_SDK_INSTALL_DIR AND | 
|  | NOT DEFINED ZEPHYR_TOOLCHAIN_VARIANT | 
|  | AND NOT CMAKE_SCRIPT_MODE_FILE) | 
|  | message(STATUS "ZEPHYR_TOOLCHAIN_VARIANT not set, trying to locate Zephyr SDK") | 
|  | endif() | 
|  |  | 
|  | # This ensure packages are sorted in descending order. | 
|  | SET(CMAKE_FIND_PACKAGE_SORT_DIRECTION_CURRENT ${CMAKE_FIND_PACKAGE_SORT_DIRECTION}) | 
|  | SET(CMAKE_FIND_PACKAGE_SORT_ORDER_CURRENT ${CMAKE_FIND_PACKAGE_SORT_ORDER}) | 
|  | SET(CMAKE_FIND_PACKAGE_SORT_DIRECTION DEC) | 
|  | SET(CMAKE_FIND_PACKAGE_SORT_ORDER NATURAL) | 
|  |  | 
|  | if(DEFINED ZEPHYR_SDK_INSTALL_DIR) | 
|  | # The Zephyr SDK will automatically set the toolchain variant. | 
|  | # To support Zephyr SDK tools (DTC, and other tools) with 3rd party toolchains | 
|  | # then we keep track of current toolchain variant. | 
|  | set(ZEPHYR_CURRENT_TOOLCHAIN_VARIANT ${ZEPHYR_TOOLCHAIN_VARIANT}) | 
|  | find_package(Zephyr-sdk ${TOOLCHAIN_ZEPHYR_MINIMUM_REQUIRED_VERSION} QUIET HINTS $ENV{ZEPHYR_SDK_INSTALL_DIR}) | 
|  | if(DEFINED ZEPHYR_CURRENT_TOOLCHAIN_VARIANT) | 
|  | set(ZEPHYR_TOOLCHAIN_VARIANT ${ZEPHYR_CURRENT_TOOLCHAIN_VARIANT}) | 
|  | endif() | 
|  | else() | 
|  | find_package(Zephyr-sdk ${TOOLCHAIN_ZEPHYR_MINIMUM_REQUIRED_VERSION} QUIET PATHS | 
|  | /usr | 
|  | /usr/local | 
|  | /opt | 
|  | $ENV{HOME} | 
|  | $ENV{HOME}/.local | 
|  | $ENV{HOME}/.local/opt | 
|  | $ENV{HOME}/bin) | 
|  | endif() | 
|  |  | 
|  | SET(CMAKE_FIND_PACKAGE_SORT_DIRECTION ${CMAKE_FIND_PACKAGE_SORT_DIRECTION_CURRENT}) | 
|  | SET(CMAKE_FIND_PACKAGE_SORT_ORDER ${CMAKE_FIND_PACKAGE_SORT_ORDER_CURRENT}) | 
|  | endif() | 
|  |  | 
|  | if(NOT DEFINED ZEPHYR_TOOLCHAIN_VARIANT) | 
|  | if (NOT Zephyr-sdk_CONSIDERED_VERSIONS) | 
|  | set(error_msg "ZEPHYR_TOOLCHAIN_VARIANT not specified and no Zephyr SDK is installed.\n") | 
|  | string(APPEND error_msg "Please set ZEPHYR_TOOLCHAIN_VARIANT to the toolchain to use or install the Zephyr SDK.") | 
|  |  | 
|  | if(NOT ZEPHYR_TOOLCHAIN_VARIANT AND NOT ZEPHYR_SDK_INSTALL_DIR) | 
|  | set(error_note "Note: If you are using Zephyr SDK 0.11.1 or 0.11.2, remember to set ZEPHYR_SDK_INSTALL_DIR and ZEPHYR_TOOLCHAIN_VARIANT") | 
|  | endif() | 
|  | else() | 
|  | #  Note: When CMake mimimun version becomes >= 3.17, change this loop into: | 
|  | #    foreach(version config IN ZIP_LISTS Zephyr-sdk_CONSIDERED_VERSIONS Zephyr-sdk_CONSIDERED_CONFIGS) | 
|  | set(error_msg "The Zephyr SDK version you are using is not supported, please update your SDK.\n") | 
|  | set(missing_version "You need SDK version ${TOOLCHAIN_ZEPHYR_MINIMUM_REQUIRED_VERSION} or newer.") | 
|  | foreach (version ${Zephyr-sdk_CONSIDERED_VERSIONS}) | 
|  | if(${version} VERSION_GREATER ${TOOLCHAIN_ZEPHYR_MINIMUM_REQUIRED_VERSION}) | 
|  | set(missing_version "You need SDK version ${TOOLCHAIN_ZEPHYR_MINIMUM_REQUIRED_VERSION} or compatible version.") | 
|  | endif() | 
|  | list(GET Zephyr-sdk_CONSIDERED_CONFIGS 0 zephyr-sdk-candidate) | 
|  | list(REMOVE_AT Zephyr-sdk_CONSIDERED_CONFIGS 0) | 
|  | get_filename_component(zephyr-sdk-path ${zephyr-sdk-candidate}/../.. ABSOLUTE) | 
|  | string(APPEND version_path "  ${version} (${zephyr-sdk-path})") | 
|  | endforeach() | 
|  | string(APPEND error_msg "${missing_version}") | 
|  | string(APPEND error_msg "You have version(s):") | 
|  | string(APPEND error_msg "${version_path}") | 
|  | endif() | 
|  |  | 
|  | message(FATAL_ERROR "${error_msg} | 
|  | The Zephyr SDK can be downloaded from: | 
|  | https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${TOOLCHAIN_ZEPHYR_MINIMUM_REQUIRED_VERSION}/zephyr-sdk-${TOOLCHAIN_ZEPHYR_MINIMUM_REQUIRED_VERSION}-setup.run | 
|  | ${error_note} | 
|  | ") | 
|  |  | 
|  | endif() | 
|  |  | 
|  | if(CMAKE_SCRIPT_MODE_FILE) | 
|  | if("${FORMAT}" STREQUAL "json") | 
|  | set(json "{\"ZEPHYR_TOOLCHAIN_VARIANT\" : \"${ZEPHYR_TOOLCHAIN_VARIANT}\", ") | 
|  | string(APPEND json "\"SDK_VERSION\": \"${SDK_VERSION}\", ") | 
|  | string(APPEND json "\"ZEPHYR_SDK_INSTALL_DIR\" : \"${ZEPHYR_SDK_INSTALL_DIR}\"}") | 
|  | message("${json}") | 
|  | else() | 
|  | message(STATUS "ZEPHYR_TOOLCHAIN_VARIANT: ${ZEPHYR_TOOLCHAIN_VARIANT}") | 
|  | if(DEFINED SDK_VERSION) | 
|  | message(STATUS "SDK_VERSION: ${SDK_VERSION}") | 
|  | endif() | 
|  |  | 
|  | if(DEFINED ZEPHYR_SDK_INSTALL_DIR) | 
|  | message(STATUS "ZEPHYR_SDK_INSTALL_DIR  : ${ZEPHYR_SDK_INSTALL_DIR}") | 
|  | endif() | 
|  | endif() | 
|  | endif() |