aboutsummaryrefslogtreecommitdiffstats
path: root/manual/CMakeLists.txt
blob: 53109937adbc84b5ed6d7f945299b07e7a88e0fd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# 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()