【发布时间】:2021-05-25 17:34:49
【问题描述】:
问题上下文:
doxygen 1.8.14 / Eclipse CDT 2021-03 / Eclox 0.12.1 / macOS 10.15.7
该项目是纯 C 语言,并为此进行了配置。
这个问题与仅从裸代码自动生成的文档有关,而不是我自己的任何注释标记。
在 Doxygen 中,使用 Enable Preprocessing YES,它会分析条件构建标志,并且不会记录这些标志内的代码。
如果Enable Preprocessing 否,Doxygen 会记录这些标志内的代码,但不会记录所有基本的#define 语句。
我不理解这个非此即彼的观点。我两个都想要。
我已经摆弄了所有预处理选项(例如Macro Expansion)并且无法获得我需要的东西。看起来我可以手动列出我想要包含的定义,但对于 100k LOC 项目,这是不现实的。
为每个构建变体构建多个文档版本,其中 97% 是相同的(虽然我认为对某些人有用)对于我的目的来说是一个蹩脚的解决方案——文档的重点是让软件工程师理解选项上下文中的整个系统,而不仅仅是它的一种视图。
我是否在某处缺少解决此问题的配置选项?感谢阅读。
// Examples (out of context):
//
// Build option system:
#define mBUILD_PLATFORM_105 (1U)
#define mBUILD_PLATFORM_205 (2U)
#define mBUILD_PLATFORM_300 (3U)
#define mBUILD_PLATFORM_320 (4U)
#define mBUILD_FOR_PLATFORM (mBUILD_PLATFORM_105)
// Then in code somewhere...
#if (mBUILD_FOR_PLATFORM == mBUILD_PLATFORM_105)
// This could be a few lines, could be a whole function,
// or even a whole library suitable only for 105.
#endif
// Meanwhile, there are many of these...
#define mYADDA_SENSOR_COUNT_MAX (12U)
Eclox UI 预处理器选项:
更新 2:
// Differences from a baseline doxyfile (not including the obvious
// project-specific name, source path, etc.)
REPEAT_BRIEF = NO
ABBREVIATE_BRIEF =
OPTIMIZE_OUTPUT_FOR_C = YES
EXTRACT_ALL = YES
EXTRACT_PRIVATE = YES
RECURSIVE = YES
HTML_EXTRA_STYLESHEET = assets/mDoxStyles.css *
ENUM_VALUES_PER_LINE = 1
SEARCHENGINE = NO
GENERATE_LATEX = NO
CLASS_DIAGRAMS = NO
DIRECTORY_GRAPH = NO
// * I've made minor changes to text size, color and spacing.
// Nothing structural.
更新 3:
我使用 4 个文件来尝试解释。我已经绘制了这些文件的图表,希望可以全面查看,以便您参考。
从左侧开始 mProject.h —— 这是我之前展示的构建定义,并且为了更好地衡量另一个定义以及文件的“Dox-umentation”和一个定义。
接下来是 mMutex.h,它是程序员将在整个应用程序中使用的外观 API。这还包含文件的 Dox-umentation 和定义。
接下来的两个文件 mMutex_rtos 和 mMutex_macos 是 mMutex 外观的实现细节。请注意构建条件包装几乎整个文件。
好的,那么,Doxygen 1.8.14 对这些文件做了什么...
我在一个简单的文本编辑器中编写了这些文件,并使用 Doxygen GUI(没有 Eclipse 或 Eclox)运行这些文件。我正在使用的唯一 Doxygen 设置是 ENABLE_PREPROCESSING 和 EXTRA_ALL。请注意,构建条件设置为 mOS_MACOS。
使用 ENABLE_PREPROCESSING = YES 和 EXTRACT_ALL = YES
- Project.h -- 所有定义都记录在案(信息呈现在 html 文件中)。
- mMutex.h -- 处理完整文件并记录在 html 文件中呈现的 @file 和 @var 信息。
- mMutex_macos.h -- 该文件有完整的文档,所有细节都以 html 呈现。
- mMutex_rtos.h -- 文件显示在文件列表中,html 页面仅显示#include,没有呈现其他文档。如果我设置 EXTRACT_ALL = NO,则文件名会显示在文件列表中,但没有指向后续 html 页面的链接。
我在这种情况下遇到的问题是文档中没有捕获 mMutex_rtos 文件的任何内容。在这种风格中,构建条件是包装整个文件或整个函数,而不仅仅是函数中的几行内联,那么文档最终会丢失。
ENABLE_PREPROCESSING = NO 和 EXTRACT_ALL = YES
- Project.h -- @file 信息被渲染,但没有任何定义包含在 html 文件中。 Dox 的常用渲染和我明确的 @var 内容都不存在。
- mMutex.h -- 函数使用 Dox 的默认内容呈现,但 html 文件中缺少 mMUTEX_NAME_LENGTH_MAX。 Dox 的常用渲染和我明确的 @var 内容都不存在。
- mMutex_macos.h -- 该文件有完整的文档,所有细节都以 html 呈现。但是,如果有 #define 它,它就会丢失。
- mMutex_rtos.h -- 现在该文件已完整记录,所有详细信息均以 html 呈现。但是,如果有 #define 它,它就会丢失。
打开/关闭 EXTRACT_ALL 时我注意到的是,即使没有我自己的 @fn 文本,它也会为定义和函数添加大的选项卡式部分。否则,当 ENABLE_PREPROCESSING = Y 时,我认为 EXTRACT_ALL 不会改变 html 文件中包含的内容。
因此,我似乎可以选择消除所有#defines(不是选项),或者排除在编译文档时任何构建选项未激活的所有文档。
(我很快就会尝试 1.9.x。)
- 已更新,包括上下文注释、一些文本编辑、Eclox UI 图像。
- 更新 2 以包含 doxyfile 差异。
- 更新 3 以提供更详细的文件示例。
【问题讨论】:
-
您使用的是哪个 doxygen 版本?你提到
Enable preprocession是指MACRO_EXPANSION的标志吗?您的示例不包含 doxygen 的任何文档,您能否添加一个小示例以及与默认设置不同的 doxygen 设置(doxygen -x)? -
@albert 我用上下文详细信息更新了帖子(抱歉,含糊不清)。至于样本,IMO 确实不需要样本,因为问题不在于我的任何格式化评论,它基于原始源代码以及 Dox 如何读取它以生成其默认输出。尚不确定如何收集项目特定设置以进行共享。会弄清楚的。希望 Eclox UI 图像有所帮助。
-
Doxygen 1.8.14 有点旧(2017 年 12 月),当前版本是 1.9.1,所以我当然建议升级,但这很可能不是问题的原因。显示的设置看起来就像预处理组的默认设置,但是没有 Doxyfile 就很难分辨(我不知道 Eclox 在他的引擎盖下做了什么)。我不知道您是否在其他组中设置了设置,但值得查看
EXTRACT_ALL,因为在这种情况下我看到了所有定义,#if中的部分没有任何可记录的内容/没有记录任何内容,因此也无法显示任何内容。 -
(续)eclox 编写的某处必须有一个 Doxyfile,因此您可以与我们分享与默认版本的差异(以获得案例的完整图片)。此外,我建议查看 doxygen 手册以了解所有可能性。
-
@albert re: 回调错误——是的,这个错误在 1.9.1 中仍然存在。我 -- 我以为我报告了它,然后才找到它 -- [链接] (github.com/doxygen/doxygen/issues/7060#issuecomment-567556453)
标签: doxygen preprocessor