# There is a FindLATEX module, but it does some things we don't care
# about and doesn't do everything we need.
find_program(LATEX latex)
find_program(PDFLATEX pdflatex)
find_program(LATEXMK latexmk)
find_program(SPHINX sphinx-build)

# *** NOTE: Never check BUILD_DOC_PDF if BUILD_DOC is not set. See
# *** comments in top-level CMakeLists.txt.

if(BUILD_DOC)
  if(SPHINX STREQUAL SPHINX-NOTFOUND)
    message(FATAL_ERROR "sphinx-build is required for building documentation")
  endif()
  if(BUILD_DOC_PDF AND
      ((LATEX STREQUAL LATEX-NOTFOUND) OR
        (LATEXMK STREQUAL LATEXMK-NOTFOUND) OR
        (PDFLATEX STREQUAL PDFLATEX-NOTFOUND)))
    message(FATAL_ERROR
      "latex, latexmk, and pdflatex are required to build PDF documentation")
  endif()
endif()

set(MANUAL_SRC ${qpdf_SOURCE_DIR}/manual)
foreach(F qpdf.1 fix-qdf.1 zlib-flate.1)
  configure_file(
    ${MANUAL_SRC}/${F}.in
    ${CMAKE_CURRENT_BINARY_DIR}/${F}
    NEWLINE_STYLE UNIX)
endforeach()

SET(MANUAL_DEPS
  conf.py
  _ext/qpdf.py
  acknowledgement.rst
  cli.rst
  design.rst
  download.rst
  encryption.rst
  index.rst
  installation.rst
  json.rst
  contributing.rst
  library.rst
  license.rst
  linearization.rst
  object-streams.rst
  overview.rst
  packaging.rst
  qdf.rst
  qpdf-job.rst
  release-notes.rst
  weak-crypto.rst)

# Prevent targets that run ${SPHINX} from running in parallel by using
# dependencies. This avoids clashes in temporary files that cause the
# build to fail with the error "_pickle.UnpicklingError: pickle data
# was truncated". It would be better if we could use order-only
# dependencies like gnu make to make it possible to build the targets
# independently.
set(DOC_HTML_OUTPUT html/index.html)
set(DOC_SINGLEHTML_OUTPUT singlehtml/index.html)
set(DOC_PDF_OUTPUT latex/qpdf.pdf)
if(BUILD_DOC)
  add_custom_command(OUTPUT ${DOC_HTML_OUTPUT}
    COMMAND ${SPHINX} -M html ${MANUAL_SRC} ${CMAKE_CURRENT_BINARY_DIR} -W
    COMMAND touch ${DOC_HTML_OUTPUT}
    DEPENDS ${MANUAL_DEPS})
  add_custom_command(OUTPUT ${DOC_SINGLEHTML_OUTPUT}
    COMMAND ${SPHINX} -M singlehtml ${MANUAL_SRC} ${CMAKE_CURRENT_BINARY_DIR} -W
    COMMAND touch ${DOC_SINGLEHTML_OUTPUT}
    DEPENDS ${MANUAL_DEPS})
  add_custom_command(OUTPUT ${DOC_PDF_OUTPUT}
    COMMAND ${SPHINX} -M latexpdf ${MANUAL_SRC} ${CMAKE_CURRENT_BINARY_DIR} -W
    COMMAND touch ${DOC_PDF_OUTPUT}
    DEPENDS ${MANUAL_DEPS})
  add_custom_target(doc_html DEPENDS ${DOC_HTML_OUTPUT})
  add_custom_target(doc_singlehtml DEPENDS ${DOC_SINGLEHTML_OUTPUT})
  add_dependencies(doc_singlehtml doc_html)
  add_custom_target(doc_pdf DEPENDS ${DOC_PDF_OUTPUT})
  add_custom_target(doc ALL)
  if(BUILD_DOC_PDF)
    add_dependencies(doc doc_pdf)
    if(BUILD_DOC_HTML)
      add_dependencies(doc_pdf doc_singlehtml)
    endif()
  elseif(BUILD_DOC_HTML)
    add_dependencies(doc doc_singlehtml)
  endif()
  if(GENERATE_AUTO_JOB)
    add_dependencies(doc auto_job_files)
  endif()

  if(BUILD_DOC_DIST)
    set(DOC_DIST_HTML doc-dist/manual-html)
    set(DOC_DIST_SINGLEHTML doc-dist/manual-single-page-html)
    set(DOC_DIST_PDF doc-dist/qpdf-manual.pdf)
    add_custom_command(
      OUTPUT
      ${DOC_DIST_HTML}
      ${DOC_DIST_SINGLEHTML}
      ${DOC_DIST_PDF}
      COMMAND rm -rf doc-dist
      COMMAND mkdir -p doc-dist
      COMMAND cp -r html ${DOC_DIST_HTML}
      COMMAND cp -r singlehtml ${DOC_DIST_SINGLEHTML}
      COMMAND cp -r ${DOC_PDF_OUTPUT} ${DOC_DIST_PDF}
      DEPENDS ${DOC_HTML_OUTPUT} ${DOC_SINGLEHTML_OUTPUT} ${DOC_PDF_OUTPUT})
    add_custom_target(doc_dist ALL
      DEPENDS ${DOC_DIST_HTML} ${DOC_DIST_SINGLEHTML} ${DOC_DIST_PDF})
    add_dependencies(doc_dist doc)
  endif()
endif()

# INSTALL_MANUAL is not dependent on building doc -- we sometimes drop in
# pre-built doc when creating distributions.
if(INSTALL_MANUAL)
  install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc-dist/
    TYPE DOC
    COMPONENT ${COMPONENT_DOC})
else()
  install(FILES ${qpdf_SOURCE_DIR}/README-doc.txt
    TYPE DOC
    COMPONENT ${COMPONENT_DOC})
endif()

if(NOT WIN32)
  # There's no reason to install manual pages in a Windows
  # environment, especially when all they do is refer people to the
  # manual.
  install(FILES
    ${CMAKE_CURRENT_BINARY_DIR}/qpdf.1
    ${CMAKE_CURRENT_BINARY_DIR}/fix-qdf.1
    ${CMAKE_CURRENT_BINARY_DIR}/zlib-flate.1
    DESTINATION ${CMAKE_INSTALL_MANDIR}/man1
    COMPONENT ${COMPONENT_DOC})
endif()
