#-------------------------------------------------------------------------------
# Copyright (c) 2024, Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
#-------------------------------------------------------------------------------

#FindSphinx
#-----------
#Sphinx is a document generation tool written in Python.
#See http://www.sphinx-doc.org/en/master/
#
#This module checks availability of the Sphinx document generator
#(sphinx-build) and it's dependences (Python).
#Sphinx is distributed as pip package or on Linux as a distribution specific
#package (i.e. python-sphinx for Ubuntu). Independent of the distribution
#method this module expects sphix-build to be either available on the PATH,
#or to be located in a host OS specific standard location.
#
#This modules has the following parameters:
#   SPHINX_PATH   = variable specifying where sphinx-build can be found.
#                         If it is not defined the environment variable with
#                         the same name is used. If that is also undefined,
#                         then OS specific standard locations will be
#                         searched.
#
# This modules defines the following variables:
#   SPHINX_VERSION   = The version reported by "sphinx-build --version"
#   SPHINX_FOUND     = True is sphinx-build was found and executed fine
#

Include(CMakeParseArguments)

#Sphinx needs Python.
find_package(PythonInterp 3)
if (NOT PYTHONINTERP_FOUND)
    message(STATUS "Can not find Python3.x interpreter. Pyhton3 must be installed and available on the PATH.")
    message(STATUS "Sphinx documentation targets will not be created.")
    return()
endif()

if (NOT DEFINED SPHINX_PATH)
    if (DEFINED $ENV{SPHINX_PATH})
    set(SPHINX_PATH $ENV{SPHINX_PATH})
    endif()
endif()


if (DEFINED SPHINX_PATH)
    #Find the Sphinx executable. Search only at SPHINX_PATH.
    find_program(SPHINX_EXECUTABLE
        NAMES sphinx-build
        DOC "Sphinx Documentation Builder (sphinx-doc.org)"
        PATH ${SPHINX_PATH}
        NO_DEFAULT_PATH
        NO_CMAKE_ENVIRONMENT_PATH
        NO_CMAKE_PATH
        NO_SYSTEM_ENVIRONMENT_PATH
        NO_CMAKE_SYSTEM_PATH
        NO_CMAKE_FIND_ROOT_PATH
    )
    if (SPHINX_EXECUTABLE-NOTFOUND)
        message(STATUS "Failed to find sphinx-build at ${SPHINX_PATH}.")
        message(STATUS "Sphinx documentation targets will not be created.")
        return()
    endif()
else()
    #Find the Sphinx executable. Search OS specific default locations.
    find_program(SPHINX_EXECUTABLE
      NAMES sphinx-build
      DOC "Sphinx Documentation Builder (sphinx-doc.org)"
    )

    if (SPHINX_EXECUTABLE-NOTFOUND)
        message(STATUS "Failed to find sphinx-build at OS specific default locations.")
        message(STATUS "Sphinx documentation targets will not be created.")
        return()
    endif()
endif()

#Get Sphinx version
execute_process(COMMAND "${SPHINX_EXECUTABLE}" "--version" OUTPUT_VARIABLE _SPHINX_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET)
#Parse output
if(_SPHINX_VERSION)
    if(_SPHINX_VERSION MATCHES ".*sphinx-build[^0-9.]*([0-9.]+).*")
        string(REGEX REPLACE ".*sphinx-build ([0-9.]+).*" "\\1" SPHINX_VERSION "${_SPHINX_VERSION}")
    endif()
endif()

#Set "standard" find module return values
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Sphinx REQUIRED_VARS SPHINX_EXECUTABLE SPHINX_VERSION VERSION_VAR SPHINX_VERSION)
