# 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.13.1) # 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} REQUIRED 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} REQUIRED 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()