# function (sphinx_build_html) # # Parameters: # # target_name - name of the generated custom target (e.g., bson-html) # doc_dir - name of the destination directory for HTML documentation; is used # to construct a target path: ${CMAKE_INSTALL_PREFIX}/share/doc/${doc_dir}/html # # Description: # # Process the list of .rst files in the current source directory and: # - build up a list of target/output .html files # - create the custom Sphinx command that produces the HTML output # - add install rules for: # + source static content (e.g., images) # + each output file # + additional Sphinx-generated content # - create the custom target that depends on the output files and calls sphinx function (sphinx_build_html target_name doc_dir) include (ProcessorCount) ProcessorCount (NPROCS) set (SPHINX_HTML_DIR "${CMAKE_CURRENT_BINARY_DIR}/html") set (doctrees_dir "${SPHINX_HTML_DIR}.doctrees") file (GLOB_RECURSE doc_rsts RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} CONFIGURE_DEPENDS *.rst) # Select a builder: The Sphinx `dirhtml` builder will result in "prettier" URLs, # as each page is an `index.html` within a directory. This relies on "autoindex"-style # static file URL resolution in the HTTP server, which is extremely common. For # EVG, however, we host build results on a server that does not support this, # so instead use the traditional HTML builder so that the built documentation # artifact can be easily viewed in a web browser set(is_evg_docs_build "$ENV{EVG_DOCS_BUILD}") if(NOT is_evg_docs_build) set (builder dirhtml) # We have an extension in place that generates stub page redirects for # old HTML file URLs that now point to the auto-index URL for the # corresponding page. As such, every .rst builds two corresponding .html # files: list (TRANSFORM doc_rsts REPLACE "^(.+)\\.rst$" "html/\\1.html;html/\\1/index.html" OUTPUT_VARIABLE doc_htmls) else() set (builder html) # We use the regular html builder in this case, which generates exactly # one HTML page for each input rST file list (TRANSFORM doc_rsts REPLACE "^(.+)\\.rst$" "html/\\1.html" OUTPUT_VARIABLE doc_htmls) endif() # Set PYTHONDONTWRITEBYTECODE to prevent .pyc clutter in the source directory add_custom_command (OUTPUT ${doc_htmls} ${SPHINX_HTML_DIR}/.nojekyll ${SPHINX_HTML_DIR}/objects.inv COMMAND ${CMAKE_COMMAND} -E env "PYTHONDONTWRITEBYTECODE=1" ${SPHINX_EXECUTABLE} -qnW -b "${builder}" -j "${NPROCS}" -c "${CMAKE_CURRENT_SOURCE_DIR}" -d "${doctrees_dir}" "${CMAKE_CURRENT_SOURCE_DIR}" "${SPHINX_HTML_DIR}" DEPENDS ${doc_rsts} COMMENT "Building HTML documentation with Sphinx" ) # Install all HTML files install (DIRECTORY "${SPHINX_HTML_DIR}/" DESTINATION "${CMAKE_INSTALL_DOCDIR}/${doc_dir}/html" FILES_MATCHING PATTERN "*.html") # Ensure additional Sphinx-generated content gets installed install (FILES ${SPHINX_HTML_DIR}/search.html ${SPHINX_HTML_DIR}/objects.inv ${SPHINX_HTML_DIR}/searchindex.js DESTINATION ${CMAKE_INSTALL_DOCDIR}/${doc_dir}/html ) install (DIRECTORY ${SPHINX_HTML_DIR}/_static DESTINATION ${CMAKE_INSTALL_DOCDIR}/${doc_dir}/html ) add_custom_target (${target_name} DEPENDS ${doc_htmls}) endfunction () # function (sphinx_build_man) # # Parameters: # # target_name - name of the generated custom target (e.g., mongoc-man) # # Description: # # Process the list of .rst files in the current source directory and: # - build up a list of target/output .3 files (i.e., man pages) # - create the custom Sphinx command that produces the man page output # - add install rules for each output file # - create the custom target that depends on the output files and calls sphinx # function (sphinx_build_man target_name) include (ProcessorCount) ProcessorCount (NPROCS) set (SPHINX_MAN_DIR "${CMAKE_CURRENT_BINARY_DIR}/man") set (doctrees_dir "${SPHINX_MAN_DIR}.doctrees") file (GLOB_RECURSE doc_rsts RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} CONFIGURE_DEPENDS *.rst) set (doc_mans) foreach (rst IN LISTS doc_rsts) # Only those with the :man_page: tag at the beginning build man pages file (READ "${rst}" rst_head LIMIT 256) string (FIND "${rst_head}" ":man_page: " man_tag_pos) if (man_tag_pos GREATER_EQUAL "0") list (APPEND man_doc_rsts "${rst}") string (REGEX REPLACE "^.*:man_page: +([a-z0-9_]+).*$" "man\/\\1.3" man ${rst_head} ) list (APPEND doc_mans ${man}) endif () endforeach () # Set PYTHONDONTWRITEBYTECODE to prevent .pyc clutter in the source directory add_custom_command (OUTPUT ${doc_mans} COMMAND ${CMAKE_COMMAND} -E env "PYTHONDONTWRITEBYTECODE=1" ${SPHINX_EXECUTABLE} -qW -b man -c "${CMAKE_CURRENT_SOURCE_DIR}" -d "${doctrees_dir}" "${CMAKE_CURRENT_SOURCE_DIR}" "${SPHINX_MAN_DIR}" DEPENDS ${doc_rsts} COMMENT "Building manual pages with Sphinx" ) foreach (man IN LISTS doc_mans) install (FILES ${CMAKE_CURRENT_BINARY_DIR}/${man} DESTINATION ${CMAKE_INSTALL_MANDIR}/man3 ) endforeach () add_custom_target (${target_name} DEPENDS ${doc_mans}) endfunction ()