将mercurial changeset注入C可执行文件中的版本信息

我希望我正在处理的项目的可执行文件记录了最新的mercurial变更集,以便当用户抱怨错误行为时,我可以跟踪他们正在使用的版本。 我的一些可执行文件是Python,其他的是C编译。有没有办法自动化这个,或者你能指出我展示可以看到的解决方案的项目吗?

我在我的项目中使用autoconf …以防止解决方案更容易。

谢谢!

那么setjmp

将其添加到configure.ac

 AM_CONDITIONAL([IS_HG_REPO], [test -d "$srcdir/.hg"]) 

Makefile.am添加到Makefile.am

 if IS_HG_REPO AM_CPPFLAGS = -DHGVERSION="\"$(PACKAGE) `hg parents --template 'hgid: {node|short}'`\"" else AM_CPPFLAGS = -DHGVERSION=PACKAGE_STRING endif 

如果从发布tarball构建,这将HGVERSION定义为APPNAME hgid: 24d0921ee4bdAPPNAME VERSIONforms的字符串。

执行此操作的常用方法是使用m4_esyscmd。 例如,autoconf在build-aux中分发一个脚本,它从git repo生成一个版本号,并调用AC_INIT:

 AC_INIT([GNU Autoconf],m4_esyscmd([build-aux / git-version-gen .tarball-version]), 
   [bug-autoconf@gnu.org])

您可以经常离开而不分发脚本并执行以下操作:

 AC_INIT([包名],m4_esyscmd([git describe --dirty | tr -d'\ 012']), 
   [错误报告地址])

而不是git-describe,使用您想要生成版本号的任何命令。 一个重要的细节是它不应该有一个尾随换行符(因此跟随git-describe的tr)。

此技术的一个主要缺点是版本号仅在运行autoconf时生成。

有关make的版本控制,请参阅wiki页面