FindDoxygen

查找 Doxygen(一个源代码文档生成器)以及一些可选的辅助工具,并提供了一个命令,用于将基于 Doxygen 的文档集成到 CMake 项目中。

find_package(Doxygen [<version>] [...] [COMPONENTS <components>...] [...])

组件

其他 Doxygen 辅助工具可以通过 `find_package()` 命令的组件进行指定:find_package() 命令。

find_package(Doxygen [COMPONENTS <components>...])

支持的组件包括

doxygen

版本 3.9 中添加。

查找 `doxygen` 可执行文件。此组件即使未请求也会自动包含。

dot

版本 3.9 中添加。

查找 Graphviz 的 `dot` 工具,它用于在文档中渲染图形和图表。

mscgen

版本 3.9 中添加。

查找 Doxygen 的 `\msc` 和 `\mscfile` 命令使用的“消息图生成器”(Message Chart Generator)工具:Message Chart Generator

dia

版本 3.9 中添加。

查找 Doxygen 的 `\diafile` 命令使用的“Dia”图编辑器:Dia

导入的目标

此模块提供了以下 导入目标,如果请求了相应组件且找到了相关可执行文件,则会定义每个目标。

Doxygen::doxygen

版本 3.9 中添加。

导入的可执行目标,封装了 `doxygen` 可执行文件的使用需求。如果找到 Doxygen,则可用。

Doxygen::dot

版本 3.9 中添加。

导入的可执行目标,封装了 `dot` 可执行文件的使用需求。如果找到上述 `dot` 组件,则可用。

Doxygen::mscgen

版本 3.9 中添加。

导入的可执行目标,封装了 `mscgen` 可执行文件的使用需求。如果找到上述 `mscgen` 组件,则可用。

Doxygen::dia

版本 3.9 中添加。

导入的可执行目标,封装了 `dia` 可执行文件的使用需求。如果找到上述 `dia` 组件,则可用。

这些目标可以用在 `add_custom_command()` 等命令中,并且比旧的、已弃用的变量(如 `DOXYGEN_EXECUTABLE`)更受推荐。

结果变量

此模块定义了以下变量

Doxygen_FOUND

布尔值,指示是否找到(请求的版本) `doxygen` 可执行文件以及所有请求的必需组件。为了向后兼容,也设置了 `DOXYGEN_FOUND` 变量,但其布尔值为 `YES` 或 `NO`。

DOXYGEN_VERSION

找到的 Doxygen 版本(如 `doxygen --version` 报告的那样)。

命令

此模块提供以下命令

doxygen_add_docs

版本 3.9 中添加。

在构建阶段添加一个自定义目标,用于使用 Doxygen 生成文档。

doxygen_add_docs(
  <target-name>
  [<files-or-dirs>...]
  [ALL]
  [USE_STAMP_FILE]
  [WORKING_DIRECTORY <dir>]
  [COMMENT <comment>]
  [CONFIG_FILE <file>]
)

默认情况下,此便捷命令还在 CMake 配置阶段在当前二进制目录中生成一个名为 `Doxyfile.` 的配置文件。它提供了合理的默认值,因此大多数项目只需要指定输入文件或目录。可以使用以下部分所述的变量来自定义其他行为和配置。

参数为

<target-name>

要创建的用于使用 Doxygen 生成文档的目标名称。

<files-or-dirs>...

一个或多个路径(文件或目录),作为文档的输入源。

这些将传递给生成的 `Doxyfile.` 中的 `INPUT` Doxygen 配置标签。此处列出的文件也将作为底层 `add_custom_target()` 命令的 `SOURCES` 参数添加,以便它们出现在 IDE 项目的源列表中。

当使用 `USE_STAMP_FILE` 选项时,只允许文件(不允许目录、符号链接或通配符),并且每个文件在调用此命令时都必须存在。

ALL

3.12 版本新增。

将创建的文档目标添加到默认构建目标,以便它作为构建阶段的一部分自动运行。

USE_STAMP_FILE

3.16 版新增。

启用时间戳文件,以避免在源文件未更改时重新生成文档。

时间戳文件(名为 `.stamp`)由底层自定义命令在当前二进制目录中创建。

使用此选项时,`` 中的所有条目在调用此命令时都必须是现有文件(即不允许目录、符号链接或通配符)。如果任何列出的路径无效,将引发错误。

如果未使用此选项,CMake 将在每次构建 `` 目标时重新运行 Doxygen,而不管 `` 中列出的任何输入源文件是否已更改。

WORKING_DIRECTORY <dir>

默认情况下,Doxygen 的工作目录是当前源目录(CMAKE_CURRENT_SOURCE_DIR)。这与使用相对输入路径一致。

使用此选项来更改和覆盖 Doxygen 运行的目录。然后,绝对路径 `

` 将用作相对路径的基础点。

另请注意,Doxygen 的默认行为是从生成的文档中的相对路径中剥离工作目录。有关更多详细信息,请参阅 Doxygen 手册 中的 `STRIP_FROM_PATH` 配置标签。

COMMENT <comment>

如果提供了 `` 字符串,它将作为 `COMMENT` 参数传递给用于在内部创建自定义目标的底层 `add_custom_target()` 命令。当目标构建时,这会显示在构建系统的输出中。

CONFIG_FILE <file>

在 3.27 版本中新增。

如果指定,则提供的带有完整路径的文件将用作 Doxygen 配置文件,而不是默认的 `Doxyfile.`。

用于自定义 Doxygen 配置的变量

`doxygen_add_docs()` 命令生成一个包含配置标签的 Doxygen 配置文件。例如:

Doxygen.<target-name>
DOXYFILE_ENCODING      = UTF-8
PROJECT_NAME           = DoxygenExample
PROJECT_NUMBER         = 1.2.3
PROJECT_BRIEF          = "Example project using Doxygen"
PROJECT_LOGO           =
OUTPUT_DIRECTORY       = /home/user/doxygen-example/build
GENERATE_HTML          = YES
GENERATE_MAN           = NO
# ...

在 CMake 中,可以通过设置形式为 `DOXYGEN_` 的输入变量来修改这些标签,其中 `` 是 Doxygen 手册 中列出的配置标签之一。

例如,要修改 `GENERATE_HTML` 和 `GENERATE_MAN` 配置标签,可以在调用 `doxygen_add_docs()` 之前设置以下变量:

CMakeLists.txt
find_package(Doxygen)

if(Doxygen_FOUND)
  set(DOXYGEN_GENERATE_HTML NO)
  set(DOXYGEN_GENERATE_MAN YES)

  doxygen_add_docs(project_docs ${PROJECT_SOURCE_DIR})
endif()

默认配置

默认情况下,`doxygen_add_docs()` 会覆盖 Doxygen 的几个设置,以更好地适应典型的 CMake 项目。除非在调用 `doxygen_add_docs()` 之前已定义,否则会明确设置以下每个变量,但有一些例外情况(如下所述):

DOXYGEN_HAVE_DOT

如果请求并找到了 `dot` 组件,则设置为 `YES`,否则设置为 `NO`。忽略 `DOXYGEN_HAVE_DOT` 的任何现有值。

DOXYGEN_DOT_MULTI_TARGETS

由本模块设置为 `YES`(请注意,这需要比 1.8.10 更新的 `dot` 版本)。此选项仅在 `DOXYGEN_HAVE_DOT` 也设置为 `YES` 时才有意义。

DOXYGEN_GENERATE_LATEX

由本模块设置为 `NO`。

DOXYGEN_WARN_FORMAT

对于基于 Visual Studio 的生成器,这被设置为 Visual Studio IDE 识别的格式:`$file($line) : $text`。对于所有其他生成器,Doxygen 的默认值不会被覆盖。

DOXYGEN_PROJECT_NAME

填充为当前项目的名称(即 PROJECT_NAME)。

DOXYGEN_PROJECT_NUMBER

填充为当前项目的版本(即 PROJECT_VERSION)。

DOXYGEN_PROJECT_BRIEF

填充为当前项目的描述(即 PROJECT_DESCRIPTION)。

DOXYGEN_INPUT

此变量会自动用传递给 `doxygen_add_docs()` 的文件和目录列表进行填充。为了与其他内置命令(如 `add_executable()`、`add_library()` 和 `add_custom_target()`)保持一致,项目不应手动设置此变量。如果项目设置了名为 `DOXYGEN_INPUT` 的变量,它将被忽略并发出警告。

DOXYGEN_RECURSIVE

由本模块设置为 `YES`。

DOXYGEN_EXCLUDE_PATTERNS

如果 `doxygen_add_docs()` 的 `` 参数包含目录,此变量将指定用于从这些目录中排除文件的模式。默认情况下,会添加以下模式以确保 CMake 特定的文件和目录不包含在输入中。如果项目设置了此变量,则这些内容将与这些附加模式合并,而不是替换它们。

*/.git/*
*/.svn/*
*/.hg/*
*/CMakeFiles/*
*/_CPack_Packages/*
DartConfiguration.tcl
CMakeLists.txt
CMakeCache.txt
DOXYGEN_OUTPUT_DIRECTORY

由本模块设置为 CMAKE_CURRENT_BINARY_DIR。如果项目为此提供了自己的值,并且它是一个相对路径,则它将相对于当前二进制目录(CMAKE_CURRENT_BINARY_DIR)进行解释。这是必要的,因为 Doxygen 通常会从源树中的一个目录运行,以便相对源路径按预期工作。如果此目录不存在,则在执行 Doxygen 之前会递归创建它。

列表

许多 Doxygen 配置标签接受列表值,Doxygen 要求它们用空格分隔,而在 CMake 中,列表是项目号分隔的项目字符串(分号)。

`doxygen_add_docs()` 专门检查以下 Doxygen 配置标签,并在设置时将它们关联的 CMake `DOXYGEN_` 变量值转换为 Doxygen 格式的列表:

  • ABBREVIATE_BRIEF

  • ALIASES

  • CITE_BIB_FILES

  • DIAFILE_DIRS

  • DOTFILE_DIRS

  • DOT_FONTPATH

  • ENABLED_SECTIONS

  • EXAMPLE_PATH

  • EXAMPLE_PATTERNS

  • EXCLUDE

  • EXCLUDE_PATTERNS

  • EXCLUDE_SYMBOLS

  • EXPAND_AS_DEFINED

  • EXTENSION_MAPPING

  • EXTRA_PACKAGES

  • EXTRA_SEARCH_MAPPINGS

  • FILE_PATTERNS

  • FILTER_PATTERNS

  • FILTER_SOURCE_PATTERNS

  • HTML_EXTRA_FILES

  • HTML_EXTRA_STYLESHEET

  • IGNORE_PREFIX

  • IMAGE_PATH

  • INCLUDE_FILE_PATTERNS

  • INCLUDE_PATH

  • INPUT

  • LATEX_EXTRA_FILES

  • LATEX_EXTRA_STYLESHEET

  • MATHJAX_EXTENSIONS

  • MSCFILE_DIRS

  • PLANTUML_INCLUDE_PATH

  • PREDEFINED

  • QHP_CUST_FILTER_ATTRS

  • QHP_SECT_FILTER_ATTRS

  • STRIP_FROM_INC_PATH

  • STRIP_FROM_PATH

  • TAGFILES

  • TCL_SUBST

例如,要自定义 Doxygen 的文件模式,可以在 CMake 中设置一个通常的分号分隔列表:

CMakeLists.txt
find_package(Doxygen)

if(Doxygen_FOUND)
  set(DOXYGEN_FILE_PATTERNS *.c *.cxx *.h *.hxx)
  doxygen_add_docs(example_docs ${CMAKE_CURRENT_SOURCE_DIR} ALL)
endif()

这将生成一个在生成的配置文件中由空格分隔的 Doxygen 模式列表:

Doxyfile.<target-name>
# ...
FILE_PATTERNS          = *.c *.cxx *.h *.hxx

自动引用

如果 Doxygen 的单值标签包含空格,则其值必须用双引号(`"..."`)括起来。`doxygen_add_docs()` 在生成 `Doxyfile` 时会自动引用以下 Doxygen 标签的值(如果它们至少包含一个空格):

  • CHM_FILE

  • DIA_PATH

  • DOCBOOK_OUTPUT

  • DOCSET_FEEDNAME

  • DOCSET_PUBLISHER_NAME

  • DOT_FONTNAME

  • DOT_PATH

  • EXTERNAL_SEARCH_ID

  • FILE_VERSION_FILTER

  • GENERATE_TAGFILE

  • HHC_LOCATION

  • HTML_FOOTER

  • HTML_HEADER

  • HTML_OUTPUT

  • HTML_STYLESHEET

  • INPUT_FILTER

  • LATEX_FOOTER

  • LATEX_HEADER

  • LATEX_OUTPUT

  • LAYOUT_FILE

  • MAN_OUTPUT

  • MAN_SUBDIR

  • MATHJAX_CODEFILE

  • MSCGEN_PATH

  • OUTPUT_DIRECTORY

  • PERL_PATH

  • PLANTUML_JAR_PATH

  • PROJECT_BRIEF

  • PROJECT_LOGO

  • PROJECT_NAME

  • QCH_FILE

  • QHG_LOCATION

  • QHP_CUST_FILTER_NAME

  • QHP_VIRTUAL_FOLDER

  • RTF_EXTENSIONS_FILE

  • RTF_OUTPUT

  • RTF_STYLESHEET_FILE

  • SEARCHDATA_FILE

  • USE_MDFILE_AS_MAINPAGE

  • WARN_FORMAT

  • WARN_LOGFILE

  • XML_OUTPUT

DOXYGEN_VERBATIM_VARS

3.11 版本新增。

一个 CMake 输入变量,用于 `doxygen_add_docs()` 来指定 Doxygen 输入变量列表(包括其前缀 `DOXYGEN_`),这些变量的值应在不进行自动引用的情况下传递给生成的 `Doxyfile` 配置。

使用此变量时,项目负责确保这些变量的值在直接放入生成的 `Doxyfile` 配置时是有意义的。对于列表变量,项仍然在输出中用空格分隔,但不对单个项进行引用。

对于某些 Doxygen 标签,例如 `ALIASES`,`doxygen_add_docs()` 的自动引用可能会干扰正确的语法(例如,嵌入式引号)。

例如,以下代码将引用 `DOXYGEN_PROJECT_BRIEF`,但会跳过 `DOXYGEN_ALIASES` 列表中的每个项(使用括号语法以方便处理嵌入式引号):

CMakeLists.txt
find_package(Doxygen)

if(Doxygen_FOUND)
  set(DOXYGEN_PROJECT_BRIEF "String with spaces")
  set(
    DOXYGEN_ALIASES
    [[somealias="@some_command param"]]
    "anotherAlias=@foobar"
  )
  set(DOXYGEN_VERBATIM_VARS DOXYGEN_ALIASES)

  add_doxygen_docs(project_docs ${PROJECT_SOURCE_DIR})
endif()

生成的 `Doxyfile` 配置将包含以下行:

Doxyfile.project_docs
PROJECT_BRIEF = "String with spaces"
ALIASES       = somealias="@some_command param" anotherAlias=@foobar

已弃用变量

为了与 CMake 的早期版本兼容,还定义了以下变量,但它们已弃用,不应再使用:

DOXYGEN_EXECUTABLE

自 3.9 版本起已弃用: 请使用 `Doxygen::doxygen` 导入的目标,而不是直接引用 `doxygen` 可执行文件。

包含 `doxygen` 命令路径的缓存变量。

DOXYGEN_DOT_FOUND

自 3.9 版本起已弃用。

布尔结果变量,指示是否找到 `dot` 可执行文件。

DOXYGEN_DOT_EXECUTABLE

自 3.9 版本起已弃用: 请使用 `Doxygen::dot` 导入的目标,而不是直接引用 `dot` 可执行文件。

包含 `dot` 命令行可执行文件路径的缓存变量。

DOXYGEN_DOT_PATH

自 3.9 版本起已弃用。

结果变量,包含 `dot` 可执行文件所在的目录的路径(如 `DOXYGEN_DOT_EXECUTABLE` 中报告的)。该路径可能带有正斜杠,即使在 Windows 上也是如此,并且不适合直接替换到 `Doxyfile.in` 模板中。如果需要此值,请获取 `Doxygen::dot` 目标的 `IMPORTED_LOCATION` 属性,并使用 `get_filename_component()` 来提取该路径的目录部分。还可以考虑使用 `file(TO_NATIVE_PATH)` 来为 Doxygen 配置文件准备路径。

DOXYGEN_SKIP_DOT

自 3.9 版本起已弃用。

在 `find_package(Doxygen COMPONENTS ...)` 中指定组件时,此提示变量不起作用。在向后兼容模式下(即不指定组件时),它可以防止此查找模块搜索 Graphviz 的 `dot` 工具。

示例

示例:查找 Doxygen

查找 Doxygen

find_package(Doxygen)

或者,查找 Doxygen 并指定所需的最低版本:

find_package(Doxygen 1.9)

或者,将 Doxygen 标记为必需(如果未找到,处理将停止并显示错误消息):

find_package(Doxygen REQUIRED)

或者,将 Doxygen 标记为必需,并将 `dot` 工具作为必需组件,将 `mscgen` 和 `dia` 工具作为可选组件:

find_package(Doxygen REQUIRED COMPONENTS dot OPTIONAL_COMPONENTS mscgen dia)

示例:在 CMake 中使用 Doxygen

以下示例演示了如何在构建阶段查找 Doxygen 并从源文件创建文档。项目构建后,生成的文档文件将位于项目二进制目录内的 `html` 目录中:

CMakeLists.txt
cmake_minimum_required(VERSION 3.24)
project(
  DoxygenExample
  DESCRIPTION "Example project using Doxygen"
  VERSION 1.2.3
)

add_executable(example example.c)

find_package(Doxygen)

if(Doxygen_FOUND)
  doxygen_add_docs(project_docs example.c ALL USE_STAMP_FILE)
endif()
example.c
/**
 * @file example.c
 * @brief A simple example to demonstrate Doxygen.
 */

#include <stdio.h>

/**
 * @brief Calculates the sum of two integers.
 *
 * @param a First integer.
 * @param b Second integer.
 * @return Sum of a and b.
 *
 * @par Example
 * @code
 * int result = sum(3, 4);
 * printf("%d\n", result); // Outputs: 7
 * @endcode
 */
int sum(int a, int b) { return a + b; }

/**
 * @brief Main function.
 *
 * @return 0 on success.
 */
int main(void)
{
  int result = sum(5, 7);
  printf("Result: %d\n", result);
  return 0;
}

示例:使用变量配置 Doxygen

在以下示例中,Doxygen 配置使用 CMake 变量进行自定义。该配置在使用目录作为源输入(CMAKE_CURRENT_SOURCE_DIR)时设置文件模式,启用用于在浅色和深色模式之间切换的主题切换,在构建阶段抑制 Doxygen 的标准输出,将一个 Markdown 文件指定为主页面,并禁用有关未记录代码的警告:

find_package(Doxygen)

if(Doxygen_FOUND)
  set(DOXYGEN_FILE_PATTERNS *.c *.cxx *.md)
  set(DOXYGEN_HTML_COLORSTYLE "TOGGLE")
  set(DOXYGEN_QUIET YES)
  set(DOXYGEN_USE_MDFILE_AS_MAINPAGE "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
  set(DOXYGEN_WARN_IF_UNDOCUMENTED NO)

  doxygen_add_docs(example_docs ${CMAKE_CURRENT_SOURCE_DIR} ALL)
endif()

示例:自定义配置文件

在以下示例中,在调用 `doxygen_add_doxs()` 之前,在当前二进制目录(CMAKE_CURRENT_BINARY_DIR)中创建了一个自定义 `Doxyfile` 配置文件。这允许根据需要自定义项目特定的配置标签:

CMakeLists.txt
find_package(Doxygen)

if(Doxygen_FOUND)
  configure_file(Doxyfile.in Doxyfile)

  doxygen_add_doxs(
    example_docs
    foo.c bar.c
    ALL
    USE_STAMP_FILE
    COMMENT "Generating project documentation with custom Doxyfile"
    CONFIG_FILE ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
  )
endif()
Doxyfile.in
PROJECT_NAME           = "Customized project name"
OUTPUT_DIRECTORY       = "@CMAKE_CURRENT_BINARY_DIR@"
# ...