#This script has been adapted from the one found on: 
#https://github.com/InsightSoftwareConsortium/ITKExamples/blob/master/CMake/FindSphinx.cmake

#----------------------------
#
# Find Sphinx
#
#---------------------------- 

#
# Try to find the Python-Sphinx library
#
# This module exports:
#   SPHINX_FOUND
#   SPHINX_EXECUTABLE
#   SPHINX_HTML_OUTPUT
#   SPHINX_DIRHTML_OUTPUT
#   SPHINX_HTMLHELP_OUTPUT
#   SPHINX_QTHELP_OUTPUT
#   SPHINX_DEVHELP_OUTPUT
#   SPHINX_EPUB_OUTPUT
#   SPHINX_LATEX_OUTPUT
#   SPHINX_MAN_OUTPUT
#   SPHINX_TEXT_OUTPUT

#
# - This module looks for Sphinx
# Find the Sphinx documentation generator
#

find_program(SPHINX_EXECUTABLE
               NAMES sphinx-build sphinx-build2
               PATHS
                 /usr/bin
                 /usr/local/bin
                 /opt/local/bin
               DOC "Sphinx documentation generator"
               )
if( NOT SPHINX_EXECUTABLE )
  set(_Python_VERSIONS 2.7 2.6 2.5 2.4 2.3 2.2 2.1 2.0 1.6 1.5)

  foreach( _version ${_Python_VERSIONS} )
    set( _sphinx_NAMES sphinx-build-${_version} )
    find_program( SPHINX_EXECUTABLE
                    NAMES ${_sphinx_NAMES}
                    PATHS
                      /usr/bin
                      /usr/local/bin
                      /opt/loca/bin
                    DOC "Sphinx documentation generator"
                    )
  endforeach()
endif()

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Sphinx DEFAULT_MSG SPHINX_EXECUTABLE)

option( SPHINX_HTML_OUTPUT "Build a single HTML with the whole content." ON )
option( SPHINX_DIRHTML_OUTPUT "Build HTML pages, but with a single directory per document." OFF )
option( SPHINX_HTMLHELP_OUTPUT "Build HTML pages with additional information for building a documentation collection in htmlhelp." OFF )
option( SPHINX_QTHELP_OUTPUT "Build HTML pages with additional information for building a documentation collection in qthelp." OFF )
option( SPHINX_DEVHELP_OUTPUT "Build HTML pages with additional information for building a documentation collection in devhelp." OFF )
option( SPHINX_EPUB_OUTPUT "Build HTML pages with additional information for building a documentation collection in epub." OFF )
option( SPHINX_LATEX_OUTPUT "Build LaTeX sources that can be compiled to a PDF document using pdflatex." OFF )
option( SPHINX_MAN_OUTPUT "Build manual pages in groff format for UNIX systems." OFF )
option( SPHINX_TEXT_OUTPUT "Build plain text files." OFF )

mark_as_advanced(SPHINX_EXECUTABLE
                   SPHINX_HTML_OUTPUT
                   SPHINX_DIRHTML_OUTPUT
                   SPHINX_HTMLHELP_OUTPUT
                   SPHINX_QTHELP_OUTPUT
                   SPHINX_DEVHELP_OUTPUT
                   SPHINX_EPUB_OUTPUT
                   SPHINX_LATEX_OUTPUT
                   SPHINX_MAN_OUTPUT
                   SPHINX_TEXT_OUTPUT
                   )

function( Sphinx_add_target target_name builder conf source destination )
  add_custom_target( ${target_name} ALL
                       COMMAND ${SPHINX_EXECUTABLE} -b ${builder}
                         -c ${conf}
                         ${source}
                         ${destination}
                       COMMENT "Generating sphinx documentation: ${builder}"
                       )
  set_property(DIRECTORY APPEND PROPERTY
                 ADDITIONAL_MAKE_CLEAN_FILES
                 ${destination}
                 )
endfunction()

# Target dependencies can be optionally listed at the end.
function( Sphinx_add_targets target_base_name conf source base_destination )
  set( _dependencies )
  
  foreach( arg IN LISTS ARGN )
    set( _dependencies ${_dependencies} ${arg} )
  endforeach()
  
  if( ${SPHINX_HTML_OUTPUT} )
    Sphinx_add_target( ${target_base_name}_html html ${conf} ${source} ${base_destination}/html )
    add_dependencies( ${target_base_name}_html ${_dependencies} )
  endif()
  
  if( ${SPHINX_DIRHTML_OUTPUT} )
    Sphinx_add_target( ${target_base_name}_dirhtml dirhtml ${conf} ${source} ${base_destination}/dirhtml )
    add_dependencies( ${target_base_name}_dirhtml ${_dependencies} )
  endif()
  
  if( ${SPHINX_QTHELP_OUTPUT} )
    Sphinx_add_target( ${target_base_name}_qthelp qthelp ${conf} ${source} ${base_destination}/qthelp )
    add_dependencies( ${target_base_name}_qthelp ${_dependencies} )
  endif()
  
  if( ${SPHINX_DEVHELP_OUTPUT} )
    Sphinx_add_target( ${target_base_name}_devhelp devhelp ${conf} ${source} ${base_destination}/devhelp )
    add_dependencies( ${target_base_name}_devhelp ${_dependencies} )
  endif()
  
  if( ${SPHINX_EPUB_OUTPUT} )
    Sphinx_add_target( ${target_base_name}_epub epub ${conf} ${source} ${base_destination}/epub )
    add_dependencies( ${target_base_name}_epub ${_dependencies} )
  endif()
  
  if( ${SPHINX_LATEX_OUTPUT} )
    Sphinx_add_target( ${target_base_name}_latex latex ${conf} ${source} ${base_destination}/latex )
    add_dependencies( ${target_base_name}_latex ${_dependencies} )
  endif()
  
  if( ${SPHINX_MAN_OUTPUT} )
    Sphinx_add_target( ${target_base_name}_man man ${conf} ${source} ${base_destination}/man )
    add_dependencies( ${target_base_name}_man ${_dependencies} )
  endif()
  
  if( ${SPHINX_TEXT_OUTPUT} )
    Sphinx_add_target( ${target_base_name}_text text ${conf} ${source} ${base_destination}/text )
    add_dependencies( ${target_base_name}_text ${_dependencies} )
  endif()
  
  if( ${BUILD_TESTING} )
    sphinx_add_target( ${target_base_name}_linkcheck linkcheck ${conf} ${source} ${base_destination}/linkcheck )
    add_dependencies( ${target_base_name}_linkcheck ${_dependencies} )
  endif()

endfunction()