使用“branchy”开发模型避免不必要的重新编译

时间:2009-05-11 10:32:13

标签: c++ mercurial

我正在使用Mercurial开发相当大的C ++项目,从头开始构建大约需要30分钟(而增量构建非常快)。

我经常尝试在新分支中实现每个新功能(使用“hg clone”),我可能会在白天开发一些新功能,并且等待新功能分支很快变得非常无聊建成。

是否有任何配方以某种方式重用其他已经构建的分支中的目标文件?

P.S。在git中,在同一个存储库中有一些命名分支,它们可以为构建系统重用现有的目标文件,但是我更喜欢更简单的Mercurial单独分支模型......

6 个答案:

答案 0 :(得分:4)

我建议使用ccache来加速(主要)相同代码树的编译。它的工作方式如下:

  • 使用CCACHE_DIR环境变量
  • 定义要用作缓存的位置(以及最大缓存大小)
  • 您的编译器应设置为ccache ${CC}ccache ${CXX}

ccache获取${CC} -E的输出和编译标志,并将其用作其哈希的基础。只要编译器标志,源文件和标题都未更改,就会从缓存中获取目标文件,从而节省宝贵的编译时间。

请注意,此方法可加快最终生成相同哈希的任何源文件的编译速度。如果您跨项目共享源文件,ccache也会处理它们。

如果您已使用distcc并希望将其与ccache一起使用,请将CCACHE_PREFIX环境变量设置为distcc

使用ccache将我们的源代码树编译加速了十倍。

答案 1 :(得分:3)

加速构建的一种简单方法可能是在磁盘上使用本地“构建目录”。这样您就可以签出到这个目录并开始构建。第一次需要全部时间,但之后它(希望)只会重建源代码更改的文件。

答案 2 :(得分:2)

Woops,我错过了你的P.S.你不喜欢在同一个仓库中拥有多个命名分支,而你更喜欢单独的克隆..对不起。

<击> 我也有一些大型的C ++项目,而且每个功能的克隆工作流程对我来说并不适用。首先,我必须关闭我的Vim会话,然后在创建克隆后重新打开(许多相同的)文件。其次,就像你说的那样,必须不必要地重新编译很多代码。第三,我必须跟踪我推动和拉出的位置 - 当你开始一个新功能然后被转移到一个新功能时会变得混乱。在您知道它之前,您有许多克隆,并且不确定哪些克隆需要被推回到您的主体。

你绝对不想使用命名分支(我相信你知道)来处理它,因为它们非常永久。

您需要的是书签:https://www.mercurial-scm.org/wiki/BookmarksExtension

书签允许您通过促进回购中头部的命名来为每个功能创建轻量级(和其他匿名)分支。这些头通常是未命名的,你必须查看'hg log'的输出或使用一些图形工具来查找功能分支的提示的修订号。使用书签,您可以将它们命名为“my-cool-feature”或“bugfix-392”等描述性名称。

如果您喜欢书签的想法,我还建议我自己的扩展名为“任务”:http://bitbucket.org/alu/hgtasks。此扩展程序与书签类似,但增加了一些功能。它允许您创建功能分支(现在称为任务)并抑制推送不完整的任务。当您同时拥有一些功能分支时,这很方便。你可能还没有准备好推动你的'我的酷功能'任务,但'bugfix-392'已准备就绪。由于任务跟踪一组变更集(而不仅仅是一个'tip'变更集),因此您可以使用书签执行某些操作。请在此处查看示例工作流程:http://x.zpuppet.org/2009/03/09/mercurial-tasks-extension/

答案 3 :(得分:2)

我的Localbranch extension部分围绕此用例设计。它使用单个工作目录,但我认为它比git简单。它本质上是一种在一个工作目录下维护多个存储库克隆的机制,其中只有一个在给定时间处于活动状态。

答案 4 :(得分:1)

Mercurial也有本地命名分支,请参阅hg branch命令。

如果你坚持使用hg clone进行分支开发,我猜你可以尝试在你的repo中创建一个文件夹链接(windows下的快捷方式)到一个共享的obj文件夹。这将适用于hg clone,但我不确定你的构建工具是否可以使用它。

否则,您可能将所有存储库保存在一个文件夹中 - 只需将obj文件夹放在那里(无论如何都不应该在源代码管理下,imo)。使用相对路径来引用它。

答案 5 :(得分:0)

警告:许多.o符号表(或等效表)包含源文件的完整路径名。如果该其他文件发生更改(或者如果从新目录中看不到该路径),则在调试时可能会遇到奇怪现象。