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