Improve detection of sphinx-build.
[alexxy/gromacs.git] / cmake / FindSphinx.cmake
index 82827bba5a4406bb0ff3f7c690c09fdf0ecb6820..0d62d36647a8522f9685cced865f469438d069a2 100644 (file)
@@ -1,7 +1,7 @@
 #
 # This file is part of the GROMACS molecular simulation package.
 #
-# Copyright (c) 2015,2018, by the GROMACS development team, led by
+# Copyright (c) 2015,2018,2019,2020,2021, by the GROMACS development team, led by
 # Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
 # and including many others, as listed in the AUTHORS file in the
 # top-level source directory and at http://www.gromacs.org.
 # To help us fund GROMACS development, we humbly ask that you cite
 # the research papers on the package. Check out http://www.gromacs.org.
 
+# Check the Python installation for sphinx-build, even if not on PATH.
+if(Python3_EXECUTABLE)
+    execute_process(
+        COMMAND ${Python3_EXECUTABLE} -c "import sys; print(sys.exec_prefix)"
+        OUTPUT_VARIABLE _python_exec_prefix
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    list(APPEND CMAKE_PROGRAM_PATH ${_python_exec_prefix})
+    unset(_python_exec_prefix)
+    execute_process(
+        COMMAND ${Python3_EXECUTABLE} -m site --user-base
+        OUTPUT_VARIABLE _python_user_base
+        ERROR_QUIET
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    if (_python_user_base)
+        list(APPEND CMAKE_PROGRAM_PATH ${_python_user_base})
+    endif ()
+    unset(_python_user_base)
+    execute_process(
+        COMMAND ${Python3_EXECUTABLE} -c "import sys; print(sys.base_exec_prefix)"
+        OUTPUT_VARIABLE _python_base_exec_prefix
+        ERROR_QUIET
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+    )
+    if (_python_base_exec_prefix)
+        list(APPEND CMAKE_PROGRAM_PATH ${_python_base_exec_prefix})
+    endif ()
+    unset(_python_base_exec_prefix)
+endif()
+
 find_program(SPHINX_EXECUTABLE NAMES sphinx-build sphinx-build2
-    HINTS
-    $ENV{SPHINX_DIR}
-    PATH_SUFFIXES bin
-    DOC "Sphinx documentation generator"
-)
+             HINTS ENV SPHINX_DIR
+             PATH_SUFFIXES bin
+             DOC "Sphinx documentation generator"
+             )
 mark_as_advanced(SPHINX_EXECUTABLE)
 
 # Detect Sphinx version
@@ -50,18 +80,33 @@ if (SPHINX_EXECUTABLE AND NOT DEFINED SPHINX_EXECUTABLE_VERSION)
         ERROR_QUIET
         OUTPUT_STRIP_TRAILING_WHITESPACE
         )
-    string(REGEX REPLACE ".*build[ )]*" "" SPHINX_EXECUTABLE_VERSION "${SPHINX_VERSION_OUTPUT_VARIABLE}")
-    set(SPHINX_EXECUTABLE_VERSION "${SPHINX_EXECUTABLE_VERSION}" CACHE INTERNAL "Version of ${SPHINX_EXECUTABLE}")
-endif()
 
-set(_find_deps_options)
-if (Sphinx_FIND_QUIETLY)
-    set(_find_deps_options QUIET)
+    # Detect the sphinx version. First try to match the error message
+    # from old versions that didn't even support --version, then try
+    # to detect more modern sphinx versions. If nothing is found, then
+    # the cache variable is set to an empty value.
+    set(_version "")
+    if(SPHINX_VERSION_OUTPUT_VARIABLE MATCHES "Sphinx v([0-9\.]+)\n.*")
+        set(_version ${CMAKE_MATCH_1})
+    elseif (SPHINX_VERSION_OUTPUT_VARIABLE MATCHES ".*build[ )]*(.*)")
+        set(_version ${CMAKE_MATCH_1})
+    endif()
+
+    set(SPHINX_EXECUTABLE_VERSION ${_version} CACHE INTERNAL "Version of ${SPHINX_EXECUTABLE}")
 endif()
-include(FindPythonModule)
-find_python_module(pygments ${_find_deps_options})
-if (PYTHONMODULE_PYGMENTS)
-    set(Sphinx_pygments_FOUND 1)
+
+
+if (NOT Sphinx_pygments_FOUND)
+    # Check if pygments module is available via the Unix error code (ie. 0
+    # for success)
+    execute_process(COMMAND "${PYTHON_EXECUTABLE}" "-c"
+        "import pygments"
+        RESULT_VARIABLE _pygments_status
+        ERROR_QUIET
+        )
+    if (_pygments_status EQUAL 0)
+        set(Sphinx_pygments_FOUND TRUE CACHE BOOL "Whether pygments module is available for Sphinx")
+    endif()
 endif()
 
 include(FindPackageHandleStandardArgs)