CCACHE改善协同构建时间加快编译(转)
上一篇 / 下一篇 2007-08-16 10:58:54 / 个人分类:嵌入式LINUX技术
#j[*rQwg&f)` ~0 #! 先声明一下,以下文字来源于网络,非我所写,仅供个人工作参考。51Testing软件测试网T*n8H%L t.{q
51Testing软件测试网I+w Whe0hP7\8V4D D1Oh借助 CVS,可以很好地使用 cc 或者 gcc 将 C/C++ 项目协同构建为共享源代码文件和其他组件,但是,当应用程序融入了任何其他人的改变时,构建所需要的时间可能是相当可观的。即便您不是作为小组成员来编译项目,重新编译一个应用程序也会需要很长时间。ccache 工具通过将头文件高速缓存到源文件之中而改进了构建性能,因而通过减少每一步编译时添加头文件所需要的时间而提高了构建速度。通过本文学习如何构建和安装 ccache、如何在您现有的环境中使用它以及如何在小组开发项目中改善编译时间。您还将了解到如何同时使用 ccache 和 distcc 来使开发环境达到最佳性能。51Testing软件测试网5Tt;n UN%\oZD
51Testing软件测试网 wg3v#e1H
在标准的编译过程中,在 UNIX 下使用 C/C++ 开发应用程序通常需要用到一个编译器(如 gcc)以及一个编译工具,比如 make。make 和所有的 C 编译器的问题在于 C 预处理程序(preprocessor)和头文件的工作方式。观察一个典型的 C 源文件,您会发现其中有很多由 #include 所引用的各种头文件。51Testing软件测试网V5^/Xl/m Cegy5J
51Testing软件测试网Y[#b[&`y4\
每一次编译一个文件时,C 预处理程序(cpp)都会解析并引入每个头文件以及这些头文件引用到的任何文件。通过对内容进行解析,ccp 可以将一个相当基本的 1-KB 大小的源文件转化为一个 8-KB 大小的源文件,在这个过程中,会合并入几十个甚至几百个头文件。在典型的开发项目中,有很多与项目相关的头文件可能会在不同的源文件中多次被引入,而且每个头文件本身也可能引用很多其他头文件。
^_J].tJ0 51Testing软件测试网$L%q#UzK;s
在典型的编译过程中,make 工具只编译自上次编译后发生修改的文件,这样就在很大程度上简化了编译过程。例如,清单 1 中的目录表明,foo.o 对象比相应的 foo.c 源文件的最后修改日期更新。同时,bar.o 比 bar.c 更新。使用一个经过适当配置的 Makefile,将只会从源文件编译 foo.o。51Testing软件测试网g,o^@cG9p
9Zp;A'GI9Rb0 make 将必须被编译的文件限制在经过修改的那些源文件范围之内,但是即使是使用 make,仍然有相当可观的浪费。每一次编译项目时,源文件在编译为汇编语言和最终的机器代码之前,都要通过 cpp 进行解析。对每一个文件来说,每一次可能都要重新解析头文件。从编译的全过程来看,您最后可能多次解析了相同的头文件,浪费了处理器周期,更重要的是浪费了开发者的时间,因为他们要等待这一过程的完成。在一个团队中,这一影响可能会更为明显,因为多名开发者可能都会反复多次重复这一过程,在某一天甚至可能会同时进行。51Testing软件测试网-]Z.{
S3v'sT
51Testing软件测试网"m$t.n+efR#O
清单 1. 一个示例源文件环境
h@:iV6n/[2@0
:k,{$b}1ZmK,f.@jj&|0 total 808
r4q
I%V7`
b#\jN0 -rw------- 1 mc mc 5123 24 Jul 14:17 bar.c51Testing软件测试网V
Nl}xn!J:H5R
-rw------- 1 mc mc 39474 24 Jul 14:19 bar.o51Testing软件测试网JV!o-r&KN%hg
-rw------- 1 mc mc 7856 24 Jul 14:17 foo.c51Testing软件测试网z%`|;a(FW_)g RO.Z
-rw------- 1 mc mc 28443 24 Jul 14:19 foo.o51Testing软件测试网p9@
^mPC$Z
-rwx--x--x 1 mc mc 319742 24 Jul 14:19 foobar*
.sSH0PC5j0 -rw------- 1 mc mc 1045 24 Jul 14:21 foobar.h
6Lu
yw;~m
Q0
g0]g0Ep~3K n
\0 使用 ccache51Testing软件测试网x3o7}Qd"g L
ccache(“compiler cache”的缩写)工具会高速缓存编译生成的信息,并在编译的特定部分使用高速缓存的信息,比如头文件,这样就节省了通常使用 cpp 解析这些信息所需要的时间。如果您编译清单 2 中的文件,假定 foobar.h 中包含对其他头文件的引用,ccache 会用那个文件的 cpp-parsed 版本来取代 include 声明。就那么简单。不是真正去读取、理解并解释其内容,ccache 只是将最终的文本拷贝到文件中,使得它可以立即被编译。
.U3ay b_#bi0
#exo!YA9o2E0 清单 2. 源文件内容
Njp%k7D0
+z/ph"q*C](L S0 #include "foobar.h"
#Cj6i$u(o"^
hF}^(~I0
BWl1vf:A_0YF0 void main(void)
q:s@!WWSF0 {51Testing软件测试网 AdrRIe2R
}51Testing软件测试网(u/I/FQk"NGs
51Testing软件测试网k}$ei])xt&m7Nm
安装
)Vdz1Y8j{sm0 安装和使用 ccache 并不像您可能想像的那样复杂。它不会取代或者以任何方式影响您原来的使用编译器的方式,而是担当了您与您的编译器之间的一个接口,所以您可以根据需要选择是否使用它。要安装 ccache,需要从 Samba 小组或者一个本地镜像(参阅本文最后的 参考资料)直接下载源文件。解压出文件的内容:
^+SE2g3V'W7gc6F-F0 51Testing软件测试网 s0f
X4jtJae~Y)s
$ bunzip2 -c ccache-2.3.tar.bz2|tar xf -
9R {'bU6`cH3z0 51Testing软件测试网_C'~0Q!d+H4`$y\
切换到那个目录:
9e6zO
D4AK0 51Testing软件测试网;aJ"N5[0o)U
$ cd ccache-2.351Testing软件测试网 x`9N\r;yiW
51Testing软件测试网8AYun6`b
配置:
-i0j)E)U_0 $ ./configure
!L(N)U$M5ewR{'a0
v[6z/d,W8^:?0 编译:51Testing软件测试网2@ WN%`Z3y`S&GJp
$ make
S+SW$|)jj#H0 51Testing软件测试网 z2F p/z9M5s
最后,安装 ccache:
`p1|7N,T XQI0 51Testing软件测试网.f)SBG*j8I2O6Q
$ make install51Testing软件测试网LZBo7c/^8Xi-`
51Testing软件测试网,s2Z9PM6wyI7G
您就准备好开始使用了!
#P\7|qt9x%J%d|7r0
;T C'oIX+A~.h0 部署
"R:m0^vrQ0 如上所述,ccache 在您与您的普通编译器之间进行工作。以 gcc 为第一个参数调用 ccache,而不是调用 gcc。例如,要在命令行中编译一个文件,您通常会使用:51Testing软件测试网!YIu(hM#zr#o
51Testing软件测试网G+[uCeUvjQ1q
$ gcc foo.c
W8H
^^Umn0
(_
cs8SC,ql3bR0 要使用 ccache,您应该输入:51Testing软件测试网 A O.b0xJZv
E5f(I!i)t@r0 $ ccache gcc foo.c51Testing软件测试网&^(ZM0eGk-z;s
51Testing软件测试网[h"T_(X6E
像这样对一个文件进行单独的编译,尤其是第一次使用 ccache 编译那个文件时,您将不会看到有任何的帮助,因为编译信息还没有被高速缓存。所以,配置 ccache 永久地取代主要编译器通常来说更为有效。设置 CC 环境变量的值来完成这一任务:51Testing软件测试网J:G)KI:h(GZq
51Testing软件测试网.h-w
cnLp
$ export set CC='ccache gcc'51Testing软件测试网rhI.}E2r9U*C
4yX*E(c
C4ltx0 如果您只是想为一个项目启用 ccache,比如说编译 Perl 等第三方工具时,那么您或者可以使用环境变量,或者可以告知配置脚本或 make 命令使用哪个 C 编译器。51Testing软件测试网!U]'y"B9d'i{9r"T,_
H4W,K6m9C_K0 控制高速缓存
l1SZ)s }
H.M+Em0 默认情况下,ccache 使用当前用户主目录中的一个目录($HOME/.ccache)来保持高速缓存信息。在团队环境中,您应该使用一个集中的位置来进行高速缓存,这样在编译过程中每个人都可以使用高速缓存的信息。另一个环境变量 CCACHE_DIR 指定了高速缓存目录的位置。在单机环境中,将这个环境变量设置为一个每一个需要它的人都可以访问的目录。使用通过 tmpfs 挂载的目录可以获得更高的速度,前提是您得有支持这一功能的存储器。您的速度可能会再提高 10% 到 25%。
J7b0}1w7\](EzYOW0
M-?5pni:d0 如果您是在网络中多台机器上使用 ccache,那么要确保您共享的目录要通过 NFS 导出(export)并挂载到每一个客户机上。如果您希望获得额外的加速,同样可以使用 tmpfs 文件系统。
'@e%y^,W0 51Testing软件测试网~nf:K p
另外的一些选项让您可以更深入地控制高速缓存设置:
6xW&J:^7K\,[._0 51Testing软件测试网?4D'jhM;_i"ZV
CCACHE_LOGFILE 环境变量定义了使用高速缓存时生成的日志文件所处的位置。
w"a#fJdZW0 51Testing软件测试网+RC(h9e4hk
在 ccache 中使用 -s 命令行选项来获得关于高速缓存性能的统计数据(见清单 3)。
E4n+c Brx6L.Y:a0
"zWP~}4L*Ch0 使用 -M 命令行选项来设置高速缓存的最大大小。默认是 1GB。高速缓存的设置会写入到高速缓存目录,所以您可以让不同的用户和组在不同的位置拥有不同大小的高速缓存。
)U&GAD(s|y!K0 51Testing软件测试网(aW]*s2h Z't/s
-F 选项设置高速缓存目录的最大文件数目,按 16 进制舍入。和 -M 相同,只是当您希望改变配置的时候才需要使用它。
P"_.x(~J0
rm q,Z0R`0 -c 选项清空缓存。您通常不需要使用这个选项,因为 ccache 在执行过程中会更新信息,但是,如果您要重用一个没有为某个文件所使用的高速缓存目录,那么就应该尝试使用这个选项。
/eli5Y%I!OR r0
%~Of6oA+[0 -C 选项完全清空高速缓存。51Testing软件测试网Z-h6B#],~.q!f
&A