qpdf/manual/CMakeLists.txt

138 lines
4.3 KiB
CMake

# 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 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
${qpdf_SOURCE_DIR}/manual/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()