141 lines
5.9 KiB
CMake
141 lines
5.9 KiB
CMake
# 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)
|
|
|
|
# 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()
|