自动构建ID

时间:2009-01-02 15:22:06

标签: c++ visual-studio svn visual-c++

我们正在寻找一种在构建中自动包含某种构建ID的方法。这需要是可移植的(VC ++,Linux和Mac上的g ++)和自动。 VC ++是最重要的,因为在其他环境中我们使用自定义Python构建脚本,所以我可以做任何我想做的事。

我们使用SVN,所以我们正在考虑使用svnversion的输出将修订写入标题并包含它。这有问题:如果我们把文件放在SVN中,它每次都会显示为修改,但它会是一个多余的提交,从某种意义上说会产生一个增加修订的无限循环。如果我们不将文件放在SVN中并将其创建为预构建步骤,则源代码将不完整,因为它们需要预构建步骤或Makefile来生成该文件。

我们也可以使用__DATE__但我们无法保证使用__DATE__的文件(即将其写入日志文件)将被编译,如果其他文件被修改 - 除非我们“触摸”它,但那时我们会让项目总是过时的。我们可以将它作为预构建步骤触摸,因此只有在项目的其余部分已过期时才会触及它,因此不会导致虚假编译,但如果VC ++在之前计算依赖关系预构建步骤,这不起作用(__DATE__的文件将不会被编译)

有什么有趣的想法吗?

6 个答案:

答案 0 :(得分:9)

我们正在使用svnversion的输出,写入头文件并包含在内。我们从存储库中省略了该文件,并在预构建步骤中创建它;这对我们来说非常有效。 (我不确定你为什么反对使用预构建步骤?)

我们目前正在使用Perl脚本将svnversion的输出转换为头文件;我后来发现TortoiseSVN包含一个subwcrev命令(它也被移植到Linux),它可以完成同样的事情。

答案 1 :(得分:4)

如果您不喜欢构建所需的源控件中包含文件的想法,请考虑批处理文件或其他构建步骤,以编程方式创建文件/ include并在构建过程中调用svnversion。

基本上生成文件,因此您没有未版本和必需的文件。

EDIT 乔希的次级心脏可能是最好的主意。

在实现之前,我编写了自己的hacky工具来做同样的事情 - 在模板文件中进行替换。

答案 2 :(得分:3)

可能很简单:

% make -DBUILD_NUMBER=`svnlook youngest /path/to/repo`

答案 3 :(得分:2)

我会看SvnRev。您可以将其用作VS中的自定义预构建步骤,或者从makefile或其他任何您需要执行的操作中调用它,并生成一个头文件,您可以将其包含在其他文件中,以便为您提供所需的内容。网站上有很好的文档。

SubWCRev是另一种选择,虽然Linux端口较新,但我不知道Mac版本存在。它在Windows for .NET上非常有用(我猜这对你来说不是问题,但我将其添加以供将来参考),因为它允许你创建一个可用于生成的模板文件,例如,.NET程序集的Properties文件。

答案 4 :(得分:0)

自动构建通常可以是完整,干净的构建。在这种情况下,您从干净的目录开始,在任何情况下都不会出现__DATE__的问题。否则,请参阅Paul Beckinham的想法。

答案 5 :(得分:-1)

为什么不绑定GUID,几乎每种语言都支持生成一个语言,或者如果你的语言没有,那么就有很多算法。

(虽然,如果你使用颠覆,我个人更喜欢Josh的想法!)