109 lines
3.7 KiB
CMake
109 lines
3.7 KiB
CMake
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
include_guard(GLOBAL)
|
|
|
|
include(python)
|
|
|
|
# west is an optional dependency. We need to run west using the same
|
|
# Python interpreter as everything else, though, so we play some extra
|
|
# tricks.
|
|
|
|
# When west runs cmake, it sets WEST_PYTHON to its interpreter. If
|
|
# it's defined, we assume west is installed. We do these checks here
|
|
# instead of in the failure paths below to avoid CMake warnings about
|
|
# WEST_PYTHON not being used.
|
|
if(DEFINED WEST_PYTHON)
|
|
# Cut out any symbolic links, e.g. python3.x -> python
|
|
get_filename_component(west_realpath ${WEST_PYTHON} REALPATH)
|
|
get_filename_component(python_realpath ${PYTHON_EXECUTABLE} REALPATH)
|
|
|
|
# If realpaths differ from the variables we're using, add extra
|
|
# diagnostics.
|
|
if(NOT ("${west_realpath}" STREQUAL "${WEST_PYTHON}"))
|
|
set(west_realpath_msg " (real path ${west_realpath})")
|
|
else()
|
|
set(west_realpath_msg "")
|
|
endif()
|
|
if(NOT ("${python_realpath}" STREQUAL "${PYTHON_EXECUTABLE}"))
|
|
set(python_realpath_msg " (real path ${python_realpath})")
|
|
else()
|
|
set(python_realpath_msg "")
|
|
endif()
|
|
endif()
|
|
|
|
execute_process(
|
|
COMMAND
|
|
${PYTHON_EXECUTABLE}
|
|
-c
|
|
"import west.version; print(west.version.__version__, end='')"
|
|
OUTPUT_VARIABLE west_version
|
|
ERROR_VARIABLE west_version_err
|
|
RESULT_VARIABLE west_version_output_result
|
|
)
|
|
|
|
if(west_version_output_result)
|
|
if(DEFINED WEST_PYTHON)
|
|
if(NOT (${west_realpath} STREQUAL ${python_realpath}))
|
|
set(PYTHON_EXECUTABLE_OUT_OF_SYNC "\nOr verify these installations:\n\
|
|
The Python version used by west is: ${WEST_PYTHON}${west_realpath_msg}\n\
|
|
The Python version used by CMake is: ${PYTHON_EXECUTABLE}${python_realpath_msg}")
|
|
endif()
|
|
|
|
message(FATAL_ERROR "Unable to import west.version from '${PYTHON_EXECUTABLE}':\n${west_version_err}\
|
|
Please install with:\n\
|
|
${PYTHON_EXECUTABLE} -m pip install west\
|
|
${PYTHON_EXECUTABLE_OUT_OF_SYNC}")
|
|
else()
|
|
# WEST_PYTHON is undefined and we couldn't import west. That's
|
|
# fine; it's optional.
|
|
set(WEST WEST-NOTFOUND CACHE INTERNAL "West")
|
|
endif()
|
|
else()
|
|
# We can import west from PYTHON_EXECUTABLE and have its version.
|
|
|
|
# Make sure its version matches the minimum required one.
|
|
set_ifndef(MIN_WEST_VERSION 0.7.1)
|
|
if(${west_version} VERSION_LESS ${MIN_WEST_VERSION})
|
|
message(FATAL_ERROR "The detected west version, ${west_version}, is unsupported.\n\
|
|
The minimum supported version is ${MIN_WEST_VERSION}.\n\
|
|
Please upgrade with:\n\
|
|
${PYTHON_EXECUTABLE} -m pip install --upgrade west\
|
|
${PYTHON_EXECUTABLE_OUT_OF_SYNC}\n")
|
|
endif()
|
|
|
|
# Set WEST to a COMMAND prefix as if it were a find_program()
|
|
# result.
|
|
#
|
|
# From west 0.8 forward, you can run 'python -m west' to run
|
|
# the command line application.
|
|
set(WEST_MODULE west)
|
|
if(${west_version} VERSION_LESS 0.8)
|
|
# In west 0.7.x, this wasn't supported yet, but it happens to be
|
|
# possible to run 'python -m west.app.main'.
|
|
string(APPEND WEST_MODULE .app.main)
|
|
endif()
|
|
|
|
# Need to cache this so the Zephyr Eclipse plugin knows
|
|
# how to invoke West.
|
|
set(WEST ${PYTHON_EXECUTABLE} -m ${WEST_MODULE} CACHE INTERNAL "West")
|
|
|
|
# Print information about the west module we're relying on. This
|
|
# will still work even after output is one line.
|
|
message(STATUS "Found west (found suitable version \"${west_version}\", minimum required is \"${MIN_WEST_VERSION}\")")
|
|
|
|
execute_process(
|
|
COMMAND ${WEST} topdir
|
|
OUTPUT_VARIABLE WEST_TOPDIR
|
|
ERROR_QUIET
|
|
RESULT_VARIABLE west_topdir_result
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
WORKING_DIRECTORY ${ZEPHYR_BASE}
|
|
)
|
|
|
|
if(west_topdir_result)
|
|
# west topdir is undefined.
|
|
# That's fine; west is optional, so could be custom Zephyr project.
|
|
set(WEST WEST-NOTFOUND CACHE INTERNAL "West")
|
|
endif()
|
|
endif()
|