7

我有一些 C++ 代码库,用 doxygen 记录,并用 GNU make 构建。版本信息集中在makefile中,我有类似的东西:

版本=1.2.3.4

在我的 makefile 中,CFLAGS 添加了以下定义:

CFLAGS += -DAPP_VERSION=$(VERSION)

这使我能够在代码中获取版本,如下所示:

#define STR_EXPAND(tok) #tok
#define STR(tok) STR_EXPAND(tok)
int main()
{
    cout << "software version is << STR(APP_VERSION) << endl;
}

现在,我想要在 doxygen 生成的 html 文件中有这个:

当前软件版本为 1.2.3.4

我设法将makefile变量导出到doxygen配置文件中:(编辑:doxygen是从makefile调用的,通过'make-doc'目标)

预定义 = APP_VERSION=$(VERSION)

但是,如果我在 doxygen \mainpage 命令中尝试这样的事情,它会失败,因为(当然)宏名称不会在评论中扩展......

/**
\mainpage this is the doc
Current version is $(APP_VERSION) -- or -- ... is APP_VERSION
*/

问题

  • 您知道在 doxygen 注释中“扩展”该宏的方法吗?这可以通过对包含 makefile 中注释的文件进行一些 sed 处理来完成,但也许这可以直接用 doxygen 解决?

  • 其他项目如何处理版本控制(除了 VCS 提供的自动版本控制工具,我的意思是),版本 ID 在文件中是唯一定义的,因此它可以被软件构建系统和文档构建系统获取。

相关:如何显示定义的值

4

3 回答 3

3

注释中的宏通常不会被扩展(例如,参见这个答案)。这不是 doxygen 独有的,我想不出使用PREDEFINED配置选项的方法。

正如您在问题中所述,您可以使用, 请参阅此答案sed中的第三个要点。例如,使用以下

INPUT_FILTER  = "sed -e 's/VERSION/1.0/'"

将替换所有源文件中的所有实例VERSION1.0您可以指定要处理的文件INPUT_FILTER,而不是处理所有源文件)。你可能不想VERSION到处扩展,所以也许最好使用类似$(VERSION)sed这个令牌的东西。此外,您将需要一种从 makefile 中获取版本号并进入 doxygen 配置文件的方法。这可以用另一个sed.

为了解决您的最后一个要点,doxygen 具有FILE_VERSION_FILTER用于确定每个文件的版本号的配置选项。FILE_VERSION_FILTER使用它会在每个文件页面的顶部打印一些版本信息(从 中指定的命令打印到标准输出的任何内容)。在文档中,有使用多种不同版本控制系统获取版本号的示例。另外,这里有一个页面描述了如何使用 git 和 doxygen 来提取版本信息。

此配置选项的唯一缺点是我不知道如何指定文件版本信息应出现在最终文档中的哪个位置。我假设您可以使用布局文件:我假设您可以更改 pages 的布局,但我从未这样做过,也不知道使用它在主页上包含版本信息有多容易。

于 2012-05-22T08:52:43.620 回答
2

命令手册建议$(VARIABLE)扩展环境变量。所以也许你可以把你的版本放在环境变量中?

于 2012-05-21T21:56:43.267 回答
2

您需要使用 make 的“导出”功能,即一个非常简单的 make 文件

project_name=FooBar
export project_name
all:
    doxygen Doxyfile

将允许您在 C++ 中使用以下注释

/*! \mainpage Project $(project_name) Lorem ipsum dolor

我可以看到这将成为具有大量导出的 PITA,但这是一种相当简单的方法。或者,您可以从一个单独的 BASH 脚本中运行 doxygen,其中包含所有导出内容,以避免过多地污染您的 Makefile。

于 2012-12-29T11:51:32.230 回答