From b8aff90997116a84350018f88f1eabdaa368d11b Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 5 Mar 2022 08:24:51 -0500 Subject: Add cmake configuration files --- manual/CMakeLists.txt | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 manual/CMakeLists.txt (limited to 'manual/CMakeLists.txt') diff --git a/manual/CMakeLists.txt b/manual/CMakeLists.txt new file mode 100644 index 00000000..737d2335 --- /dev/null +++ b/manual/CMakeLists.txt @@ -0,0 +1,133 @@ +# 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 + 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} + 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} + 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} + 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(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() -- cgit v1.2.3-54-g00ecf