今天写netsurf的一篇blog,顺便把之前做的的一个东西给写了,写blog真的是蛮辛苦的一件事。。。就都今天苦了吧,呵呵
用distcc,ccache是两年前,项目结束的空隙,自己拿来玩的。当时是在arm上做的一个很大的工程,当时的PC,只编UI部分就需要3个小时,这也是为什么后来我用分布式编译的原因。那个项目是c++加adobe的flash,仿iphone做一款很炫的手机,其中UI全部用flash做,效果很炫,速度就比较差了。后来,我也试过在arm9261(200MHz)上用gnash播放flash,效果确实比较一般。言归正传,还是来说下分布式编译,其实它的原理很简单,把c文件在本机预编译,然后发到其他主机进行编译,编译的后的o文件再传回本机,最后在本机进行链接。没有看过代码,猜测对于每个编译的c文件对应产生一个编译任务,下发到其他机器或本机,最终完成编译。
我们的环境是ADS1.2+cygwin,用tcc,tcpp进行编译。distcc,ccache本来是在cygwin上直接装的的,但后来在使用时发现会碰到一些问题。所以从源码编译了。distcc产生的中间文件是.i的格式,tcc无法识别该文件类型,需要修改源码。就一句话,网上可以搜到的。if(dcc_getenv_bool("DISTCC_KEEP_FILETYPE", 1)).然后,./configure; make; make install。ccache问题是一样的,无法识别.i文件,修改ccache.c,把中间文件i/ii改为c/cpp,一样的方式安装。
然后要对安装的东西进行配置,我当时的配置如下,10.19.5.0网段的主机都可以做协同编译的主机,当然ads的licence只有20个啦。此处目录设置至关重要,tcc无法识别cygwin环境,tcc -c /cygdriver/c/a.c, tcc无法读取文件,错误码为C3052E。利用了cygwin既可以win32的路径,又可以识别posix路径。
export DISTCC_LOG='/var/log/distcc.log'
export DISTCC_HOSTS='localhost 10.19.5.0/24'
export DISTCC_VERBOSE=1
export DISTCC_SAVE_TEMPS=1
export TMPDIR=' e:/test '
export CCACHE_DIR=e:/test
export CCACHE_PREFIX=distcc
export CCACHE_LOGFILE=e:/test/ccache.log
distccd在没有设置DISTCCD_PATH时,使用系统的PATH作为搜索,和makefile里指定的不一致。设置了DISTCCD_PATH,很莫名其妙,当时是为什么。然后distccd --daemon --allow0.0.0.0/0,任何ip都可以接入,比较简单。
修改makefile,在CC,ARMCC,ARMCPP,TCPP原来的设置前,添加ccache。需要说明的是,distcc仅为编译器前端,编译器的指定需要distcc <compiler>。distcc支持的编译器必须可以预编译,也就是常用的gcc -E这样的选项。
最后的测试很简单,自己写makefile,只做".c.o:" ,然后把.o文件链接到工程中就可以了。在手机上还是可以很好的run起来的。当然验证的工作不是那么简单了,看了下反汇编的代码。一台主机编译的和分布式编译的,没有什么太大的差别,汇编稍有不同,但功能一致。
项目结束后自己玩的东西,虽然没有用于实际来提高效率,但还是学到了一些东西。
相关文章
- maven编译报错File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
- 如何检查Eclipse的gcc c++编译器版本?
- 10000字,图解分布式系统限流平台Sentinel
- 理解Android编译命令
- RT-Thread BSP qemu-virt64-aarch64 的编译环境搭建
- 作为移动开发你不能不了解的编译流程
- 【Dubbo分布式服务框架】1.Dubbo基础介绍
- 【Dubbo分布式服务框架】3.基于注解的服务提供者和消费者
- 分布式请求链路跟踪-SpringCloud Sleuth
- 基于matlab的QC-LDPC编译码误码率仿真,译码为最小和译码算法