zephyr/cmake/west.cmake
Torsten Rasmussen 6360593f99 cmake: west: do not print error if west topdir fails
`west` is an optional tool.
Although `west` is optional, a developer might be working with both west
and non-west based projects, like
- vanilla Zephyr (using west)
- downstream project (not using west)

and thus have west installed, but not always in use.

In the downstream project scenario not using west, then running CMake
will print the following error:
```
FATAL ERROR: no west workspace found from "<path>/zephyr";
"west topdir" requires one.
Things to try:
  - Change directory to somewhere inside a west workspace and retry.
  - Set ZEPHYR_BASE to a zephyr repository path in a west workspace.
  - Run "west init" to set up a workspace here.
  - Run "west init -h" for additional information.
```

This commit sets `WEST` CMake variable to `WEST-NOTFOUND` when west is
found but Zephyr is not in a west workspace (`west topdir` fails)

Signed-off-by: Torsten Rasmussen <Torsten.Rasmussen@nordicsemi.no>
2021-03-17 11:28:14 +01:00

105 lines
3.7 KiB
CMake

# SPDX-License-Identifier: Apache-2.0
# 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(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()