# ============================================================================
# Copyright (c) 2011-2012 University of Pennsylvania
# Copyright (c) 2013-2014 Carnegie Mellon University
# Copyright (c) 2013-2016 Andreas Schuh
# All rights reserved.
#
# See COPYING file for license information or visit
# https://cmake-basis.github.io/download.html#license
# ============================================================================
##############################################################################
# @file DocTools.cmake
# @brief Tools related to gnerating or adding software documentation.
#
# @ingroup CMakeTools
##############################################################################
if (__BASIS_DOCTOOLS_INCLUDED)
return ()
else ()
set (__BASIS_DOCTOOLS_INCLUDED TRUE)
endif ()
# ============================================================================
# adding / generating documentation
# ============================================================================
# ----------------------------------------------------------------------------
## @brief Add documentation target.
#
# This function is used to add a software documentation files to the project
# which are either just copied to the installation or generated from input
# files such as in particular source code files and documentation files
# marked up using one of the supported lightweight markup languages.
#
# The supported generators are:
#
#
# @tp @b EXCLUDE_FROM_DOC @endtp
# By default, the specified target is build as part of the global
# @c doc target. If this option is given, however, the added
# documentation will not be build as part of this target. |
#
#
# @tp @b COMPONENT component @endtp
# Name of the component this documentation belongs to.
# Defaults to @c BASIS_LIBRARY_COMPONENT. |
#
#
# @tp @b DESTINATION dir @endtp
# Installation directory prefix. Defaults to
# @c BASIS_INSTALL_<TARGET>_DIR in case of HTML output if set.
# Otherwise, the generated HTML files are not installed. |
#
#
# @tp @b DOXYFILE file @endtp
# Name of the template Doxyfile. |
#
#
# @tp @b PROJECT_NAME name @endtp
# Value for Doxygen's @c PROJECT_NAME tag which is used to
# specify the project name.@n
# Default: @c PROJECT_NAME. |
#
#
# @tp @b PROJECT_NUMBER version @endtp
# Value for Doxygen's @c PROJECT_NUMBER tag which is used
# to specify the project version number.@n
# Default: @c PROJECT_RELEASE. |
#
#
# @tp @b PROJECT_WEBSITE url @endtp
# Used for links to project website.@n
# Default: @c PROJECT_PACKAGE_WEBSITE |
#
#
# @tp @b INPUT path1 [path2 ...] @endtp
# Value for Doxygen's @c INPUT tag which is used to specify input
# directories/files. Any given input path is added to the default
# input paths.@n
# Default: @c PROJECT_CODE_DIRS, @c BINARY_CODE_DIR,
# @c PROJECT_INCLUDE_DIRS, @c BINARY_INCLUDE_DIR. |
#
#
# @tp @b EXCLUDE_BASIS_MODULES @endtp
# Do not add project CMake files used and generated by BASIS to @b INPUT. |
#
#
# @tp @b EXCLUDE_BASIS_UTILITIES @endtp
# Do not add documentation (.dox) files for used CMake BASIS Utilities to @b INPUT. |
#
#
# @tp @b INPUT_FILTER filter @endtp
#
# Value for Doxygen's @c INPUT_FILTER tag which can be used to
# specify a default filter for all input files.@n
# Default: @c doxyfilter of BASIS.
# |
#
#
# @tp @b FILTER_PATTERNS pattern1 [pattern2...] @endtp
# Value for Doxygen's @c FILTER_PATTERNS tag which can be used to
# specify filters on a per file pattern basis.@n
# Default: None. |
#
#
# @tp @b INCLUDE_PATH path1 [path2...] @endtp
# Doxygen's @c INCLUDE_PATH tag can be used to specify one or more
# directories that contain include files that are not input files
# but should be processed by the preprocessor. Any given directories
# are appended to the default include path considered.
# Default: Directories added by basis_include_directories(). |
#
#
# @tp @b EXCLUDE_PATTERNS pattern1 [pattern2 ...] @endtp
# Additional patterns used for Doxygen's @c EXCLUDE_PATTERNS tag
# which can be used to specify files and/or directories that
# should be excluded from the INPUT source files.@n
# Default: No exclude patterns. |
#
#
# @tp @b PREDEFINED name1|name1=value1 [name2|name2=value2...] @endtp
# Add preprocessor definitions to be expanded by Doxygen. |
#
#
# @tp @b OUTPUT fmt @endtp
# Specify output formats in which to generate the documentation.
# Currently, only @c html and @c xml are supported. |
#
#
# @tp @b OUTPUT_DIRECTORY dir @endtp
# Value for Doxygen's @c OUTPUT_DIRECTORY tag which can be used to
# specify the output directory. The output files are written to
# subdirectories named "html", "latex", "rtf", and "man".@n
# Default: CMAKE_CURRENT_BINARY_DIR/TARGET_NAME. |
#
#
# @tp @b COLS_IN_ALPHA_INDEX n @endtp
# Number of columns in alphabetical index. Default: 3. |
#
#
# @tp @b IGNORE_PREFIX prefix1 [prefix2...] @endtp
# In case all classes in a project start with a common prefix, all
# classes will be put under the same header in the alphabetical index.
# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
# should be ignored while generating the index headers. |
#
#
# @tp @b PROVIDER_NAME name @endtp
# Value for provider name, such as a company name,
# that will be used for pages in the doxygen output.@n
# Default: @c PROJECT_PROVIDER_NAME. |
#
#
# @tp @b PROVIDER_WEBSITE url @endtp
# Value for provider website, such as a company website,
# that will be used for pages in the doxygen output.@n
# Default: @c PROJECT_PROVIDER_WEBSITE. |
#
#
# @tp @b PROVIDER_LOGO image_file @endtp
# Value for provider logo file, such as a company logo,
# that will be used for pages in the doxygen output.@n
# Default: @c PROJECT_PROVIDER_LOGO. |
#
#
# @tp @b DIVISION_NAME name @endtp
# Value for division name, such as a company division name,
# that will be used for pages in the doxygen output.@n
# Default: @c PROJECT_DIVISION_NAME. |
#
#
# @tp @b DIVISION_WEBSITE url @endtp
# Value for division website, such as a company division website,
# that will be used for pages in the doxygen output.@n
# Default: @c PROJECT_DIVISION_WEBSITE. |
#
#
# @tp @b DIVISION_LOGO image_file @endtp
# Value for division logo file, such as a company division logo,
# that will be used for pages in the doxygen output.@n
# Default: @c PROJECT_DIVISION_LOGO. |
#
#
# @tp @b ENABLED_SECTIONS section1 [section2 ...] @endtp
# The ENABLED_SECTIONS tag can be used to enable conditional
# documentation sections, marked by "\if sectionname ... \endif". |
#
#
# @tp @b HTML_HEADER html_file @endtp
# The HTML_HEADER tag can be used to specify a personal HTML header for
# each generated HTML page. If none specified, the
# @c "PROJECT_SOURCE_DIR/doc/doxygen_header.html(.in)?" file is used if present.
# Otherwise, a default header is used. Specify the value @c Doxygen to use the
# standard header generated by Doxygen instead. |
#
#
# @tp @b HTML_FOOTER html_file @endtp
# The HTML_FOOTER tag can be used to specify a personal HTML footer for
# each generated HTML page. If none specified, the
# @c "PROJECT_SOURCE_DIR/doc/doxygen_footer.html(.in)?" file is used if present.
# Otherwise, a default footer is used. Specify the value @c Doxygen to use the
# standard footer generated by Doxygen instead. |
#
#
# @tp @b HTML_EXTRA_STYLESHEET css_file @endtp
# The HTML_EXTRA_STYLESHEET tag can be used to specify a user-defined cascading
# style sheet that is used by each HTML page. It can be used to
# fine-tune the look of the HTML output. If none specified, the
# @c "PROJECT_SOURCE_DIR/doc/doxygen_extra.css(.in)?" file is used if present. |
#
#
# @tp @b HTML_EXTRA_FILES file1 [file2...] @endtp
# The HTML_EXTRA_FILES tag can be used to specify additional files needed
# for the HTML output of the API documentation. |
#
#
# @tp @b DISABLE_PROJECT_NAME_DISPLAY@endtp
# The DISABLE_PROJECT_NAME_DISPLAY option causes Doxygen's
# @c PROJECT_NAME text not to be displayed in the header.
# Use this if the project name is already part of the logo
# so it won't be there twice in the logo image and title text. |
#
#
# @n
# See
#
# @tp @b EXCLUDE_FROM_DOC @endtp
# By default, the specified target is build as part of the global
# @c doc target. If this option is given, however, the added
# documentation will not be build as part of this target. |
#
#
# @tp @b BUILDER(S) builder... @endtp
# Sphinx builders to use. For each named builder, a build target
# named <TARGET_NAME>_<builder> is added. |
#
#
# @tp @b DEFAULT_BUILDER builder @endtp
# Default Sphinx builder to associated with the @c TARGET_NAME
# build target. Defaults to the first builder named by @c BUILDERS. |
#
#
# @tp @b AUTHOR(S) name @endtp
# Names of authors who wrote this documentation.
# (default: @c PROJECT_AUTHORS) |
#
#
# @tp @b COPYRIGHT text @endtp
# Copyright statement for generated files. (default: @c PROJECT_COPYRIGHT) |
#
#
# @tp @b COMPONENT component @endtp
# Name of the component this documentation belongs to.
# Defaults to @c BASIS_RUNTIME_COMPONENT. |
#
#
# @tp @b DESTINATION dir @endtp
# Installation directory prefix. Used whenever there is no specific
# destination specified for a particular Sphinx builder. Defaults to
# @c BASIS_INSTALL_<TARGET>_DIR in case of HTML output if set.
# Otherwise, the generated HTML files are not installed. |
#
#
# @tp @b <BUILDER>_DESTINATION dir @endtp
# Installation directory for files generated by the specific builder. |
# |
#
# @tp @b EXTENSIONS ext... @endtp
# Names of Sphinx extensions to enable. |
#
#
# @tp @b BREATHE target... @endtp
# Adds a project for the breathe extension which allows the
# inclusion of in-source code documentation extracted by Doxygen.
# For this to work, the specified Doxygen target has to be
# configured with the XML output enabled. |
#
#
# @tp @b DOXYLINK target... @endtp
# Adds a role for the doxylink Sphinx extension which allows to cross-reference
# generated HTML API documentation generated by Doxygen. |
#
#
# @tp @b DOXYLINK_URL url @endtp
# URL to Doxygen documentation. Use DOXYLINK_PREFIX and/or DOXYLINK_SUFFIX
# instead if you use multiple Doxygen targets, where the target name is
# part of the URL. |
#
#
# @tp @b DOXYLINK_PREFIX url @endtp
# Prefix to use for links to Doxygen generated documentation pages
# as generated by the doxylink Sphinx extension. If this prefix does
# not start with a protocol such as http:// or https://, it is prefixed
# to the default path determined by this function relative to the build
# or installed Doxygen documentation. |
#
#
# @tp @b DOXYLINK_SUFFIX suffix @endtp
# Suffix for links to Doxygen generated documentation pages as generated
# by the doxylink Sphinx extension. |
#
#
# @tp @b DOXYDOC target... @endtp
# Alias for both @c BREATHE and @c DOXYLINK options. |
#
#
# @tp @b CONFIG_FILE file @endtp
# Sphinx configuration file. Defaults to @c BASIS_SPHINX_CONFIG. |
#
#
# @tp @b SOURCE_DIRECTORY @endtp
# Root directory of Sphinx source files.
# Defaults to the current source directory or, if a subdirectory
# named @c TARGET_NAME in lowercase only exists, to this subdirectory. |
#
#
# @tp @b OUTPUT_NAME @endtp
# Output name for generated documentation such as PDF document or MAN page.
# Defaults to @c PROJECT_NAME. |
#
#
# @tp @b OUTPUT_DIRECTORY @endtp
# Root output directory for generated files. Defaults to the binary
# directory corresponding to the set @c SOURCE_DIRECTORY. |
#
#
# @tp @b TAG tag @endtp
# Tag argument of sphinx-build. |
#
#
# @tp @b TEMPLATES_PATH @endtp
# Path to template files. Defaults to SOURCE_DIRECTORY/templates/. |
#
#
# @tp @b MASTER_DOC name @endtp
# Name of master document. Defaults to index. |
#
#
# @tp @b EXCLUDE_PATTERN pattern @endtp
# A glob-style pattern that should be excluded when looking for source files.
# Specify this option more than once to specify multiple exclude patterns.
# They are matched against the source file names relative to the source directory,
# using slashes as directory separators on all platforms. |
#
#
# @tp @b HTML_TITLE title @endtp
# Title of HTML web site. |
#
#
# @tp @b HTML_THEME theme @endtp
# Name of HTML theme. Defaults to the @c sbia theme included with BASIS. |
#
#
# @tp @b HTML_THEME_PATH dir @endtp
# Directory of HTML theme. Defaults to @c BASIS_SPHINX_HTML_THEME_PATH. |
#
#
# @tp @b HTML_LOGO file @endtp
# Logo to display in sidebar of HTML pages. |
#
#
# @tp @b HTML_FAVICON file @endtp
# Favorite square icon often displayed by browsers in the tab bar.
# Should be a @c .ico file. |
#
#
# @tp @b HTML_STATIC_PATH dir @endtp
# Directory for static files of HTML pages. Defaults to SOURCE_DIRECTORY/static/. |
#
#
# @tp @b HTML_STYLE css @endtp
# The style sheet to use for HTML pages. A file of that name must exist either in Sphinx'
# default static/ path or the specified @c HTML_STATIC_PATH. Default is the stylesheet
# given by the selected theme. If you only want to add or override a few things compared
# to the theme’s stylesheet, use CSS \@import to import the theme’s stylesheet. |
#
#
# @tp @b HTML_SIDEBARS name... @endtp
# Names of HTML template files for sidebar(s). Defaults to none if not specified.
# Valid default templates are @c localtoc, @c globaltoc, @c searchbox, @c relations,
# @c sourcelink. See
# Shinx documentation of html_sidebars option. Custom templates can be used as
# well by copying the template .html file to the @c TEMPLATES_PATH directory. |
#
#
# @tp @b NO_HTML_DOMAIN_INDICES @endtp
# Set Sphinx configuration option @c html_domain_indices to @c False. (Default: @c True) |
#
#
# @tp @b NO_HTML_MODINDEX @endtp
# Set Sphinx configuration option @c html_use_modindex to @c False. (Default: @c True) |
#
#
# @tp @b NO_HTML_INDEX @endtp
# Set Sphinx configuration option @c html_use_index to @c False. (Default: @c True) |
#
#
# @tp @b LATEX_MASTER_DOC name @endtp
# Name of master document for LaTeX builder. Defaults to MASTER_DOC. |
#
#
# @tp @b LATEX_TITLE title @endtp
# Title for LaTeX/PDF output. Defaults to title of index.rst. |
#
#
# @tp @b LATEX_LOGO file @endtp
# Logo to display above title in generated LaTeX/PDF output. |
#
#
# @tp @b LATEX_DOCUMENT_CLASS howto|manual @endtp
# Document class to use by @c latex builder. |
#
#
# @tp @b LATEX_SHOW_URLS @endtp
# See Sphinx documentation of the
# latex_show_urls option. |
#
#
# @tp @b LATEX_SHOW_PAGEREFS @endtp
# See Sphinx documentation of the
# latex_show_pagerefs option. |
#
#
# @tp @b MAN_SECTION num @endtp
# Section number for manual pages generated by @c man builder. |
#
#
#
# @sa basis_add_doc()
function (basis_add_sphinx_doc TARGET_NAME)
# check target name
basis_check_target_name ("${TARGET_NAME}")
basis_make_target_uid (TARGET_UID "${TARGET_NAME}")
string (TOLOWER "${TARGET_NAME}" TARGET_NAME_L)
string (TOUPPER "${TARGET_NAME}" TARGET_NAME_U)
# verbose output
message (STATUS "Adding documentation ${TARGET_UID}...")
# parse arguments
set (ONE_ARG_OPTIONS
COMPONENT
DEFAUL_BUILDER
DESTINATION HTML_DESTINATION MAN_DESTINATION TEXINFO_DESTINATION
CONFIG_FILE
SOURCE_DIRECTORY OUTPUT_DIRECTORY OUTPUT_NAME TAG
COPYRIGHT MASTER_DOC
HTML_TITLE HTML_THEME HTML_LOGO HTML_FAVICON HTML_THEME_PATH HTML_STYLE
LATEX_MASTER_DOC LATEX_TITLE LATEX_LOGO LATEX_DOCUMENT_CLASS LATEX_SHOW_URLS LATEX_SHOW_PAGEREFS
MAN_SECTION
DOXYLINK_URL DOXYLINK_PREFIX DOXYLINK_SUFFIX
)
# note that additional multiple value arguments are parsed later on below
# this is necessary b/c all unparsed arguments are considered to be options
# of the used HTML theme
CMAKE_PARSE_ARGUMENTS (SPHINX
"EXCLUDE_FROM_DOC;NO_HTML_DOMAIN_INDICES;NO_HTML_MODINDEX;NO_HTML_INDEX"
"${ONE_ARG_OPTIONS}"
""
${ARGN}
)
# source directory
if (NOT SPHINX_SOURCE_DIRECTORY)
if (IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_NAME}")
set (SPHINX_SOURCE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_NAME}")
else ()
set (SPHINX_SOURCE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
endif ()
elseif (NOT IS_ABSOLUTE "${SPHINX_SOURCE_DIRECTORY}")
get_filename_component (SPHINX_SOURCE_DIRECTORY "${SPHINX_SOURCE_DIRECTORY}" ABSOLUTE)
endif ()
# component
if (NOT SPHINX_COMPONENT)
set (SPHINX_COMPONENT "${BASIS_RUNTIME_COMPONENT}")
endif ()
if (NOT SPHINX_COMPONENT)
set (SPHINX_COMPONENT "Unspecified")
endif ()
# find Sphinx
find_package (Sphinx COMPONENTS build QUIET)
if (NOT Sphinx-build_EXECUTABLE)
if (BUILD_DOCUMENTATION)
message (FATAL_ERROR "Command sphinx-build not found! Either install Sphinx and/or set Sphinx-build_EXECUTABLE or disable BUILD_DOCUMENTATION.")
endif ()
message (STATUS "Command sphinx-build not found. Generation of ${TARGET_UID} documentation disabled.")
message (STATUS "Adding documentation ${TARGET_UID}... - skipped")
return ()
endif ()
if (DEFINED Sphinx_VERSION_MAJOR AND Sphinx_VERSION_MAJOR LESS 1)
if (BUILD_DOCUMENTATION)
message (FATAL_ERROR "Found sphinx-build is too old (v${Sphinx_VERSION_STRING})! Please install a more recent version and/or set Sphinx-build_EXECUTABLE to a newer version or disable BUILD_DOCUMENTATION.")
endif ()
message (STATUS "Command sphinx-build is too old (v${Sphinx_VERSION_STRING}). Generation of ${TARGET_UID} documentation disabled.")
message (STATUS "Adding documentation ${TARGET_UID}... - skipped")
return ()
endif ()
# parse remaining arguments
set (SPHINX_HTML_THEME_OPTIONS)
set (SPHINX_BUILDERS)
set (SPHINX_AUTHORS)
set (SPHINX_EXTENSIONS)
set (SPHINX_BREATHE_TARGETS)
set (SPHINX_DOXYLINK_TARGETS)
set (SPHINX_HTML_SIDEBARS)
set (SPHINX_TEMPLATES_PATH)
set (SPHINX_HTML_STATIC_PATH)
set (SPHINX_EXCLUDE_PATTERNS)
set (SPHINX_DEPENDS)
set (OPTION_NAME)
set (OPTION_VALUE)
set (OPTION_PATTERN "(authors?|builders?|extensions|breathe|doxylink|doxydoc|html_sidebars|templates_path|html_static_path|exclude_pattern)")
foreach (ARG IN LISTS SPHINX_UNPARSED_ARGUMENTS)
if (NOT OPTION_NAME OR ARG MATCHES "^[A-Z_]+$")
# SPHINX_HTML_THEME_OPTIONS
if (OPTION_NAME AND NOT OPTION_NAME MATCHES "^${OPTION_PATTERN}$")
if (NOT OPTION_VALUE)
message (FATAL_ERROR "Option ${OPTION_NAME} is missing an argument!")
endif ()
list (LENGTH OPTION_VALUE NUM)
if (NUM GREATER 1)
basis_list_to_delimited_string (OPTION_VALUE ", " NOAUTOQUOTE ${OPTION_VALUE})
set (OPTION_VALUE "[${OPTION_VALUE}]")
endif ()
list (APPEND SPHINX_HTML_THEME_OPTIONS "'${OPTION_NAME}': ${OPTION_VALUE}")
endif ()
# name of next option
set (OPTION_NAME "${ARG}")
set (OPTION_VALUE)
string (TOLOWER "${OPTION_NAME}" OPTION_NAME)
# BUILDER option
elseif (OPTION_NAME MATCHES "^builders?$")
if (ARG MATCHES "html dirhtml singlehtml pdf latex man text texinfo linkcheck")
message (FATAL_ERROR "Invalid/Unsupported Sphinx builder: ${ARG}")
endif ()
list (APPEND SPHINX_BUILDERS "${ARG}")
# AUTHORS option
elseif (OPTION_NAME MATCHES "^authors?$")
list (APPEND SPHINX_AUTHORS "'${ARG}'")
# EXTENSIONS option
elseif (OPTION_NAME MATCHES "^extensions$")
# built-in extension
if (ARG MATCHES "^(autodoc|autosummary|doctest|intersphinx|pngmath|jsmath|mathjax|graphvis|inheritance_graph|ifconfig|coverage|todo|extlinks|viewcode)$")
set (ARG "sphinx.ext.${CMAKE_MATCH_0}")
# map originial name of extensions included with BASIS
elseif (BASIS_SPHINX_EXTENSIONS_PATH AND ARG MATCHES "^sphinxcontrib.(doxylink)$")
set (ARG "${CMAKE_MATCH_1}")
endif ()
list (APPEND SPHINX_EXTENSIONS "'${ARG}'")
# DOXYDOC
elseif (OPTION_NAME MATCHES "^doxydoc$")
list (APPEND SPHINX_BREATHE_TARGETS "${ARG}")
list (APPEND SPHINX_DOXYLINK_TARGETS "${ARG}")
# BREATHE
elseif (OPTION_NAME MATCHES "^breathe$")
list (APPEND SPHINX_BREATHE_TARGETS "${ARG}")
# DOXYLINK
elseif (OPTION_NAME MATCHES "^doxylink$")
list (APPEND SPHINX_DOXYLINK_TARGETS "${ARG}")
# HTML_SIDEBARS
elseif (OPTION_NAME MATCHES "^html_sidebars$")
if (NOT ARG MATCHES "\\.html?$")
set (ARG "${ARG}.html")
endif ()
list (APPEND SPHINX_HTML_SIDEBARS "'${ARG}'")
# TEMPLATES_PATH
elseif (OPTION_NAME MATCHES "^templates_path$")
if (NOT IS_ABSOLUTE "${ARG}")
set (ARG "${SPHINX_SOURCE_DIRECTORY}/${ARG}")
endif ()
list (APPEND SPHINX_TEMPLATES_PATH "'${ARG}'")
# HTML_STATIC_PATH
elseif (OPTION_NAME MATCHES "^html_static_path$")
if (NOT IS_ABSOLUTE "${ARG}")
set (ARG "${SPHINX_SOURCE_DIRECTORY}/${ARG}")
endif ()
list (APPEND SPHINX_HTML_STATIC_PATH "'${ARG}'")
# EXCLUDE_PATTERN
elseif (OPTION_NAME MATCHES "^exclude_pattern$")
list (APPEND SPHINX_EXCLUDE_PATTERNS "'${ARG}'")
# value of theme option
else ()
if (ARG MATCHES "^(TRUE|FALSE)$")
string (TOLOWER "${ARG}" "${ARG}")
endif ()
if (NOT ARG MATCHES "^\\[.*\\]$|^{.*}$")
set (ARG "'${ARG}'")
endif ()
list (APPEND OPTION_VALUE "${ARG}")
endif ()
endforeach ()
# append parsed option setting to SPHINX_HTML_THEME_OPTIONS
if (OPTION_NAME AND NOT OPTION_NAME MATCHES "^${OPTION_PATTERN}$")
if (NOT OPTION_VALUE)
message (FATAL_ERROR "Option ${OPTION_NAME} is missing an argument!")
endif ()
list (LENGTH OPTION_VALUE NUM)
if (NUM GREATER 1)
basis_list_to_delimited_string (OPTION_VALUE ", " NOAUTOQUOTE ${OPTION_VALUE})
set (OPTION_VALUE "[${OPTION_VALUE}]")
endif ()
list (APPEND SPHINX_HTML_THEME_OPTIONS "'${OPTION_NAME}': ${OPTION_VALUE}")
endif ()
# authors
if (NOT SPHINX_AUTHORS)
foreach (AUTHOR IN LISTS PROJECT_AUTHORS)
list (APPEND SPHINX_AUTHORS "'${AUTHOR}'")
endforeach ()
endif ()
if (NOT SPHINX_COPYRIGHT)
set (SPHINX_COPYRIGHT "${PROJECT_COPYRIGHT}")
endif ()
# default builders
if (NOT SPHINX_BUILDERS)
set (SPHINX_BUILDERS html dirhtml singlehtml man pdf texinfo text linkcheck)
endif ()
if (SPHINX_DEFAULT_BUILDER)
list (FIND SPHINX_BUILDERS "${SPHINX_DEFAULT_BUILDER}" IDX)
if (IDX EQUAL -1)
list (INSERT SPHINX_BUILDERS 0 "${SPHINX_DEFAULT_BUILDER}")
endif ()
else ()
list (GET SPHINX_BUILDERS 0 SPHINX_DEFAULT_BUILDER)
endif ()
# output directories
if (NOT SPHINX_OUTPUT_NAME)
set (SPHINX_OUTPUT_NAME "${PROJECT_NAME}")
endif ()
if (NOT SPHINX_OUTPUT_DIRECTORY)
if (IS_ABSOLUTE "${SPHINX_OUTPUT_NAME}")
get_filename_component (SPHINX_OUTPUT_DIRECTORY "${SPHINX_OUTPUT_NAME}" PATH)
else ()
basis_get_relative_path (SPHINX_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" "${SPHINX_SOURCE_DIRECTORY}")
endif ()
endif ()
if (NOT IS_ABSOLUTE "${SPHINX_OUTPUT_DIRECTORY}")
set (SPHINX_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${SPHINX_OUTPUT_DIRECTORY}")
endif ()
foreach (b IN LISTS SPHINX_BUILDERS)
string (TOUPPER "${b}" B)
if (SPHINX_${B}_OUTPUT_DIRECTORY)
if (NOT IS_ABSOLUTE "${SPHINX_${B}_OUTPUT_DIRECTORY}")
set (SPHINX_${B}_OUTPUT_DIRECTORY "${SPHINX_OUTPUT_DIRECTORY}/${SPHINX_${B}_OUTPUT_DIRECTORY}")
endif ()
else ()
set (SPHINX_${B}_OUTPUT_DIRECTORY "${SPHINX_OUTPUT_DIRECTORY}/${b}")
endif ()
endforeach ()
if (IS_ABSOLUTE "${SPHINX_OUTPUT_NAME}")
basis_get_relative_path (SPHINX_OUTPUT_NAME "${SPHINX_OUTPUT_DIRECTORY}" NAME_WE)
endif ()
# configuration directory
basis_get_relative_path (SPHINX_CONFIG_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" "${SPHINX_SOURCE_DIRECTORY}")
set (SPHINX_CONFIG_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${SPHINX_CONFIG_DIRECTORY}")
# build configuration
if (NOT SPHINX_MASTER_DOC)
set (SPHINX_MASTER_DOC "index")
endif ()
if (NOT SPHINX_LATEX_MASTER_DOC)
set (SPHINX_LATEX_MASTER_DOC "${SPHINX_MASTER_DOC}")
endif ()
if (NOT SPHINX_TEMPLATES_PATH AND EXISTS "${SPHINX_SOURCE_DIRECTORY}/templates")
set (SPHINX_TEMPLATES_PATH "'${SPHINX_SOURCE_DIRECTORY}/templates'")
endif ()
if (NOT SPHINX_HTML_STATIC_PATH AND EXISTS "${SPHINX_SOURCE_DIRECTORY}/static")
set (SPHINX_HTML_STATIC_PATH "'${SPHINX_SOURCE_DIRECTORY}/static'")
endif ()
if (NOT SPHINX_HTML_THEME)
set (SPHINX_HTML_THEME "${BASIS_SPHINX_HTML_THEME}")
endif ()
if (NOT SPHINX_UNPARSED_ARGUMENTS AND SPHINX_HTML_THEME STREQUAL BASIS_SPHINX_HTML_THEME)
set (SPHINX_UNPARSED_ARGUMENTS ${BASIS_SPHINX_HTML_THEME_OPTIONS})
endif ()
if (NOT SPHINX_LATEX_DOCUMENT_CLASS)
set (SPHINX_LATEX_DOCUMENT_CLASS "howto")
endif ()
if (NOT SPHINX_MAN_SECTION)
set (SPHINX_MAN_SECTION 1)
endif ()
# installation directories
set (BASIS_INSTALL_${TARGET_NAME_U}_DIR "" CACHE PATH "Installation directory for documentation ${TARGET_NAME} target.")
mark_as_advanced (BASIS_INSTALL_${TARGET_NAME_U}_DIR)
foreach (b IN LISTS SPHINX_BUILDERS)
string (TOUPPER "${b}" B)
if (BASIS_INSTALL_${TARGET_NAME_U}_DIR)
set (SPHINX_${B}_DESTINATION "${BASIS_INSTALL_${TARGET_NAME_U}_DIR}") # user setting
endif ()
if (NOT SPHINX_${B}_DESTINATION)
if (SPHINX_DESTINATION)
set (SPHINX_${B}_DESTINATION "${DESTINATION}") # common destination
elseif (b MATCHES "text")
set (SPHINX_${B}_DESTINATION "${INSTALL_DOC_DIR}/${TARGET_NAME_L}")
elseif (b MATCHES "man")
if (INSTALL_MAN_DIR)
set (SPHINX_${B}_DESTINATION "${INSTALL_MAN_DIR}/man${SPHINX_MAN_SECTION}") # default for manual pages
endif ()
elseif (b MATCHES "texinfo")
if (INSTALL_TEXINFO_DIR)
set (SPHINX_${B}_DESTINATION "${INSTALL_TEXINFO_DIR}") # default for Texinfo files
endif ()
elseif (NOT b MATCHES "html") # do not install excludes by default
set (SPHINX_${B}_DESTINATION "${INSTALL_DOC_DIR}") # default location
endif ()
endif ()
endforeach ()
if (SPHINX_HTML_DESTINATION)
foreach (b IN LISTS SPHINX_BUILDERS)
if (b MATCHES "(dir|single)html")
string (TOUPPER "${b}" B)
if (NOT SPHINX_${B}_DESTINATION)
set (SPHINX_${B}_DESTINATION "${SPHINX_HTML_DESTINATION}")
endif ()
endif ()
endforeach ()
endif ()
# enable required extension
if (SPHINX_DOXYLINK_TARGETS)
if (BASIS_SPHINX_EXTENSIONS_PATH)
if (NOT SPHINX_EXTENSIONS MATCHES "(^|;)?doxylink(;|$)?")
list (APPEND SPHINX_EXTENSIONS "'doxylink'")
endif ()
else ()
if (NOT SPHINX_EXTENSIONS MATCHES "(^|;)?sphinxcontrib.doxylink(;|$)?")
list (APPEND SPHINX_EXTENSIONS "'sphinxcontrib.doxylink'")
endif ()
endif ()
endif ()
if (SPHINX_BREATHE_TARGETS AND NOT SPHINX_EXTENSIONS MATCHES "(^|;)?breathe(;|$)?")
list (APPEND SPHINX_EXTENSIONS "'breathe'")
endif ()
# doxylink configuration
foreach (TARGET IN LISTS SPHINX_DOXYLINK_TARGETS)
basis_get_target_uid (UID "${TARGET}")
get_target_property (TYPE ${UID} BASIS_TYPE)
if (NOT TYPE MATCHES "Doxygen")
message (FATAL_ERROR "Invalid argument for DOXYLINK: Target ${UID} either unknown or it is not a Doxygen target!")
endif ()
get_target_property (DOXYGEN_OUTPUT ${UID} OUTPUT)
if (NOT DOXYGEN_OUTPUT MATCHES "html")
message (FATAL_ERROR "Doxygen target ${UID} was not configured to generate HTML output! This output is required by the doxylink Sphinx extension.")
endif ()
get_target_property (DOXYGEN_TAGFILE ${UID} TAGFILE)
get_target_property (DOXYGEN_HTML_DIRECTORY ${UID} HTML_INSTALL_DIRECTORY)
set (DOXYLINK_PATH)
if (SPHINX_DOXYLINK_URL)
set (DOXYLINK_PATH "${SPHINX_DOXYLINK_URL}")
elseif (SPHINX_DOXYLINK_PREFIX MATCHES "^[a-z]://")
set (DOXYLINK_PATH "${SPHINX_DOXYLINK_PREFIX}${TARGET}${SPHINX_DOXYLINK_SUFFIX}")
else ()
set (DOXYLINK_BASE_DIR)
if (DOXYGEN_HTML_DIRECTORY)
if (SPHINX_DOXYLINK_BASE_DIR)
set (DOXYLINK_BASE_DIR "${SPHINX_DOXYLINK_BASE_DIR}")
elseif (SPHINX_HTML_INSTALL_DIRECTORY)
set (DOXYLINK_BASE_DIR "${SPHINX_HTML_INSTALL_DIRECTORY}")
endif ()
else ()
get_target_property (DOXYGEN_HTML_DIRECTORY ${UID} HTML_OUTPUT_DIRECTORY)
if (SPHINX_DOXYLINK_BASE_DIR)
set (DOXYLINK_BASE_DIR "${SPHINX_DOXYLINK_BASE_DIR}")
else ()
set (DOXYLINK_BASE_DIR "${SPHINX_HTML_OUTPUT_DIRECTORY}")
endif ()
endif ()
if (DOXYLINK_BASE_DIR)
basis_get_relative_path (DOXYLINK_PATH "${DOXYLINK_BASE_DIR}" "${DOXYGEN_HTML_DIRECTORY}")
else ()
set (DOXYLINK_PATH "${TARGET}") # safe fall back
endif ()
set (DOXYLINK_PATH "${SPHINX_DOXYLINK_PREFIX}${DOXYLINK_PATH}${SPHINX_DOXYLINK_SUFFIX}")
endif ()
list (APPEND SPHINX_DOXYLINK "'${TARGET}': ('${DOXYGEN_TAGFILE}', '${DOXYLINK_PATH}')")
list (APPEND SPHINX_DEPENDS ${UID})
endforeach ()
# breathe configuration
set (SPHINX_BREATHE_PROJECTS)
set (SPHINX_BREATHE_DEFAULT_PROJECT)
foreach (TARGET IN LISTS SPHINX_BREATHE_TARGETS)
basis_get_target_uid (UID "${TARGET}")
get_target_property (TYPE ${UID} BASIS_TYPE)
if (NOT TYPE MATCHES "Doxygen")
message (FATAL_ERROR "Invalid argument for BREATHE_PROJECTS: Target ${UID} either unknown or it is not a Doxygen target!")
endif ()
get_target_property (DOXYGEN_OUTPUT ${UID} OUTPUT)
if (NOT DOXYGEN_OUTPUT MATCHES "xml")
message (FATAL_ERROR "Doxygen target ${UID} was not configured to generate XML output! This output is required by the Sphinx extension breathe.")
endif ()
get_target_property (DOXYGEN_OUTPUT_DIRECTORY ${UID} XML_OUTPUT_DIRECTORY)
list (APPEND SPHINX_BREATHE_PROJECTS "'${TARGET}': '${DOXYGEN_OUTPUT_DIRECTORY}'")
if (NOT SPHINX_BREATHE_DEFAULT_PROJECT)
set (SPHINX_BREATHE_DEFAULT_PROJECT "${TARGET}")
endif ()
list (APPEND SPHINX_DEPENDS ${UID})
endforeach ()
# HTML output options
if (SPHINX_NO_HTML_DOMAIN_INDICES)
set (SPHINX_USE_DOMAIN_INDICES False)
else ()
set (SPHINX_USE_DOMAIN_INDICES True)
endif ()
if (SPHINX_NO_HTML_MODINDEX)
set (SPHINX_USE_MODINDEX False)
else ()
set (SPHINX_USE_MODINDEX True)
endif ()
if (SPHINX_NO_HTML_INDEX)
set (SPHINX_USE_INDEX False)
else ()
set (SPHINX_USE_INDEX True)
endif ()
# LaTeX output options
if (NOT SPHINX_LATEX_SHOW_URLS)
set (SPHINX_LATEX_SHOW_URLS "no")
endif ()
if (SPHINX_LATEX_SHOW_PAGEREFS)
set (SPHINX_LATEX_SHOW_PAGEREFS "True")
else ()
set (SPHINX_LATEX_SHOW_PAGEREFS "False")
endif ()
# turn html_logo, html_favicon, and latex_logo into absolute file path
foreach (L IN ITEMS HTML_LOGO HTML_FAVICON LATEX_LOGO)
if (SPHINX_${L} AND NOT IS_ABSOLUTE "${SPHINX_${L}}")
if (EXISTS "${SPHINX_SOURCE_DIRECTORY}/${SPHINX_${L}}")
set (SPHINX_${L} "${SPHINX_SOURCE_DIRECTORY}/${SPHINX_${L}}")
elseif (L MATCHES "^HTML|^LATEX")
foreach (D IN LISTS SPHINX_${CMAKE_MATCH_0}_STATIC_PATH)
string (REGEX REPLACE "^'|'$" "" D "${D}")
if (EXISTS "${D}/${SPHINX_${L}}")
set (SPHINX_${L} "${D}/${SPHINX_${L}}")
break ()
endif ()
endforeach ()
endif ()
endif ()
endforeach ()
# turn CMake lists into Python lists
basis_list_to_delimited_string (SPHINX_EXTENSIONS ", " NOAUTOQUOTE ${SPHINX_EXTENSIONS})
basis_list_to_delimited_string (SPHINX_HTML_THEME_OPTIONS ", " NOAUTOQUOTE ${SPHINX_HTML_THEME_OPTIONS})
basis_list_to_delimited_string (SPHINX_AUTHORS ", " NOAUTOQUOTE ${SPHINX_AUTHORS})
basis_list_to_delimited_string (SPHINX_DOXYLINK ", " NOAUTOQUOTE ${SPHINX_DOXYLINK})
basis_list_to_delimited_string (SPHINX_BREATHE_PROJECTS ", " NOAUTOQUOTE ${SPHINX_BREATHE_PROJECTS})
basis_list_to_delimited_string (SPHINX_HTML_SIDEBARS ", " NOAUTOQUOTE ${SPHINX_HTML_SIDEBARS})
basis_list_to_delimited_string (SPHINX_TEMPLATES_PATH ", " NOAUTOQUOTE ${SPHINX_TEMPLATES_PATH})
basis_list_to_delimited_string (SPHINX_HTML_STATIC_PATH ", " NOAUTOQUOTE ${SPHINX_HTML_STATIC_PATH})
basis_list_to_delimited_string (SPHINX_EXCLUDE_PATTERNS ", " NOAUTOQUOTE ${SPHINX_EXCLUDE_PATTERNS})
# configuration file
if (NOT SPHINX_CONFIG_FILE)
set (SPHINX_CONFIG_FILE "${BASIS_SPHINX_CONFIG}")
endif ()
get_filename_component (SPHINX_CONFIG_FILE "${SPHINX_CONFIG_FILE}" ABSOLUTE)
if (EXISTS "${SPHINX_CONFIG_FILE}")
configure_file ("${SPHINX_CONFIG_FILE}" "${SPHINX_CONFIG_DIRECTORY}/conf.py" @ONLY)
elseif (EXISTS "${SPHINX_CONFIG_FILE}.in")
configure_file ("${SPHINX_CONFIG_FILE}.in" "${SPHINX_CONFIG_DIRECTORY}/conf.py" @ONLY)
else ()
message (FATAL_ERROR "Missing Sphinx configuration file ${SPHINX_CONFIG_FILE}!")
endif ()
# add target to build documentation
set (OPTIONS -a -N -n)
if (NOT BASIS_VERBOSE)
list (APPEND OPTIONS "-q")
endif ()
foreach (TAG IN LISTS SPHINX_TAG)
list (APPEND OPTIONS "-t" "${TAG}")
endforeach ()
add_custom_target (${TARGET_UID}_all) # target to run all builders
foreach (BUILDER IN LISTS SPHINX_BUILDERS)
set (SPHINX_BUILDER "${BUILDER}")
set (SPHINX_POST_COMMAND)
if (BUILDER MATCHES "pdf|texinfo")
if (UNIX)
set (SPHINX_MAKE_COMMAND "make")
if (BUILDER MATCHES "pdf")
set (SPHINX_BUILDER "latex")
configure_file ("${BASIS_MODULE_PATH}/sphinx_make.sh.in" "${SPHINX_CONFIG_DIRECTORY}/make.sh" @ONLY)
set (SPHINX_MAKE_COMMAND "${SPHINX_CONFIG_DIRECTORY}/make.sh")
execute_process (COMMAND chmod +x "${SPHINX_CONFIG_DIRECTORY}/make.sh")
endif ()
set (SPHINX_POST_COMMAND COMMAND "${SPHINX_MAKE_COMMAND}" -C "${SPHINX_OUTPUT_DIRECTORY}/${SPHINX_BUILDER}")
elseif (BUILDER MATCHES "pdf")
message (WARNING "Target ${TARGET_UID} requires the execution of pdflatex which is currently"
" only executed after sphinx-build on Unix platforms. On Windows, pdflatex"
" must be executed manually in the directory\n\n\t${SPHINX_OUTPUT_DIRECTORY}/${SPHINX_BUILDER}")
endif ()
endif ()
if (Sphinx_PYTHON_EXECUTABLE)
add_custom_target (
${TARGET_UID}_${BUILDER}
"${Sphinx_PYTHON_EXECUTABLE}" ${Sphinx_PYTHON_OPTIONS}
"${Sphinx-build_EXECUTABLE}" ${OPTIONS}
-b ${SPHINX_BUILDER}
-c "${SPHINX_CONFIG_DIRECTORY}"
-d "${SPHINX_CONFIG_DIRECTORY}/doctrees"
"${SPHINX_SOURCE_DIRECTORY}"
"${SPHINX_OUTPUT_DIRECTORY}/${SPHINX_BUILDER}"
${SPHINX_POST_COMMAND}
${OPTDEPENDS}
WORKING_DIRECTORY "${SPHINX_CONFIG_DIRECTORY}"
COMMENT "Building documentation ${TARGET_UID} (${BUILDER})..."
)
elseif (UNIX)
add_custom_target (
${TARGET_UID}_${BUILDER}
"${Sphinx-build_EXECUTABLE}" ${OPTIONS}
-b ${SPHINX_BUILDER}
-c "${SPHINX_CONFIG_DIRECTORY}"
-d "${SPHINX_CONFIG_DIRECTORY}/doctrees"
"${SPHINX_SOURCE_DIRECTORY}"
"${SPHINX_OUTPUT_DIRECTORY}/${SPHINX_BUILDER}"
${SPHINX_POST_COMMAND}
${OPTDEPENDS}
WORKING_DIRECTORY "${SPHINX_CONFIG_DIRECTORY}"
COMMENT "Building documentation ${TARGET_UID} (${BUILDER})..."
)
else ()
message (FATAL_ERROR "Python executable required to run Sphinx could not be determined by FindSphinx.cmake!"
" Set the advanced PYTHON_EXECUTABLE variable and try again.")
endif ()
if (SPHINX_DEPENDS)
add_dependencies (${TARGET_UID}_${BUILDER} ${SPHINX_DEPENDS})
endif ()
add_dependencies (${TARGET_UID}_all ${TARGET_UID}_${BUILDER})
# cleanup on "make clean"
set_property (
DIRECTORY
APPEND PROPERTY
ADDITIONAL_MAKE_CLEAN_FILES
"${SPHINX_OUTPUT_DIRECTORY}"
)
endforeach ()
# add general target which depends on default builder only
if (BUILD_DOCUMENTATION AND BASIS_ALL_DOC)
add_custom_target (${TARGET_UID} ALL)
else ()
add_custom_target (${TARGET_UID})
endif ()
add_dependencies (${TARGET_UID} ${TARGET_UID}_${SPHINX_DEFAULT_BUILDER})
# add general "doc" target
if (NOT SPHINX_EXCLUDE_FROM_DOC)
if (NOT TARGET doc)
add_custom_target (doc)
endif ()
add_dependencies (doc ${TARGET_UID}_${SPHINX_DEFAULT_BUILDER})
endif ()
# memorize important target properties
set_target_properties (
${TARGET_UID}
PROPERTIES
BASIS_TYPE Sphinx
BUILDERS "${SPHINX_BUILDERS}"
SOURCE_DIRECTORY "${SPHINX_SOURCE_DIRECTORY}"
OUTPUT_DIRECTORY "${SPHINX_OUTPUT_DIRECTORY}"
CONFIG_DIRECTORY "${SPHINX_CONFIG_DIRECTORY}"
)
foreach (b IN LISTS SPHINX_BUILDERS)
string (TOUPPER ${b} B)
set_target_properties (${TARGET_UID} PROPERTIES ${B}_INSTALL_DIRECTORY "${SPHINX_${B}_DESTINATION}")
endforeach ()
# cleanup on "make clean"
set_property (
DIRECTORY
APPEND PROPERTY
ADDITIONAL_MAKE_CLEAN_FILES
"${SPHINX_CONFIG_DIRECTORY}/doctrees"
)
# install documentation
install (
CODE
"
set (HTML_DESTINATION \"${SPHINX_HTML_DESTINATION}\")
set (PDF_DESTINATION \"${SPHINX_PDF_DESTINATION}\")
set (LATEX_DESTINATION \"${SPHINX_LATEX_DESTINATION}\")
set (MAN_DESTINATION \"${SPHINX_MAN_DESTINATION}\")
set (TEXINFO_DESTINATION \"${SPHINX_TEXINFO_DESTINATION}\")
set (TEXT_DESTINATION \"${SPHINX_TEXT_DESTINATION}\")
function (install_sphinx_doc BUILDER)
if (BUILDER MATCHES \"pdf\")
set (SPHINX_BUILDER \"latex\")
else ()
set (SPHINX_BUILDER \"\${BUILDER}\")
endif ()
string (TOUPPER \"\${BUILDER}\" BUILDER_U)
set (CMAKE_INSTALL_PREFIX \"\${\${BUILDER_U}_DESTINATION}\")
if (NOT CMAKE_INSTALL_PREFIX)
return ()
elseif (NOT IS_ABSOLUTE \"\${CMAKE_INSTALL_PREFIX}\")
set (CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}/\${CMAKE_INSTALL_PREFIX}\")
endif ()
set (EXT)
if (BUILDER MATCHES \"pdf\")
set (EXT \".pdf\")
elseif (BUILDER MATCHES \"man\")
set (EXT \".?\")
elseif (BUILDER MATCHES \"texinfo\")
set (EXT \".info\")
endif ()
file (
GLOB_RECURSE
FILES
RELATIVE \"${SPHINX_OUTPUT_DIRECTORY}/\${SPHINX_BUILDER}\"
\"${SPHINX_OUTPUT_DIRECTORY}/\${SPHINX_BUILDER}/*\${EXT}\"
)
foreach (F IN LISTS FILES)
if (NOT F MATCHES \"\\\\.buildinfo\")
set (RC 1)
if (NOT BUILDER MATCHES \"texinfo\")
execute_process (
COMMAND \"${CMAKE_COMMAND}\" -E compare_files
\"${SPHINX_OUTPUT_DIRECTORY}/\${SPHINX_BUILDER}/\${F}\"
\"\${CMAKE_INSTALL_PREFIX}/\${F}\"
RESULT_VARIABLE RC
OUTPUT_QUIET
ERROR_QUIET
)
endif ()
if (RC EQUAL 0)
message (STATUS \"Up-to-date: \${CMAKE_INSTALL_PREFIX}/\${F}\")
else ()
message (STATUS \"Installing: \${CMAKE_INSTALL_PREFIX}/\${F}\")
if (BUILDER MATCHES \"texinfo\")
if (EXISTS \"\${CMAKE_INSTALL_PREFIX}/dir\")
execute_process (
COMMAND install-info
\"${SPHINX_OUTPUT_DIRECTORY}/\${SPHINX_BUILDER}/\${F}\"
\"\${CMAKE_INSTALL_PREFIX}/dir\"
RESULT_VARIABLE RC
OUTPUT_QUIET
ERROR_QUIET
)
else ()
execute_process (
COMMAND \"${CMAKE_COMMAND}\" -E copy_if_different
\"${SPHINX_OUTPUT_DIRECTORY}/\${SPHINX_BUILDER}/\${F}\"
\"\${CMAKE_INSTALL_PREFIX}/dir\"
RESULT_VARIABLE RC
OUTPUT_QUIET
ERROR_QUIET
)
endif ()
else ()
execute_process (
COMMAND \"${CMAKE_COMMAND}\" -E copy_if_different
\"${SPHINX_OUTPUT_DIRECTORY}/\${SPHINX_BUILDER}/\${F}\"
\"\${CMAKE_INSTALL_PREFIX}/\${F}\"
RESULT_VARIABLE RC
OUTPUT_QUIET
ERROR_QUIET
)
endif ()
if (RC EQUAL 0)
# also remember .info files for deinstallation via install-info --delete
list (APPEND CMAKE_INSTALL_MANIFEST_FILES \"\${CMAKE_INSTALL_PREFIX}/\${F}\")
else ()
message (STATUS \"Failed to install \${CMAKE_INSTALL_PREFIX}/\${F}\")
endif ()
endif ()
endif ()
endforeach ()
endfunction ()
set (BUILDERS \"${SPHINX_BUILDERS}\")
set (HTML_INSTALLED FALSE)
foreach (BUILDER IN LISTS BUILDERS)
if ((BUILDER MATCHES \"html\" AND NOT HTML_INSTALLED) OR
(BUILDER MATCHES \"texinfo|man\" AND UNIX) OR
NOT BUILDER MATCHES \"html|texinfo|man|latex|linkcheck\")
install_sphinx_doc (\${BUILDER})
if (BUILDER MATCHES \"html\")
set (HTML_INSTALLED TRUE)
endif ()
endif ()
endforeach ()
"
)
# done
message (STATUS "Adding documentation ${TARGET_UID}... - done")
endfunction ()
# ============================================================================
# change log
# ============================================================================
# ----------------------------------------------------------------------------
## @brief Add target for generation of ChangeLog file.
#
# The ChangeLog is either generated from the Subversion or Git log depending
# on which revision control system is used by the project. Moreover, the
# project's source directory must be either a Subversion working copy or
# the root of a Git repository, respectively. In case of Subversion, if the
# command-line tool svn2cl(.sh) is installed, it is used to output a nicer
# formatted change log.
function (basis_add_changelog)
_basis_make_target_uid (TARGET_UID changelog)
option (BUILD_CHANGELOG "Request build and/or installation of the ChangeLog." OFF)
mark_as_advanced (BUILD_CHANGELOG)
set (CHANGELOG_FILE "${PROJECT_BINARY_DIR}/ChangeLog")
message (STATUS "Adding ChangeLog...")
if (NOT PROJECT_IS_MODULE AND BUILD_CHANGELOG)
set (_ALL "ALL")
else ()
set (_ALL)
endif ()
set (DISABLE_BUILD_CHANGELOG FALSE)
# --------------------------------------------------------------------------
# generate ChangeLog from Subversion history
if (EXISTS "${PROJECT_SOURCE_DIR}/.svn")
find_package (Subversion QUIET)
if (Subversion_FOUND)
if (_ALL)
message ("Generation of ChangeLog enabled as part of ALL."
" Be aware that the ChangeLog generation from the Subversion"
" commit history can take several minutes and may require the"
" input of your Subversion repository credentials during the"
" build. If you would like to build the ChangeLog separate"
" from the rest of the software package, disable the option"
" BUILD_CHANGELOG. You can then build the changelog target"
" separate from ALL.")
endif ()
# using svn2cl command
find_program (
SVN2CL_EXECUTABLE
NAMES svn2cl svn2cl.sh
DOC "The command line tool svn2cl."
)
mark_as_advanced (SVN2CL_EXECUTABLE)
if (SVN2CL_EXECUTABLE)
add_custom_target (
${TARGET_UID} ${_ALL}
COMMAND "${SVN2CL_EXECUTABLE}"
"--output=${CHANGELOG_FILE}"
"--linelen=79"
"--reparagraph"
"--group-by-day"
"--include-actions"
"--separate-daylogs"
"${PROJECT_SOURCE_DIR}"
COMMAND "${CMAKE_COMMAND}"
"-DCHANGELOG_FILE:FILE=${CHANGELOG_FILE}" -DINPUTFORMAT=SVN2CL
-P "${BASIS_MODULE_PATH}/PostprocessChangeLog.cmake"
WORKING_DIRECTORY "${PROJECT_BINARY_DIR}"
COMMENT "Generating ChangeLog from Subversion log (using svn2cl)..."
)
# otherwise, use svn log output directly
else ()
add_custom_target (
${TARGET_UID} ${_ALL}
COMMAND "${CMAKE_COMMAND}"
"-DCOMMAND=${Subversion_SVN_EXECUTABLE};log"
"-DWORKING_DIRECTORY=${PROJECT_SOURCE_DIR}"
"-DOUTPUT_FILE=${CHANGELOG_FILE}"
-P "${BASIS_SCRIPT_EXECUTE_PROCESS}"
COMMAND "${CMAKE_COMMAND}"
"-DCHANGELOG_FILE:FILE=${CHANGELOG_FILE}" -DINPUTFORMAT=SVN
-P "${BASIS_MODULE_PATH}/PostprocessChangeLog.cmake"
COMMENT "Generating ChangeLog from Subversion log..."
VERBATIM
)
endif ()
else ()
if (BASIS_VERBOSE)
message (STATUS "Project is SVN working copy but Subversion executable was not found."
" Generation of ChangeLog disabled.")
endif ()
set (DISABLE_BUILD_CHANGELOG TRUE)
endif ()
# --------------------------------------------------------------------------
# generate ChangeLog from Git log
elseif (EXISTS "${PROJECT_SOURCE_DIR}/.git")
find_package (Git QUIET)
if (GIT_FOUND)
add_custom_target (
${TARGET_UID} ${_ALL}
COMMAND "${CMAKE_COMMAND}"
"-DCOMMAND=${GIT_EXECUTABLE};log;--date-order;--date=short;--pretty=format:%ad\ \ %an%n%n%w(79,8,10)* %s%n%n%b%n"
"-DWORKING_DIRECTORY=${PROJECT_SOURCE_DIR}"
"-DOUTPUT_FILE=${CHANGELOG_FILE}"
-P "${BASIS_SCRIPT_EXECUTE_PROCESS}"
COMMAND "${CMAKE_COMMAND}"
"-DCHANGELOG_FILE=${CHANGELOG_FILE}" -DINPUTFORMAT=GIT
-P "${BASIS_MODULE_PATH}/PostprocessChangeLog.cmake"
COMMENT "Generating ChangeLog from Git log..."
VERBATIM
)
else ()
if (BASIS_VERBOSE)
message (STATUS "Project is Git repository but Git executable was not found."
" Generation of ChangeLog disabled.")
endif ()
set (DISABLE_BUILD_CHANGELOG TRUE)
endif ()
# --------------------------------------------------------------------------
# neither SVN nor Git repository
else ()
if (BASIS_VERBOSE)
message (STATUS "Project source directory ${PROJECT_SOURCE_DIR} is neither"
" SVN working copy nor Git repository. Generation of ChangeLog disabled.")
endif ()
set (DISABLE_BUILD_CHANGELOG TRUE)
endif ()
# --------------------------------------------------------------------------
# disable changelog target
if (DISABLE_BUILD_CHANGELOG)
set (BUILD_CHANGELOG OFF CACHE INTERNAL "" FORCE)
message (STATUS "Adding ChangeLog... - skipped")
return ()
endif ()
# --------------------------------------------------------------------------
# cleanup on "make clean"
set_property (DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${CHANGELOG_FILE}")
# --------------------------------------------------------------------------
# install ChangeLog
get_filename_component (CHANGELOG_NAME "${CHANGELOG_FILE}" NAME)
if (PROJECT_IS_MODULE)
set (CHANGELOG_NAME "${CHANGELOG_NAME}-${PROJECT_NAME}")
endif ()
install (
FILES "${CHANGELOG_FILE}"
DESTINATION "${TOPLEVEL_INSTALL_DOC_DIR}"
COMPONENT "${BASIS_RUNTIME_COMPONENT}"
RENAME "${CHANGELOG_NAME}"
OPTIONAL
)
message (STATUS "Adding ChangeLog... - done")
endfunction ()