使用gcc和ccache

时间:2009-09-15 07:13:59

标签: gcc compilation ccache

我正考虑在团队范围内使用ccache和gcc编译代码(同一台机器上的所有开发人员都会使用相同的ccache缓存)。

由于我们谈论的是商业产品,编制的“正确性”是首要任务。

这里有问题:

  1. 使用ccache的编译是安全 / 可重现? 是否存在一些异常情况,ccache会错误地设置缓存命中。

    如果我签出源代码并编译它,我希望收到相同的产品 (每次重复一个新的编译过程时,(完全相同的库/二进制文件)。 商业产品必须

  2. 是否有使用ccache的开源/商业产品是其中不可或缺的一部分 建立系统?这样可以更容易说服我的同事使用ccache。
  3. 由于

2 个答案:

答案 0 :(得分:6)

根据其手册,ccache确定它是否在以下内容之前编译了某个对象:

  • 使用-E
  • 运行编译器的预处理器输出
  • 命令行选项
  • 真正的编译器大小和修改时间
  • 编译器生成的任何stderr输出

如果某个PHB仍然担心由于ccache而导致的任何假设风险,请仅将其用于开发构建,并使用编译器构建最终产品,而不使用任何前端。或者您可以在构建最终产品之前清除缓存。

更新:我不知道使用ccache作为其构建系统不可或缺的部分的产品,但是将它集成到可以设置编译器的任何环境中都非常简单路径。即autoconf

CC="ccache gcc" ./configure

在查看了作者的名字之后,我会说这是一个非常安全的假设,它已被广泛用于Samba团队。

更新以回应Ringding关于stderr使用情况的评论:从ccache的角度来看,一个有趣的信息是C编译器的版本和配置字符串。 gcc将其输出到标准错误文件:

$ gcc -v 2>err
$ cat err
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.3.4-2' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.3.4 (Debian 4.3.4-2)

我敢打赌ccache使用此输出或类似输出。但是,嘿,你总是可以看看它的源代码。 : - )

答案 1 :(得分:0)

我个人很熟悉ccache,它非常简单易用,我发现它对我的大型私人项目非常有用。 但是,对于团队的基础,我还没有经验。 您可能也对AO (audited objects)

感兴趣

一般来说:

  • 它提供了更强大的机制,可以使用分布式环境进行缓存
  • ccache仅加快编译时间,而AO也加快了链接时间。
  • 不仅限于c / c ++

在我发布的答案(1。5年前......)后不久,我设法说服我们的构建和研发经理,将ccache集成到自动构建系统中,他们对此感激不尽。该公司拥有200多名开发人员,因此它确实在运作。至于连接阶段,它仍然是一个问题。