如果我在 Doxyfile 中提供 CLANG_DATABASE_PATH,我还需要提供 INPUT 和 INCLUDE_PATH 吗?

If I provide CLANG_DATABASE_PATH in Doxyfile do I still have to provide INPUT and INCLUDE_PATH?

我正在使用 Doxygen 来记录我的项目。我在目录 C:\dev\project_dir 中有一个 compile_commands.json 文件描述我的项目的源代码。我设置了以下变量:

CLANG_ASSISTED_PARSING = YES
CLANG_DATABASE_PATH    = C:\dev\project_dir

那么这是如何工作的呢?我还必须设置变量 INPUTINCLUDE_PATH 吗?好像所有的文件和编译它们的指令,包括从哪里得到头文件,都写在编译数据库里了。


如果我必须同时设置变量 INPUTINCLUDE_PATH,我应该将它们设置成什么?编译数据库列出了项目的源文件和头文件,它们分散在多个不同的目录中。这种情况应该怎么处理。

我找到了答案。

所以我在 Doxyfile 中设置了以下变量。

CLANG_ASSISTED_PARSING = YES
CLANG_DATABASE_PATH    = C:\dev\project_dir

然后我将以下变量设置为空白:

INPUT =
INCLUDE_PATH =

INPUT 指定要处理的源代码 *.c *.cpp 文件 and/or 目录的路径。 INCLUDE_PATH 指定要处理的头代码 *.h *.hpp 个文件 and/or 个目录的路径。

CLANG_ASSISTED_PARSING = YES 允许使用 clang 编译器作为解析器而不是默认的 doxygen 解析器。因此,如果 INPUTINCLUDE_PATH 未设置,则它会从编译数据库本身获取源代码文件和头代码文件。 CLANG_DATABASE_PATH 指定存放编译数据库的目录。它默认从该目录中抓取名为 compile_commands.json 的文件,这意味着编译数据库的名称是固定的。如果您将编译数据库命名为 JSON 文件,除 compile_commands.json 之外的任何其他文件都无法找到它。

因此,如果使用 clang 编译数据库 JSON 文件,则所有正在编译的 *.c *.cpp 文件都放在 INPUT 中。并且所有的头代码文件都放在了INCLUDE_PATH中。 doxygen 使用的 clang 解析 JSON,每次遇到 -I 编译器标志时,它都会将该文件识别为头文件,并将其添加到 INCLUDE_PATH。这意味着设置 INPUTINCLUDE_PATH 不是强制性的 。所以如果编译数据库格式正确,所有头文件都显式标记-I,只设置CLANG_DATABASE_PATH即可。

]

但在某些情况下,INCLUDE_PATH 也需要明确设置。例如,如果您有一个源代码文件,其中包含一个头文件,其中包含另一个头文件。

first.h

int one(int);

second.h

#include "first.h"
int two(int);

code.cpp

#include "second.h"

int main(void) {}

而编译数据库中的命令是这样的:

clang -I path/to/second.h -c code.cpp

所以在这种情况下,doxygen 会读取该文件,并且会在内部设置以下变量:

INPUT = code.cpp
INCLUDE_PATH = path/to/second.h

这意味着虽然 doxygen 会索引 second.h,但它会错过 first.h,因为 -I 编译数据库中没有明确提供该头文件。那将是一个错误。所以我们需要在 doxyfile 中明确列出它,这是一个额外的包含路径。

INPUT =
INCLUDE_PATH = path\to\first.h

CLANG_ASSISTED_PARSING = YES
CLANG_DATABASE_PATH    = C:\dev\project_dir