我想知道是否有办法将 Mercurial 标签嵌入到我的 C/C++ 代码中。
基本上,我希望将最终成为版本号 (major.minor.rev) 的标记字符串作为静态字符串自动插入到我的 C 代码的确定位置。
总体目标是,当使用“-v”命令行参数执行时,可以查询应用程序的版本号。任何不涉及尝试嵌入 Mercurial 标签的替代方法也将受到欢迎。
我在 Linux 环境中使用 Code::Blocks,因此该解决方案不能依赖 Visual Studio 功能。
我想知道是否有办法将 Mercurial 标签嵌入到我的 C/C++ 代码中。
基本上,我希望将最终成为版本号 (major.minor.rev) 的标记字符串作为静态字符串自动插入到我的 C 代码的确定位置。
总体目标是,当使用“-v”命令行参数执行时,可以查询应用程序的版本号。任何不涉及尝试嵌入 Mercurial 标签的替代方法也将受到欢迎。
我在 Linux 环境中使用 Code::Blocks,因此该解决方案不能依赖 Visual Studio 功能。
您将需要关键字扩展来允许扩展关键字条目,它与 mercurial 捆绑在一起。
例如,为了获得对您的支持,$Id$
您可以为您的 repo ( .hg/hgrc
) 编辑 hgrc 并添加:
[extensions]
keyword =
[keyword]
# Enable expansion for the specific files
myfile.cpp =
# Enable for all .h files
**.h =
然后运行
hg kwexpand
扩展相关文件的关键字,或
hg kwshrink
缩小关键字。[keywordmaps]
您甚至可以通过添加条目来创建自己的关键字,例如
[keywordmaps]
User = {author|user}
注意:这会禁用内置关键字
更多关于扩展的细节可以在 wiki中找到。
我们为此使用宏
#define CVS(a) static const volatile char *rcsid = a;
....
CVS("$Id$")
CVS 自动扩展 $Id$。我认为这也是 mercurial 标签的工作原理。
然后我们可以使用 strings 命令在可执行文件/库等中查找每个文件的确切版本。
你可以使用类似的东西。
static const volatile char *rcsid = "$Id"; //or whatever mercurial tag you want
int main() {
.....
std::cout << "Version is " << rcsid << std::endl;
}