# 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()
