Rework the Sphinx find module
* Make sphinx_rtd_theme a find module component to avoid hard-wiring it
into the module and allowing to report the theme in case it is missing
using the standard CMake package mechanism.
* Adjust find module cache variables names case to match the find module
name.
* Also report sphinx-build version for completeness.
* Invoke the find module only once. Calling find_package on the same
module is not needed.
Change-Id: I9d1bf0fcc0d44b9b37e624128812f348c5442ada
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2957e60..91cf6b1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -622,8 +622,8 @@
add_subdirectory(internal/ceres)
if (BUILD_DOCUMENTATION)
- find_package(Sphinx)
- if (NOT SPHINX_FOUND)
+ find_package (Sphinx REQUIRED COMPONENTS sphinx_rtd_theme)
+ if (NOT Sphinx_FOUND)
message("-- Failed to find Sphinx and/or its dependencies, disabling build of documentation.")
update_cache_variable(BUILD_DOCUMENTATION OFF)
else()
diff --git a/cmake/FindSphinx.cmake b/cmake/FindSphinx.cmake
index 52a456c..d1488eb 100644
--- a/cmake/FindSphinx.cmake
+++ b/cmake/FindSphinx.cmake
@@ -29,41 +29,96 @@
# Author: pablo.speciale@gmail.com (Pablo Speciale)
#
-# Find the Sphinx documentation generator
-#
-# This modules defines
-# SPHINX_EXECUTABLE
-# SPHINX_FOUND
+#[=======================================================================[.rst:
+FindSphinx
+==========
-find_program(SPHINX_EXECUTABLE
- NAMES sphinx-build
- PATHS /opt/local/bin
- DOC "Sphinx documentation generator")
+Module for locating Sphinx and its components.
-if (SPHINX_EXECUTABLE)
+This modules defines the following variables:
- find_package(Python COMPONENTS Interpreter)
+``Sphinx_FOUND``
+ ``TRUE`` iff Sphinx and all of its components have been found.
- if(Python_Interpreter_FOUND)
- # Check for sphinx theme dependency for documentation
- execute_process(
- COMMAND ${Python_EXECUTABLE} -c "import sphinx_rtd_theme"
- RESULT_VARIABLE SPHINX_RTD_THEME
- OUTPUT_QUIET
- ERROR_QUIET
- )
- endif ()
+``Sphinx_BUILD_EXECUTABLE``
+ Path to the ``sphinx-build`` tool.
+]=======================================================================]
- if (SPHINX_RTD_THEME EQUAL 0)
- set(SPHINX_RTD_THEME TRUE)
- else ()
- set(SPHINX_RTD_THEME FALSE)
- endif ()
+include (FindPackageHandleStandardArgs)
-endif ()
+find_program (Sphinx_BUILD_EXECUTABLE
+ NAMES sphinx-build
+ PATHS /opt/local/bin
+ DOC "Sphinx documentation generator"
+)
-include(FindPackageHandleStandardArgs)
+mark_as_advanced (Sphinx_BUILD_EXECUTABLE)
-find_package_handle_standard_args(Sphinx DEFAULT_MSG SPHINX_EXECUTABLE SPHINX_RTD_THEME)
+if (Sphinx_BUILD_EXECUTABLE)
+ execute_process (
+ COMMAND ${Sphinx_BUILD_EXECUTABLE} --version
+ ERROR_STRIP_TRAILING_WHITESPACE
+ ERROR_VARIABLE _Sphinx_BUILD_ERROR
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ OUTPUT_VARIABLE _Sphinx_VERSION_STRING
+ RESULT_VARIABLE _Sphinx_BUILD_RESULT
+ )
-mark_as_advanced(SPHINX_EXECUTABLE)
+ if (_Sphinx_BUILD_RESULT EQUAL 0)
+ string (REGEX REPLACE "^sphinx-build[ \t]+([^ \t]+)$" "\\1" Sphinx_VERSION
+ "${_Sphinx_VERSION_STRING}")
+
+ if (Sphinx_VERSION MATCHES "[0-9]+\\.[0-9]+\\.[0-9]+")
+ set (Sphinx_VERSION_COMPONENTS 3)
+ set (Sphinx_VERSION_MAJOR ${CMAKE_MATCH_1})
+ set (Sphinx_VERSION_MINOR ${CMAKE_MATCH_2})
+ set (Sphinx_VERSION_PATCH ${CMAKE_MATCH_3})
+ endif (Sphinx_VERSION MATCHES "[0-9]+\\.[0-9]+\\.[0-9]+")
+ else (_Sphinx_BUILD_RESULT EQUAL 0)
+ message (WARNING "Could not determine sphinx-build version: ${_Sphinx_BUILD_ERROR}")
+ endif (_Sphinx_BUILD_RESULT EQUAL 0)
+
+ unset (_Sphinx_BUILD_ERROR)
+ unset (_Sphinx_BUILD_RESULT)
+ unset (_Sphinx_VERSION_STRING)
+
+ find_package (Python COMPONENTS Interpreter)
+ set (_Sphinx_BUILD_RESULT FALSE)
+
+ if (Python_Interpreter_FOUND)
+ # Check for Sphinx theme dependency for documentation
+ foreach (component IN LISTS Sphinx_FIND_COMPONENTS)
+ string (REGEX MATCH "^(.+_theme)$" theme_component "${component}")
+
+ if (NOT theme_component STREQUAL component)
+ continue ()
+ endif (NOT theme_component STREQUAL component)
+
+ execute_process (
+ COMMAND ${Python_EXECUTABLE} -c "import ${theme_component}"
+ ERROR_STRIP_TRAILING_WHITESPACE
+ ERROR_VARIABLE _Sphinx_BUILD_ERROR
+ OUTPUT_QUIET
+ RESULT_VARIABLE _Sphinx_BUILD_RESULT
+ )
+
+ if (_Sphinx_BUILD_RESULT EQUAL 0)
+ set (Sphinx_${component}_FOUND TRUE)
+ elseif (_Sphinx_BUILD_RESULT EQUAL 0)
+ message (WARNING "Could not determine whether Sphinx component '${theme_component}' is available: ${_Sphinx_BUILD_ERROR}")
+ set (Sphinx_${component}_FOUND FALSE)
+ endif (_Sphinx_BUILD_RESULT EQUAL 0)
+
+ unset (_Sphinx_BUILD_ERROR)
+ unset (_Sphinx_BUILD_RESULT)
+ endforeach (component)
+
+ unset (theme_component)
+ endif (Python_Interpreter_FOUND)
+endif (Sphinx_BUILD_EXECUTABLE)
+
+find_package_handle_standard_args (Sphinx
+ REQUIRED_VARS Sphinx_BUILD_EXECUTABLE
+ VERSION_VAR Sphinx_VERSION
+ HANDLE_COMPONENTS
+)
diff --git a/docs/source/CMakeLists.txt b/docs/source/CMakeLists.txt
index 144316d..1f8fed8 100644
--- a/docs/source/CMakeLists.txt
+++ b/docs/source/CMakeLists.txt
@@ -1,5 +1,3 @@
-find_package(Sphinx REQUIRED)
-
# HTML output directory
set(SPHINX_HTML_DIR "${Ceres_BINARY_DIR}/docs/html")
@@ -18,6 +16,6 @@
"${Ceres_SOURCE_DIR}/scripts/make_docs.py"
"${Ceres_SOURCE_DIR}"
"${Ceres_BINARY_DIR}/docs"
- "${SPHINX_EXECUTABLE}"
+ "${Sphinx_BUILD_EXECUTABLE}"
USES_TERMINAL
COMMENT "Building HTML documentation with Sphinx")